diff --git a/Dockerfile b/Dockerfile index a037093576..ec3694c7e8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM tgstation/byond:512.1484 as base +FROM tgstation/byond:512.1488 as base FROM base as build_base diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_alien_nest.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_alien_nest.dmm index 6893a41517..1ea3f19c62 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_alien_nest.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_alien_nest.dmm @@ -167,7 +167,7 @@ /area/ruin/unpowered/xenonest) "aM" = ( /obj/structure/alien/weeds, -/obj/effect/decal/cleanable/xenoblood, +/obj/effect/decal/cleanable/blood/xeno, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/xenonest) "aQ" = ( @@ -260,7 +260,7 @@ /obj/structure/stone_tile/cracked{ dir = 1 }, -/obj/effect/decal/cleanable/xenoblood, +/obj/effect/decal/cleanable/blood/xeno, /turf/open/indestructible/boss/air, /area/ruin/unpowered/xenonest) "be" = ( @@ -381,7 +381,7 @@ /obj/structure/stone_tile{ dir = 1 }, -/obj/effect/decal/cleanable/xenoblood, +/obj/effect/decal/cleanable/blood/xeno, /turf/open/indestructible/boss/air, /area/ruin/unpowered/xenonest) "bs" = ( @@ -439,7 +439,7 @@ /obj/structure/stone_tile{ dir = 8 }, -/obj/effect/decal/cleanable/xenoblood, +/obj/effect/decal/cleanable/blood/xeno, /turf/open/indestructible/boss/air, /area/ruin/unpowered/xenonest) "by" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm index ed5b07168f..bb9bc75d25 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm @@ -475,6 +475,8 @@ dir = 4 }, /obj/item/storage/bag/plants/portaseeder, +/obj/item/seeds/cotton, +/obj/item/seeds/cotton, /turf/open/indestructible/boss, /area/ruin/unpowered/ash_walkers) "bk" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm index 945ea515c7..fec70b215e 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm @@ -279,6 +279,7 @@ }, /turf/open/floor/plasteel/freezer, /area/ruin/powered/seedvault) + (1,1,1) = {" a a diff --git a/_maps/RandomRuins/SpaceRuins/augmentationfacility.dmm b/_maps/RandomRuins/SpaceRuins/augmentationfacility.dmm index c64050ce3a..e23beb3407 100644 --- a/_maps/RandomRuins/SpaceRuins/augmentationfacility.dmm +++ b/_maps/RandomRuins/SpaceRuins/augmentationfacility.dmm @@ -90,6 +90,9 @@ /obj/structure/table, /obj/effect/decal/cleanable/dirt, /obj/item/organ/cyberimp/chest/reviver, +/obj/item/stack/sheet/mineral/gold{ + amount = 3 + }, /turf/open/floor/plasteel, /area/ruin/powered) "s" = ( @@ -145,9 +148,6 @@ "A" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, -/obj/item/mmi/posibrain{ - pixel_y = 9 - }, /obj/item/mmi, /turf/open/floor/plasteel, /area/ruin/powered) diff --git a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm index f1a3005ce1..9c273f4d75 100644 --- a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm +++ b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm @@ -1288,7 +1288,7 @@ /turf/open/floor/plasteel, /area/ruin/space/has_grav/derelictoutpost/cargobay) "cV" = ( -/obj/effect/decal/cleanable/xenoblood/xsplatter, +/obj/effect/decal/cleanable/blood/splatter/xeno, /turf/open/floor/plasteel, /area/ruin/space/has_grav/derelictoutpost/cargobay) "cW" = ( @@ -1525,7 +1525,7 @@ /turf/open/floor/plasteel, /area/ruin/space/has_grav/derelictoutpost/cargobay) "dq" = ( -/obj/effect/decal/cleanable/xenoblood/xsplatter, +/obj/effect/decal/cleanable/blood/splatter/xeno, /obj/structure/alien/weeds{ color = "#4BAE56"; desc = "A thick gelatinous surface covers the floor. Someone get the golashes."; diff --git a/_maps/RandomRuins/SpaceRuins/hilbertshoteltestingsite.dmm b/_maps/RandomRuins/SpaceRuins/hilbertshoteltestingsite.dmm new file mode 100644 index 0000000000..a89d1422d2 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/hilbertshoteltestingsite.dmm @@ -0,0 +1,970 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/space/basic, +/area/template_noop) +"b" = ( +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered/no_grav) +"c" = ( +/turf/closed/wall/r_wall/rust, +/area/ruin/space/has_grav/hilbertresearchfacility) +"d" = ( +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/hilbertresearchfacility) +"e" = ( +/obj/machinery/porta_turret/syndicate{ + desc = "A ballistic machine gun auto-turret that fires bluespace bullets."; + lethal_projectile = /obj/item/projectile/magic/teleport; + name = "displacement turret"; + stun_projectile = /obj/item/projectile/magic/teleport + }, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"f" = ( +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"g" = ( +/obj/structure/table/glass, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"h" = ( +/obj/structure/table/glass, +/obj/item/stack/sheet/bluespace_crystal{ + amount = 37 + }, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"i" = ( +/obj/structure/table/glass, +/obj/item/bodybag/bluespace, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"j" = ( +/turf/open/floor/plasteel/stairs/left, +/area/ruin/space/has_grav/hilbertresearchfacility) +"k" = ( +/turf/open/floor/plasteel/stairs/medium, +/area/ruin/space/has_grav/hilbertresearchfacility) +"l" = ( +/turf/open/floor/plasteel/stairs/right, +/area/ruin/space/has_grav/hilbertresearchfacility) +"m" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/syringe/bluespace, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"n" = ( +/obj/structure/table/glass, +/obj/item/stock_parts/matter_bin/bluespace, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"o" = ( +/turf/open/floor/plasteel/vaporwave, +/area/ruin/space/has_grav/hilbertresearchfacility) +"p" = ( +/obj/structure/table/glass, +/obj/item/stack/cable_coil/blue, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"q" = ( +/obj/structure/table/glass, +/obj/item/storage/backpack/holding, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"r" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/beaker/bluespace, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"s" = ( +/obj/structure/table/glass, +/obj/item/stock_parts/subspace/crystal, +/obj/item/stock_parts/subspace/transmitter, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"t" = ( +/obj/structure/displaycase{ + start_showpiece_type = /obj/item/hilbertshotel + }, +/turf/open/floor/plasteel/vaporwave, +/area/ruin/space/has_grav/hilbertresearchfacility) +"u" = ( +/obj/structure/table/glass, +/obj/item/analyzer, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"v" = ( +/obj/structure/table/glass, +/obj/item/stock_parts/subspace/amplifier, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"w" = ( +/obj/item/paper/crumpled/docslogs, +/obj/item/pen, +/turf/open/floor/plasteel/vaporwave, +/area/ruin/space/has_grav/hilbertresearchfacility) +"x" = ( +/obj/structure/table/glass, +/obj/item/assembly/signaler, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"y" = ( +/obj/structure/table/glass, +/obj/item/slimecross/industrial/bluespace, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"z" = ( +/obj/machinery/door/airlock/vault{ + name = "secured door"; + req_access = 207 + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/plasteel/grimy{ + icon_state = "engine" + }, +/area/ruin/space/has_grav/hilbertresearchfacility) +"A" = ( +/obj/structure/filingcabinet, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hilbertresearchfacility) +"B" = ( +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hilbertresearchfacility) +"C" = ( +/obj/structure/table/reinforced, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hilbertresearchfacility) +"D" = ( +/obj/item/twohanded/required/kirbyplants/random, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hilbertresearchfacility) +"E" = ( +/obj/structure/chair/office, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hilbertresearchfacility) +"F" = ( +/obj/machinery/door/window/eastleft, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hilbertresearchfacility) +"G" = ( +/obj/structure/table/reinforced, +/obj/item/pen, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hilbertresearchfacility) +"H" = ( +/obj/structure/table/reinforced, +/obj/item/paper/crumpled/robertsworkjournal, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hilbertresearchfacility) +"I" = ( +/obj/machinery/door/airlock/highsecurity{ + req_access = 207 + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hilbertresearchfacility) +"J" = ( +/turf/closed/mineral/random, +/area/ruin/unpowered/no_grav) +"K" = ( +/turf/open/floor/plasteel/stairs/right{ + initial_gas_mix = "TEMP=2.7" + }, +/area/ruin/unpowered/no_grav) +"U" = ( +/turf/open/floor/plasteel/stairs/medium{ + initial_gas_mix = "TEMP=2.7" + }, +/area/ruin/unpowered/no_grav) +"X" = ( +/turf/open/floor/plasteel/stairs/left{ + initial_gas_mix = "TEMP=2.7" + }, +/area/ruin/unpowered/no_grav) + +(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 +"} +(2,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +b +b +b +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 +b +J +J +J +a +a +a +a +a +a +a +a +a +a +a +a +"} +(4,1,1) = {" +a +a +a +J +b +J +b +b +a +b +J +b +b +b +b +a +a +a +a +a +a +a +a +a +a +a +"} +(5,1,1) = {" +a +a +b +J +J +J +b +J +b +J +b +b +J +J +J +b +a +a +a +a +a +a +a +a +a +a +"} +(6,1,1) = {" +a +a +b +c +c +c +c +c +d +d +c +d +d +c +d +d +b +a +a +a +a +a +a +a +a +a +"} +(7,1,1) = {" +a +a +b +d +e +f +f +m +r +g +g +f +f +f +e +c +b +a +a +a +a +a +a +a +a +a +"} +(8,1,1) = {" +a +a +b +d +f +f +f +f +f +f +f +f +f +f +f +d +J +b +b +b +b +b +a +a +a +a +"} +(9,1,1) = {" +a +a +J +d +f +f +f +f +f +f +f +f +f +f +f +c +J +b +b +J +b +b +b +a +a +a +"} +(10,1,1) = {" +a +a +J +c +f +f +f +f +f +f +f +f +f +f +f +c +J +b +J +b +b +J +b +a +a +a +"} +(11,1,1) = {" +a +a +J +c +g +f +f +n +s +v +f +f +f +f +f +c +J +J +J +J +J +J +b +a +a +a +"} +(12,1,1) = {" +a +a +J +c +g +f +j +o +o +o +j +f +f +f +c +d +d +c +c +d +c +J +b +a +a +a +"} +(13,1,1) = {" +a +a +J +c +h +f +k +o +t +o +k +f +f +f +c +A +B +C +B +D +c +J +J +a +a +a +"} +(14,1,1) = {" +a +a +J +c +g +f +l +o +o +w +l +f +f +f +d +B +B +G +B +B +c +J +b +b +a +a +"} +(15,1,1) = {" +a +a +J +c +i +f +f +p +u +x +f +f +f +f +d +B +E +H +B +B +c +J +J +J +a +a +"} +(16,1,1) = {" +a +b +J +c +f +f +f +f +f +f +f +f +f +f +c +B +B +C +B +B +c +b +J +b +a +a +"} +(17,1,1) = {" +a +b +J +d +f +f +f +f +f +f +f +f +f +f +c +C +F +C +B +B +c +b +b +b +a +a +"} +(18,1,1) = {" +a +b +J +d +f +f +f +f +f +f +f +f +f +f +d +B +B +B +B +B +d +b +b +b +b +a +"} +(19,1,1) = {" +a +b +J +d +f +f +f +f +f +f +f +f +f +f +z +B +B +B +B +B +d +b +b +b +b +a +"} +(20,1,1) = {" +a +a +b +c +e +f +g +q +g +y +g +f +e +f +c +B +B +B +B +B +d +b +b +b +b +a +"} +(21,1,1) = {" +a +a +b +c +c +c +c +c +c +d +d +c +c +c +d +B +B +B +B +B +d +X +b +b +b +a +"} +(22,1,1) = {" +a +a +b +b +J +J +b +b +J +J +J +J +J +J +d +D +B +B +B +B +I +U +b +b +b +a +"} +(23,1,1) = {" +a +a +a +b +b +J +J +b +b +b +b +J +b +J +c +d +d +c +d +c +d +K +b +b +b +a +"} +(24,1,1) = {" +a +a +a +a +b +b +J +J +J +b +b +b +b +J +b +b +J +J +J +J +b +b +b +b +b +a +"} +(25,1,1) = {" +a +a +a +a +a +b +b +b +J +J +J +J +b +b +b +b +b +b +a +J +J +J +b +J +b +a +"} +(26,1,1) = {" +a +a +a +a +a +a +a +a +b +b +b +a +b +b +b +b +b +a +a +a +J +J +J +J +J +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 +"} diff --git a/_maps/RandomZLevels/Academy.dmm b/_maps/RandomZLevels/Academy.dmm index 29bd7d0526..2f08d9a29e 100644 --- a/_maps/RandomZLevels/Academy.dmm +++ b/_maps/RandomZLevels/Academy.dmm @@ -3830,7 +3830,7 @@ /turf/open/floor/engine/cult, /area/awaymission/academy/academycellar) "kY" = ( -/obj/effect/decal/cleanable/xenoblood, +/obj/effect/decal/cleanable/blood/xeno, /turf/open/floor/engine/cult, /area/awaymission/academy/academycellar) "kZ" = ( diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm index a25808d933..d50480c381 100644 --- a/_maps/RandomZLevels/caves.dmm +++ b/_maps/RandomZLevels/caves.dmm @@ -873,7 +873,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/effect/decal/cleanable/xenoblood, +/obj/effect/decal/cleanable/blood/xeno, /turf/open/floor/plating{ initial_gas_mix = "n2=23;o2=14" }, @@ -945,7 +945,7 @@ /area/awaymission/caves/research) "cN" = ( /obj/machinery/door/window/eastleft, -/obj/effect/decal/cleanable/xenoblood/xgibs, +/obj/effect/decal/cleanable/blood/gibs/xeno, /turf/open/floor/plating{ initial_gas_mix = "n2=23;o2=14" }, @@ -1015,7 +1015,7 @@ }, /area/awaymission/caves/BMP_asteroid/level_two) "cV" = ( -/obj/effect/decal/cleanable/xenoblood/xgibs, +/obj/effect/decal/cleanable/blood/gibs/xeno, /turf/open/floor/plating{ initial_gas_mix = "n2=23;o2=14" }, diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm index 7edc7b4518..c251a338a5 100644 --- a/_maps/RandomZLevels/moonoutpost19.dmm +++ b/_maps/RandomZLevels/moonoutpost19.dmm @@ -5597,8 +5597,8 @@ }, /area/awaymission/moonoutpost19/arrivals) "kK" = ( -/obj/effect/decal/cleanable/xenoblood, -/obj/effect/decal/cleanable/xenoblood/xgibs, +/obj/effect/decal/cleanable/blood/xeno, +/obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 @@ -5608,7 +5608,7 @@ }, /area/awaymission/moonoutpost19/arrivals) "kL" = ( -/obj/effect/decal/cleanable/xenoblood, +/obj/effect/decal/cleanable/blood/xeno, /obj/effect/decal/remains/xeno{ desc = "They look like the remains of something... alien. The front of skull appears to have been completely obliterated." }, diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 9cd932c6d4..125da46b81 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -5898,6 +5898,15 @@ }, /turf/open/floor/plasteel, /area/security/prison) +"alN" = ( +/obj/machinery/camera{ + c_tag = "Dormitory Toilets"; + dir = 1 + }, +/obj/structure/table, +/obj/structure/bedsheetbin/towel, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet) "alO" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -9471,7 +9480,7 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, -/area/lawoffice) +/area/maintenance/fore) "avj" = ( /obj/machinery/firealarm{ dir = 8; @@ -15668,13 +15677,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"aJz" = ( -/obj/machinery/camera{ - c_tag = "Dormitory Toilets"; - dir = 1 - }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) "aJA" = ( /obj/machinery/door/airlock/maintenance{ name = "Kitchen Maintenance"; @@ -17917,6 +17919,9 @@ /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" = ( @@ -21195,6 +21200,11 @@ /obj/effect/turf_decal/stripes/corner{ dir = 2 }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-21"; + pixel_x = -3; + pixel_y = 3 + }, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aXu" = ( @@ -21295,6 +21305,9 @@ /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" = ( @@ -21933,6 +21946,9 @@ dir = 1; pixel_y = -24 }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-08" + }, /turf/open/floor/wood, /area/library) "aZe" = ( @@ -24557,6 +24573,9 @@ /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" = ( @@ -24603,6 +24622,9 @@ /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" = ( @@ -27271,11 +27293,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/sorting) -"bml" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/quartermaster/office) "bmm" = ( /obj/structure/cable{ icon_state = "1-2" @@ -28105,6 +28122,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bof" = ( @@ -28128,6 +28146,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "boi" = ( @@ -30036,6 +30055,7 @@ name = "Genetics"; req_access_txt = "5; 68" }, +/obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plasteel/white, /area/medical/genetics) "bsv" = ( @@ -30320,6 +30340,9 @@ /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" = ( @@ -32538,19 +32561,16 @@ /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/heads/hor) "byc" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/item/stamp/qm, /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" = ( @@ -32590,6 +32610,11 @@ /obj/effect/turf_decal/tile/brown{ dir = 8 }, +/obj/item/stamp/qm, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, /turf/open/floor/plasteel, /area/quartermaster/qm) "byh" = ( @@ -34728,12 +34753,7 @@ /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/machinery/bloodbankgen, /turf/open/floor/plasteel/white, /area/medical/sleeper) "bCP" = ( @@ -36513,6 +36533,11 @@ "bGR" = ( /obj/structure/table, /obj/item/hand_labeler, +/obj/item/storage/box/rxglasses, +/obj/item/storage/box/bodybags{ + pixel_x = 3; + pixel_y = 3 + }, /obj/item/gun/syringe, /turf/open/floor/plasteel/white, /area/medical/sleeper) @@ -39710,6 +39735,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/item/twohanded/required/kirbyplants, /turf/open/floor/plasteel/white/side{ dir = 1 }, @@ -57100,6 +57126,18 @@ }, /turf/open/floor/plating, /area/maintenance/port) +"hwu" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-24" + }, +/turf/open/floor/plasteel, +/area/security/prison) +"hEm" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-22" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "hRa" = ( /obj/structure/table/reinforced, /obj/machinery/light{ @@ -57386,6 +57424,10 @@ /obj/machinery/vending/wardrobe/bar_wardrobe, /turf/open/floor/wood, /area/crew_quarters/bar) +"moD" = ( +/obj/effect/landmark/barthpot, +/turf/open/floor/wood, +/area/library) "mpI" = ( /obj/structure/table/wood, /turf/open/floor/wood{ @@ -57559,6 +57601,15 @@ }, /turf/open/floor/plasteel, /area/science/circuit) +"qoW" = ( +/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) "quT" = ( /obj/structure/lattice, /obj/structure/grille/broken, @@ -57570,6 +57621,12 @@ }, /turf/open/floor/carpet, /area/crew_quarters/cryopod) +"qQP" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-14" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "rcD" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -57580,6 +57637,15 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) +"rjA" = ( +/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) "rmX" = ( /obj/structure/table, /obj/item/reagent_containers/food/drinks/beer, @@ -57723,6 +57789,12 @@ icon_state = "wood-broken5" }, /area/maintenance/bar) +"tlO" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "applebush" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "tqg" = ( /obj/machinery/cryopod{ dir = 4 @@ -57879,6 +57951,20 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"uZN" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-03" + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/entry) "vbD" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command/glass{ @@ -58053,6 +58139,20 @@ }, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) +"xFY" = ( +/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) "xIa" = ( /obj/structure/table, /obj/effect/spawner/lootdrop/grille_or_trash, @@ -67425,7 +67525,7 @@ apN apN apN apJ -awY +xFY ayk awW aAD @@ -67449,7 +67549,7 @@ aaa aaa aaa arB -awY +uZN ayk awW aAD @@ -70021,7 +70121,7 @@ awW arB awZ aym -azB +qoW awW aaf aaa @@ -79775,7 +79875,7 @@ aKt aLN aMS aOi -aLE +tlO aPK aSl aTH @@ -81083,7 +81183,7 @@ boS bfm bNK bkN -bml +bfm bwe bwe bwd @@ -81831,7 +81931,7 @@ aKA aLN aMS aOz -aLE +qQP aPQ aSa aSr @@ -85383,7 +85483,7 @@ aaG aaK aaP aaX -aat +hwu aat acd acD @@ -90050,7 +90150,7 @@ aDL aFf aGk aHU -aJz +alN aAh aLQ aJq @@ -94951,7 +95051,7 @@ aYV aYV bet bfH -bhh +hEm bhh bhg bln @@ -97287,7 +97387,7 @@ bCR bqQ bGX bCR -bqQ +rjA bRN bIK bPq @@ -102395,7 +102495,7 @@ aQq aRP aIt aIt -aIt +moD aWd aXV aIt diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index aae5ff8ff9..79b7561ebb 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -124,6 +124,36 @@ }, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) +"aaq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/table, +/obj/structure/bedsheetbin/towel, +/turf/open/floor/plasteel, +/area/crew_quarters/toilet/restrooms) +"aar" = ( +/obj/structure/table, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/bedsheetbin/color, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/crew_quarters/dorms) "aas" = ( /obj/docking_port/stationary/random{ id = "pod_lavaland1"; @@ -1010,10 +1040,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"aez" = ( -/obj/machinery/keycard_auth, -/turf/closed/wall, -/area/quartermaster/qm) "aeB" = ( /obj/machinery/status_display, /turf/closed/wall, @@ -1075,6 +1101,10 @@ "aeF" = ( /turf/open/floor/plating, /area/construction/mining/aux_base) +"aeH" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "aeR" = ( /obj/structure/closet/emcloset, /obj/effect/decal/cleanable/dirt, @@ -9270,7 +9300,6 @@ /obj/item/restraints/legcuffs/beartrap, /obj/item/restraints/legcuffs/beartrap, /obj/item/restraints/legcuffs/beartrap, -/obj/effect/decal/cleanable/cobweb, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -9288,7 +9317,6 @@ /obj/machinery/status_display{ pixel_y = 32 }, -/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, /obj/machinery/vending/wardrobe/jani_wardrobe, /obj/effect/turf_decal/tile/neutral{ @@ -9336,7 +9364,6 @@ name = "Custodial RC"; pixel_y = 32 }, -/obj/effect/decal/cleanable/dirt, /obj/machinery/camera{ c_tag = "Custodial Closet"; dir = 2; @@ -9855,22 +9882,35 @@ /turf/open/floor/plasteel, /area/janitor) "awC" = ( -/obj/effect/decal/cleanable/dirt, /obj/effect/landmark/start/janitor, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plating, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel/white, /area/janitor) "awD" = ( -/obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plating, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel/white, /area/janitor) "awE" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -9885,7 +9925,6 @@ /turf/open/floor/plasteel/white, /area/janitor) "awF" = ( -/obj/effect/decal/cleanable/dirt, /obj/effect/landmark/start/janitor, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 @@ -9905,7 +9944,6 @@ pixel_x = 32 }, /obj/item/reagent_containers/glass/bucket, -/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -10567,8 +10605,6 @@ }, /obj/item/storage/box/lights/mixed, /obj/item/lightreplacer, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -10611,7 +10647,6 @@ /turf/open/floor/plasteel, /area/janitor) "axX" = ( -/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/tile/neutral{ @@ -10639,11 +10674,21 @@ /area/janitor) "axZ" = ( /obj/structure/janitorialcart, -/obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/official/work_for_a_future{ pixel_x = 32 }, -/turf/open/floor/plating, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, /area/janitor) "aya" = ( /obj/effect/decal/cleanable/dirt, @@ -11231,7 +11276,6 @@ }, /obj/item/reagent_containers/glass/bucket, /obj/item/reagent_containers/glass/bucket, -/obj/effect/decal/cleanable/dirt, /obj/item/mop, /obj/item/mop, /obj/item/radio/intercom{ @@ -11274,15 +11318,12 @@ /obj/machinery/light_switch{ pixel_y = -26 }, -/obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ icon_state = "1-8" }, +/obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 + dir = 8 }, /turf/open/floor/plasteel/white, /area/janitor) @@ -11301,7 +11342,6 @@ /turf/open/floor/plasteel, /area/janitor) "aze" = ( -/obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ dir = 6 }, @@ -11323,7 +11363,6 @@ /obj/structure/extinguisher_cabinet{ pixel_x = 26 }, -/obj/effect/decal/cleanable/dirt, /obj/machinery/light/small, /obj/structure/disposalpipe/trunk{ dir = 8 @@ -11774,11 +11813,15 @@ /area/engine/atmospherics_engine) "aAb" = ( /turf/closed/wall, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aAc" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aAd" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ @@ -11824,7 +11867,6 @@ /turf/closed/wall, /area/janitor) "aAi" = ( -/obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock{ name = "Custodial Closet"; req_access_txt = "26" @@ -11881,6 +11923,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/maintenance/port/fore) "aAm" = ( @@ -12358,7 +12401,9 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aBh" = ( /obj/item/twohanded/required/kirbyplants/random, /obj/machinery/light/small{ @@ -12367,27 +12412,27 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aBi" = ( /obj/structure/table, /obj/item/clothing/suit/apron/overalls, /obj/item/cultivator, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aBj" = ( /obj/machinery/biogenerator, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aBk" = ( /obj/structure/table, -/obj/item/seeds/poppy/lily{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/seeds/poppy/geranium, -/obj/effect/decal/cleanable/dirt, /obj/item/reagent_containers/food/snacks/grown/wheat, /obj/item/reagent_containers/food/snacks/grown/corn, /obj/item/reagent_containers/food/snacks/grown/apple, @@ -12395,15 +12440,23 @@ /obj/machinery/airalarm{ pixel_y = 23 }, +/obj/item/seeds/poppy/lily{ + pixel_x = 4; + pixel_y = 4 + }, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aBl" = ( /obj/machinery/hydroponics/soil, /obj/item/seeds/tea, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aBm" = ( /obj/item/twohanded/required/kirbyplants/random, /obj/machinery/status_display{ @@ -12411,18 +12464,21 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aBn" = ( /obj/structure/table, /obj/item/stack/packageWrap, -/obj/effect/decal/cleanable/dirt, /obj/item/hand_labeler, /obj/item/reagent_containers/food/snacks/grown/tea, /obj/item/reagent_containers/food/snacks/grown/grapes, /obj/item/reagent_containers/food/snacks/grown/cherries, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aBo" = ( /obj/item/twohanded/required/kirbyplants/random, /obj/machinery/light/small{ @@ -12432,14 +12488,18 @@ /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aBp" = ( /obj/machinery/hydroponics/soil, /obj/item/seeds/poppy, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aBq" = ( /obj/structure/cable/white{ icon_state = "2-4" @@ -12537,7 +12597,6 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "aBx" = ( -/obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ icon_state = "4-8" }, @@ -12557,7 +12616,6 @@ /turf/open/floor/plasteel, /area/maintenance/port/fore) "aBy" = ( -/obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ icon_state = "1-8" }, @@ -12602,7 +12660,6 @@ /turf/open/floor/plasteel, /area/maintenance/port/fore) "aBB" = ( -/obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, @@ -12624,16 +12681,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"aBD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -13032,26 +13079,34 @@ /turf/closed/wall/r_wall, /area/engine/atmospherics_engine) "aCv" = ( -/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aCw" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/hydroponics/soil, +/obj/item/seeds/watermelon, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aCx" = ( -/obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aCy" = ( -/obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aCz" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -13080,13 +13135,19 @@ /turf/closed/wall, /area/maintenance/port/fore) "aCD" = ( -/obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /obj/structure/disposalpipe/segment, -/turf/open/floor/plating, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, /area/maintenance/port/fore) "aCE" = ( /obj/structure/cable/white{ @@ -13101,7 +13162,6 @@ /turf/open/floor/plasteel, /area/maintenance/port/fore) "aCF" = ( -/obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ icon_state = "4-8" }, @@ -13134,10 +13194,16 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/plating, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, /area/maintenance/port/fore) "aCI" = ( -/obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ icon_state = "4-8" }, @@ -13658,15 +13724,21 @@ }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aDy" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aDz" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aDA" = ( /obj/structure/sink{ dir = 4; @@ -13677,7 +13749,9 @@ }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aDB" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -14188,37 +14262,38 @@ /turf/open/space, /area/space/nearstation) "aEB" = ( -/obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ icon_state = "2-4" }, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aEC" = ( /obj/structure/cable/white{ icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aED" = ( -/obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aEE" = ( /obj/structure/cable/white{ icon_state = "2-8" }, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) -"aEF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aEG" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ @@ -14854,14 +14929,18 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aFK" = ( /obj/machinery/hydroponics/soil, /obj/item/seeds/harebell, /obj/machinery/light/small, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aFL" = ( /obj/structure/table, /obj/item/shovel/spade, @@ -14872,47 +14951,54 @@ pixel_x = -5 }, /obj/item/reagent_containers/syringe, -/obj/effect/decal/cleanable/dirt, /obj/structure/cable/white, /obj/machinery/power/apc{ - dir = 2; - name = "Abandoned Garden APC"; areastring = "/area/hydroponics/garden/abandoned"; + dir = 2; + name = "Maintenance Garden APC"; pixel_y = -26 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aFM" = ( -/obj/machinery/seed_extractor, /obj/machinery/status_display{ pixel_y = -32 }, -/obj/item/reagent_containers/glass/bucket, /obj/effect/turf_decal/delivery, +/obj/machinery/hydroponics/soil, +/obj/item/seeds/poppy/geranium, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aFN" = ( /obj/structure/table, /obj/item/plant_analyzer, /obj/item/hatchet, -/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aFO" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aFP" = ( -/obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ icon_state = "1-2" }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aFQ" = ( /obj/structure/table, /obj/item/crowbar, @@ -14920,7 +15006,9 @@ /obj/item/reagent_containers/glass/bucket, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aFR" = ( /obj/machinery/hydroponics/soil, /obj/item/seeds/tower, @@ -14929,7 +15017,9 @@ /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aFS" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -15021,6 +15111,9 @@ location = "Bar" }, /obj/effect/turf_decal/delivery, +/obj/machinery/door/window/eastleft{ + req_access_txt = "25" + }, /turf/open/floor/plasteel, /area/crew_quarters/bar) "aGc" = ( @@ -15922,18 +16015,16 @@ /area/engine/atmospherics_engine) "aHl" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/barricade/wooden, /turf/open/floor/plating, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aHm" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch"; req_access_txt = "12" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/barricade/wooden, /obj/effect/turf_decal/stripes/line{ dir = 2 }, @@ -15941,17 +16032,17 @@ dir = 1 }, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aHn" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch"; req_access_txt = "12" }, -/obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ icon_state = "1-2" }, -/obj/structure/barricade/wooden, /obj/effect/turf_decal/stripes/line{ dir = 2 }, @@ -15959,13 +16050,16 @@ dir = 1 }, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aHo" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/barricade/wooden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, -/area/hydroponics/garden/abandoned) +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "aHp" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ @@ -16794,7 +16888,6 @@ /turf/open/floor/plasteel, /area/maintenance/port/fore) "aII" = ( -/obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, @@ -16808,7 +16901,8 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/plating, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, /area/maintenance/port/fore) "aIK" = ( /obj/structure/cable/white{ @@ -16818,10 +16912,18 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, /area/maintenance/port/fore) "aIL" = ( -/obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ icon_state = "4-8" }, @@ -17687,10 +17789,16 @@ /area/engine/atmospherics_engine) "aKg" = ( /obj/structure/closet/emcloset, -/turf/open/floor/plating, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, /area/maintenance/port/fore) "aKh" = ( -/obj/effect/decal/cleanable/dirt, /obj/structure/rack, /obj/effect/spawner/lootdrop/maintenance{ lootcount = 2; @@ -17704,7 +17812,11 @@ /area/maintenance/port/fore) "aKi" = ( /obj/structure/closet, -/turf/open/floor/plating, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, /area/maintenance/port/fore) "aKj" = ( /obj/effect/decal/cleanable/dirt, @@ -17715,16 +17827,20 @@ /turf/open/floor/plasteel, /area/maintenance/port/fore) "aKk" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/maintenance/port/fore) "aKl" = ( /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, @@ -21299,6 +21415,9 @@ location = "Theatre" }, /obj/effect/turf_decal/delivery, +/obj/machinery/door/window/westleft{ + req_access_txt = "46" + }, /turf/open/floor/plasteel, /area/crew_quarters/theatre) "aQj" = ( @@ -26153,6 +26272,9 @@ dir = 4 }, /obj/effect/turf_decal/delivery, +/obj/machinery/door/window/eastright{ + req_one_access_txt = "48,50" + }, /turf/open/floor/plasteel, /area/quartermaster/office) "aXg" = ( @@ -27548,7 +27670,6 @@ /turf/open/floor/plasteel, /area/quartermaster/qm) "aZh" = ( -/obj/structure/table/reinforced, /obj/machinery/light{ dir = 4 }, @@ -27559,6 +27680,9 @@ /obj/effect/turf_decal/tile/brown{ dir = 8 }, +/obj/machinery/computer/card/minor/qm{ + dir = 8 + }, /turf/open/floor/plasteel, /area/quartermaster/qm) "aZi" = ( @@ -29213,6 +29337,9 @@ location = "Kitchen" }, /obj/effect/turf_decal/delivery, +/obj/machinery/door/window/eastleft{ + req_access_txt = "28" + }, /turf/open/floor/plasteel, /area/crew_quarters/kitchen) "bcd" = ( @@ -30865,6 +30992,9 @@ location = "Hydroponics" }, /obj/effect/turf_decal/delivery, +/obj/machinery/door/window/westleft{ + req_access_txt = "35" + }, /turf/open/floor/plasteel, /area/hallway/secondary/service) "beW" = ( @@ -36055,6 +36185,9 @@ /obj/structure/plasticflaps/opaque, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, +/obj/machinery/door/window/northright{ + req_access_txt = "48" + }, /turf/open/floor/plasteel, /area/maintenance/starboard/fore) "bnB" = ( @@ -39195,13 +39328,6 @@ name = "Hydroponics Desk"; req_access_txt = "35" }, -/obj/item/seeds/lime{ - pixel_x = 6 - }, -/obj/item/seeds/watermelon, -/obj/item/seeds/grape{ - pixel_x = -6 - }, /obj/item/reagent_containers/food/snacks/grown/wheat, /obj/item/reagent_containers/food/snacks/grown/watermelon, /obj/item/reagent_containers/food/snacks/grown/banana, @@ -41789,6 +41915,9 @@ location = "Atmospherics" }, /obj/effect/turf_decal/delivery, +/obj/machinery/door/window/westleft{ + req_access_txt = "24" + }, /turf/open/floor/plasteel, /area/engine/atmos) "bwH" = ( @@ -71753,6 +71882,9 @@ location = "Security" }, /obj/effect/turf_decal/delivery, +/obj/machinery/door/window/northleft{ + req_access_txt = "63" + }, /turf/open/floor/plasteel, /area/security/range) "cqh" = ( @@ -80743,21 +80875,6 @@ }, /turf/open/floor/plating, /area/crew_quarters/toilet/restrooms) -"cFc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/toilet/restrooms) "cFd" = ( /obj/machinery/shower{ dir = 8; @@ -82547,6 +82664,9 @@ location = "Engineering" }, /obj/effect/turf_decal/delivery, +/obj/machinery/door/window/northright{ + req_access_txt = "10" + }, /turf/open/floor/plasteel, /area/engine/engineering) "cIr" = ( @@ -84247,19 +84367,6 @@ /obj/item/reagent_containers/dropper, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"cKT" = ( -/obj/structure/table, -/obj/structure/bedsheetbin, -/obj/machinery/light{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/crew_quarters/dorms) "cKU" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral{ @@ -87734,6 +87841,9 @@ location = "Medbay" }, /obj/effect/turf_decal/delivery, +/obj/machinery/door/window/westleft{ + req_access_txt = "5" + }, /turf/open/floor/plasteel, /area/medical/storage) "cRl" = ( @@ -88597,6 +88707,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, /turf/open/floor/plasteel, /area/medical/medbay/central) "cSK" = ( @@ -89119,7 +89232,7 @@ /area/maintenance/port) "cTz" = ( /obj/effect/decal/remains/xeno, -/obj/effect/decal/cleanable/xenoblood, +/obj/effect/decal/cleanable/blood/xeno, /turf/open/floor/circuit/green, /area/science/xenobiology) "cTA" = ( @@ -89771,6 +89884,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, /turf/open/floor/plasteel, /area/medical/medbay/central) "cUD" = ( @@ -92897,10 +93013,10 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cZK" = ( -/obj/item/twohanded/required/kirbyplants/random, /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/machinery/bloodbankgen, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cZL" = ( @@ -114081,6 +114197,9 @@ location = "Robotics" }, /obj/effect/turf_decal/delivery, +/obj/machinery/door/window/northright{ + req_access_txt = "47" + }, /turf/open/floor/plasteel, /area/science/robotics/lab) "dKl" = ( @@ -120412,7 +120531,6 @@ name = "Station Intercom"; pixel_x = -26 }, -/obj/item/clothing/under/burial, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -122476,14 +122594,19 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "dZM" = ( -/obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, -/turf/open/floor/plating, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, /area/maintenance/port/aft) "dZN" = ( /turf/closed/wall/r_wall, @@ -122835,11 +122958,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, -/obj/machinery/button/crematorium{ - id = "cremawheat"; - pixel_x = -26; - req_access_txt = "27" - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -123160,24 +123278,6 @@ /obj/structure/sign/nanotrasen, /turf/closed/wall/r_wall, /area/maintenance/port/aft) -"ebd" = ( -/obj/structure/bodycontainer/morgue, -/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/chapel/office) "ebe" = ( /obj/machinery/light{ dir = 4 @@ -123536,12 +123636,6 @@ /turf/open/floor/plasteel, /area/maintenance/port/aft) "ebS" = ( -/obj/structure/table, -/obj/item/storage/box/gloves{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/box/bodybags, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -123552,6 +123646,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/chapel/office) "ebT" = ( @@ -123827,6 +123924,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/closet/crate/coffin, /turf/open/floor/plasteel/dark, /area/chapel/office) "ecx" = ( @@ -126276,6 +126374,20 @@ }, /turf/open/floor/plasteel/dark, /area/library) +"enO" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/bodycontainer/morgue, +/turf/open/floor/plasteel/dark, +/area/chapel/office) "exE" = ( /obj/machinery/air_sensor/atmos/toxins_mixing_tank, /turf/open/floor/engine/vacuum, @@ -126408,13 +126520,6 @@ /obj/machinery/door/airlock/research/glass/incinerator/toxmix_interior, /turf/open/floor/engine, /area/science/mixing) -"fwr" = ( -/obj/machinery/door/poddoor{ - id = "chapelgun"; - name = "Chapel Launcher Door" - }, -/turf/open/floor/plating, -/area/chapel/office) "fFK" = ( /obj/machinery/ore_silo, /obj/effect/turf_decal/tile/neutral{ @@ -126469,6 +126574,10 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, /area/science/circuit) +"gFk" = ( +/obj/structure/grille, +/turf/open/space, +/area/space/nearstation) "gJj" = ( /obj/machinery/door/window/northleft{ name = "Mass Driver" @@ -126510,6 +126619,10 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, +/obj/machinery/airalarm{ + dir = 2; + pixel_y = 22 + }, /turf/open/floor/plasteel/dark, /area/chapel/office) "gNS" = ( @@ -126536,6 +126649,20 @@ /obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white, /area/science/research) +"gQw" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel{ + heat_capacity = 1e+006 + }, +/area/maintenance/port/aft) "gQS" = ( /turf/open/floor/plasteel/white/side{ dir = 9 @@ -126680,11 +126807,50 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/science/research) +"ibC" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/hydroponics/soil, +/obj/item/seeds/lime{ + pixel_x = 6 + }, +/turf/open/floor/plasteel, +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) +"iiH" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/port/fore) +"ijd" = ( +/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/chapel/office) "ijB" = ( /obj/structure/reagent_dispensers/keg/aphro/strong, /obj/item/reagent_containers/glass/beaker, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) +"ivF" = ( +/obj/machinery/door/poddoor{ + id = "chapelgun"; + name = "Chapel Launcher Door" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/chapel/office) "iwL" = ( /obj/machinery/status_display{ pixel_x = 32 @@ -126771,6 +126937,18 @@ /turf/open/floor/plasteel, /area/science/research/abandoned) "jhK" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 2; + name = "2maintenance loot spawner" + }, +/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/maintenance/port/aft) "jjN" = ( @@ -126881,15 +127059,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/computer/pod/old{ - density = 0; - icon = 'icons/obj/airlock_machines.dmi'; - icon_state = "airlock_control_standby"; - id = "chapelgun"; - name = "Mass Driver Controller"; - pixel_x = 0; - pixel_y = -24 - }, /turf/open/floor/plasteel/dark, /area/chapel/office) "jRy" = ( @@ -126945,6 +127114,31 @@ }, /turf/open/floor/plasteel, /area/maintenance/port) +"kzw" = ( +/obj/machinery/button/crematorium{ + id = "cremawheat"; + pixel_x = -26; + req_access_txt = "27" + }, +/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/table, +/obj/item/clothing/under/burial, +/obj/item/clothing/under/burial, +/obj/item/clothing/under/burial, +/obj/item/clothing/under/burial, +/obj/item/clothing/under/burial, +/obj/item/clothing/under/burial, +/turf/open/floor/plasteel/dark, +/area/chapel/office) "kLu" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -126960,6 +127154,10 @@ }, /turf/open/floor/plasteel/white, /area/science/mixing) +"kZu" = ( +/obj/effect/landmark/barthpot, +/turf/open/floor/wood, +/area/library) "lak" = ( /turf/open/floor/plasteel/white/side{ dir = 10 @@ -127109,6 +127307,14 @@ dir = 1 }, /area/science/circuit) +"mdk" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light/small, +/turf/open/floor/plasteel, +/area/maintenance/port/fore) "mkm" = ( /obj/machinery/atmospherics/components/binary/valve, /obj/machinery/embedded_controller/radio/airlock_controller/incinerator_toxmix{ @@ -127189,7 +127395,11 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel/dark, /area/chapel/office) -"nht" = ( +"nyN" = ( +/obj/machinery/vending/kink, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) +"nOV" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 }, @@ -127200,17 +127410,54 @@ dir = 4 }, /obj/effect/turf_decal/tile/neutral, -/obj/machinery/light, +/obj/machinery/light{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/chapel/office) -"nyN" = ( -/obj/machinery/vending/kink, -/turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den) "nSh" = ( /obj/machinery/atmospherics/pipe/simple/general/hidden, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) +"oaP" = ( +/obj/machinery/seed_extractor, +/obj/item/reagent_containers/glass/bucket, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) +"obe" = ( +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/maintenance/port/fore) +"ost" = ( +/obj/structure/filingcabinet/chestdrawer, +/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_x = -25 + }, +/turf/open/floor/plasteel, +/area/quartermaster/qm) "owr" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -127224,6 +127471,29 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel/dark, /area/chapel/office) +"owI" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/port/fore) +"ozr" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/hydroponics/soil, +/obj/item/seeds/grape, +/turf/open/floor/plasteel, +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "oIl" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 @@ -127273,6 +127543,19 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) +"oOb" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/door/window{ + req_one_access_txt = "48,50" + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) "oSD" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/manifold/general/visible{ @@ -127363,6 +127646,15 @@ }, /turf/open/floor/plating, /area/science/research/abandoned) +"pHf" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/port/fore) "pQm" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ @@ -127408,6 +127700,13 @@ }, /turf/open/floor/plating, /area/chapel/office) +"rbY" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/closet/crate/coffin, +/turf/open/floor/plating, +/area/chapel/office) "rhO" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 @@ -127455,6 +127754,16 @@ }, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) +"rYR" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/port/aft) "saw" = ( /turf/closed/wall, /area/science/circuit) @@ -127466,6 +127775,13 @@ /obj/machinery/door/poddoor/incinerator_toxmix, /turf/open/floor/engine/vacuum, /area/science/mixing) +"tbC" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/maintenance/port/fore) "tmi" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -127479,14 +127795,57 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) +"tAi" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/maintenance/port/fore) "tCh" = ( /turf/closed/wall, /area/science/misc_lab) +"tEW" = ( +/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/bodycontainer/morgue, +/turf/open/floor/plasteel/dark, +/area/chapel/office) "tMk" = ( /turf/open/floor/plasteel/white/side{ dir = 10 }, /area/science/misc_lab) +"tOQ" = ( +/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/turf_decal/tile/neutral, +/obj/machinery/computer/pod/old{ + density = 0; + icon = 'icons/obj/airlock_machines.dmi'; + icon_state = "airlock_control_standby"; + id = "chapelgun"; + name = "Mass Driver Controller"; + pixel_x = -24 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) "tRT" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -127557,14 +127916,6 @@ }, /turf/open/floor/engine, /area/engine/supermatter) -"uZN" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, -/turf/open/floor/plasteel, -/area/maintenance/port/aft) "vhA" = ( /obj/item/clothing/under/color/grey, /turf/open/floor/plating, @@ -127578,10 +127929,45 @@ }, /turf/open/floor/plasteel/white, /area/science/mixing) +"vFw" = ( +/obj/machinery/door/window/northright{ + name = "Coffin Storage" + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/closet/crate/coffin, +/turf/open/floor/plating, +/area/chapel/office) +"vON" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/structure/cable/white{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/port/aft) "wei" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/science/circuit) +"whX" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/port/fore) "wAA" = ( /obj/structure/sign/nanotrasen, /turf/closed/wall/r_wall, @@ -127703,9 +128089,6 @@ /turf/open/floor/plasteel, /area/science/research) "xWZ" = ( -/obj/structure/bodycontainer/morgue{ - dir = 2 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, @@ -156627,7 +157010,7 @@ arB aug alg alg -aAd +whX aKg alf aMO @@ -156884,7 +157267,7 @@ aAb aAb aAb aAb -arB +pHf aKh alf aMN @@ -157138,11 +157521,11 @@ aAb aBg aCv aDx -aCw +aCv aFJ aAb aIH -aoY +tAi alf aMP aDw @@ -157393,8 +157776,8 @@ axI ayU aAb aBh -aCw -aCw +aCv +aCv aCv aFK aHl @@ -157650,13 +158033,13 @@ axJ aoY aAb aBi -aCw +aCv aCw aEB aFL aAb -arB -alg +aIH +tbC avm arB arB @@ -157908,11 +158291,11 @@ alf aAb aBj aCv -aCw +oaP aEC aFM aAb -alg +aIH ary aLz aLz @@ -158039,7 +158422,7 @@ edL eep eff aad -ajr +aeH aaa ajr aaa @@ -158165,11 +158548,11 @@ alg aAb aBk aCv -aCw +ozr aEC aFN aAb -arA +aIH aKi aLz aMQ @@ -158296,7 +158679,7 @@ edM eeq dLY aad -aad +gFk aaa aad aaa @@ -158421,13 +158804,13 @@ axL ayV aAb aBl -aCw +aCv aDy aED aFO aHm aII -aKj +mdk aLz aMR aOq @@ -158678,13 +159061,13 @@ axM ayW aAb aBm -aCw -aCw +aCv +aCv aEE aFP aHn aIJ -aKj +iiH aLz aMS aOr @@ -158936,12 +159319,12 @@ ayX aAb aBn aCx -aCw -aCw +ibC +aCv aFQ aAb -asQ -arB +owI +iiH aLz aMT aOs @@ -159194,7 +159577,7 @@ aAc aBo aCy aDz -aEF +aDz aFR aHo aIK @@ -159314,7 +159697,7 @@ dXz dYt dON dOl -eap +vON eaX dYu ect @@ -159449,7 +159832,7 @@ alf alf aAb aBp -aCw +aCv aDA aCv aFJ @@ -159570,8 +159953,8 @@ dON dON dON dON -dZJ -ean +gQw +rYR ebc ebQ ecu @@ -159712,7 +160095,7 @@ aAb aAb aAb aIL -arB +tbC aLz aLz aLz @@ -159835,10 +160218,10 @@ dZN dZN fHS dZN -dLY +dZN dLY aad -ajr +aeH aad aad aaa @@ -159969,7 +160352,7 @@ aEG aFS aHp aIM -aEG +obe aLB aFS aEG @@ -160084,15 +160467,15 @@ dWJ dLW dYu dZg -jhK +hLO jhK dZN owr -mXJ +nOV +tOQ gJj qMR -fwr -aaa +ivF aaa iyd aaa @@ -160273,7 +160656,7 @@ caG chU cjt ckR -cmt +kZu cnR cpv cqQ @@ -160341,15 +160724,15 @@ dTw dTw dTw dTw -hLO -uZN +dZN +dZN hei gNJ jPA +jPA +vFw +rbY dTw -dTw -dTw -aad aad aad aad @@ -160590,7 +160973,7 @@ dPJ dQC dRB dSz -dTx +tEW dUi dTx dVN @@ -160598,11 +160981,11 @@ dTx dXB dYv dTw -dZN -dZN -dZN +dZO +kzw +enO xWZ -nht +mXJ dTw dTw dTw @@ -160855,9 +161238,9 @@ dUj dXC dYw dZh -dZO +ijd eau -ebd +edr ebS ecw dTw @@ -162790,7 +163173,7 @@ axX azd aAj aBA -asQ +asK aDL aEO aGc @@ -163047,7 +163430,7 @@ axY aze aAk aBB -asM +asK aDL aEP aGd @@ -163560,7 +163943,7 @@ auh auh auh auh -aBD +aBz aCG aDL aER @@ -167677,7 +168060,7 @@ aCP avQ aFe aGp -aHH +oOb aJg aKF aLP @@ -172364,7 +172747,7 @@ bsE cAm cBI cDo -cFc +aaq cAm cHW cIW @@ -174623,7 +175006,7 @@ aaa aaa aad aQQ -aez +aQQ aUp aVY aXE @@ -174880,7 +175263,7 @@ aaa aaa aad aQR -aSs +ost aUq aVR aXF @@ -176737,7 +177120,7 @@ cFr cGP cqd cJe -cKT +aar cMq cAw cPM diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 13f774d25d..522d9801ca 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -2,6 +2,17 @@ "aaa" = ( /turf/open/space/basic, /area/space) +"aab" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/structure/sign/poster/official/random{ + pixel_y = -32 + }, +/obj/structure/table, +/obj/structure/bedsheetbin/towel, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/restrooms) "aac" = ( /obj/effect/landmark/carpspawn, /turf/open/space, @@ -20376,6 +20387,7 @@ /obj/machinery/keycard_auth{ pixel_y = 23 }, +/obj/item/clipboard, /turf/open/floor/plasteel, /area/quartermaster/qm) "aNS" = ( @@ -21064,6 +21076,7 @@ departmentType = 2; pixel_x = 32 }, +/obj/item/stamp/qm, /turf/open/floor/plasteel, /area/quartermaster/qm) "aPl" = ( @@ -21619,12 +21632,12 @@ /turf/open/floor/plasteel, /area/quartermaster/qm) "aQt" = ( -/obj/structure/table, -/obj/item/clipboard, -/obj/item/stamp/qm, /obj/machinery/status_display/supply{ pixel_x = 32 }, +/obj/machinery/computer/card/minor/qm{ + dir = 8 + }, /turf/open/floor/plasteel, /area/quartermaster/qm) "aQu" = ( @@ -43775,6 +43788,7 @@ /turf/open/floor/wood, /area/library) "bGt" = ( +/obj/effect/landmark/barthpot, /turf/open/floor/wood{ icon_state = "wood-broken7" }, @@ -56591,11 +56605,6 @@ /turf/open/floor/plasteel/dark, /area/medical/sleeper) "cfK" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 4 - }, /obj/machinery/light_switch{ pixel_x = 11; pixel_y = 23 @@ -56610,6 +56619,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/bloodbankgen, /turf/open/floor/plasteel/dark, /area/medical/sleeper) "cfL" = ( @@ -57384,6 +57394,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cha" = ( @@ -57404,6 +57415,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "chb" = ( @@ -66401,6 +66413,9 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/medical/genetics/cloning) "cxZ" = ( @@ -78455,6 +78470,7 @@ /turf/open/floor/engine, /area/science/xenobiology) "dbq" = ( +/mob/living/simple_animal/hostile/retaliate/goose, /turf/open/floor/wood{ icon_state = "wood-broken6" }, @@ -80877,15 +80893,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/warehouse) -"dhD" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/structure/sign/poster/official/random{ - pixel_y = -32 - }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet/restrooms) "dhE" = ( /obj/structure/sign/poster/contraband/random{ pixel_x = 32 @@ -118782,7 +118789,7 @@ aBu aCB aDU aFg -dhD +aab axC axC axC diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index 0c55f05fcb..a87c17836c 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -955,6 +955,19 @@ }, /turf/open/floor/plasteel/dark, /area/bridge) +"abn" = ( +/obj/structure/table, +/obj/machinery/camera{ + c_tag = "Locker Room East"; + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/bedsheetbin/color, +/turf/open/floor/plasteel/white/corner, +/area/crew_quarters/dorms) "abo" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -15282,19 +15295,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) -"aAJ" = ( -/obj/structure/table, -/obj/structure/bedsheetbin, -/obj/machinery/camera{ - c_tag = "Locker Room East"; - dir = 8 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/white/corner, -/area/crew_quarters/dorms) "aAK" = ( /obj/structure/sign/poster/random, /turf/closed/wall, @@ -26273,7 +26273,7 @@ /turf/open/floor/wood, /area/library) "aUZ" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/effect/landmark/barthpot, /turf/open/floor/wood, /area/library) "aVa" = ( @@ -27287,6 +27287,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, /turf/open/floor/plasteel, /area/medical/medbay/zone3) "aWM" = ( @@ -28598,6 +28601,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, /turf/open/floor/plasteel, /area/medical/medbay/zone3) "aYU" = ( @@ -29134,6 +29140,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, /turf/open/floor/plasteel, /area/medical/medbay/zone3) "aZQ" = ( @@ -30064,10 +30073,8 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/zone3) "bbs" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21" - }, /obj/effect/turf_decal/tile/blue, +/obj/machinery/bloodbankgen, /turf/open/floor/plasteel/white, /area/medical/medbay/zone3) "bbt" = ( @@ -43068,7 +43075,7 @@ /turf/open/floor/plasteel, /area/engine/atmos) "vsf" = ( -/obj/effect/decal/cleanable/xenoblood/xgibs, +/obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -82325,7 +82332,7 @@ awQ axK ayC awQ -aAJ +abn aBT awQ aDI diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 7e4f54c8b4..698eb6cd5a 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -2,6 +2,33 @@ "aaa" = ( /turf/open/space/basic, /area/space) +"aab" = ( +/obj/machinery/newscaster{ + pixel_x = 32 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/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/dorms) +"aac" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/structure/table, +/obj/structure/bedsheetbin/towel, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/restrooms) "aad" = ( /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating{ @@ -7254,22 +7281,6 @@ }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/dorms) -"asg" = ( -/obj/structure/bedsheetbin, -/obj/machinery/newscaster{ - pixel_x = 32 - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/dorms) "ash" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -14880,15 +14891,6 @@ }, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/restrooms) -"aJo" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet/restrooms) "aJp" = ( /obj/item/chair, /turf/open/floor/plating, @@ -24136,8 +24138,7 @@ dir = 8 }, /obj/machinery/keycard_auth{ - pixel_x = -23; - pixel_y = 0 + pixel_x = -23 }, /turf/open/floor/plasteel, /area/quartermaster/qm) @@ -24477,16 +24478,11 @@ /turf/open/floor/plasteel/dark, /area/science/robotics/mechbay) "bfB" = ( -/obj/structure/table, /obj/machinery/requests_console{ department = "Cargo Bay"; departmentType = 2; pixel_x = -30 }, -/obj/item/paper_bin{ - layer = 2.9 - }, -/obj/item/pen, /obj/effect/turf_decal/tile/brown{ dir = 1 }, @@ -24494,6 +24490,9 @@ /obj/effect/turf_decal/tile/brown{ dir = 8 }, +/obj/machinery/computer/card/minor/qm{ + dir = 4 + }, /turf/open/floor/plasteel, /area/quartermaster/qm) "bfC" = ( @@ -27566,6 +27565,7 @@ }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plasteel/freezer, /area/storage/emergency/port) "bnx" = ( @@ -29314,6 +29314,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, /turf/open/floor/plasteel/white, /area/medical/genetics) "brb" = ( @@ -30153,6 +30156,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bsI" = ( @@ -30164,6 +30168,7 @@ name = "Medbay" }, /obj/effect/turf_decal/tile/blue, +/obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bsJ" = ( @@ -31866,14 +31871,11 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - pixel_y = 3 - }, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/bloodbankgen, /turf/open/floor/plasteel/white, /area/medical/sleeper) "bwG" = ( @@ -54387,6 +54389,10 @@ }, /turf/open/floor/plating, /area/maintenance/department/cargo) +"ggg" = ( +/mob/living/simple_animal/hostile/retaliate/goose, +/turf/open/floor/wood, +/area/maintenance/department/crew_quarters/dorms) "gih" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 @@ -60870,6 +60876,10 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) +"vkd" = ( +/obj/effect/landmark/barthpot, +/turf/open/floor/carpet, +/area/library/lounge) "vlF" = ( /obj/item/coin/silver, /obj/effect/decal/cleanable/oil{ @@ -62094,6 +62104,7 @@ name = "Port Emergency Storage"; req_access_txt = "0" }, +/obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plasteel/freezer, /area/storage/emergency/port) "xSX" = ( @@ -79865,7 +79876,7 @@ ckT xhj xhj cwK -xhj +vkd xhj cxn xhj @@ -99275,7 +99286,7 @@ cBk jhD cBo alQ -alb +ggg cBw noC aiS @@ -100830,7 +100841,7 @@ aiT aiS apX cod -asg +aab atj apX avi @@ -102389,7 +102400,7 @@ aFH aGG aHo aIk -aJo +aac aGF aEd aMr diff --git a/_maps/map_files/generic/City_of_Cogs.dmm b/_maps/map_files/generic/City_of_Cogs.dmm index 889abe66c3..584564ba2a 100644 --- a/_maps/map_files/generic/City_of_Cogs.dmm +++ b/_maps/map_files/generic/City_of_Cogs.dmm @@ -47,11 +47,6 @@ /obj/machinery/sleeper/clockwork, /turf/open/floor/clockwork/reebe, /area/reebe/city_of_cogs) -"am" = ( -/obj/structure/table/reinforced/brass, -/obj/item/storage/firstaid, -/turf/open/floor/clockwork/reebe, -/area/reebe/city_of_cogs) "an" = ( /obj/structure/noticeboard, /obj/item/paper/fluff/ruins/djstation{ @@ -84,15 +79,6 @@ }, /turf/open/floor/clockwork/reebe, /area/reebe/city_of_cogs) -"at" = ( -/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, -/turf/open/floor/clockwork/reebe, -/area/reebe/city_of_cogs) "au" = ( /obj/structure/table/reinforced/brass, /obj/item/radio/intercom/ratvar, @@ -333,6 +319,10 @@ /obj/structure/window/reinforced/clockwork/fulltile, /turf/open/indestructible/clock_spawn_room, /area/reebe/city_of_cogs) +"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, @@ -349,17227 +339,17367 @@ }, /turf/open/indestructible/clock_spawn_room, /area/reebe/city_of_cogs) +"bE" = ( +/obj/structure/table/reinforced/brass, +/obj/item/storage/firstaid, +/obj/item/healthanalyzer/advanced, +/obj/item/healthanalyzer/advanced, +/obj/item/healthanalyzer/advanced, +/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, +/area/reebe/city_of_cogs) +"nj" = ( +/obj/structure/table/bronze, +/turf/open/indestructible/clock_spawn_room, +/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, +/obj/item/storage/belt/utility/servant, +/obj/item/storage/belt/utility/servant, +/turf/open/floor/clockwork/reebe, +/area/reebe/city_of_cogs) +"zb" = ( +/turf/open/space/basic, +/area/space) +"EE" = ( +/obj/structure/table/bronze, +/obj/item/camera, +/turf/open/indestructible/clock_spawn_room, +/area/reebe/city_of_cogs) +"Nz" = ( +/obj/structure/table/bronze, +/obj/item/implantcase, +/obj/item/implantcase, +/obj/item/implantcase, +/obj/item/implanter, +/obj/item/storage/backpack/duffelbag/sec/surgery, +/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" = ( +/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, +/turf/open/floor/clockwork/reebe, +/area/reebe/city_of_cogs) +"WT" = ( +/turf/closed/wall/clockwork, +/area/reebe) +"Yy" = ( +/obj/structure/table/optable, +/turf/open/floor/clockwork/reebe, +/area/reebe/city_of_cogs) (1,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (2,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (3,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (4,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (5,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (6,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (7,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (8,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (9,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (10,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (11,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (12,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (13,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (14,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (15,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (16,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (17,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (18,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (19,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (20,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (21,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (22,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (23,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (24,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (25,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (26,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (27,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (28,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (29,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (30,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (31,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (32,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (33,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (34,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (35,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (36,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (37,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (38,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (39,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (40,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (41,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (42,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (43,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (44,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (45,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (46,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (47,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (48,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (49,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (50,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (51,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (52,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (53,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (54,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (55,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (56,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (57,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (58,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (59,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (60,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (61,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (62,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (63,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (64,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (65,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (66,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (67,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (68,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -17677,156 +17807,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (69,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -17934,156 +18064,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (70,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -18191,156 +18321,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (71,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -18448,156 +18578,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (72,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -18705,156 +18835,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (73,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -18962,156 +19092,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (74,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -19219,156 +19349,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (75,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -19476,156 +19606,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (76,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -19733,156 +19863,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (77,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -19990,156 +20120,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (78,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -20247,156 +20377,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (79,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -20504,156 +20634,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (80,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -20761,156 +20891,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (81,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -21018,156 +21148,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (82,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -21275,156 +21405,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (83,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -21532,156 +21662,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (84,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -21789,156 +21919,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (85,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -22046,156 +22176,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (86,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -22303,156 +22433,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (87,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -22560,156 +22690,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (88,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -22817,156 +22947,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (89,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -23074,156 +23204,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (90,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -23331,156 +23461,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (91,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -23588,156 +23718,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (92,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -23845,156 +23975,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (93,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -24102,156 +24232,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (94,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -24359,156 +24489,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (95,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -24554,6 +24684,7 @@ aa aa aa aa +ab aa aa aa @@ -24615,157 +24746,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (96,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -24791,6 +24921,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 @@ -24821,1805 +25003,670 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (97,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (98,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (99,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(100,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(101,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(102,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(103,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -26671,6 +25718,16 @@ ab ab ab ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab aF ab ab @@ -26717,166 +25774,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(104,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(100,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -26928,6 +25975,16 @@ ab ab ab ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab aF ab ab @@ -26974,166 +26031,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(105,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(101,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -27185,6 +26232,16 @@ ab ab ab ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab aF ab ab @@ -27231,166 +26288,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(106,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(102,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -27442,6 +26489,16 @@ ab ab ab ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab aF ab ab @@ -27488,180 +26545,180 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(107,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(103,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT +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 @@ -27745,166 +26802,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(108,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(104,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -27956,6 +27003,16 @@ ab ab ab ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aF aF ab ab @@ -28002,166 +27059,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(109,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(105,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -28213,6 +27260,16 @@ ab ab aF aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aG aY ae ae @@ -28259,164 +27316,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(110,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(106,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -28448,8 +27497,16 @@ ab ab ab ab -ab -ab +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF aF aF aF @@ -28491,8 +27548,8 @@ aT aT aT aT -aT -aT +nj +nj ah ah ah @@ -28516,111 +27573,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(111,1,1) = {" +(107,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -28635,61 +27737,6 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 @@ -28727,6 +27774,16 @@ aG aG aG aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aj aS bu bu @@ -28748,8 +27805,8 @@ aT aT aT aT -aT -aT +xH +EE bo aX bo @@ -28773,168 +27830,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(112,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(108,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -28956,13 +28001,15 @@ ab ab ab ab +ab +ab ae ag ag ah ar aj -aj +bt ah aj aj @@ -28984,6 +28031,16 @@ aj aj aj aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj aS bw bw @@ -29005,8 +28062,8 @@ aT aR aT aR -aT -aT +eV +NH bo aZ bo @@ -29030,168 +28087,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(113,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(109,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -29213,6 +28258,8 @@ ab ab ab ab +ab +ab ae ag ag @@ -29241,6 +28288,16 @@ aj aj aj aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj aS aT aT @@ -29262,8 +28319,8 @@ aT aT aT aT -aT -aT +xH +nj bo ba bo @@ -29287,167 +28344,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(114,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(110,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -29470,13 +28516,14 @@ ab ab ab ab +ab ae ag ag ah -at -aj +VP aj +ym ah aj aj @@ -29498,6 +28545,16 @@ aj aj aj aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj aS aT aT @@ -29519,8 +28576,8 @@ aT aR aT aR -aT -aT +eV +nj bo bb bo @@ -29544,167 +28601,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(115,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(111,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -29728,6 +28774,7 @@ ab ab ab ab +ab ae ae ah @@ -29755,6 +28802,16 @@ aj aj aj aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj aS aT aT @@ -29776,8 +28833,8 @@ aT aT aT aT -aT -aT +xH +ww bo bc bo @@ -29801,167 +28858,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(116,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(112,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -29986,6 +29032,7 @@ ab ab ab ab +ab ae an au @@ -30012,6 +29059,16 @@ aj aj aj aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj aS aT aT @@ -30033,8 +29090,8 @@ aT aR aT aR -aT -aT +eV +nj bo bd bo @@ -30058,167 +29115,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(117,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(113,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -30243,6 +29289,7 @@ ab ab ab ab +ab ah ah av @@ -30269,6 +29316,16 @@ aj aj aj aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj aS aT aT @@ -30290,8 +29347,8 @@ aT aT aT aT -aT -aT +xH +nj bo be bo @@ -30315,167 +29372,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(118,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(114,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -30499,6 +29545,7 @@ ab ab ab ab +ab ae ai ao @@ -30526,6 +29573,16 @@ aj aj aj aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj aS aT aT @@ -30547,8 +29604,8 @@ aT aT aT aT -aT -aT +EE +nj ah ah ah @@ -30572,167 +29629,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(119,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(115,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -30756,6 +29802,7 @@ ab ab ab ab +ab ae ah ah @@ -30783,6 +29830,16 @@ aj aj aj aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj aS aT aT @@ -30829,167 +29886,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(120,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(116,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -31011,6 +30057,7 @@ ab ab ab ab +ab ae ae ag @@ -31040,6 +30087,16 @@ aj aj aj aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj aS aT aT @@ -31061,8 +30118,8 @@ aT aT aT aT -aT -aT +ww +nj ah ah ah @@ -31086,167 +30143,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(121,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(117,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -31266,6 +30312,7 @@ ab ab ab ab +ab ah ah ah @@ -31297,6 +30344,16 @@ aj aj aj aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj aS aT aT @@ -31318,8 +30375,8 @@ aT aT aT aT -aT -aT +xH +nj bo bf bo @@ -31343,167 +30400,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(122,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(118,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -31522,6 +30568,7 @@ ab ab ab ab +ab ac ah aj @@ -31554,6 +30601,16 @@ aj aj aj aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj aS aT aT @@ -31575,8 +30632,8 @@ aT aR aT aR -aT -aT +eV +nj bo bg bo @@ -31600,167 +30657,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(123,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(119,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -31779,6 +30825,7 @@ ab ab ab ab +ab ae ah aj @@ -31811,6 +30858,16 @@ aj aj aj aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj aS aT aT @@ -31832,8 +30889,8 @@ aT aT aT aT -aT -aT +xH +EE bo bk bo @@ -31857,167 +30914,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(124,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(120,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -32035,6 +31081,7 @@ ab ab ab ab +ab ae ag ai @@ -32068,6 +31115,16 @@ aj aj aj aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj aS aT aT @@ -32089,8 +31146,8 @@ aT aR aT aR -aT -aT +eV +nj bo bl bo @@ -32114,111 +31171,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(125,1,1) = {" +(121,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -32228,61 +31330,6 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 @@ -32325,6 +31372,16 @@ aj aj aj aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj aS aT aT @@ -32346,8 +31403,8 @@ aT aT aT aT -aT -aT +xH +nj bo bm bo @@ -32371,111 +31428,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(126,1,1) = {" +(122,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -32485,61 +31587,6 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 @@ -32582,6 +31629,16 @@ aj aj aj aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj aS aT aT @@ -32603,8 +31660,8 @@ aT aR aT aR -aT -aT +eV +nj bo bn bo @@ -32628,111 +31685,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(127,1,1) = {" +(123,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -32742,61 +31844,6 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 @@ -32839,6 +31886,16 @@ aj aj aj aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj aS aT aT @@ -32860,8 +31917,8 @@ aT aT aT aT -aT -aT +xH +nj bo aX bo @@ -32885,111 +31942,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(128,1,1) = {" +(124,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -32999,61 +32101,6 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 @@ -33096,6 +32143,16 @@ aj aj aj aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj aS aT aT @@ -33117,8 +32174,8 @@ aT aT aT aT -aT -aT +NH +EE ah ah ah @@ -33142,111 +32199,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(129,1,1) = {" +(125,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -33256,61 +32358,6 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 @@ -33353,6 +32400,16 @@ aj aj aj aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj aS aT aT @@ -33399,111 +32456,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(130,1,1) = {" +(126,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -33513,61 +32615,6 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 @@ -33610,6 +32657,16 @@ aj aj aj aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj aS aT aT @@ -33631,8 +32688,8 @@ aT aT aT aT -aT -aT +nj +nj ah ah ah @@ -33656,165 +32713,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(131,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(127,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -33829,7 +32877,6 @@ ab ab ab ab -ac ad ab ab @@ -33867,6 +32914,16 @@ aj aj aj aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj aS aT aT @@ -33888,8 +32945,8 @@ aT aT aT aT -aT -aT +xH +EE bo aZ bo @@ -33913,111 +32970,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(132,1,1) = {" +(128,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -34027,61 +33129,6 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 @@ -34124,6 +33171,16 @@ aj aj aj aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj aS aT aT @@ -34145,8 +33202,8 @@ aT aR aT aR -aT -aT +eV +nj bo ba bo @@ -34170,111 +33227,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(133,1,1) = {" +(129,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -34284,61 +33386,6 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 @@ -34381,6 +33428,16 @@ aj aj aj aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj aS aT aT @@ -34402,8 +33459,8 @@ aT aT aT aT -aT -aT +xH +NH bo bb bo @@ -34427,111 +33484,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(134,1,1) = {" +(130,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -34541,61 +33643,6 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 @@ -34638,6 +33685,16 @@ aj aj aj aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj aS aT aT @@ -34659,8 +33716,8 @@ aT aR aT aR -aT -aT +eV +nj bo bc bo @@ -34684,166 +33741,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(135,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(131,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -34869,9 +33916,9 @@ ab ab ae ai -am -aj +bE aj +Yy aj aj aA @@ -34895,6 +33942,16 @@ aj aj aj aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aj aS aT aT @@ -34916,8 +33973,8 @@ aT aT aT aT -aT -aT +xH +ww bo bd bo @@ -34941,166 +33998,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(136,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(132,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -35128,7 +34175,7 @@ ae ah al aj -aj +Nz aj aC ah @@ -35152,6 +34199,16 @@ aj aj aj aj +aj +aj +aj +aj +aj +aj +aj +aj +aj +aG aS bx bx @@ -35173,8 +34230,8 @@ aT aR aT aR -aT -aT +eV +EE bo be bo @@ -35198,178 +34255,168 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(137,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(133,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab ab ab ab @@ -35409,6 +34456,16 @@ aG aG aG aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG aS bu bu @@ -35430,8 +34487,8 @@ aT aT aT aT -aT -aT +xH +nj bo bf bo @@ -35455,178 +34512,168 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(138,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(134,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab ab ab ab @@ -35665,7 +34712,17 @@ aF aF aF aF -aG +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ab aS ah ah @@ -35687,8 +34744,8 @@ aT aT aT aT -aT -aT +nj +nj ah ah ah @@ -35712,181 +34769,181 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(139,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(135,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab ab @@ -35969,181 +35026,181 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(140,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(136,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT +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 @@ -36226,181 +35283,181 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(141,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(137,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT +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 @@ -36483,181 +35540,181 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(142,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(138,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT +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 @@ -36740,166 +35797,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(143,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(139,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -36951,6 +35998,16 @@ ab ab ab ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab aF ab ab @@ -36997,181 +36054,181 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(144,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(140,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT +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 @@ -37254,181 +36311,181 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} -(145,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(141,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT +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 @@ -37511,6 +36568,670 @@ aa aa aa aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +"} +(142,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +"} +(143,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +"} +(144,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -37536,7 +37257,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 @@ -37567,6 +37339,156 @@ aa aa aa aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +"} +(145,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -37614,156 +37536,216 @@ aa aa aa aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (146,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -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 +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -37871,156 +37853,156 @@ aa aa aa aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (147,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -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 +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -38128,156 +38110,156 @@ aa aa aa aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (148,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -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 +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -38385,8 +38367,156 @@ aa aa aa aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (149,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -38494,156 +38624,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (150,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -38751,156 +38881,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (151,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -39008,156 +39138,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (152,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -39265,156 +39395,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (153,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -39522,156 +39652,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (154,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -39779,156 +39909,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (155,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -40036,156 +40166,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (156,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -40293,156 +40423,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (157,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -40550,156 +40680,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (158,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -40807,156 +40937,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (159,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -41064,156 +41194,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (160,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -41321,156 +41451,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (161,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -41578,156 +41708,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (162,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -41835,156 +41965,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (163,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -42092,156 +42222,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (164,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -42349,156 +42479,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (165,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -42606,156 +42736,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (166,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -42863,156 +42993,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (167,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -43120,156 +43250,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (168,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -43377,156 +43507,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (169,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -43634,156 +43764,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (170,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -43891,156 +44021,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (171,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -44148,156 +44278,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (172,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -44405,156 +44535,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (173,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -44662,156 +44792,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (174,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -44919,156 +45049,156 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (175,1,1) = {" +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT aa aa aa @@ -45176,20712 +45306,20646 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (176,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +WT +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (177,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (178,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (179,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (180,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (181,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (182,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (183,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (184,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (185,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (186,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (187,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (188,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (189,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (190,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (191,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (192,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (193,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (194,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (195,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (196,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (197,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (198,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (199,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (200,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (201,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (202,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (203,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (204,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (205,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (206,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (207,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (208,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (209,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (210,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (211,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (212,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (213,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (214,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (215,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (216,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (217,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (218,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (219,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (220,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (221,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (222,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (223,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (224,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (225,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (226,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (227,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (228,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (229,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (230,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (231,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (232,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (233,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (234,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (235,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (236,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (237,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (238,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (239,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (240,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (241,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (242,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (243,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (244,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (245,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (246,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (247,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (248,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (249,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (250,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (251,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (252,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (253,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (254,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} (255,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb +zb "} diff --git a/_maps/shuttles/arrival_box.dmm b/_maps/shuttles/arrival_box.dmm index 4c63ce80b4..07644e5291 100644 --- a/_maps/shuttles/arrival_box.dmm +++ b/_maps/shuttles/arrival_box.dmm @@ -9,6 +9,7 @@ /obj/machinery/door/airlock/titanium{ name = "Arrivals Shuttle Airlock" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/arrival) "d" = ( @@ -150,17 +151,21 @@ }, /turf/open/floor/plating/airless, /area/shuttle/arrival) +"B" = ( +/obj/machinery/porta_turret/centcom_shuttle, +/turf/closed/wall/mineral/titanium, +/area/shuttle/arrival) "S" = ( /turf/open/floor/mineral/titanium, /area/shuttle/arrival) (1,1,1) = {" a -b +B o d d -b +B a "} (2,1,1) = {" diff --git a/_maps/shuttles/arrival_delta.dmm b/_maps/shuttles/arrival_delta.dmm index 4f883436a6..62e30ef335 100644 --- a/_maps/shuttles/arrival_delta.dmm +++ b/_maps/shuttles/arrival_delta.dmm @@ -165,6 +165,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/structure/fans/tiny, /turf/open/floor/plasteel/white, /area/shuttle/arrival) "o" = ( @@ -449,6 +450,10 @@ }, /turf/open/floor/plasteel, /area/shuttle/arrival) +"T" = ( +/obj/machinery/porta_turret/centcom_shuttle, +/turf/closed/wall/mineral/plastitanium, +/area/shuttle/arrival) "U" = ( /obj/machinery/computer{ dir = 1; @@ -480,7 +485,7 @@ (1,1,1) = {" a -d +T f g n @@ -632,7 +637,7 @@ a "} (9,1,1) = {" a -d +T f g n diff --git a/_maps/shuttles/arrival_omega.dmm b/_maps/shuttles/arrival_omega.dmm index c4eeecbecf..f580149163 100644 --- a/_maps/shuttles/arrival_omega.dmm +++ b/_maps/shuttles/arrival_omega.dmm @@ -87,6 +87,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 9 }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/arrival) "k" = ( diff --git a/_maps/shuttles/arrival_pubby.dmm b/_maps/shuttles/arrival_pubby.dmm index c8e6427add..9932e9f3e8 100644 --- a/_maps/shuttles/arrival_pubby.dmm +++ b/_maps/shuttles/arrival_pubby.dmm @@ -9,6 +9,7 @@ /obj/machinery/door/airlock/titanium{ name = "Arrivals Shuttle Airlock" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/arrival) "d" = ( @@ -139,16 +140,20 @@ }, /turf/open/floor/plating/airless, /area/shuttle/arrival) +"w" = ( +/obj/machinery/porta_turret/centcom_shuttle, +/turf/closed/wall/mineral/titanium, +/area/shuttle/arrival) "C" = ( /turf/open/floor/mineral/titanium, /area/shuttle/arrival) (1,1,1) = {" a -b +w m m -b +w a "} (2,1,1) = {" diff --git a/_maps/shuttles/emergency_airless.dmm b/_maps/shuttles/emergency_airless.dmm index b69a11ee7b..47ef968c28 100644 --- a/_maps/shuttles/emergency_airless.dmm +++ b/_maps/shuttles/emergency_airless.dmm @@ -28,7 +28,7 @@ /turf/closed/wall, /area/shuttle/escape) "f" = ( -/turf/open/floor/plating/airless, +/turf/open/floor/plating, /area/shuttle/escape) "g" = ( /obj/docking_port/mobile/emergency/shuttle_build{ @@ -39,32 +39,45 @@ preferred_direction = 2; width = 30 }, -/turf/open/floor/plating/airless, +/obj/machinery/door/airlock, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/escape) +"h" = ( +/obj/machinery/computer/emergency_shuttle{ + dir = 1 + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"K" = ( +/obj/machinery/door/airlock, +/obj/structure/fans/tiny, +/turf/open/floor/plating, /area/shuttle/escape) (1,1,1) = {" a c e -f -f -f -f -f -f -f -f +e +e +e +e +e +e +K +e g -f -f -f -f -f -f -f -f -f -f +e +e +e +e +e +K +e +K +e +e e e a @@ -128,7 +141,7 @@ f f f f -f +e a a a @@ -192,8 +205,8 @@ f f e e -f -f +e +e e e "} @@ -257,7 +270,7 @@ f f f f -f +e "} (8,1,1) = {" c @@ -288,7 +301,7 @@ f f f f -f +e "} (9,1,1) = {" b @@ -318,8 +331,8 @@ f f f f -f -f +h +e "} (10,1,1) = {" b @@ -350,7 +363,7 @@ f f f f -f +e "} (11,1,1) = {" c @@ -381,7 +394,7 @@ f f f f -f +e "} (12,1,1) = {" b @@ -412,7 +425,7 @@ f f f f -f +e "} (13,1,1) = {" b @@ -471,8 +484,8 @@ f f e e -f -f +e +e e e "} @@ -531,7 +544,7 @@ f f f f -f +e a a a @@ -573,25 +586,25 @@ a a c e -f -f -f -f -f -f -f -f -f -f -f -f -f -f -f -f -f -f -f +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e e e a diff --git a/_maps/shuttles/emergency_asteroid.dmm b/_maps/shuttles/emergency_asteroid.dmm index 7687241791..1d76177190 100644 --- a/_maps/shuttles/emergency_asteroid.dmm +++ b/_maps/shuttles/emergency_asteroid.dmm @@ -2,6 +2,13 @@ "aa" = ( /turf/template_noop, /area/template_noop) +"ab" = ( +/obj/machinery/door/airlock/titanium{ + name = "Emergency Shuttle Airlock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) "ac" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/escape) @@ -16,17 +23,7 @@ }, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) -"ah" = ( -/obj/effect/spawner/structure/window/shuttle, -/turf/open/floor/plating, -/area/shuttle/escape) -"ai" = ( -/obj/machinery/door/airlock/titanium{ - name = "Emergency Shuttle Airlock" - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/escape) -"aj" = ( +"af" = ( /obj/machinery/door/airlock/titanium{ name = "Emergency Shuttle Airlock" }, @@ -37,8 +34,13 @@ name = "Asteroid emergency shuttle"; width = 28 }, +/obj/structure/fans/tiny, /turf/open/floor/mineral/titanium, /area/shuttle/escape) +"ah" = ( +/obj/effect/spawner/structure/window/shuttle, +/turf/open/floor/plating, +/area/shuttle/escape) "al" = ( /obj/machinery/door/airlock/titanium{ name = "Emergency Shuttle Airlock"; @@ -618,7 +620,7 @@ aa aa "} (12,1,1) = {" -ai +ab at at at @@ -708,7 +710,7 @@ aa aa "} (18,1,1) = {" -aj +af at at at diff --git a/_maps/shuttles/emergency_backup.dmm b/_maps/shuttles/emergency_backup.dmm index 6b59c17ec1..d7aedbb2f5 100644 --- a/_maps/shuttles/emergency_backup.dmm +++ b/_maps/shuttles/emergency_backup.dmm @@ -5,9 +5,10 @@ }, /turf/open/floor/mineral/titanium, /area/shuttle/escape/backup) -"c" = ( +"b" = ( /obj/machinery/door/airlock/titanium, /obj/docking_port/mobile/emergency/backup, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/escape/backup) "f" = ( @@ -55,7 +56,7 @@ (1,1,1) = {" m m -c +b m m m diff --git a/_maps/shuttles/emergency_bar.dmm b/_maps/shuttles/emergency_bar.dmm index 544e8891a4..7c14d9ebd0 100644 --- a/_maps/shuttles/emergency_bar.dmm +++ b/_maps/shuttles/emergency_bar.dmm @@ -10,15 +10,8 @@ /turf/open/floor/plating, /area/shuttle/escape) "ad" = ( -/obj/structure/table, -/obj/machinery/chem_dispenser/drinks/beer{ - dir = 8 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, +/obj/effect/spawner/structure/window/shuttle, +/turf/open/space/basic, /area/shuttle/escape) "ae" = ( /turf/closed/wall/mineral/titanium/nodiagonal, @@ -45,19 +38,10 @@ pixel_x = -4; pixel_y = 6 }, +/obj/item/reagent_containers/food/drinks/bottle/whiskey, +/obj/item/storage/box/drinkingglasses, /turf/open/floor/carpet, /area/shuttle/escape) -"aj" = ( -/obj/structure/table, -/obj/machinery/chem_dispenser/drinks{ - dir = 8 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/shuttle/escape) "ak" = ( /obj/structure/extinguisher_cabinet{ pixel_y = 30 @@ -88,12 +72,6 @@ }, /turf/open/floor/carpet, /area/shuttle/escape) -"ap" = ( -/obj/machinery/computer/security{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/shuttle/escape) "aq" = ( /obj/machinery/computer/crew{ dir = 4 @@ -122,17 +100,53 @@ pixel_x = 6; pixel_y = -24 }, -/obj/structure/table/wood/poker, -/obj/item/storage/box/drinkingglasses, -/obj/item/reagent_containers/food/drinks/bottle/whiskey, /obj/machinery/light, /turf/open/floor/carpet, /area/shuttle/escape) "au" = ( -/obj/machinery/computer/communications{ - dir = 8 +/obj/structure/table, +/obj/item/storage/backpack/duffelbag/med/surgery, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"av" = ( +/obj/machinery/door/airlock/titanium{ + name = "Emergency Shuttle Airlock"; + req_access_txt = "2" }, -/turf/open/floor/carpet, +/obj/structure/fans/tiny, +/turf/open/floor/mineral/plastitanium/red/brig, +/area/shuttle/escape) +"aw" = ( +/obj/machinery/door/airlock/titanium{ + name = "Emergency Shuttle Airlock" + }, +/obj/docking_port/mobile/emergency{ + name = "The Emergency Escape Bar" + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/fans/tiny, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"ax" = ( +/obj/machinery/door/airlock/titanium{ + name = "Emergency Shuttle Airlock" + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/fans/tiny, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"ay" = ( +/obj/machinery/door/airlock/titanium{ + name = "Emergency Shuttle Airlock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plasteel/freezer, /area/shuttle/escape) "az" = ( /obj/machinery/door/airlock/public/glass{ @@ -145,6 +159,12 @@ /obj/machinery/status_display/evac, /turf/closed/wall/mineral/titanium, /area/shuttle/escape) +"aB" = ( +/obj/machinery/computer/security{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/shuttle/escape) "aC" = ( /obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/plastitanium/red/brig, @@ -183,10 +203,10 @@ /turf/open/floor/plasteel/grimy, /area/shuttle/escape) "aG" = ( -/obj/structure/chair/stool{ - can_buckle = 1 +/obj/machinery/computer/communications{ + dir = 8 }, -/turf/open/floor/plasteel/grimy, +/turf/open/floor/carpet, /area/shuttle/escape) "aH" = ( /obj/machinery/flasher{ @@ -220,11 +240,10 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "aK" = ( -/obj/machinery/door/airlock/titanium{ - name = "Emergency Shuttle Airlock"; - req_access_txt = "2" +/obj/structure/chair/stool{ + can_buckle = 1 }, -/turf/open/floor/mineral/plastitanium/red/brig, +/turf/open/floor/plasteel/grimy, /area/shuttle/escape) "aL" = ( /obj/structure/extinguisher_cabinet{ @@ -267,6 +286,12 @@ }, /turf/open/floor/plasteel, /area/shuttle/escape) +"aQ" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel/grimy, +/area/shuttle/escape) "aR" = ( /obj/structure/table/wood/bar{ boot_dir = 8 @@ -278,6 +303,15 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "aS" = ( +/obj/structure/table/wood/bar, +/obj/item/instrument/guitar, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"aT" = ( /obj/structure/extinguisher_cabinet{ pixel_x = 27 }, @@ -290,19 +324,6 @@ }, /turf/open/floor/plasteel, /area/shuttle/escape) -"aT" = ( -/obj/machinery/door/airlock/titanium{ - name = "Emergency Shuttle Airlock" - }, -/obj/docking_port/mobile/emergency{ - name = "The Emergency Escape Bar" - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/shuttle/escape) "aU" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -311,6 +332,17 @@ /mob/living/simple_animal/hostile/alien/maid/barmaid, /turf/open/floor/plasteel, /area/shuttle/escape) +"aV" = ( +/obj/structure/table, +/obj/machinery/chem_dispenser/drinks/beer{ + dir = 8 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/shuttle/escape) "aW" = ( /obj/structure/chair/wood/normal, /turf/open/floor/plasteel/grimy, @@ -341,6 +373,17 @@ /obj/effect/spawner/lootdrop/gambling, /turf/open/floor/plasteel/grimy, /area/shuttle/escape) +"bb" = ( +/obj/structure/table, +/obj/machinery/chem_dispenser/drinks{ + dir = 8 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/shuttle/escape) "bc" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; @@ -369,10 +412,29 @@ }, /turf/open/floor/plasteel, /area/shuttle/escape) -"bg" = ( -/obj/machinery/door/airlock/titanium{ - name = "Emergency Shuttle Airlock" +"bf" = ( +/obj/structure/table, +/obj/item/storage/box/drinkingglasses, +/obj/item/reagent_containers/food/drinks/shaker, +/obj/item/storage/fancy/cigarettes/cigars/havana, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 }, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"bg" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-10" + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"bh" = ( +/obj/machinery/vending/cigarette, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 @@ -382,13 +444,24 @@ "bi" = ( /turf/open/floor/mineral/titanium, /area/shuttle/escape) +"bj" = ( +/obj/effect/spawner/structure/window/shuttle, +/turf/open/floor/plasteel/freezer, +/area/shuttle/escape) "bk" = ( -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/obj/machinery/sleeper{ + dir = 8 }, -/turf/open/floor/plasteel, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"bl" = ( +/obj/machinery/sleeper{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, /area/shuttle/escape) "bm" = ( /obj/machinery/door/airlock{ @@ -402,10 +475,13 @@ /turf/closed/wall/mineral/titanium, /area/shuttle/escape) "bo" = ( -/obj/machinery/door/airlock/titanium{ - name = "Emergency Shuttle Airlock" +/obj/structure/table, +/obj/item/storage/firstaid/fire, +/obj/item/storage/firstaid/brute{ + pixel_x = 4; + pixel_y = 4 }, -/turf/open/floor/plasteel/freezer, +/turf/open/floor/mineral/titanium, /area/shuttle/escape) "bp" = ( /turf/open/floor/plasteel/freezer, @@ -417,10 +493,8 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "br" = ( -/obj/machinery/sleeper{ - dir = 8 - }, -/turf/open/floor/mineral/titanium, +/obj/machinery/computer/card, +/turf/open/floor/carpet, /area/shuttle/escape) "bs" = ( /obj/machinery/door/airlock{ @@ -442,7 +516,6 @@ /area/shuttle/escape) "bw" = ( /obj/structure/table/optable, -/obj/item/surgical_drapes, /obj/machinery/light/small{ brightness = 3; dir = 8 @@ -465,15 +538,12 @@ }, /turf/open/floor/plasteel/freezer, /area/shuttle/escape) -"bz" = ( -/obj/structure/table, -/obj/item/circular_saw, -/obj/item/hemostat, -/obj/item/retractor, -/obj/item/scalpel, -/obj/item/surgicaldrill, -/obj/item/cautery, -/turf/open/floor/mineral/titanium, +"bA" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/turf/open/floor/plasteel, /area/shuttle/escape) "bC" = ( /obj/structure/window/reinforced{ @@ -486,10 +556,6 @@ /obj/structure/shuttle/engine/propulsion, /turf/open/floor/plating/airless, /area/shuttle/escape) -"bF" = ( -/obj/effect/spawner/structure/window/shuttle, -/turf/open/floor/plasteel/freezer, -/area/shuttle/escape) "bG" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; @@ -505,15 +571,6 @@ "bH" = ( /turf/open/floor/plasteel/grimy, /area/shuttle/escape) -"bI" = ( -/obj/structure/table/wood/bar, -/obj/item/instrument/guitar, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/shuttle/escape) "bJ" = ( /obj/structure/table/wood/bar, /obj/item/storage/fancy/donut_box, @@ -535,17 +592,6 @@ }, /turf/open/floor/plasteel/grimy, /area/shuttle/escape) -"bN" = ( -/obj/structure/table, -/obj/item/storage/box/drinkingglasses, -/obj/item/reagent_containers/food/drinks/shaker, -/obj/item/storage/fancy/cigarettes/cigars/havana, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/shuttle/escape) "bO" = ( /obj/structure/table/wood/bar, /obj/item/folder/red, @@ -584,25 +630,6 @@ }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"bT" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-10" - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/shuttle/escape) -"bU" = ( -/obj/structure/table, -/obj/item/storage/firstaid/fire, -/obj/item/storage/firstaid/brute{ - pixel_x = 4; - pixel_y = 4 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/escape) "bV" = ( /obj/structure/table/wood/bar{ boot_dir = 8 @@ -616,12 +643,6 @@ }, /turf/open/floor/plasteel, /area/shuttle/escape) -"bW" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plasteel/grimy, -/area/shuttle/escape) "bX" = ( /obj/machinery/light{ dir = 8 @@ -658,15 +679,6 @@ }, /turf/open/floor/plasteel, /area/shuttle/escape) -"cb" = ( -/obj/machinery/sleeper{ - dir = 8 - }, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/escape) (1,1,1) = {" aa @@ -676,17 +688,17 @@ aa ab ab ab -aK +av ab -aT +aw ab ac ac ac ab -bg +ax ab -bo +ay ab ab ab @@ -703,11 +715,11 @@ aH aL ab bY -bH -aZ -bc -aZ -bH +bA +bA +bA +bA +bA bZ ab bp @@ -727,11 +739,11 @@ aI aM ab aE -aW -ba -bL -bO -bQ +bH +aZ +bc +aZ +bH bR ab bp @@ -752,9 +764,9 @@ aM ab aE aW -bJ -bM -bP +ba +bL +bO bQ aE ab @@ -775,11 +787,11 @@ aJ ac ae aE -bH -bK -bH -bK -bH +aW +bJ +bM +bP +bQ aE aA bp @@ -799,11 +811,11 @@ aE aE bX aE -aE -aE -aE -aE -aE +bH +bK +bH +bK +bH aE bm bp @@ -814,10 +826,34 @@ bE "} (7,1,1) = {" ac -ag +br an an az +bA +bA +bA +bA +bA +bA +bA +bA +bA +bA +bA +ae +ae +ab +ab +bC +bE +"} +(8,1,1) = {" +ad +ag +an +an +ab aE aE aN @@ -830,13 +866,13 @@ aN aE ca ae -ab -ab -ab +bw +bi +au bC bE "} -(8,1,1) = {" +(9,1,1) = {" ac ai ao @@ -855,16 +891,16 @@ aN aE bn bi -bw -bz +bi +bi bC bE "} -(9,1,1) = {" +(10,1,1) = {" ab ae -ap -au +aB +aG ab aF bH @@ -884,32 +920,32 @@ bS bC bE "} -(10,1,1) = {" -aa -ab -ab -ab -ab -aG -bW -bI -aS -ad -aY -aj -bN -be -bT -bk -bF -br -cb -bU -ab -ab -"} (11,1,1) = {" aa +ab +ab +ab +ab +aK +aQ +aS +aT +aV +aY +bb +bf +be +bg +bh +bj +bk +bl +bo +ab +ab +"} +(12,1,1) = {" +aa aa aa aa diff --git a/_maps/shuttles/emergency_birdboat.dmm b/_maps/shuttles/emergency_birdboat.dmm index 940d655f43..43a6a85bf7 100644 --- a/_maps/shuttles/emergency_birdboat.dmm +++ b/_maps/shuttles/emergency_birdboat.dmm @@ -112,6 +112,11 @@ /obj/machinery/light, /turf/open/floor/mineral/titanium, /area/shuttle/escape) +"w" = ( +/obj/machinery/door/airlock/titanium, +/obj/structure/fans/tiny, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) "x" = ( /obj/structure/table, /obj/machinery/recharger{ @@ -197,6 +202,7 @@ width = 14; name = "Birdboat emergency escape shuttle" }, +/obj/structure/fans/tiny, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "L" = ( @@ -574,7 +580,7 @@ p u b b -G +w K b b diff --git a/_maps/shuttles/emergency_box.dmm b/_maps/shuttles/emergency_box.dmm index 19c1bf7720..349e1130f8 100644 --- a/_maps/shuttles/emergency_box.dmm +++ b/_maps/shuttles/emergency_box.dmm @@ -2,6 +2,14 @@ "aa" = ( /turf/template_noop, /area/template_noop) +"ab" = ( +/obj/machinery/door/airlock/titanium{ + name = "Emergency Shuttle Airlock"; + req_access_txt = "2" + }, +/obj/structure/fans/tiny, +/turf/open/floor/mineral/plastitanium/red/brig, +/area/shuttle/escape) "ac" = ( /obj/effect/spawner/structure/window/shuttle, /turf/open/floor/plating, @@ -37,6 +45,23 @@ /obj/item/storage/firstaid/fire, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) +"aj" = ( +/obj/machinery/door/airlock/titanium{ + name = "Emergency Shuttle Airlock" + }, +/obj/docking_port/mobile/emergency{ + name = "Box emergency shuttle" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/escape) +"ak" = ( +/obj/machinery/door/airlock/titanium{ + name = "Emergency Shuttle Airlock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/escape) "al" = ( /obj/machinery/computer/atmos_alert{ dir = 4 @@ -171,13 +196,6 @@ }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"aI" = ( -/obj/machinery/door/airlock/titanium{ - name = "Emergency Shuttle Airlock"; - req_access_txt = "2" - }, -/turf/open/floor/mineral/plastitanium/red/brig, -/area/shuttle/escape) "aJ" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -192,15 +210,6 @@ /obj/structure/table, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) -"aP" = ( -/obj/machinery/door/airlock/titanium{ - name = "Emergency Shuttle Airlock" - }, -/obj/docking_port/mobile/emergency{ - name = "Box emergency shuttle" - }, -/turf/open/floor/plating, -/area/shuttle/escape) "aQ" = ( /obj/structure/extinguisher_cabinet{ pixel_x = -5; @@ -235,12 +244,6 @@ }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) -"aV" = ( -/obj/machinery/door/airlock/titanium{ - name = "Emergency Shuttle Airlock" - }, -/turf/open/floor/plating, -/area/shuttle/escape) "aW" = ( /obj/structure/extinguisher_cabinet{ pixel_y = -30 @@ -362,10 +365,19 @@ "ga" = ( /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) +"gJ" = ( +/obj/structure/table/optable, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/escape) "XC" = ( /obj/structure/closet/emcloset, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) +"ZQ" = ( +/obj/item/storage/backpack/duffelbag/med/surgery, +/obj/structure/table, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/escape) (1,1,1) = {" aa @@ -375,17 +387,17 @@ aa ad ad ad -aI +ab ad -aP +aj ad ac ac ac ad -aV +ak ad -aV +ak ad ad ad @@ -531,7 +543,7 @@ aC ac XC bs -XC +gJ bi bk "} @@ -555,7 +567,7 @@ aC aZ ga ga -ga +ZQ bi bk "} diff --git a/_maps/shuttles/emergency_cere.dmm b/_maps/shuttles/emergency_cere.dmm index 47ad888f11..23de211226 100644 --- a/_maps/shuttles/emergency_cere.dmm +++ b/_maps/shuttles/emergency_cere.dmm @@ -507,6 +507,35 @@ /obj/item/book/manual/wiki/security_space_law, /turf/open/floor/mineral/plastitanium/red/brig, /area/shuttle/escape) +"aW" = ( +/obj/machinery/door/airlock/shuttle{ + name = "Emergency Shuttle Airlock"; + req_access_txt = "2" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/escape) +"aX" = ( +/obj/machinery/door/airlock/shuttle{ + name = "Emergency Shuttle Airlock" + }, +/obj/docking_port/mobile/emergency{ + dheight = 0; + dwidth = 15; + height = 20; + name = "Cere emergency shuttle"; + width = 42 + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/escape) +"aY" = ( +/obj/machinery/door/airlock/shuttle{ + name = "Emergency Shuttle Airlock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/escape) "aZ" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -639,13 +668,6 @@ }, /turf/open/floor/plasteel, /area/shuttle/escape) -"bv" = ( -/obj/machinery/door/airlock/shuttle{ - name = "Emergency Shuttle Airlock"; - req_access_txt = "2" - }, -/turf/open/floor/plating, -/area/shuttle/escape) "bw" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -696,19 +718,6 @@ }, /turf/open/floor/plasteel, /area/shuttle/escape) -"bE" = ( -/obj/machinery/door/airlock/shuttle{ - name = "Emergency Shuttle Airlock" - }, -/obj/docking_port/mobile/emergency{ - dheight = 0; - dwidth = 15; - height = 20; - name = "Cere emergency shuttle"; - width = 42 - }, -/turf/open/floor/plating, -/area/shuttle/escape) "bF" = ( /obj/structure/closet/crate/bin, /obj/effect/turf_decal/tile/neutral{ @@ -936,12 +945,6 @@ }, /turf/open/floor/plasteel, /area/shuttle/escape) -"bY" = ( -/obj/machinery/door/airlock/shuttle{ - name = "Emergency Shuttle Airlock" - }, -/turf/open/floor/plating, -/area/shuttle/escape) "bZ" = ( /obj/structure/extinguisher_cabinet{ pixel_x = -28 @@ -1291,26 +1294,17 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/item/circular_saw, -/obj/item/scalpel{ - pixel_y = 12 - }, -/obj/item/hemostat, -/obj/item/surgicaldrill, -/obj/item/cautery{ - pixel_x = 4 - }, -/obj/item/retractor, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, +/obj/item/storage/backpack/duffelbag/med/surgery, /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel/white, /area/shuttle/escape) "cG" = ( @@ -1361,15 +1355,13 @@ /obj/item/clothing/suit/apron/surgical, /obj/item/clothing/gloves/color/latex, /obj/item/clothing/mask/surgical, -/obj/item/surgical_drapes, -/obj/item/razor, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, /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 }, @@ -1762,17 +1754,17 @@ ab ab ab ab -bv +aW ab -bE +aX ab aa aa aa ab -bY +aY ab -bY +aY ab aa aa diff --git a/_maps/shuttles/emergency_clown.dmm b/_maps/shuttles/emergency_clown.dmm index d2329af155..666746ad20 100644 --- a/_maps/shuttles/emergency_clown.dmm +++ b/_maps/shuttles/emergency_clown.dmm @@ -117,6 +117,23 @@ }, /turf/open/floor/mineral/bananium, /area/shuttle/escape) +"aw" = ( +/obj/machinery/door/airlock/bananium{ + name = "Emergency Shuttle Airlock" + }, +/obj/docking_port/mobile/emergency{ + name = "Snappop(tm)!" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/escape) +"ax" = ( +/obj/machinery/door/airlock/bananium{ + name = "Emergency Shuttle Airlock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/escape) "ay" = ( /obj/structure/table, /obj/item/storage/firstaid/fire, @@ -137,6 +154,8 @@ /obj/machinery/door/airlock/bananium/glass{ name = "Emergency Shuttle Greentext" }, +/obj/structure/fans/tiny, +/obj/structure/barricade/wooden/crude, /turf/open/floor/bluespace, /area/shuttle/escape) "aC" = ( @@ -170,15 +189,6 @@ /obj/item/toy/sword, /turf/open/floor/mineral/bananium, /area/shuttle/escape) -"aI" = ( -/obj/machinery/door/airlock/bananium{ - name = "Emergency Shuttle Airlock" - }, -/obj/docking_port/mobile/emergency{ - name = "Snappop(tm)!" - }, -/turf/open/floor/plating, -/area/shuttle/escape) "aJ" = ( /obj/item/toy/snappop/phoenix, /obj/machinery/light/small{ @@ -233,12 +243,6 @@ }, /turf/open/floor/mineral/bananium, /area/shuttle/escape) -"aQ" = ( -/obj/machinery/door/airlock/bananium{ - name = "Emergency Shuttle Airlock" - }, -/turf/open/floor/plating, -/area/shuttle/escape) "aR" = ( /obj/item/toy/snappop/phoenix, /obj/machinery/light/small, @@ -338,6 +342,11 @@ /obj/structure/shuttle/engine/propulsion, /turf/open/floor/plating/airless, /area/shuttle/escape) +"bL" = ( +/obj/item/toy/snappop/phoenix, +/obj/item/pneumatic_cannon/pie/selfcharge, +/turf/open/floor/bluespace, +/area/shuttle/escape) "Zf" = ( /obj/structure/closet/emcloset, /obj/item/toy/sword, @@ -354,15 +363,15 @@ ab ab ab ab -aI +aw ab ac ac ac ab -aQ +ax ab -aQ +ax ab ab ab @@ -467,7 +476,7 @@ bg (6,1,1) = {" ac ag -ak +bL aq ab av diff --git a/_maps/shuttles/emergency_cramped.dmm b/_maps/shuttles/emergency_cramped.dmm index 863b5bd088..08ac96bf69 100644 --- a/_maps/shuttles/emergency_cramped.dmm +++ b/_maps/shuttles/emergency_cramped.dmm @@ -11,6 +11,7 @@ name = "Emergency Shuttle Airlock"; req_access_txt = "2" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/escape) "d" = ( @@ -64,6 +65,7 @@ name = "Secure Transport Vessel 5"; width = 14 }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/escape) "l" = ( @@ -97,6 +99,7 @@ /obj/machinery/door/airlock/titanium{ name = "Emergency Shuttle Airlock" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/escape) "r" = ( diff --git a/_maps/shuttles/emergency_delta.dmm b/_maps/shuttles/emergency_delta.dmm index 471232a295..564115443d 100644 --- a/_maps/shuttles/emergency_delta.dmm +++ b/_maps/shuttles/emergency_delta.dmm @@ -147,7 +147,6 @@ /area/shuttle/escape) "al" = ( /obj/structure/table/optable, -/obj/item/surgical_drapes, /obj/effect/turf_decal/tile/blue{ dir = 4 }, @@ -157,18 +156,7 @@ /turf/open/floor/plasteel/white, /area/shuttle/escape) "am" = ( -/obj/item/scalpel{ - pixel_y = 12 - }, -/obj/item/circular_saw, -/obj/item/retractor{ - pixel_x = 4 - }, -/obj/item/hemostat{ - pixel_x = -4 - }, -/obj/item/clothing/gloves/color/latex, -/obj/item/clothing/mask/surgical, +/obj/item/storage/backpack/duffelbag/med/surgery, /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -176,8 +164,6 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/item/surgicaldrill, -/obj/item/cautery, /turf/open/floor/plasteel/white, /area/shuttle/escape) "an" = ( @@ -490,6 +476,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/structure/fans/tiny, /turf/open/floor/plasteel/white, /area/shuttle/escape) "aP" = ( @@ -562,6 +549,7 @@ preferred_direction = 2; port_direction = 4 }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/escape) "aX" = ( @@ -796,6 +784,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/structure/fans/tiny, /turf/open/floor/plasteel/white, /area/shuttle/escape) "bw" = ( @@ -908,6 +897,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/structure/fans/tiny, /turf/open/floor/plasteel, /area/shuttle/escape) "bM" = ( diff --git a/_maps/shuttles/emergency_discoinferno.dmm b/_maps/shuttles/emergency_discoinferno.dmm index 025a7cf743..e142208e12 100644 --- a/_maps/shuttles/emergency_discoinferno.dmm +++ b/_maps/shuttles/emergency_discoinferno.dmm @@ -83,6 +83,7 @@ /obj/machinery/door/airlock/gold{ req_access_txt = "19" }, +/obj/structure/fans/tiny, /turf/open/floor/mineral/gold, /area/shuttle/escape) "q" = ( @@ -110,6 +111,7 @@ heat_proof = 1; resistance_flags = 2 }, +/obj/structure/fans/tiny, /turf/open/floor/mineral/plasma, /area/shuttle/escape) "v" = ( @@ -118,6 +120,7 @@ /area/shuttle/escape) "w" = ( /obj/machinery/door/airlock/gold, +/obj/structure/fans/tiny, /turf/open/floor/wood, /area/shuttle/escape) "x" = ( @@ -220,6 +223,11 @@ "O" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/shuttle/escape) +"P" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/structure/fans/tiny, +/turf/open/floor/plasteel/elevatorshaft, +/area/shuttle/escape) (1,1,1) = {" a @@ -262,7 +270,7 @@ r r r q -c +P x C I @@ -274,7 +282,7 @@ b b h m -c +P r r r @@ -286,7 +294,7 @@ r r r r -c +P x D D @@ -298,7 +306,7 @@ c d i i -c +P r r r @@ -310,7 +318,7 @@ j r r r -c +P x x x @@ -322,7 +330,7 @@ c e j j -c +P r r s @@ -334,7 +342,7 @@ j s r r -c +P y E y @@ -346,7 +354,7 @@ c f j n -c +P r j j @@ -358,7 +366,7 @@ t j j r -c +P z F J @@ -382,7 +390,7 @@ j s r r -c +P y G y @@ -394,7 +402,7 @@ c g k k -c +P r r r @@ -406,7 +414,7 @@ j r r r -c +P x x x @@ -418,7 +426,7 @@ b b l o -c +P r r r @@ -430,7 +438,7 @@ r r r r -c +P A x K @@ -454,7 +462,7 @@ r r r q -c +P B H L diff --git a/_maps/shuttles/emergency_goon.dmm b/_maps/shuttles/emergency_goon.dmm index 8e254729e8..be7408793c 100644 --- a/_maps/shuttles/emergency_goon.dmm +++ b/_maps/shuttles/emergency_goon.dmm @@ -28,6 +28,7 @@ /obj/machinery/door/airlock/titanium{ name = "Emergency Shuttle Airlock" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/escape) "h" = ( @@ -41,6 +42,7 @@ name = "NES Port"; width = 19 }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/escape) "l" = ( @@ -67,9 +69,7 @@ /turf/open/floor/plating, /area/shuttle/escape) "q" = ( -/obj/machinery/sleeper{ - dir = 4 - }, +/obj/machinery/sleeper, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) "r" = ( @@ -93,11 +93,6 @@ }, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) -"v" = ( -/obj/structure/table, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/escape) "w" = ( /obj/machinery/door/airlock/public/glass{ name = "Emergency Shuttle Infirmary" @@ -186,12 +181,18 @@ /obj/structure/window/reinforced, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) +"P" = ( +/obj/structure/table/optable, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/escape) "Q" = ( /obj/machinery/light, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "R" = ( /obj/machinery/light/small, +/obj/structure/table, +/obj/item/storage/backpack/duffelbag/med/surgery, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) "S" = ( @@ -272,8 +273,8 @@ X c d q -v -q +n +P d H H @@ -284,7 +285,7 @@ Y (4,1,1) = {" d l -n +q n R d diff --git a/_maps/shuttles/emergency_gorilla.dmm b/_maps/shuttles/emergency_gorilla.dmm new file mode 100644 index 0000000000..0c75cd8b7e --- /dev/null +++ b/_maps/shuttles/emergency_gorilla.dmm @@ -0,0 +1,641 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/template_noop, +/area/template_noop) +"ab" = ( +/turf/closed/wall/rust, +/area/shuttle/escape) +"ac" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plasteel/elevatorshaft, +/area/shuttle/escape) +"ad" = ( +/turf/closed/wall, +/area/shuttle/escape) +"ae" = ( +/turf/open/floor/holofloor/wood, +/area/shuttle/escape) +"af" = ( +/obj/machinery/computer/emergency_shuttle, +/turf/open/floor/holofloor/wood, +/area/shuttle/escape) +"ag" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/holofloor/wood, +/area/shuttle/escape) +"ah" = ( +/obj/machinery/computer/atmos_alert{ + dir = 4 + }, +/turf/open/floor/holofloor/wood, +/area/shuttle/escape) +"ai" = ( +/obj/structure/chair/office/dark, +/turf/open/floor/holofloor/wood, +/area/shuttle/escape) +"aj" = ( +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/turf/open/floor/holofloor/wood, +/area/shuttle/escape) +"ak" = ( +/obj/item/chair, +/turf/open/floor/holofloor/wood, +/area/shuttle/escape) +"al" = ( +/obj/machinery/computer/security{ + dir = 8 + }, +/turf/open/floor/holofloor/wood, +/area/shuttle/escape) +"am" = ( +/obj/machinery/computer/crew{ + dir = 4 + }, +/turf/open/floor/holofloor/wood, +/area/shuttle/escape) +"an" = ( +/obj/machinery/light, +/turf/open/floor/holofloor/wood, +/area/shuttle/escape) +"ao" = ( +/obj/machinery/computer/communications{ + dir = 8 + }, +/turf/open/floor/holofloor/wood, +/area/shuttle/escape) +"ap" = ( +/obj/machinery/status_display/evac, +/turf/closed/wall/rust, +/area/shuttle/escape) +"aq" = ( +/obj/machinery/door/airlock/gold{ + req_access_txt = "19" + }, +/turf/open/floor/holofloor/wood, +/area/shuttle/escape) +"ar" = ( +/obj/structure/urinal{ + pixel_y = 31 + }, +/turf/open/floor/mineral/plastitanium/red/brig, +/area/shuttle/escape) +"as" = ( +/obj/structure/chair/comfy/shuttle, +/turf/open/floor/mineral/plastitanium/red/brig, +/area/shuttle/escape) +"at" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/shuttle/escape) +"au" = ( +/obj/machinery/deepfryer, +/turf/open/floor/plasteel/shuttle, +/area/shuttle/escape) +"av" = ( +/turf/open/floor/plasteel/shuttle, +/area/shuttle/escape) +"aw" = ( +/obj/structure/closet/crate/freezer/blood, +/turf/open/floor/plasteel/freezer, +/area/shuttle/escape) +"ax" = ( +/turf/open/floor/plating, +/area/shuttle/escape) +"ay" = ( +/obj/machinery/flasher{ + id = "shuttle_flasher"; + pixel_x = -24; + pixel_y = 6 + }, +/obj/machinery/button/flasher{ + id = "shuttle_flasher"; + pixel_x = -24; + pixel_y = -6 + }, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red/brig, +/area/shuttle/escape) +"az" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red/brig, +/area/shuttle/escape) +"aA" = ( +/turf/open/floor/mineral/plastitanium/red/brig, +/area/shuttle/escape) +"aB" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Emergency Shuttle Brig"; + req_access_txt = "2" + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/escape) +"aC" = ( +/turf/open/floor/plasteel/freezer, +/area/shuttle/escape) +"aD" = ( +/obj/structure/closet, +/turf/open/floor/plasteel/freezer, +/area/shuttle/escape) +"aE" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Emergency Shuttle Airlock"; + req_access_txt = "2" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/escape) +"aF" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red/brig, +/area/shuttle/escape) +"aG" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/plasteel/freezer, +/area/shuttle/escape) +"aH" = ( +/obj/structure/noticeboard, +/turf/closed/wall/rust, +/area/shuttle/escape) +"aI" = ( +/obj/docking_port/mobile/emergency{ + height = 15; + name = "Gorilla Emergency Shuttle" + }, +/obj/machinery/door/airlock/security/glass{ + name = "Emergency Shuttle Airlock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/escape) +"aJ" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -5; + pixel_y = 30 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/shuttle/escape) +"aK" = ( +/obj/structure/closet/crate/trashcart, +/turf/open/floor/plasteel/shuttle, +/area/shuttle/escape) +"aL" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/shuttle, +/area/shuttle/escape) +"aM" = ( +/obj/structure/reagent_dispensers/keg/mead, +/turf/open/floor/plating, +/area/shuttle/escape) +"aN" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/shuttle/escape) +"aO" = ( +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plasteel/shuttle, +/area/shuttle/escape) +"aP" = ( +/obj/structure/fluff/broken_flooring, +/turf/open/floor/plating, +/area/shuttle/escape) +"aQ" = ( +/obj/structure/closet/crate/freezer, +/turf/open/floor/plating, +/area/shuttle/escape) +"aR" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/plasteel/shuttle, +/area/shuttle/escape) +"aS" = ( +/obj/effect/decal/cleanable/vomit/old, +/turf/open/floor/plasteel/shuttle, +/area/shuttle/escape) +"aT" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/open/floor/plasteel/shuttle, +/area/shuttle/escape) +"aU" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Emergency Shuttle Airlock" + }, +/turf/open/floor/plasteel/freezer, +/area/shuttle/escape) +"aV" = ( +/obj/effect/decal/cleanable/blood/innards, +/turf/open/floor/plasteel/freezer, +/area/shuttle/escape) +"aW" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"aX" = ( +/obj/structure/closet/crate/freezer/surplus_limbs, +/turf/open/floor/plasteel/freezer, +/area/shuttle/escape) +"aY" = ( +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plasteel/freezer, +/area/shuttle/escape) +"aZ" = ( +/obj/structure/closet/crate/freezer, +/turf/open/floor/plasteel/freezer, +/area/shuttle/escape) +"ba" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/turf/open/floor/plasteel/shuttle, +/area/shuttle/escape) +"bb" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Emergency Shuttle Airlock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/escape) +"bc" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/turf/open/floor/plasteel/shuttle, +/area/shuttle/escape) +"bd" = ( +/obj/structure/closet/toolcloset, +/turf/open/floor/plating, +/area/shuttle/escape) +"be" = ( +/obj/structure/chair/sofa/right, +/turf/open/floor/plating, +/area/shuttle/escape) +"bf" = ( +/obj/structure/chair/sofa, +/mob/living/simple_animal/hostile/gorilla, +/turf/open/floor/plating, +/area/shuttle/escape) +"bg" = ( +/obj/structure/chair/sofa, +/turf/open/floor/plating, +/area/shuttle/escape) +"bh" = ( +/obj/structure/chair/sofa, +/mob/living/simple_animal/hostile/gorilla, +/turf/open/floor/plasteel/shuttle, +/area/shuttle/escape) +"bi" = ( +/obj/structure/chair/sofa/left, +/mob/living/simple_animal/hostile/gorilla, +/turf/open/floor/plating, +/area/shuttle/escape) +"bj" = ( +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plating, +/area/shuttle/escape) +"bk" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Emergency Shuttle Brig"; + req_access_txt = "2" + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"bl" = ( +/mob/living/simple_animal/hostile/gorilla, +/turf/open/floor/plating, +/area/shuttle/escape) +"bm" = ( +/obj/effect/decal/cleanable/blood/gibs/limb, +/mob/living/simple_animal/hostile/gorilla, +/turf/open/floor/plasteel/shuttle, +/area/shuttle/escape) +"bn" = ( +/obj/structure/reagent_dispensers/keg/semen, +/turf/open/floor/plating, +/area/shuttle/escape) +"bo" = ( +/obj/structure/closet/crate/freezer/surplus_limbs, +/turf/open/floor/plasteel/shuttle, +/area/shuttle/escape) +"bp" = ( +/obj/structure/closet/crate/freezer/surplus_limbs, +/turf/open/floor/plating, +/area/shuttle/escape) +"bq" = ( +/mob/living/simple_animal/hostile/gorilla, +/turf/open/floor/plasteel/shuttle, +/area/shuttle/escape) +"br" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel/shuttle, +/area/shuttle/escape) +"bs" = ( +/obj/structure/shuttle/engine/heater, +/obj/structure/window/plasma/reinforced{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/shuttle/escape) +"bt" = ( +/turf/template_noop, +/area/space) +"bu" = ( +/obj/structure/shuttle/engine/propulsion, +/turf/open/floor/plating/airless, +/area/shuttle/escape) +"fV" = ( +/turf/closed/wall/r_wall, +/area/shuttle/escape) +"IR" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/shuttle/escape) +"Pi" = ( +/obj/structure/chair/sofa, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/shuttle/escape) + +(1,1,1) = {" +aa +aa +aa +aa +ab +ab +ab +aE +ab +aI +ab +at +at +at +ab +bb +ab +bb +ab +ad +ad +bt +"} +(2,1,1) = {" +aa +ad +ab +ad +ab +ar +ay +aA +aH +ax +aN +aR +aW +aR +ba +av +ad +ax +ax +bo +ab +ab +"} +(3,1,1) = {" +ab +ab +ah +am +ap +as +az +aF +ab +aJ +av +aS +av +ax +av +bc +ab +bd +bj +bp +bs +bu +"} +(4,1,1) = {" +ac +ae +ai +ae +ab +as +aA +aF +ad +aK +av +aP +av +av +ax +av +fV +fV +bk +fV +bs +bu +"} +(5,1,1) = {" +ac +ae +ae +ak +ab +at +aB +at +ab +aL +av +aT +aT +aT +aT +aT +IR +be +aN +bl +bs +bu +"} +(6,1,1) = {" +ac +af +aj +an +ad +au +av +av +av +av +aO +ab +ab +ad +ab +ad +fV +bf +bl +bq +bs +bu +"} +(7,1,1) = {" +ac +ae +ae +ae +aq +av +ax +av +av +aM +aP +aU +aC +aC +aX +aD +fV +Pi +bm +bn +bs +bu +"} +(8,1,1) = {" +ac +ag +ak +ae +ab +ab +ad +ad +ab +ad +ab +ab +aC +aC +aY +aX +fV +bh +aP +bq +bs +bu +"} +(9,1,1) = {" +ab +ad +al +ao +ab +aw +aC +ax +aG +aC +aD +aC +ax +aC +aZ +ax +IR +bg +bl +br +bs +bu +"} +(10,1,1) = {" +aa +ad +ab +ad +ab +ax +aD +aG +aD +aC +aQ +aV +aC +aC +aX +aD +fV +bi +bn +bl +fV +ab +"} +(11,1,1) = {" +aa +aa +aa +aa +ab +ab +ad +ab +ab +ad +ab +ad +ab +ad +ad +ab +fV +fV +fV +fV +fV +aa +"} diff --git a/_maps/shuttles/emergency_luxury.dmm b/_maps/shuttles/emergency_luxury.dmm index 1fd515fb76..2834f0c93f 100644 --- a/_maps/shuttles/emergency_luxury.dmm +++ b/_maps/shuttles/emergency_luxury.dmm @@ -3,94 +3,90 @@ /turf/template_noop, /area/template_noop) "ab" = ( -/turf/closed/indestructible/riveted/uranium, +/obj/structure/table/wood/fancy, +/obj/item/toy/cards/deck, +/turf/open/floor/carpet/red, /area/shuttle/escape/luxury) "ac" = ( -/obj/machinery/door/airlock/external, -/turf/open/floor/wood{ - icon_state = "wood-broken2" - }, +/turf/closed/wall/mineral/gold, /area/shuttle/escape/luxury) "ad" = ( /obj/machinery/door/airlock/gold, -/obj/effect/forcefield/luxury_shuttle{ - name = "Ticket Booth" - }, -/turf/open/floor/mineral/gold, +/obj/structure/fans/tiny, +/turf/open/floor/carpet/red, /area/shuttle/escape/luxury) "ae" = ( /obj/docking_port/mobile/emergency{ dir = 2; dwidth = 5; height = 14; + movement_force = list("KNOCKDOWN" = 3, "THROW" = 0); name = "Luxury emergency shuttle"; width = 25 }, /obj/machinery/door/airlock/gold, -/obj/effect/forcefield/luxury_shuttle{ - name = "Ticket Booth" - }, -/turf/open/floor/mineral/gold, +/obj/structure/fans/tiny, +/turf/open/floor/carpet/red, /area/shuttle/escape/luxury) "af" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken3" - }, +/turf/open/floor/carpet/red, /area/shuttle/escape/luxury) "ag" = ( -/turf/open/floor/wood, +/obj/machinery/light{ + dir = 4; + light_range = 8 + }, +/turf/open/floor/carpet/red, /area/shuttle/escape/luxury) "ah" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/turf/open/floor/plasteel/white, /area/shuttle/escape/luxury) "ai" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken5" +/obj/structure/chair/comfy{ + dir = 8 }, +/turf/open/floor/mineral/plastitanium/red/brig, /area/shuttle/escape/luxury) "aj" = ( -/turf/open/floor/mineral/gold, +/obj/machinery/door/airlock/gold/glass{ + name = "shuttle brig"; + req_access_txt = "2" + }, +/obj/structure/fans/tiny, +/turf/open/floor/mineral/plastitanium/red/brig, /area/shuttle/escape/luxury) "ak" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-10" - }, -/turf/open/floor/mineral/gold, -/area/shuttle/escape/luxury) -"al" = ( -/obj/structure/mirror{ - pixel_y = 32 - }, -/turf/open/floor/mineral/gold, -/area/shuttle/escape/luxury) -"am" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, -/area/shuttle/escape/luxury) -"an" = ( -/obj/machinery/light/small, -/turf/open/floor/wood{ - icon_state = "wood-broken2" - }, -/area/shuttle/escape/luxury) -"ao" = ( -/obj/machinery/light/small, -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, -/area/shuttle/escape/luxury) -"ap" = ( -/obj/structure/toilet{ +/obj/structure/chair/comfy{ dir = 4 }, -/turf/open/floor/mineral/gold, +/turf/open/floor/mineral/plastitanium/red/brig, +/area/shuttle/escape/luxury) +"al" = ( +/turf/open/floor/mineral/plastitanium/red/brig, +/area/shuttle/escape/luxury) +"am" = ( +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape/luxury) +"an" = ( +/turf/open/floor/carpet/royalblack, +/area/shuttle/escape/luxury) +"ao" = ( +/obj/structure/chair/comfy, +/turf/open/floor/carpet/royalblack, +/area/shuttle/escape/luxury) +"ap" = ( +/obj/machinery/light{ + dir = 4; + light_range = 8 + }, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) "aq" = ( -/obj/machinery/door/airlock/gold, -/turf/open/floor/mineral/gold, +/obj/machinery/light{ + dir = 4; + light_range = 8 + }, +/turf/open/floor/plasteel/white, /area/shuttle/escape/luxury) "ar" = ( /obj/structure/shuttle/engine/propulsion{ @@ -108,647 +104,768 @@ /turf/open/floor/plating/airless, /area/shuttle/escape/luxury) "at" = ( -/turf/open/floor/carpet, +/obj/structure/table/wood/fancy, +/obj/item/reagent_containers/food/snacks/meatballspaghetti, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) "au" = ( -/obj/structure/chair/comfy, -/turf/open/floor/carpet, +/obj/structure/table/wood/fancy, +/obj/item/reagent_containers/food/snacks/notasandwich, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) "av" = ( -/obj/structure/chair/comfy{ - dir = 4 - }, -/turf/open/floor/mineral/gold, +/obj/structure/table/wood/fancy, +/obj/item/reagent_containers/food/snacks/pastatomato, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) "aw" = ( -/obj/machinery/computer/communications{ - dir = 8 - }, -/turf/open/floor/mineral/gold, +/obj/structure/table/wood/fancy, +/obj/item/reagent_containers/food/snacks/kebab/tofu, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) "ax" = ( /obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/snacks/meatballspaghetti, -/turf/open/floor/carpet, +/obj/item/reagent_containers/food/snacks/honkdae, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) "ay" = ( /obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/snacks/notasandwich, -/turf/open/floor/carpet, +/obj/item/reagent_containers/food/snacks/enchiladas, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) "az" = ( /obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/snacks/pastatomato, -/turf/open/floor/carpet, +/obj/item/reagent_containers/food/snacks/candiedapple, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) "aA" = ( /obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/snacks/kebab/tofu, -/turf/open/floor/carpet, +/obj/item/reagent_containers/food/snacks/burger/baconburger, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) "aB" = ( /obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/snacks/honkdae, -/turf/open/floor/carpet, +/obj/item/reagent_containers/food/snacks/benedict, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) "aC" = ( /obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/snacks/enchiladas, -/turf/open/floor/carpet, +/obj/item/reagent_containers/food/snacks/cakeslice/chocolate, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) "aD" = ( /obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/snacks/candiedapple, -/turf/open/floor/carpet, +/obj/item/reagent_containers/food/snacks/chowmein, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) "aE" = ( /obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/snacks/burger/baconburger, -/turf/open/floor/carpet, +/obj/item/reagent_containers/food/snacks/dulcedebatataslice, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) "aF" = ( /obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/snacks/benedict, -/turf/open/floor/carpet, +/obj/item/reagent_containers/food/snacks/salad/validsalad, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) "aG" = ( /obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/snacks/cakeslice/chocolate, -/turf/open/floor/carpet, +/obj/item/reagent_containers/food/snacks/carneburrito, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) "aH" = ( /obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/snacks/chowmein, -/turf/open/floor/carpet, +/obj/item/reagent_containers/food/snacks/chawanmushi, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) "aI" = ( -/obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/snacks/dulcedebatataslice, -/turf/open/floor/carpet, +/obj/structure/mirror{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/white, /area/shuttle/escape/luxury) "aJ" = ( /obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/snacks/salad/validsalad, -/turf/open/floor/carpet, +/obj/item/reagent_containers/food/snacks/melonfruitbowl, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) "aK" = ( /obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/snacks/carneburrito, -/turf/open/floor/carpet, +/obj/item/reagent_containers/food/snacks/khachapuri, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) "aL" = ( /obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/snacks/chawanmushi, -/turf/open/floor/carpet, +/obj/item/reagent_containers/food/snacks/grilledcheese, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) "aM" = ( -/obj/machinery/computer/emergency_shuttle{ - dir = 8 - }, -/turf/open/floor/mineral/gold, +/obj/structure/table/wood/fancy, +/obj/item/reagent_containers/food/snacks/jelliedtoast/cherry, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) "aN" = ( /obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/snacks/melonfruitbowl, -/turf/open/floor/carpet, +/obj/item/reagent_containers/food/snacks/honeybun, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) "aO" = ( /obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/snacks/khachapuri, -/turf/open/floor/carpet, +/obj/item/reagent_containers/food/snacks/eggplantparm, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) "aP" = ( /obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/snacks/grilledcheese, -/turf/open/floor/carpet, +/obj/item/reagent_containers/food/snacks/copypasta, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) "aQ" = ( /obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/snacks/jelliedtoast/cherry, -/turf/open/floor/carpet, +/obj/item/reagent_containers/food/snacks/bearsteak, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) "aR" = ( /obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/snacks/honeybun, -/turf/open/floor/carpet, +/obj/item/reagent_containers/food/snacks/boiledspaghetti, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) "aS" = ( /obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/snacks/eggplantparm, -/turf/open/floor/carpet, +/obj/item/reagent_containers/food/snacks/cherrycupcake, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) "aT" = ( /obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/snacks/copypasta, -/turf/open/floor/carpet, +/obj/item/reagent_containers/food/snacks/customizable/pizza, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) "aU" = ( /obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/snacks/bearsteak, -/turf/open/floor/carpet, +/obj/item/reagent_containers/food/snacks/hotdog, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) "aV" = ( /obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/snacks/boiledspaghetti, -/turf/open/floor/carpet, +/obj/item/reagent_containers/food/snacks/pie/grapetart, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) "aW" = ( /obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/snacks/cherrycupcake, -/turf/open/floor/carpet, +/obj/item/reagent_containers/food/snacks/burger/superbite, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) "aX" = ( /obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/snacks/customizable/pizza, -/turf/open/floor/carpet, +/obj/item/reagent_containers/food/snacks/cakeslice/slimecake, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) "aY" = ( -/obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/snacks/hotdog, -/turf/open/floor/carpet, +/obj/structure/chair/comfy{ + dir = 4 + }, +/turf/open/floor/carpet/royalblue, /area/shuttle/escape/luxury) "aZ" = ( -/obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/snacks/pie/grapetart, -/turf/open/floor/carpet, -/area/shuttle/escape/luxury) -"ba" = ( -/obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/snacks/burger/superbite, -/turf/open/floor/carpet, -/area/shuttle/escape/luxury) -"bb" = ( -/obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/snacks/cakeslice/slimecake, -/turf/open/floor/carpet, -/area/shuttle/escape/luxury) -"bc" = ( -/obj/machinery/computer/station_alert{ +/obj/machinery/computer/communications{ dir = 8 }, -/turf/open/floor/mineral/gold, +/turf/open/floor/carpet/royalblue, /area/shuttle/escape/luxury) -"bd" = ( +"ba" = ( /obj/structure/chair/comfy{ dir = 1 }, -/turf/open/floor/carpet, +/turf/open/floor/carpet/royalblack, /area/shuttle/escape/luxury) -"be" = ( -/obj/machinery/computer/crew{ +"bb" = ( +/obj/machinery/computer/emergency_shuttle{ dir = 8 }, -/turf/open/floor/mineral/gold, +/turf/open/floor/carpet/royalblue, /area/shuttle/escape/luxury) -"bf" = ( +"bc" = ( /obj/machinery/sleeper{ dir = 4 }, -/turf/open/floor/mineral/gold, +/turf/open/floor/carpet/red, +/area/shuttle/escape/luxury) +"bd" = ( +/obj/machinery/computer/station_alert{ + dir = 8 + }, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape/luxury) +"be" = ( +/turf/open/floor/wood, +/area/shuttle/escape/luxury) +"bf" = ( +/obj/machinery/computer/crew{ + dir = 8 + }, +/turf/open/floor/carpet/royalblue, /area/shuttle/escape/luxury) "bg" = ( /obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; - pixel_y = 3 + icon_state = "plant-10" }, -/turf/open/floor/mineral/gold, +/turf/open/floor/carpet/red, /area/shuttle/escape/luxury) "bh" = ( /turf/open/floor/plating/beach/coastline_b, /area/shuttle/escape/luxury) "bi" = ( -/obj/machinery/light, -/turf/open/floor/mineral/gold, +/obj/machinery/door/airlock/gold/glass{ + req_access_txt = "19" + }, +/turf/open/floor/carpet/royalblue, /area/shuttle/escape/luxury) "bj" = ( -/obj/machinery/light{ - dir = 8 +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-21"; + pixel_x = -3; + pixel_y = 3 }, -/turf/open/floor/mineral/gold, +/turf/open/floor/wood, /area/shuttle/escape/luxury) "bk" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/mineral/gold, -/area/shuttle/escape/luxury) -"bl" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-10" }, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/mineral/gold, +/turf/open/floor/carpet/royalblue, /area/shuttle/escape/luxury) -"bp" = ( +"bl" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21"; pixel_x = -3; pixel_y = 3 }, /obj/machinery/light, -/turf/open/floor/mineral/gold, +/turf/open/floor/wood, +/area/shuttle/escape/luxury) +"bm" = ( +/obj/structure/chair/comfy, +/turf/open/floor/carpet/red, +/area/shuttle/escape/luxury) +"bn" = ( +/obj/structure/table/wood/fancy, +/obj/item/reagent_containers/food/drinks/bottle/wine, +/turf/open/floor/carpet/red, +/area/shuttle/escape/luxury) +"bo" = ( +/obj/structure/chair/comfy{ + dir = 1 + }, +/turf/open/floor/carpet/red, +/area/shuttle/escape/luxury) +"bp" = ( +/obj/item/toy/cards/deck/cas/black, +/obj/structure/table/wood/fancy, +/turf/open/floor/carpet/red, +/area/shuttle/escape/luxury) +"bq" = ( +/obj/structure/table/wood/fancy, +/obj/item/toy/cards/deck/cas, +/turf/open/floor/carpet/red, +/area/shuttle/escape/luxury) +"br" = ( +/obj/structure/table/wood/fancy, +/obj/item/reagent_containers/food/drinks/bottle/whiskey, +/turf/open/floor/carpet/red, +/area/shuttle/escape/luxury) +"bs" = ( +/obj/structure/table/wood/fancy, +/obj/item/reagent_containers/food/drinks/bottle/grappa, +/turf/open/floor/carpet/red, +/area/shuttle/escape/luxury) +"bt" = ( +/obj/structure/table/optable, +/turf/open/floor/carpet/red, +/area/shuttle/escape/luxury) +"bu" = ( +/obj/machinery/door/airlock/gold/glass, +/turf/open/floor/carpet/red, +/area/shuttle/escape/luxury) +"bv" = ( +/obj/structure/table/plasmaglass, +/obj/item/storage/firstaid/brute, +/obj/item/storage/firstaid/fire, +/obj/item/storage/firstaid/toxin, +/turf/open/floor/carpet/red, +/area/shuttle/escape/luxury) +"bw" = ( +/obj/structure/table/plasmaglass, +/obj/item/storage/backpack/duffelbag/med/surgery, +/turf/open/floor/carpet/red, +/area/shuttle/escape/luxury) +"bx" = ( +/obj/machinery/door/airlock/gold, +/turf/open/floor/plasteel/white, +/area/shuttle/escape/luxury) +"by" = ( +/obj/structure/toilet{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape/luxury) +"bz" = ( +/obj/machinery/shower{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape/luxury) +"bA" = ( +/obj/structure/bed, +/turf/open/floor/wood, +/area/shuttle/escape/luxury) +"bC" = ( +/obj/machinery/vending/coffee, +/turf/open/floor/carpet/red, +/area/shuttle/escape/luxury) +"bD" = ( +/obj/machinery/vending/boozeomat/all_access, +/turf/open/floor/carpet/red, +/area/shuttle/escape/luxury) +"bE" = ( +/obj/machinery/light{ + dir = 1; + light_range = 8 + }, +/turf/open/floor/carpet/red, +/area/shuttle/escape/luxury) +"bF" = ( +/obj/machinery/light{ + dir = 4; + light_range = 8 + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-10" + }, +/turf/open/floor/carpet/red, +/area/shuttle/escape/luxury) +"bG" = ( +/obj/machinery/light{ + light_range = 8 + }, +/turf/open/floor/plating/beach/coastline_b, +/area/shuttle/escape/luxury) +"bH" = ( +/obj/machinery/light{ + dir = 1; + light_range = 8 + }, +/turf/open/floor/mineral/plastitanium/red/brig, +/area/shuttle/escape/luxury) +"bI" = ( +/obj/machinery/light{ + light_range = 8 + }, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape/luxury) +"Uj" = ( +/obj/machinery/door/airlock/gold/glass{ + name = "shuttle brig"; + req_access_txt = "2" + }, +/turf/open/floor/mineral/plastitanium/red/brig, /area/shuttle/escape/luxury) (1,1,1) = {" -aa -ab -ab -ab -ab +ac +ac +ac +ac +ac ar ar ar ar -ab -ab -ab -ab +ac +ac +ac +ac aa "} (2,1,1) = {" -ab -ab -am -ab -ab +ac +bz +ah +by +ac as as as as -ab -bf -bf -ab -ab +ac +bc +bc +ac +ac "} (3,1,1) = {" -ab +ac +aI +ah +aq +ac +ac +ac +ac +ac +ac af -ag -ab -ab -ab -ab -ab -ab -ab -aj -aj -ab -ab +af +bv +ac "} (4,1,1) = {" -ab -ag +ac +ac +bx +ac +ac an -ab -bl -aj -aj -aj -aj -bj -aj -aj -ak -ab +an +an +an +bu +af +af +bt +ac "} (5,1,1) = {" -ab -ag -ag -ab -aj -at -at -at -at -aj -aj -aj -aj -ab -"} -(6,1,1) = {" -ab -ag -ag -ab -aj -au -ax -aN -bd -aj -aj -bg -bp -ab -"} -(7,1,1) = {" -ab -ah -ag -ab -aj -au -ay -aO -bd -aj -aj -bh -bh -ab -"} -(8,1,1) = {" -ab -ag -ag -ab -aj -au -az -aP -bd -aj -aj -bh -bh -ab -"} -(9,1,1) = {" -ab -ag -ag -ab -aj -au -aA -aQ -bd -aj -aj -bh -bh -ab -"} -(10,1,1) = {" -ab -ai -ao -ab -aj -au -aB -aR -bd -aj -aj -bh -bh -ab -"} -(11,1,1) = {" -ab -ag -ag -ab -aj -au -aC -aS -bd -aj -aj -bh -bh -ab -"} -(12,1,1) = {" ac +af +af +af +bg +ao +at +aJ +ba +bu ag af -ab -aj -au -aD -aT -bd -aj -aj -bh -bh -ab +bw +ac "} -(13,1,1) = {" -ab -ab -ab -ab -aj -au -aE -aU -bd -aj -aj -bh -bh -ab -"} -(14,1,1) = {" -ad -aj -aj -bj -aj -au -aF -aV -bd -aj -aj -bh -bh -ab -"} -(15,1,1) = {" -ab -aj -aj -aj -aj -au -aG -aW -bd -aj -aj -bh -bh -ab -"} -(16,1,1) = {" -ab -aj -aj -aj -aj -au -aH -aX -bd -aj -aj -bh -bh -ab -"} -(17,1,1) = {" -ab -aj -aj -aj -aj -au -aI -aY -bd -aj -aj -bh -bh -ab -"} -(18,1,1) = {" -ab -aj -aj -aj -aj -au -aJ -aZ -bd -aj -aj -bh -bh -ab -"} -(19,1,1) = {" -ab -aj -aj -aj -aj +(6,1,1) = {" +ac +bE +af +af +af +ao au aK ba -bd -aj -aj +ac +ac +ac +ac +ac +"} +(7,1,1) = {" +ac +af +af +af +af +ao +av +aL +ba +af +be +bj +bj +ac +"} +(8,1,1) = {" +ac +bm +bn +bo +af +ao +aw +aM +ba +af +be bh bh +ac +"} +(9,1,1) = {" +ac +bm ab +bo +af +ao +ax +aN +ba +af +bA +bh +bh +ac +"} +(10,1,1) = {" +ac +bm +br +bo +af +ao +ay +aO +ba +af +bA +bh +bh +ac +"} +(11,1,1) = {" +ac +bE +af +af +af +ao +az +aP +ba +af +bA +bh +bG +ac +"} +(12,1,1) = {" +ad +af +af +af +af +ao +aA +aQ +ba +af +bA +bh +bh +ac +"} +(13,1,1) = {" +ac +bg +af +af +af +ao +aB +aR +ba +af +bA +bh +bh +ac +"} +(14,1,1) = {" +ad +af +af +af +af +ao +aC +aS +ba +af +bA +bh +bh +ac +"} +(15,1,1) = {" +ac +bE +af +af +af +ao +aD +aT +ba +af +bA +bh +bG +ac +"} +(16,1,1) = {" +ac +bm +bs +bo +af +ao +aE +aU +ba +af +bA +bh +bh +ac +"} +(17,1,1) = {" +ac +bm +bp +bo +af +ao +aF +aV +ba +af +bA +bh +bh +ac +"} +(18,1,1) = {" +ac +bm +bq +bo +af +ao +aG +aW +ba +af +bA +bh +bh +ac +"} +(19,1,1) = {" +ac +bE +af +af +af +ao +aH +aX +ba +af +be +bh +bh +ac "} (20,1,1) = {" ae -aj -aj -bk -aj -au -aL -bb -bd -aj -aj -bg -bp -ab +af +af +af +bF +an +an +ap +an +af +be +bj +bl +ac "} (21,1,1) = {" -ab -ab -ab -ab -aj -at -at -at -at -aj -aj -aj -aj -ab +ac +ac +ac +ac +ac +af +af +ac +ac +ac +ac +ac +ac +ac "} (22,1,1) = {" -ab +aj +al ak -ap -ab -aj -aj -aj -aj -aj -aj -aj -aj -aj -ab +ak +ac +af +af +bi +am +am +am +am +am +ac "} (23,1,1) = {" -ab -aj -bi -ab -aj -av -av -av -av -aj -aj -aj -aj -ab +ac +bH +al +al +Uj +af +af +ac +aY +aY +aY +aY +bI +ac "} (24,1,1) = {" -ab -al -aj -aq +ac +ai +ai +ai +ac +bC +bD +ac +aZ +bb +bd +bf bk -aw -aM -bc -be -bk -aj -aj -ak -ab +ac "} (25,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac "} diff --git a/_maps/shuttles/emergency_meta.dmm b/_maps/shuttles/emergency_meta.dmm index 0a357d2308..8df487714e 100644 --- a/_maps/shuttles/emergency_meta.dmm +++ b/_maps/shuttles/emergency_meta.dmm @@ -2,6 +2,13 @@ "aa" = ( /turf/template_noop, /area/template_noop) +"ab" = ( +/obj/machinery/door/airlock/titanium{ + name = "Emergency Shuttle Airlock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) "ac" = ( /obj/effect/spawner/structure/window/shuttle, /turf/open/floor/plating, @@ -9,17 +16,7 @@ "ad" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/escape) -"af" = ( -/obj/machinery/door/airlock/titanium{ - name = "Emergency Shuttle Airlock" - }, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) -"ag" = ( -/obj/structure/sign/warning/nosmoking, -/turf/closed/wall/mineral/titanium, -/area/shuttle/escape) -"ah" = ( +"ae" = ( /obj/machinery/door/airlock/titanium{ name = "Emergency Shuttle Airlock" }, @@ -30,8 +27,21 @@ name = "Meta emergency shuttle"; width = 25 }, +/obj/structure/fans/tiny, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) +"af" = ( +/obj/machinery/door/airlock/external{ + name = "Emergency Recovery Airlock" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/fans/tiny, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"ag" = ( +/obj/structure/sign/warning/nosmoking, +/turf/closed/wall/mineral/titanium, +/area/shuttle/escape) "al" = ( /obj/structure/table, /obj/item/phone{ @@ -513,7 +523,6 @@ /area/shuttle/escape) "bz" = ( /obj/structure/table/optable, -/obj/item/surgical_drapes, /obj/machinery/light{ dir = 8 }, @@ -576,25 +585,12 @@ /area/shuttle/escape) "bH" = ( /obj/structure/table, -/obj/item/scalpel{ - pixel_y = 12 - }, -/obj/item/circular_saw, -/obj/item/retractor{ - pixel_x = 4 - }, -/obj/item/hemostat{ - pixel_x = -4 - }, -/obj/item/clothing/gloves/color/latex, -/obj/item/clothing/mask/surgical, +/obj/item/storage/backpack/duffelbag/med/surgery, /obj/item/radio/intercom{ dir = 2; name = "Station Intercom (General)"; pixel_x = -27 }, -/obj/item/surgicaldrill, -/obj/item/cautery, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "bI" = ( @@ -939,7 +935,7 @@ be cc be be -bf +af "} (6,1,1) = {" ac @@ -955,7 +951,7 @@ bf bT be be -bf +af "} (7,1,1) = {" ac @@ -1038,7 +1034,7 @@ bF ac "} (12,1,1) = {" -af +ab LY LY aE @@ -1070,7 +1066,7 @@ ad ad "} (14,1,1) = {" -af +ab LY LY aE @@ -1166,7 +1162,7 @@ bM ad "} (20,1,1) = {" -ah +ae LY LY aE @@ -1198,7 +1194,7 @@ bO ac "} (22,1,1) = {" -af +ab LY LY LY diff --git a/_maps/shuttles/emergency_mini.dmm b/_maps/shuttles/emergency_mini.dmm index 1be681e5b3..5e1157062a 100644 --- a/_maps/shuttles/emergency_mini.dmm +++ b/_maps/shuttles/emergency_mini.dmm @@ -113,6 +113,21 @@ /obj/machinery/door/airlock/titanium{ name = "Emergency Shuttle Airlock" }, +/obj/structure/fans/tiny, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"v" = ( +/obj/machinery/door/airlock/titanium{ + name = "Emergency Shuttle Airlock" + }, +/obj/docking_port/mobile/emergency{ + dir = 8; + dwidth = 8; + height = 9; + name = "Mini emergency shuttle"; + width = 21 + }, +/obj/structure/fans/tiny, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "x" = ( @@ -145,19 +160,6 @@ }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) -"B" = ( -/obj/machinery/door/airlock/titanium{ - name = "Emergency Shuttle Airlock" - }, -/obj/docking_port/mobile/emergency{ - dir = 8; - dwidth = 8; - height = 9; - name = "Mini emergency shuttle"; - width = 21 - }, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) "D" = ( /obj/structure/table, /obj/item/storage/firstaid/fire, @@ -453,7 +455,7 @@ b n b b -B +v b b b diff --git a/_maps/shuttles/emergency_narnar.dmm b/_maps/shuttles/emergency_narnar.dmm index 80046340e8..8adbd6f392 100644 --- a/_maps/shuttles/emergency_narnar.dmm +++ b/_maps/shuttles/emergency_narnar.dmm @@ -6,7 +6,8 @@ /turf/closed/wall/mineral/cult, /area/shuttle/escape) "c" = ( -/obj/effect/forcefield/cult, +/obj/machinery/door/airlock/cult/friendly, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/escape) "d" = ( @@ -125,6 +126,10 @@ /area/shuttle/escape) "x" = ( /obj/machinery/door/airlock/cult/friendly, +/obj/docking_port/mobile/emergency{ + name = "shuttle 667" + }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/escape) "y" = ( @@ -156,13 +161,6 @@ /obj/effect/decal/remains/human, /turf/open/floor/plasteel/cult, /area/shuttle/escape) -"E" = ( -/obj/machinery/door/airlock/cult/friendly, -/obj/docking_port/mobile/emergency{ - name = "shuttle 667" - }, -/turf/open/floor/plating, -/area/shuttle/escape) "F" = ( /obj/effect/decal/cleanable/blood/gibs/down, /turf/open/floor/plasteel/cult, @@ -262,6 +260,10 @@ /obj/structure/shuttle/engine/propulsion, /turf/open/floor/plating/airless, /area/shuttle/escape) +"W" = ( +/obj/effect/spawner/structure/window/plastitanium, +/turf/open/floor/plating, +/area/shuttle/escape) (1,1,1) = {" a @@ -271,17 +273,17 @@ a b b b -x -b -E -b -c -c c b x b -x +W +W +W +b +c +b +c b b b @@ -336,7 +338,7 @@ U V "} (4,1,1) = {" -c +W d i n @@ -360,7 +362,7 @@ U V "} (5,1,1) = {" -c +W e j o @@ -384,7 +386,7 @@ U V "} (6,1,1) = {" -c +W f j j @@ -408,7 +410,7 @@ U V "} (7,1,1) = {" -c +W e j j @@ -424,7 +426,7 @@ j j K L -c +W t j t @@ -432,7 +434,7 @@ U V "} (8,1,1) = {" -c +W g k k @@ -472,7 +474,7 @@ A j j j -c +W j j j @@ -496,7 +498,7 @@ j j j M -c +W P Q P @@ -509,21 +511,21 @@ a a a b -c +W b -c +W b b b -c -c -c +W +W +W b b b -c +W b -c +W b a "} diff --git a/_maps/shuttles/emergency_omega.dmm b/_maps/shuttles/emergency_omega.dmm index 1601c97020..bd99f35bb5 100644 --- a/_maps/shuttles/emergency_omega.dmm +++ b/_maps/shuttles/emergency_omega.dmm @@ -185,6 +185,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/structure/fans/tiny, /turf/open/floor/plasteel/white, /area/shuttle/escape) "ar" = ( @@ -287,6 +288,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/structure/fans/tiny, /turf/open/floor/plasteel/white, /area/shuttle/escape) "az" = ( @@ -509,6 +511,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/structure/fans/tiny, /turf/open/floor/plasteel/white, /area/shuttle/escape) "aQ" = ( @@ -782,41 +785,27 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "bn" = ( -/obj/item/scalpel{ - pixel_y = 12 +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, -/obj/item/circular_saw, -/obj/item/retractor{ - pixel_x = 4 +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, -/obj/item/hemostat{ - pixel_x = -4 - }, -/obj/item/clothing/gloves/color/latex, -/obj/item/clothing/mask/surgical, /obj/structure/table/reinforced, /obj/structure/extinguisher_cabinet{ pixel_x = -24 }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/item/cautery, -/obj/item/surgicaldrill, +/obj/item/storage/backpack/duffelbag/med/surgery, /turf/open/floor/plasteel/white, /area/shuttle/escape) "bo" = ( /obj/structure/table/optable, -/obj/item/surgical_drapes, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/shuttle/escape) "bp" = ( diff --git a/_maps/shuttles/emergency_pubby.dmm b/_maps/shuttles/emergency_pubby.dmm index dc58ecf201..7b4bcc71f5 100644 --- a/_maps/shuttles/emergency_pubby.dmm +++ b/_maps/shuttles/emergency_pubby.dmm @@ -58,6 +58,29 @@ }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) +"am" = ( +/obj/machinery/door/airlock/titanium{ + name = "Emergency Shuttle Airlock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/escape) +"an" = ( +/obj/machinery/door/airlock/titanium{ + name = "Emergency Shuttle Airlock" + }, +/obj/docking_port/mobile/emergency{ + dir = 8; + dwidth = 27; + height = 8; + name = "PubbyStation emergency shuttle"; + port_direction = 4; + preferred_direction = 1; + width = 46 + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/escape) "ap" = ( /obj/structure/chair/comfy, /obj/machinery/computer/security/telescreen/entertainment{ @@ -133,12 +156,6 @@ "ax" = ( /turf/open/floor/mineral/plastitanium/red/brig, /area/shuttle/escape) -"ay" = ( -/obj/machinery/door/airlock/titanium{ - name = "Emergency Shuttle Airlock" - }, -/turf/open/floor/plating, -/area/shuttle/escape) "az" = ( /obj/structure/chair/comfy{ dir = 1 @@ -440,14 +457,12 @@ /turf/open/floor/plasteel/dark, /area/shuttle/escape) "aZ" = ( -/obj/structure/table/glass, +/obj/machinery/sleeper, /obj/machinery/light{ dir = 1 }, -/obj/item/storage/firstaid/regular, /obj/structure/window/reinforced{ - dir = 4; - layer = 2.9 + dir = 4 }, /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -487,13 +502,18 @@ /turf/open/floor/plasteel/cafeteria, /area/shuttle/escape) "be" = ( -/obj/structure/chair/comfy/shuttle, -/obj/effect/turf_decal/tile/blue{ - dir = 4 +/obj/structure/table, +/obj/item/storage/firstaid, +/obj/item/storage/firstaid/fire{ + pixel_x = -3; + pixel_y = 3 }, /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/shuttle/escape) "bf" = ( @@ -509,30 +529,12 @@ /turf/open/floor/plating, /area/shuttle/escape) "bh" = ( -/obj/structure/window/reinforced, -/obj/structure/table/glass, -/obj/item/defibrillator/loaded, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/turf/open/floor/plasteel/white, -/area/shuttle/escape) -"bi" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/table/glass, -/obj/item/storage/firstaid/regular, /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, /turf/open/floor/plasteel/white, /area/shuttle/escape) "bj" = ( @@ -551,11 +553,8 @@ /turf/open/floor/plating, /area/shuttle/escape) "bn" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, +/obj/structure/reagent_dispensers/fueltank, /obj/machinery/light, -/obj/item/storage/toolbox/mechanical, /turf/open/floor/plating, /area/shuttle/escape) "bo" = ( @@ -675,21 +674,6 @@ }, /turf/open/floor/plating, /area/shuttle/escape) -"bL" = ( -/obj/machinery/door/airlock/titanium{ - name = "Emergency Shuttle Airlock" - }, -/obj/docking_port/mobile/emergency{ - dir = 8; - dwidth = 27; - height = 8; - name = "PubbyStation emergency shuttle"; - port_direction = 4; - preferred_direction = 1; - width = 46 - }, -/turf/open/floor/plating, -/area/shuttle/escape) "bO" = ( /obj/machinery/door/airlock/public/glass{ name = "Cockpit"; @@ -710,6 +694,21 @@ }, /turf/open/floor/plating, /area/shuttle/escape) +"sI" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/item/storage/backpack/duffelbag/med/surgery, +/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/shuttle/escape) "xt" = ( /obj/structure/window/reinforced{ dir = 8; @@ -717,6 +716,17 @@ }, /turf/open/floor/plating, /area/shuttle/escape) +"Jw" = ( +/obj/structure/window/reinforced, +/obj/structure/table/optable, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/escape) "Uu" = ( /obj/structure/window/reinforced{ dir = 4 @@ -804,9 +814,9 @@ aX bb be bh +Jw +bg bl -bg -bg ab aa bs @@ -851,8 +861,8 @@ ab aZ bb bb -bi -bl +bh +sI bg bn ab @@ -1071,17 +1081,17 @@ ab ab ab ab -ay +am ab -ay +am ab ab aa ab ab -bL +an ab -ay +am ab ac ab diff --git a/_maps/shuttles/emergency_raven.dmm b/_maps/shuttles/emergency_raven.dmm index 294b2e8c40..2c04837c79 100644 --- a/_maps/shuttles/emergency_raven.dmm +++ b/_maps/shuttles/emergency_raven.dmm @@ -149,9 +149,6 @@ /area/shuttle/escape) "as" = ( /obj/structure/table/optable, -/obj/item/surgical_drapes, -/obj/item/clothing/gloves/color/latex, -/obj/item/clothing/mask/surgical, /obj/effect/turf_decal/tile/purple{ dir = 1 }, @@ -228,18 +225,13 @@ /area/shuttle/escape) "aB" = ( /obj/structure/table/reinforced, -/obj/item/scalpel, -/obj/item/circular_saw, -/obj/item/retractor, -/obj/item/hemostat, +/obj/item/storage/backpack/duffelbag/med/surgery, /obj/effect/turf_decal/tile/purple{ dir = 1 }, /obj/effect/turf_decal/tile/purple{ dir = 8 }, -/obj/item/surgicaldrill, -/obj/item/cautery, /turf/open/floor/plasteel/dark, /area/shuttle/escape) "aC" = ( @@ -427,6 +419,22 @@ "aW" = ( /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape) +"aX" = ( +/obj/machinery/door/airlock/hatch, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/escape) +"aY" = ( +/obj/docking_port/mobile/emergency{ + dwidth = 14; + height = 18; + name = "CentCom Raven Battlecruiser"; + width = 32 + }, +/obj/machinery/door/airlock/hatch, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/escape) "aZ" = ( /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/green{ @@ -761,16 +769,6 @@ }, /turf/open/floor/plasteel/dark, /area/shuttle/escape) -"bE" = ( -/obj/docking_port/mobile/emergency{ - dwidth = 14; - height = 18; - name = "CentCom Raven Battlecruiser"; - width = 32 - }, -/obj/machinery/door/airlock/hatch, -/turf/open/floor/plating, -/area/shuttle/escape) "bF" = ( /obj/effect/turf_decal/tile/green{ dir = 1 @@ -1331,9 +1329,13 @@ "eP" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/shuttle/escape) -"UQ" = ( -/obj/machinery/door/airlock/hatch, -/turf/open/floor/plating, +"Mb" = ( +/obj/machinery/door/airlock/hatch{ + name = "Shuttle EVA"; + req_access_txt = "19" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plasteel/dark, /area/shuttle/escape) (1,1,1) = {" @@ -1349,17 +1351,17 @@ bJ cs bJ bJ -UQ +aX cs -bE +aY bJ bJ cs ad aa -UQ +aX bJ -UQ +aX cs bJ cs @@ -1651,7 +1653,7 @@ cs ad cr cs -aR +Mb cs ar br @@ -1893,7 +1895,7 @@ bJ bJ bJ cs -cs +en ad ad ad @@ -1909,7 +1911,7 @@ ab bJ bJ cs -cs +en ad ad ad diff --git a/_maps/shuttles/emergency_russiafightpit.dmm b/_maps/shuttles/emergency_russiafightpit.dmm index abc40aa523..65fc7e30a2 100644 --- a/_maps/shuttles/emergency_russiafightpit.dmm +++ b/_maps/shuttles/emergency_russiafightpit.dmm @@ -235,6 +235,7 @@ name = "Emergency Shuttle Airlock"; req_access_txt = "2" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/escape) "aP" = ( @@ -282,6 +283,7 @@ /obj/machinery/door/airlock/security/glass{ name = "Emergency Shuttle Airlock" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/escape) "aX" = ( @@ -375,7 +377,9 @@ /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape) "bk" = ( -/obj/structure/kitchenspike, +/obj/machinery/light/small{ + dir = 4 + }, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "bl" = ( @@ -420,6 +424,7 @@ /obj/machinery/door/airlock/security/glass{ name = "Emergency Shuttle Airlock" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/escape) "bs" = ( @@ -460,13 +465,10 @@ /turf/open/floor/plating, /area/shuttle/escape) "bz" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = 27 - }, -/turf/open/floor/plating, +/turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "bA" = ( -/obj/structure/closet/emcloset, +/obj/machinery/sleeper, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/shuttle/escape) @@ -487,17 +489,12 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "bD" = ( -/obj/machinery/sleeper{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, +/obj/structure/closet/emcloset, +/turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape) "bE" = ( -/obj/machinery/sleeper{ - dir = 4 - }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/sleeper, /turf/open/floor/plasteel, /area/shuttle/escape) "bF" = ( @@ -567,13 +564,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) -"bP" = ( -/obj/structure/kitchenspike, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/escape) "bQ" = ( /obj/machinery/light, /turf/open/floor/mineral/plastitanium/red, @@ -584,6 +574,56 @@ }, /turf/open/floor/plating, /area/shuttle/escape) +"bS" = ( +/obj/structure/kitchenspike, +/turf/open/floor/plating, +/area/shuttle/escape) +"bT" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 27 + }, +/obj/structure/kitchenspike, +/turf/open/floor/plating, +/area/shuttle/escape) +"bU" = ( +/obj/machinery/vending/sovietsoda, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"ca" = ( +/obj/structure/shuttle/engine/heater, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"cb" = ( +/obj/structure/shuttle/engine/propulsion, +/turf/open/floor/plating, +/area/shuttle/escape) +"cd" = ( +/obj/structure/closet/emcloset, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"ce" = ( +/obj/structure/table/optable, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"cf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/storage/backpack/duffelbag/med/surgery, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"cg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/turf/open/floor/plasteel, +/area/shuttle/escape) (1,1,1) = {" aa @@ -712,7 +752,7 @@ aj ao ad aw -ax +aR ax aR ax @@ -721,9 +761,9 @@ ax aR ax bj -ax +aR ab -by +bS bx bI bK @@ -736,6 +776,30 @@ ak ak at ax +aR +ax +ax +ax +aR +aR +aR +aR +aR +ax +ab +bT +bx +bI +ca +cb +"} +(8,1,1) = {" +ac +ag +ak +ap +ab +ax aJ aJ aJ @@ -745,30 +809,6 @@ ax bc bc bc -ax -ab -bz -bx -bI -bK -bL -"} -(8,1,1) = {" -ac -ag -ak -ap -ab -ay -ay -ay -aS -aY -bf -ax -ax -ax -ax bQ bv ad @@ -783,6 +823,30 @@ af al aq au +ay +ay +ay +aS +aY +bf +ax +ax +ax +ax +ax +ad +bA +cg +ce +bK +bL +"} +(10,1,1) = {" +ac +bU +ak +aq +au az aK aQ @@ -792,16 +856,16 @@ ax ax bl ax -ax +bD ax ad -bA bE -bA +bB +bJ bK bL "} -(10,1,1) = {" +(11,1,1) = {" ac ah ak @@ -821,16 +885,16 @@ ax ac bB bB -bJ +cf bK bL "} -(11,1,1) = {" +(12,1,1) = {" ad ab am ar -au +ac aB aA aA @@ -849,12 +913,12 @@ bB bK bL "} -(12,1,1) = {" +(13,1,1) = {" aa ad ab ad -as +bv aC aK bM @@ -869,11 +933,11 @@ ax ac bB bB -bD +bF ad ad "} -(13,1,1) = {" +(14,1,1) = {" aa aa aa @@ -892,41 +956,41 @@ ax ax ad bC -bF +cd ad ad aa "} -(14,1,1) = {" -aa -aa -aa -aa -ab -aE -aN -aN -aV -aD -bi -bk -bk -bk -bP -bt -ab -bD -ab -ad -aa -aa -"} (15,1,1) = {" aa aa aa aa ad +aE +aN +aN +aV +aD +bi +bz +bz +bz +bk +bt +ab +cd +ab +ad +aa +aa +"} +(16,1,1) = {" +aa +aa +aa +aa +aa aD aE aE diff --git a/_maps/shuttles/emergency_scrapheap.dmm b/_maps/shuttles/emergency_scrapheap.dmm index 226dee7d9d..4bd8f07c8e 100644 --- a/_maps/shuttles/emergency_scrapheap.dmm +++ b/_maps/shuttles/emergency_scrapheap.dmm @@ -106,6 +106,7 @@ name = "Emergency Shuttle Airlock"; req_access_txt = "2" }, +/obj/structure/fans/tiny, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "at" = ( @@ -174,6 +175,7 @@ name = "Emergency Shuttle Airlock"; req_access_txt = "2" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/escape) "aD" = ( @@ -227,6 +229,7 @@ /obj/docking_port/mobile/emergency{ name = "Scrapheap Challenge" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/escape) "aL" = ( @@ -309,6 +312,7 @@ /obj/machinery/door/airlock/titanium{ name = "Emergency Shuttle Airlock" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/escape) "ba" = ( diff --git a/_maps/shuttles/emergency_supermatter.dmm b/_maps/shuttles/emergency_supermatter.dmm index fcdbf48a3d..71f791fad0 100644 --- a/_maps/shuttles/emergency_supermatter.dmm +++ b/_maps/shuttles/emergency_supermatter.dmm @@ -2,6 +2,13 @@ "aa" = ( /turf/template_noop, /area/template_noop) +"ab" = ( +/obj/machinery/door/airlock/titanium{ + name = "Emergency Shuttle Airlock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/escape) "ac" = ( /obj/structure/sign/warning/radiation, /turf/closed/wall/mineral/titanium, @@ -13,6 +20,16 @@ "ae" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/escape) +"af" = ( +/obj/machinery/door/airlock/titanium{ + name = "Emergency Shuttle Airlock" + }, +/obj/docking_port/mobile/emergency{ + name = "Hyperfractal Gigashuttle" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/escape) "ag" = ( /obj/structure/closet/radiation{ anchored = 1 @@ -33,6 +50,14 @@ }, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) +"ak" = ( +/obj/machinery/door/airlock/external{ + name = "Emergency Launch Catwalk"; + req_access_txt = "10;13" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/escape) "al" = ( /obj/machinery/shower{ dir = 8 @@ -101,12 +126,6 @@ "ax" = ( /turf/closed/wall/mineral/titanium/interior, /area/shuttle/escape) -"aA" = ( -/obj/machinery/door/airlock/titanium{ - name = "Emergency Shuttle Airlock" - }, -/turf/open/floor/plating, -/area/shuttle/escape) "aB" = ( /obj/machinery/power/supermatter_crystal/shard/hugbox/fakecrystal, /turf/open/floor/plating, @@ -125,26 +144,10 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) -"aF" = ( -/obj/machinery/door/airlock/titanium{ - name = "Emergency Shuttle Airlock" - }, -/obj/docking_port/mobile/emergency{ - name = "Hyperfractal Gigashuttle" - }, -/turf/open/floor/plating, -/area/shuttle/escape) "aI" = ( /obj/structure/sign/warning/radiation, /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/escape) -"aL" = ( -/obj/machinery/door/airlock/external{ - name = "Emergency Launch Catwalk"; - req_access_txt = "10;13" - }, -/turf/open/floor/plating, -/area/shuttle/escape) "aM" = ( /turf/open/floor/plating/airless, /area/shuttle/escape) @@ -348,9 +351,9 @@ aa aa aa aw -aA +ab ac -aF +af aw aa aa @@ -472,7 +475,7 @@ aB bf at at -aL +ak aM aM hD @@ -588,9 +591,9 @@ aa aa aa aw -aA +ab ac -aA +ab aw aa aa diff --git a/_maps/shuttles/emergency_syndicate.dmm b/_maps/shuttles/emergency_syndicate.dmm index 6e76bbc5f6..85048b9d89 100644 --- a/_maps/shuttles/emergency_syndicate.dmm +++ b/_maps/shuttles/emergency_syndicate.dmm @@ -116,7 +116,6 @@ id = "shuttleshutters"; name = "Bridge Blast Shutters"; pixel_x = -26; - pixel_y = 0; req_access_txt = "19" }, /obj/effect/turf_decal/tile/neutral{ @@ -199,8 +198,7 @@ /obj/item/radio/intercom{ dir = 4; name = "Station Intercom (General)"; - pixel_x = 27; - pixel_y = 0 + pixel_x = 27 }, /turf/open/floor/plasteel/dark, /area/shuttle/escape) @@ -309,8 +307,7 @@ /obj/item/radio/intercom{ dir = 4; name = "Station Intercom (General)"; - pixel_x = -27; - pixel_y = 0 + pixel_x = -27 }, /turf/open/floor/plasteel/dark, /area/shuttle/escape) @@ -408,7 +405,6 @@ id = "smindicate"; name = "external door control"; pixel_x = 26; - pixel_y = 0; req_access_txt = "150" }, /obj/structure/fans/tiny, @@ -420,8 +416,7 @@ /obj/item/radio/intercom{ dir = 4; name = "Station Intercom (General)"; - pixel_x = 27; - pixel_y = 0 + pixel_x = 27 }, /turf/open/floor/plasteel/dark, /area/shuttle/escape) @@ -878,6 +873,7 @@ /area/shuttle/escape) "bz" = ( /obj/machinery/door/airlock/hatch, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/escape) "bA" = ( @@ -991,6 +987,7 @@ /obj/docking_port/mobile/emergency{ name = "Syndicate Battlecruiser" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/escape) "bL" = ( @@ -1064,10 +1061,7 @@ /area/shuttle/escape) "bR" = ( /obj/structure/table/reinforced, -/obj/item/storage/box/drinkingglasses{ - pixel_x = 0; - pixel_y = 0 - }, +/obj/item/storage/box/drinkingglasses, /obj/item/storage/box/drinkingglasses{ pixel_x = -3; pixel_y = 3 @@ -1499,8 +1493,7 @@ /obj/item/radio/intercom{ dir = 4; name = "Station Intercom (General)"; - pixel_x = 27; - pixel_y = 0 + pixel_x = 27 }, /turf/open/floor/plasteel/dark, /area/shuttle/escape) @@ -1606,8 +1599,7 @@ /obj/item/radio/intercom{ dir = 4; name = "Station Intercom (General)"; - pixel_x = 27; - pixel_y = 0 + pixel_x = 27 }, /turf/open/floor/plasteel/dark, /area/shuttle/escape) @@ -1634,10 +1626,7 @@ pixel_x = 3; pixel_y = -3 }, -/obj/item/storage/toolbox/emergency{ - pixel_x = 0; - pixel_y = 0 - }, +/obj/item/storage/toolbox/emergency, /obj/item/storage/toolbox/syndicate{ pixel_x = -3; pixel_y = 3 @@ -1717,38 +1706,31 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/item/retractor, -/obj/item/hemostat, -/obj/item/cautery, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, +/obj/item/storage/backpack/duffelbag/med/surgery, /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/turf_decal/tile/neutral, /turf/open/floor/plasteel/dark, /area/shuttle/escape) "cI" = ( /obj/structure/table/reinforced, -/obj/item/circular_saw, -/obj/item/surgicaldrill, -/obj/item/scalpel{ - pixel_y = 15 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel/dark, /area/shuttle/escape) "cJ" = ( diff --git a/_maps/shuttles/emergency_wabbajack.dmm b/_maps/shuttles/emergency_wabbajack.dmm index c2707b19e9..68434a3a66 100644 --- a/_maps/shuttles/emergency_wabbajack.dmm +++ b/_maps/shuttles/emergency_wabbajack.dmm @@ -119,12 +119,7 @@ /area/shuttle/escape) "ar" = ( /obj/structure/table, -/obj/item/storage/firstaid/fire, -/obj/item/storage/firstaid/regular{ - pixel_x = 2; - pixel_y = 3 - }, -/obj/item/crowbar, +/obj/item/storage/toolbox/mechanical, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "as" = ( @@ -166,6 +161,7 @@ name = "Emergency Shuttle Airlock"; req_access_txt = "2" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/escape) "ay" = ( @@ -206,22 +202,23 @@ /obj/docking_port/mobile/emergency{ name = "NT Lepton Violet" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/escape) "aF" = ( -/obj/machinery/door/window/eastleft, -/turf/open/floor/mineral/titanium, +/obj/machinery/door/airlock/titanium{ + name = "Emergency Shuttle Airlock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, /area/shuttle/escape) "aG" = ( +/obj/machinery/sleeper{ + dir = 8 + }, /obj/structure/extinguisher_cabinet{ pixel_x = 27 }, -/obj/structure/table/glass, -/obj/item/storage/box/syringes{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/box/beakers, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) "aH" = ( @@ -244,72 +241,36 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "aK" = ( -/obj/machinery/sleeper{ - dir = 4 +/obj/structure/table, +/obj/item/storage/firstaid/regular{ + pixel_x = 2; + pixel_y = 3 }, +/obj/item/storage/firstaid/fire, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) "aL" = ( -/obj/structure/table/reinforced, -/turf/open/floor/mineral/titanium, +/obj/structure/table, +/obj/item/storage/backpack/duffelbag/med/surgery, +/turf/open/floor/mineral/titanium/white, /area/shuttle/escape) "aM" = ( -/obj/machinery/chem_dispenser, -/obj/machinery/light/small{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/escape) -"aN" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical, -/obj/item/storage/firstaid/regular{ - pixel_x = -1; - pixel_y = 1 - }, -/obj/item/wrench/medical, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/escape) -"aO" = ( -/turf/open/floor/plating, -/area/shuttle/escape) -"aP" = ( -/obj/structure/chair/office/light{ +/obj/structure/window/reinforced{ dir = 8 }, -/turf/open/floor/mineral/titanium, -/area/shuttle/escape) -"aQ" = ( -/obj/machinery/chem_heater, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/escape) -"aR" = ( -/obj/machinery/chem_master, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/escape) -"aS" = ( -/obj/machinery/door/window/eastright, -/turf/open/floor/mineral/titanium, +/turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "aT" = ( -/obj/structure/table/glass, -/obj/item/reagent_containers/glass/bottle/epinephrine{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/reagent_containers/glass/bottle/charcoal, +/obj/structure/table/optable, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) "aU" = ( /obj/machinery/door/airlock/public/glass, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"aV" = ( -/obj/machinery/door/airlock/titanium{ - name = "Emergency Shuttle Airlock" - }, -/turf/open/floor/plating, -/area/shuttle/escape) "aW" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -517,21 +478,21 @@ }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) +"cF" = ( +/obj/machinery/sleeper{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/escape) "ji" = ( /obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) -"Ec" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/escape) "MK" = ( /obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/titanium/blue, @@ -553,9 +514,9 @@ as as as ab -aV +aF ab -aV +aF ab ab ab @@ -644,9 +605,9 @@ ab ab ab aq -aK -aN -aK +aM +aM +aM aq ab ji @@ -673,10 +634,10 @@ aq aq bn aH -ab -ab -ab -ab +as +as +as +as be bf bg @@ -691,11 +652,11 @@ ao au az ab -aF -Ec aq -Ec -aS +aJ +aJ +aJ +aq as aI aI @@ -716,9 +677,9 @@ av aA ab aq -aL -aO -aL +aM +aM +aM aq aU aq @@ -741,7 +702,7 @@ aq aC aq aq -aP +aq aq aq as @@ -764,9 +725,9 @@ aw aw ab aG -aM -aQ -aR +aK +cF +aL aT as MK diff --git a/_maps/shuttles/ferry_fancy.dmm b/_maps/shuttles/ferry_fancy.dmm index 432791c936..a5705ad37f 100644 --- a/_maps/shuttles/ferry_fancy.dmm +++ b/_maps/shuttles/ferry_fancy.dmm @@ -11,6 +11,7 @@ /area/shuttle/transport) "d" = ( /obj/machinery/door/airlock/external, +/obj/structure/fans/tiny, /turf/open/floor/pod/dark, /area/shuttle/transport) "e" = ( @@ -74,6 +75,7 @@ preferred_direction = 4; width = 5 }, +/obj/structure/fans/tiny, /turf/open/floor/pod/light, /area/shuttle/transport) "o" = ( @@ -98,6 +100,7 @@ /area/shuttle/transport) "r" = ( /obj/machinery/door/airlock/external, +/obj/structure/fans/tiny, /turf/open/floor/pod/light, /area/shuttle/transport) diff --git a/_maps/templates/hilbertshotel.dmm b/_maps/templates/hilbertshotel.dmm new file mode 100644 index 0000000000..4e4d8f8267 --- /dev/null +++ b/_maps/templates/hilbertshotel.dmm @@ -0,0 +1,545 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/space/bluespace, +/area/hilbertshotel) +"b" = ( +/turf/closed/indestructible/hotelwall, +/area/hilbertshotel) +"c" = ( +/obj/machinery/jukebox{ + req_access = null + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"d" = ( +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"e" = ( +/obj/structure/table/wood, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"f" = ( +/obj/structure/table/wood, +/obj/structure/showcase/machinery/tv, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"g" = ( +/obj/structure/dresser, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"h" = ( +/obj/structure/table/wood/fancy, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"i" = ( +/obj/structure/table/wood/fancy, +/obj/structure/mirror{ + pixel_y = 24 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"j" = ( +/obj/structure/table/wood/fancy, +/obj/item/flashlight/lamp/green, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"k" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"l" = ( +/obj/structure/table/wood/poker, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"m" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"n" = ( +/obj/effect/landmark/xmastree, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"o" = ( +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"p" = ( +/obj/structure/mineral_door/wood, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"q" = ( +/obj/structure/bed, +/obj/item/bedsheet/random, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"r" = ( +/obj/structure/closet/cabinet{ + anchored = 1 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"s" = ( +/obj/structure/table/wood/fancy, +/obj/item/reagent_containers/food/snacks/grown/poppy, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"t" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"u" = ( +/obj/structure/mineral_door/paperframe, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"v" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 32 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"w" = ( +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"x" = ( +/obj/structure/curtain, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"y" = ( +/obj/machinery/door/window/northleft, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"z" = ( +/obj/structure/table/reinforced, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"A" = ( +/obj/structure/mirror{ + pixel_x = -32 + }, +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"B" = ( +/obj/structure/chair/stool/bar, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"C" = ( +/obj/machinery/shower{ + dir = 8 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"D" = ( +/obj/machinery/light_switch{ + pixel_x = 32 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"E" = ( +/obj/structure/table/reinforced, +/obj/item/soap/deluxe, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"F" = ( +/obj/structure/window/reinforced/tinted{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted{ + dir = 1 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"G" = ( +/obj/machinery/light_switch{ + pixel_x = -32 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"H" = ( +/obj/structure/table/reinforced, +/obj/machinery/microwave, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"I" = ( +/turf/closed/indestructible/hoteldoor, +/area/hilbertshotel) +"J" = ( +/obj/machinery/light/small, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"K" = ( +/obj/structure/closet/crate/bin, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"L" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"M" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"N" = ( +/obj/structure/table/reinforced, +/obj/item/soap/deluxe, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"O" = ( +/obj/item/bikehorn/rubberducky, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"P" = ( +/obj/machinery/light/small, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"Q" = ( +/obj/machinery/smartfridge/food, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"R" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted{ + dir = 1 + }, +/obj/structure/window/reinforced/tinted{ + dir = 8 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"S" = ( +/obj/structure/window/reinforced/tinted{ + dir = 8 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"T" = ( +/obj/structure/window/reinforced/tinted{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"U" = ( +/obj/structure/table/reinforced, +/obj/structure/sink/kitchen, +/obj/machinery/light/small, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"V" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/lootdrop/three_course_meal, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +b +b +b +b +b +I +b +b +b +b +b +b +b +a +"} +(3,1,1) = {" +a +b +d +d +k +d +d +t +d +y +t +H +z +b +a +"} +(4,1,1) = {" +a +b +e +d +l +o +d +d +B +z +d +d +z +b +a +"} +(5,1,1) = {" +a +b +f +d +l +o +d +d +B +V +d +d +U +b +a +"} +(6,1,1) = {" +a +b +e +d +l +o +d +d +B +z +d +d +z +b +a +"} +(7,1,1) = {" +a +b +c +d +m +d +D +K +v +z +M +Q +z +b +a +"} +(8,1,1) = {" +a +b +b +b +b +p +b +b +b +b +b +b +b +b +a +"} +(9,1,1) = {" +a +b +g +d +t +d +G +u +w +A +N +A +E +b +a +"} +(10,1,1) = {" +a +b +h +d +d +d +d +b +w +w +w +w +w +b +a +"} +(11,1,1) = {" +a +b +i +d +n +d +J +b +L +w +R +w +P +b +a +"} +(12,1,1) = {" +a +b +h +d +d +d +r +b +x +F +S +T +x +b +a +"} +(13,1,1) = {" +a +b +d +d +d +d +d +b +w +w +w +w +w +b +a +"} +(14,1,1) = {" +a +b +d +j +q +q +s +b +w +C +O +C +w +b +a +"} +(15,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +b +b +b +a +"} +(16,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/templates/hilbertshotelempty.dmm b/_maps/templates/hilbertshotelempty.dmm new file mode 100644 index 0000000000..a0482c93ba --- /dev/null +++ b/_maps/templates/hilbertshotelempty.dmm @@ -0,0 +1,289 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/space/bluespace, +/area/hilbertshotel) +"b" = ( +/turf/closed/indestructible/hotelwall, +/area/hilbertshotel) +"c" = ( +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"d" = ( +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"e" = ( +/turf/closed/indestructible/hoteldoor, +/area/hilbertshotel) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +b +b +b +b +b +e +b +b +b +b +b +b +b +a +"} +(3,1,1) = {" +a +b +c +c +c +c +c +c +c +c +c +c +c +b +a +"} +(4,1,1) = {" +a +b +c +c +c +c +c +c +c +c +c +c +c +b +a +"} +(5,1,1) = {" +a +b +c +c +c +c +c +c +c +c +c +c +c +b +a +"} +(6,1,1) = {" +a +b +c +c +c +c +c +c +c +c +c +c +c +b +a +"} +(7,1,1) = {" +a +b +c +c +c +c +c +c +c +c +c +c +c +b +a +"} +(8,1,1) = {" +a +b +b +b +b +c +b +b +b +b +b +b +b +b +a +"} +(9,1,1) = {" +a +b +c +c +c +c +c +c +d +d +d +d +d +b +a +"} +(10,1,1) = {" +a +b +c +c +c +c +c +b +d +d +d +d +d +b +a +"} +(11,1,1) = {" +a +b +c +c +c +c +c +b +d +d +d +d +d +b +a +"} +(12,1,1) = {" +a +b +c +c +c +c +c +b +d +d +d +d +d +b +a +"} +(13,1,1) = {" +a +b +c +c +c +c +c +b +d +d +d +d +d +b +a +"} +(14,1,1) = {" +a +b +c +c +c +c +c +b +d +d +d +d +d +b +a +"} +(15,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +b +b +b +a +"} +(16,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/templates/hilbertshotellore.dmm b/_maps/templates/hilbertshotellore.dmm new file mode 100644 index 0000000000..f6be66bd06 --- /dev/null +++ b/_maps/templates/hilbertshotellore.dmm @@ -0,0 +1,639 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/open/space/bluespace, +/area/hilbertshotel) +"ab" = ( +/turf/closed/indestructible/hotelwall, +/area/hilbertshotel) +"ac" = ( +/obj/structure/table/wood/fancy, +/obj/structure/mirror{ + broken = 1; + desc = "Oh no, seven years of bad luck!"; + icon_state = "mirror_broke"; + pixel_y = 24 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"ad" = ( +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"ae" = ( +/obj/structure/table/wood, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"af" = ( +/obj/structure/table/wood, +/obj/structure/showcase/machinery/tv, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"ag" = ( +/obj/structure/dresser, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"ah" = ( +/obj/structure/table/wood/fancy, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"ai" = ( +/obj/structure/table/wood/poker, +/obj/item/toy/cards/deck, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aj" = ( +/obj/structure/table/wood/fancy, +/obj/item/flashlight/lamp/green, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"ak" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"al" = ( +/obj/structure/table/wood/poker, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"am" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"an" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"ap" = ( +/obj/structure/bed, +/obj/item/bedsheet/random, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aq" = ( +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"ar" = ( +/obj/structure/mineral_door/wood, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"as" = ( +/turf/closed/indestructible/hoteldoor, +/area/hilbertshotel) +"at" = ( +/obj/effect/decal/cleanable/cobweb, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"au" = ( +/obj/machinery/light_switch{ + pixel_x = -32 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"av" = ( +/obj/machinery/light/small, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aw" = ( +/obj/structure/closet/cabinet{ + anchored = 1 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"ax" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"ay" = ( +/obj/structure/closet/crate/bin, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"az" = ( +/obj/structure/mineral_door/paperframe, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aA" = ( +/obj/structure/chair/stool/bar, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aB" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 32 + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aC" = ( +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aD" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aE" = ( +/obj/structure/curtain, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aF" = ( +/obj/machinery/door/window/northleft, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aG" = ( +/obj/structure/table/reinforced, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aH" = ( +/obj/structure/table/reinforced, +/obj/item/pen, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aI" = ( +/obj/structure/mirror{ + pixel_x = -32 + }, +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aJ" = ( +/obj/structure/window/reinforced/tinted{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted{ + dir = 1 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aK" = ( +/obj/machinery/shower{ + dir = 8 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aL" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aM" = ( +/obj/structure/table/wood/poker, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aN" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted{ + dir = 1 + }, +/obj/structure/window/reinforced/tinted{ + dir = 8 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aO" = ( +/obj/structure/window/reinforced/tinted{ + dir = 8 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aP" = ( +/obj/item/bikehorn/rubberducky, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aQ" = ( +/obj/structure/table/reinforced, +/obj/machinery/microwave, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aR" = ( +/obj/machinery/smartfridge/food, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aS" = ( +/obj/structure/window/reinforced/tinted{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aT" = ( +/obj/structure/table/reinforced, +/obj/structure/sink/kitchen, +/obj/machinery/light/small, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aU" = ( +/obj/structure/bed, +/obj/item/bedsheet/random, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aV" = ( +/obj/machinery/light/small, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"aW" = ( +/obj/machinery/jukebox{ + req_access = null + }, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aX" = ( +/obj/machinery/light_switch{ + pixel_x = 32 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aY" = ( +/obj/structure/chair/stool/bar, +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/vomit, +/obj/effect/mob_spawn/human/doctorhilbert, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"aZ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"ba" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"bb" = ( +/obj/structure/mirror{ + pixel_x = -32 + }, +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"bc" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"bd" = ( +/obj/machinery/shower{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"be" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"bf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"bg" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"bh" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/item/soap/homemade{ + name = "used soap" + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"bi" = ( +/obj/effect/decal/cleanable/vomit, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"bj" = ( +/obj/structure/table/reinforced, +/obj/item/soap/homemade{ + name = "used soap" + }, +/turf/open/indestructible/hoteltile, +/area/hilbertshotel) +"bk" = ( +/obj/structure/table/reinforced, +/obj/item/analyzer/hilbertsanalyzer, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) +"bl" = ( +/obj/structure/table/reinforced, +/obj/item/paper/crumpled/bloody/docsdeathnote, +/turf/open/indestructible/hotelwood, +/area/hilbertshotel) + +(1,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +ab +ab +ab +ab +ab +as +ab +ab +ab +ab +ab +ab +ab +aa +"} +(3,1,1) = {" +aa +ab +at +aL +ak +ad +aL +an +ad +aF +be +aQ +aG +ab +aa +"} +(4,1,1) = {" +aa +ab +ae +ad +al +aq +ad +ad +aA +aH +ad +aL +aG +ab +aa +"} +(5,1,1) = {" +aa +ab +af +ad +ai +aq +aL +ad +aY +bl +ad +aL +aT +ab +aa +"} +(6,1,1) = {" +aa +ab +ae +ad +aM +aq +ad +ad +aA +bk +bf +bf +aG +ab +aa +"} +(7,1,1) = {" +aa +ab +aW +aL +am +ad +aX +ay +aB +aG +bg +aR +aG +ab +aa +"} +(8,1,1) = {" +aa +ab +ab +ab +ab +ar +ab +ab +ab +ab +ab +ab +ab +ab +aa +"} +(9,1,1) = {" +aa +ab +ag +ad +an +ad +au +az +aC +bb +bh +aI +bj +ab +aa +"} +(10,1,1) = {" +aa +ab +ah +ad +aL +aL +ad +ab +aZ +aZ +aC +aZ +aZ +ab +aa +"} +(11,1,1) = {" +aa +ab +ac +ad +ad +aL +av +ab +aD +aC +aN +bi +aV +ab +aa +"} +(12,1,1) = {" +aa +ab +ah +ad +aL +ad +aw +ab +aE +aJ +aO +aS +aE +ab +aa +"} +(13,1,1) = {" +aa +ab +ad +ad +aL +ad +ad +ab +aC +bc +aZ +aZ +aC +ab +aa +"} +(14,1,1) = {" +aa +ab +ax +aj +ap +aU +ah +ab +ba +bd +aP +aK +aC +ab +aa +"} +(15,1,1) = {" +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +"} +(16,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} diff --git a/_maps/templates/hilbertshotelstorage.dmm b/_maps/templates/hilbertshotelstorage.dmm new file mode 100644 index 0000000000..756e2e5155 --- /dev/null +++ b/_maps/templates/hilbertshotelstorage.dmm @@ -0,0 +1,23 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/indestructible/hotelwall, +/area/hilbertshotelstorage) +"b" = ( +/turf/open/indestructible/hotelwood, +/area/hilbertshotelstorage) + +(1,1,1) = {" +a +a +a +"} +(2,1,1) = {" +a +b +a +"} +(3,1,1) = {" +a +a +a +"} diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 4372c4ca24..60fb49f780 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -105,7 +105,9 @@ #define MATRIXED 22 //if icon is color matrix'd #define SKINTONE 23 //uses skin tones #define HORNCOLOR 24 +#define WINGCOLOR 25 +//organ slots #define ORGAN_SLOT_BRAIN "brain" #define ORGAN_SLOT_APPENDIX "appendix" #define ORGAN_SLOT_RIGHT_ARM_AUG "r_arm_device" @@ -129,3 +131,8 @@ #define ORGAN_SLOT_BRAIN_ANTISTUN "brain_antistun" #define ORGAN_SLOT_TAIL "tail" #define ORGAN_SLOT_PENIS "penis" + +////organ defines +#define STANDARD_ORGAN_THRESHOLD 100 +#define STANDARD_ORGAN_HEALING 0.001 +#define STANDARD_ORGAN_DECAY 0.00222 //designed to fail organs when left to decay for ~15 minutes \ No newline at end of file diff --git a/code/__DEFINES/__513_compatibility.dm b/code/__DEFINES/__513_compatibility.dm new file mode 100644 index 0000000000..12577fb68b --- /dev/null +++ b/code/__DEFINES/__513_compatibility.dm @@ -0,0 +1,32 @@ + +#if DM_VERSION < 513 + +#define ismovableatom(A) (istype(A, /atom/movable)) + +#define islist(L) (istype(L, /list)) + +#define CLAMP01(x) (CLAMP(x, 0, 1)) + +#define CLAMP(CLVALUE,CLMIN,CLMAX) ( max( (CLMIN), min((CLVALUE), (CLMAX)) ) ) + +#define ATAN2(x, y) ( !(x) && !(y) ? 0 : (y) >= 0 ? arccos((x) / sqrt((x)*(x) + (y)*(y))) : -arccos((x) / sqrt((x)*(x) + (y)*(y))) ) + +#define TAN(x) (sin(x) / cos(x)) + +#define arctan(x) (arcsin(x/sqrt(1+x*x))) + +////////////////////////////////////////////////// + +#else + +#define ismovableatom(A) ismovable(A) + +#define CLAMP01(x) clamp(x, 0, 1) + +#define CLAMP(CLVALUE, CLMIN, CLMAX) clamp(CLVALUE, CLMIN, CLMAX) + +#define TAN(x) tan(x) + +#define ATAN2(x, y) arctan(x, y) + +#endif diff --git a/code/__DEFINES/access.dm b/code/__DEFINES/access.dm index c9d545fc03..c2021a86f2 100644 --- a/code/__DEFINES/access.dm +++ b/code/__DEFINES/access.dm @@ -6,7 +6,7 @@ #define ACCESS_MORGUE 6 #define ACCESS_TOX 7 //R&D department, R&D console, burn chamber on some maps #define ACCESS_TOX_STORAGE 8 //Toxins storage, burn chamber on some maps -#define ACCESS_GENETICS 9 +#define ACCESS_GENETICS 9 #define ACCESS_ENGINE 10 //Engineering area, power monitor, power flow control console #define ACCESS_ENGINE_EQUIP 11 //APCs, EngiVend/YouTool, engineering equipment lockers #define ACCESS_MAINT_TUNNELS 12 @@ -64,6 +64,8 @@ #define ACCESS_WEAPONS 66 //Weapon authorization for secbots #define ACCESS_NETWORK 67 //NTnet diagnostics/monitoring software #define ACCESS_CLONING 68 //Cloning room and clone pod ejection +#define ACCESS_ENTER_GENPOP 69 +#define ACCESS_LEAVE_GENPOP 70 //BEGIN CENTCOM ACCESS /*Should leave plenty of room if we need to add more access levels. diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm index 4fd1669771..0e4f0f3a6e 100644 --- a/code/__DEFINES/atom_hud.dm +++ b/code/__DEFINES/atom_hud.dm @@ -23,8 +23,9 @@ #define AI_DETECT_HUD "19" #define NANITE_HUD "20" #define DIAG_NANITE_FULL_HUD "21" +#define RAD_HUD "22" //radation alerts for medical huds //for antag huds. these are used at the /mob level -#define ANTAG_HUD "22" +#define ANTAG_HUD "23" //by default everything in the hud_list of an atom is an image //a value in hud_list with one of these will change that behavior diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm index d966c73d23..3301def4a1 100644 --- a/code/__DEFINES/citadel_defines.dm +++ b/code/__DEFINES/citadel_defines.dm @@ -93,12 +93,6 @@ #define isgenital(A) (istype(A, /obj/item/organ/genital)) #define isborer(A) (istype(A, /mob/living/simple_animal/borer)) -#define isipcperson(A) (is_species(A, /datum/species/ipc)) -#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 CITADEL_MENTOR_OOC_COLOUR "#224724" diff --git a/code/__DEFINES/cleaning.dm b/code/__DEFINES/cleaning.dm index c4db590e90..6049fd7918 100644 --- a/code/__DEFINES/cleaning.dm +++ b/code/__DEFINES/cleaning.dm @@ -5,8 +5,3 @@ #define CLEAN_STRONG 4 // Industrial strength #define CLEAN_IMPRESSIVE 5 // Cleaning strong enough your granny would be proud #define CLEAN_GOD 6 // Cleans things spotless down to the atomic structure - -//How strong things have to be to wipe forensic evidence... -#define CLEAN_STRENGTH_FINGERPRINTS CLEAN_IMPRESSIVE -#define CLEAN_STRENGTH_BLOOD CLEAN_WEAK -#define CLEAN_STRENGTH_FIBERS CLEAN_IMPRESSIVE diff --git a/code/__DEFINES/clockcult.dm b/code/__DEFINES/clockcult.dm index 47b00e67f7..2f2f94413b 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_VAR_INIT(neovgre_exists, 0) //Does neovgre exist? GLOBAL_LIST_EMPTY(all_clockwork_objects) //All clockwork items, structures, and effects in existence GLOBAL_LIST_EMPTY(all_clockwork_mobs) //All clockwork SERVANTS (not creatures) in existence diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm index 06c3c352ca..cc2cd8834a 100644 --- a/code/__DEFINES/colors.dm +++ b/code/__DEFINES/colors.dm @@ -4,15 +4,15 @@ #define COLOR_INPUT_ENABLED "#D3B5B5" #define COLOR_DARKMODE_INFO_BUTTONS_BG "#40628A" -#define COLOR_DARKMODE_ISSUE_BUTTON_BG "#ce4242" -#define COLOR_DARKMODE_BACKGROUND "#202020" -#define COLOR_DARKMODE_DARKBACKGROUND "#171717" -#define COLOR_DARKMODE_TEXT "#f0f0f0" +#define COLOR_DARKMODE_ISSUE_BUTTON_BG "#A92C2C" +#define COLOR_DARKMODE_BACKGROUND "#272727" +#define COLOR_DARKMODE_DARKBACKGROUND "#242424" +#define COLOR_DARKMODE_TEXT "#E0E0E0" -#define COLOR_WHITEMODE_INFO_BUTTONS_BG "#90b3dd" -#define COLOR_WHITEMODE_ISSUE_BUTTON_BG "#ef7f7f" -#define COLOR_WHITEMODE_BACKGROUND "#ffffff" -#define COLOR_WHITEMODE_DARKBACKGROUND "#eeeeee" +#define COLOR_WHITEMODE_INFO_BUTTONS_BG "#90B3DD" +#define COLOR_WHITEMODE_ISSUE_BUTTON_BG "#EF7F7F" +#define COLOR_WHITEMODE_BACKGROUND "#F0F0F0" +#define COLOR_WHITEMODE_DARKBACKGROUND "#E6E6E6" #define COLOR_WHITEMODE_TEXT "#000000" #define COLOR_FLOORTILE_GRAY "#8D8B8B" diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 40aea24105..e33d42df64 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -2,11 +2,8 @@ #define SEND_GLOBAL_SIGNAL(sigtype, arguments...) ( SEND_SIGNAL(SSdcs, sigtype, ##arguments) ) -//shorthand -#define GET_COMPONENT_FROM(varname, path, target) var##path/##varname = ##target.GetComponent(##path) -#define GET_COMPONENT(varname, path) GET_COMPONENT_FROM(varname, path, src) - #define COMPONENT_INCOMPATIBLE 1 +#define COMPONENT_NOTRANSFER 2 // How multiple components of the exact same type are handled in the same datum @@ -121,8 +118,13 @@ #define COMSIG_MOVABLE_HEAR "movable_hear" //from base of atom/movable/Hear(): (message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) #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) +// /mind signals +#define COMSIG_MIND_TRANSFER "mind_transfer" //from base of mind/transfer_to(): (new_character, old_character) + // /mob signals #define COMSIG_MOB_DEATH "mob_death" //from base of mob/death(): (gibbed) +#define COMSIG_MOB_GHOSTIZE "mob_ghostize" //from base of mob/Ghostize() (can_reenter_corpse) + #define COMPONENT_BLOCK_GHOSTING 1 #define COMSIG_MOB_ALLOWED "mob_allowed" //from base of obj/allowed(mob/M): (/obj) returns bool, if TRUE the mob has id access to the obj #define COMSIG_MOB_RECEIVE_MAGIC "mob_receive_magic" //from base of mob/anti_magic_check(): (magic, holy, protection_sources) #define COMPONENT_BLOCK_MAGIC 1 @@ -132,6 +134,7 @@ #define COMSIG_MOB_ITEM_AFTERATTACK "mob_item_afterattack" //from base of obj/item/afterattack(): (atom/target, mob/user, proximity_flag, click_parameters) #define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged" //from base of mob/RangedAttack(): (atom/A, params) #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() #define COMSIG_MOB_UPDATE_SIGHT "mob_update_sight" //from base of /mob/update_sight(): () #define COMSIG_MOB_SAY "mob_say" // from /mob/living/say(): (proc args list) #define COMPONENT_UPPERCASE_SPEECH 1 @@ -159,6 +162,8 @@ #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) +// /machinery signals +#define COMSIG_MACHINE_EJECT_OCCUPANT "eject_occupant" //from base of obj/machinery/dropContents() (occupant) // /obj/item signals #define COMSIG_ITEM_ATTACK "item_attack" //from base of obj/item/attack(): (/mob/living/target, /mob/living/user) @@ -189,6 +194,7 @@ #define COMPONENT_DELETE_OLD_IMPLANT 4 #define COMSIG_IMPLANT_EXISTING_UPLINK "implant_uplink_exists" //called on implants being implanted into someone with an uplink implant: (datum/component/uplink) //This uses all return values of COMSIG_IMPLANT_OTHER +#define COMSIG_IMPLANT_REMOVING "implant_removing" //from base of /obj/item/implant/proc/removed() (list/args) // /obj/item/pda signals #define COMSIG_PDA_CHANGE_RINGTONE "pda_change_ringtone" //called on pda when the user changes the ringtone: (mob/living/user, new_ringtone) @@ -216,12 +222,19 @@ #define COMSIG_TURF_MAKE_DRY "make_turf_try" //(max_strength, immediate, duration_decrease = INFINITY): Returns bool. #define COMSIG_COMPONENT_CLEAN_ACT "clean_act" //called on an object to clean it of cleanables. Usualy with soap: (num/strength) +//Blood color +#define COMSIG_BLOOD_COLOR "blood_DNA_to_color" //RGB blood stuff //Food #define COMSIG_FOOD_EATEN "food_eaten" //from base of obj/item/reagent_containers/food/snacks/attack(): (mob/living/eater, mob/feeder) +//Gibs +#define COMSIG_GIBS_STREAK "gibs_streak" // from base of /obj/effect/decal/cleanable/blood/gibs/streak(): (list/directions, list/diseases) + //Mood #define COMSIG_ADD_MOOD_EVENT "add_mood" //Called when you send a mood event from anywhere in the code. #define COMSIG_CLEAR_MOOD_EVENT "clear_mood" //Called when you clear a mood event from anywhere in the code. +#define COMSIG_INCREASE_SANITY "decrease_sanity" //Called when you want to increase sanity from anywhere in the code. +#define COMSIG_DECREASE_SANITY "increase_sanity" //Same as above but to decrease sanity instead. //NTnet #define COMSIG_COMPONENT_NTNET_RECEIVE "ntnet_receive" //called on an object by its NTNET connection component on receive. (sending_id(number), sending_netname(text), data(datum/netdata)) diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index d64fa30047..d9b30bf0e3 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -10,6 +10,8 @@ #define CHECK_BITFIELD(variable, flag) (variable & (flag)) #define TOGGLE_BITFIELD(variable, flag) (variable ^= (flag)) +#define CHECK_MULTIPLE_BITFIELDS(flagvar, flags) (((flagvar) & (flags)) == (flags)) + GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768)) // for /datum/var/datum_flags diff --git a/code/__DEFINES/footsteps.dm b/code/__DEFINES/footsteps.dm index ef96b83cc8..16d763606b 100644 --- a/code/__DEFINES/footsteps.dm +++ b/code/__DEFINES/footsteps.dm @@ -15,6 +15,15 @@ //misc footstep sounds #define FOOTSTEP_GENERIC_HEAVY "heavy" +#define FOOTPRINT_SHOE "shoe" +#define FOOTPRINT_FOOT "foot" +#define FOOTPRINT_PAW "paw" +#define FOOTPRINT_CLAW "claw" +#define FOOTPRINT_WHEEL "wheels" +#define FOOTPRINT_TRAIL "trails_" +#define FOOTPRINT_SNAKE "snake" +#define FOOTPRINT_DRAG "drag" + /* id = list( diff --git a/code/__DEFINES/forensics.dm b/code/__DEFINES/forensics.dm deleted file mode 100644 index bb512edcde..0000000000 --- a/code/__DEFINES/forensics.dm +++ /dev/null @@ -1,2 +0,0 @@ -#define IF_HAS_BLOOD_DNA(__thing) GET_COMPONENT_FROM(__FR##__thing, /datum/component/forensics, __thing); if(__FR##__thing && length(__FR##__thing.blood_DNA)) -#define IF_HAS_BLOOD_DNA_AND(__thing, __conditions...) GET_COMPONENT_FROM(__FR##__thing, /datum/component/forensics, __thing); if(__FR##__thing && length(__FR##__thing.blood_DNA) && (##__conditions)) diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index ef9e6a044f..0dee8bd1e8 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -1,11 +1,7 @@ // simple is_type and similar inline helpers -#define islist(L) (istype(L, /list)) - #define in_range(source, user) (get_dist(source, user) <= 1 && (get_step(source, 0)?:z) == (get_step(user, 0)?:z)) -#define ismovableatom(A) (istype(A, /atom/movable)) - #define isatom(A) (isloc(A)) #define isweakref(D) (istype(D, /datum/weakref)) @@ -50,7 +46,7 @@ #define isgolem(A) (is_species(A, /datum/species/golem)) #define islizard(A) (is_species(A, /datum/species/lizard)) #define isplasmaman(A) (is_species(A, /datum/species/plasmaman)) -#define ispodperson(A) (is_species(A, /datum/species/podperson)) +#define ispodperson(A) (is_species(A, /datum/species/pod)) #define isflyperson(A) (is_species(A, /datum/species/fly)) #define isjellyperson(A) (is_species(A, /datum/species/jelly)) #define isslimeperson(A) (is_species(A, /datum/species/jelly/slime)) @@ -59,6 +55,16 @@ #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 isdwarf(A) (is_species(A, /datum/species/dwarf)) + +// Citadel specific species +#define isipcperson(A) (is_species(A, /datum/species/ipc)) +#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)) //more carbon mobs #define ismonkey(A) (istype(A, /mob/living/carbon/monkey)) @@ -175,6 +181,8 @@ GLOBAL_LIST_INIT(heavyfootmob, typecacheof(list( #define iscameramob(A) (istype(A, /mob/camera)) +#define isaicamera(A) (istype(A, /mob/camera/aiEye)) + #define iseminence(A) (istype(A, /mob/camera/eminence)) //Footstep helpers @@ -234,4 +242,4 @@ GLOBAL_LIST_INIT(glass_sheet_types, typecacheof(list( #define isblobmonster(O) (istype(O, /mob/living/simple_animal/hostile/blob)) -#define isshuttleturf(T) (length(T.baseturfs) && (/turf/baseturf_skipover/shuttle in T.baseturfs)) +#define isshuttleturf(T) (length(T.baseturfs) && (/turf/baseturf_skipover/shuttle in T.baseturfs)) \ No newline at end of file diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm index e6eb9f313e..ed45da9923 100644 --- a/code/__DEFINES/jobs.dm +++ b/code/__DEFINES/jobs.dm @@ -48,6 +48,7 @@ #define JOB_UNAVAILABLE_PLAYTIME 3 #define JOB_UNAVAILABLE_ACCOUNTAGE 4 #define JOB_UNAVAILABLE_SLOTFULL 5 +#define JOB_UNAVAILABLE_SPECIESLOCK 6 #define DEFAULT_RELIGION "Christianity" #define DEFAULT_DEITY "Space Jesus" diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 8891c06f75..5e903997e4 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -39,6 +39,7 @@ #define DOOR_HELPER_LAYER 2.71 //keep this above OPEN_DOOR_LAYER #define PROJECTILE_HIT_THRESHHOLD_LAYER 2.75 //projectiles won't hit objects at or below this layer if possible #define TABLE_LAYER 2.8 +#define TRAY_LAYER 2.85 #define BELOW_OBJ_LAYER 2.9 #define LOW_ITEM_LAYER 2.95 //#define OBJ_LAYER 3 //For easy recordkeeping; this is a byond define diff --git a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm index 2ba5012301..fe50319295 100644 --- a/code/__DEFINES/logging.dm +++ b/code/__DEFINES/logging.dm @@ -35,6 +35,7 @@ #define LOG_GAME (1 << 12) #define LOG_ADMIN_PRIVATE (1 << 13) #define LOG_ASAY (1 << 14) +#define LOG_VIRUS (1 << 15) //Individual logging panel pages #define INDIVIDUAL_ATTACK_LOG (LOG_ATTACK) diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm index 5bce51293f..ad93dd2d54 100644 --- a/code/__DEFINES/maths.dm +++ b/code/__DEFINES/maths.dm @@ -16,7 +16,6 @@ #define TICK_USAGE_TO_MS(starting_tickusage) (TICK_DELTA_TO_MS(TICK_USAGE_REAL - starting_tickusage)) #define PERCENT(val) (round((val)*100, 0.1)) -#define CLAMP01(x) (CLAMP(x, 0, 1)) //time of day but automatically adjusts to the server going into the next day within the same round. //for when you need a reliable time number that doesn't depend on byond time. @@ -30,17 +29,12 @@ // round() acts like floor(x, 1) by default but can't handle other values #define FLOOR(x, y) ( round((x) / (y)) * (y) ) -#define CLAMP(CLVALUE,CLMIN,CLMAX) ( max( (CLMIN), min((CLVALUE), (CLMAX)) ) ) - // Similar to clamp but the bottom rolls around to the top and vice versa. min is inclusive, max is exclusive #define WRAP(val, min, max) ( min == max ? min : (val) - (round(((val) - (min))/((max) - (min))) * ((max) - (min))) ) // Real modulus that handles decimals #define MODULUS(x, y) ( (x) - (y) * round((x) / (y)) ) -// Tangent -#define TAN(x) (sin(x) / cos(x)) - // Cotangent #define COT(x) (1 / TAN(x)) @@ -50,8 +44,6 @@ // Cosecant #define CSC(x) (1 / sin(x)) -#define ATAN2(x, y) ( !(x) && !(y) ? 0 : (y) >= 0 ? arccos((x) / sqrt((x)*(x) + (y)*(y))) : -arccos((x) / sqrt((x)*(x) + (y)*(y))) ) - // Greatest Common Divisor - Euclid's algorithm /proc/Gcd(a, b) return b ? Gcd(b, (a) % (b)) : a @@ -207,4 +199,4 @@ #define LORENTZ_CUMULATIVE_DISTRIBUTION(x, y, s) ( (1/PI)*TORADIANS(arctan((x-y)/s)) + 1/2 ) #define RULE_OF_THREE(a, b, x) ((a*x)/b) -// ) +// ) \ No newline at end of file diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index b6115e93e9..94a189ff07 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -171,12 +171,22 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache) #define BLOOD_LOSS_IN_SPREAD 20 //Bloody shoe blood states -#define BLOOD_STATE_HUMAN "blood" -#define BLOOD_STATE_XENO "xeno" +#define BLOOD_STATE_BLOOD "blood" #define BLOOD_STATE_OIL "oil" #define BLOOD_STATE_NOT_BLOODY "no blood whatsoever" #define BLOOD_AMOUNT_PER_DECAL 20 +//Blood Decal Colors +#define BLOOD_COLOR_HUMAN "#dc0000" +#define BLOOD_COLOR_XENO "#94a83c" +#define BLOOD_COLOR_OIL "#301d02" +#define BLOOD_COLOR_SYNTHETIC "#3f48aa" +#define BLOOD_COLOR_SLIME "#00ff90" +#define BLOOD_COLOR_LIZARD "#db004D" +#define BLOOD_COLOR_UNIVERSAL "#db3300" +#define BLOOD_COLOR_BUG "#a37c0f" + + //suit sensors: sensor_mode defines #define SENSOR_OFF 0 @@ -314,7 +324,7 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S #define MAP_MAXZ 6 // Defib stats -#define DEFIB_TIME_LIMIT 120 +#define DEFIB_TIME_LIMIT 1500 #define DEFIB_TIME_LOSS 60 // Diagonal movement @@ -499,3 +509,6 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S #define VOMIT_TOXIC 1 #define VOMIT_PURPLE 2 + +//Misc text define. Does 4 spaces. Used as a makeshift tabulator. +#define FOURSPACES "    " diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 1d1dda6d99..5bd0ee5b3b 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -116,6 +116,7 @@ #define BIOWARE_GENERIC "generic" #define BIOWARE_NERVES "nerves" #define BIOWARE_CIRCULATION "circulation" +#define BIOWARE_LIGAMENTS "ligaments" //Health hud screws for carbon mobs #define SCREWYHUD_NONE 0 @@ -203,8 +204,6 @@ #define MAX_CHICKENS 50 -#define UNHEALING_EAR_DAMAGE 100 - #define INCORPOREAL_MOVE_BASIC 1 #define INCORPOREAL_MOVE_SHADOW 2 // leaves a trail of shadows @@ -233,11 +232,15 @@ #define OFFSET_S_STORE "s_store" #define OFFSET_FACEMASK "mask" #define OFFSET_HEAD "head" -#define OFFSET_FACE "face" +#define OFFSET_EYES "eyes" +#define OFFSET_LIPS "lips" #define OFFSET_BELT "belt" #define OFFSET_BACK "back" #define OFFSET_SUIT "suit" #define OFFSET_NECK "neck" +#define OFFSET_HAIR "hair" +#define OFFSET_FHAIR "fhair" +#define OFFSET_MUTPARTS "mutantparts" //MINOR TWEAKS/MISC #define AGE_MIN 18 //youngest a character can be //CITADEL EDIT - 17 --> 18 @@ -256,6 +259,9 @@ #define MAX_QUIRKS 6 //The maximum amount of quirks one character can have at roundstart +#define MAX_REVIVE_FIRE_DAMAGE 180 +#define MAX_REVIVE_BRUTE_DAMAGE 180 + // AI Toggles #define AI_CAMERA_LUMINOSITY 5 #define AI_VOX // Comment out if you don't want VOX to be enabled and have players download the voice sounds. @@ -264,3 +270,6 @@ #define BODYPART_LIFE_UPDATE_HEALTH (1<<0) #define HUMAN_FIRE_STACK_ICON_NUM 3 + +#define PULL_PRONE_SLOWDOWN 0.6 +#define HUMAN_CARRY_SLOWDOWN 0 \ No newline at end of file diff --git a/code/__DEFINES/movespeed_modification.dm b/code/__DEFINES/movespeed_modification.dm index c0aac36415..12a3c331ec 100644 --- a/code/__DEFINES/movespeed_modification.dm +++ b/code/__DEFINES/movespeed_modification.dm @@ -31,3 +31,8 @@ #define MOVESPEED_ID_PAI_SPACEWALK_SPEEDMOD "PAI_SPACEWALK_MODIFIER" #define MOVESPEED_ID_SANITY "MOOD_SANITY" + +#define MOVESPEED_ID_PRONE_DRAGGING "PRONE_DRAG" +#define MOVESPEED_ID_HUMAN_CARRYING "HUMAN_CARRY" + +#define MOVESPEED_ID_TASED_STATUS "TASED" \ No newline at end of file diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index 01d95d7ff9..1885dd2621 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -2,39 +2,51 @@ #define EMAGGED (1<<0) -#define IN_USE (1<<1) // If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING! -#define CAN_BE_HIT (1<<2) //can this be bludgeoned by items? -#define BEING_SHOCKED (1<<3) // Whether this thing is currently (already) being shocked by a tesla -#define DANGEROUS_POSSESSION (1<<4) //Admin possession yes/no -#define ON_BLUEPRINTS (1<<5) //Are we visible on the station blueprints at roundstart? -#define UNIQUE_RENAME (1<<6) // can you customize the description/name of the thing? +#define IN_USE (1<<1) //If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING! +#define CAN_BE_HIT (1<<2) //can this be bludgeoned by items? +#define BEING_SHOCKED (1<<3) //Whether this thing is currently (already) being shocked by a tesla +#define DANGEROUS_POSSESSION (1<<4) //Admin possession yes/no +#define ON_BLUEPRINTS (1<<5) //Are we visible on the station blueprints at roundstart? +#define UNIQUE_RENAME (1<<6) //can you customize the description/name of the thing? #define USES_TGUI (1<<7) //put on things that use tgui on ui_interact instead of custom/old UI. #define FROZEN (1<<8) +#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. // If you add new ones, be sure to add them to /obj/Initialize as well for complete mapping support // Flags for the item_flags var on /obj/item #define BEING_REMOVED (1<<0) -#define IN_INVENTORY (1<<1) //is this item equipped into an inventory slot or hand of a mob? used for tooltips -#define FORCE_STRING_OVERRIDE (1<<2) // used for tooltips -#define NEEDS_PERMIT (1<<3) //Used by security bots to determine if this item is safe for public use. +#define IN_INVENTORY (1<<1) //is this item equipped into an inventory slot or hand of a mob? used for tooltips +#define FORCE_STRING_OVERRIDE (1<<2) //used for tooltips +#define NEEDS_PERMIT (1<<3) //Used by security bots to determine if this item is safe for public use. #define SLOWS_WHILE_IN_HAND (1<<4) -#define NO_MAT_REDEMPTION (1<<5) // Stops you from putting things like an RCD or other items into an ORM or protolathe for materials. -#define DROPDEL (1<<6) // When dropped, it calls qdel on itself -#define NOBLUDGEON (1<<7) // when an item has this it produces no "X has been hit by Y with Z" message in the default attackby() -#define ABSTRACT (1<<8) // for all things that are technically items but used for various different stuff -#define IMMUTABLE_SLOW (1<<9) //When players should not be able to change the slowdown of the item (Speed potions, ect) +#define NO_MAT_REDEMPTION (1<<5) //Stops you from putting things like an RCD or other items into an ORM or protolathe for materials. +#define DROPDEL (1<<6) //When dropped, it calls qdel on itself +#define NOBLUDGEON (1<<7) //when an item has this it produces no "X has been hit by Y with Z" message in the default attackby() +#define ABSTRACT (1<<8) //for all things that are technically items but used for various different stuff +#define IMMUTABLE_SLOW (1<<9) //When players should not be able to change the slowdown of the item (Speed potions, ect) #define SURGICAL_TOOL (1<<10) //Tool commonly used for surgery: won't attack targets in an active surgical operation on help intent (in case of mistakes) -#define NO_UNIFORM_REQUIRED (1<<11) // Can be worn on certain slots (currently belt and id) that would otherwise require an uniform. +#define NO_UNIFORM_REQUIRED (1<<11) //Can be worn on certain slots (currently belt and id) that would otherwise require an uniform. // Flags for the clothing_flags var on /obj/item/clothing -#define LAVAPROTECT (1<<0) +#define LAVAPROTECT (1<<0) #define STOPSPRESSUREDAMAGE (1<<1) //SUIT and HEAD items which stop pressure damage. To stop you taking all pressure damage you must have both a suit and head item with this flag. -#define BLOCK_GAS_SMOKE_EFFECT (1<<2) // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY! -#define ALLOWINTERNALS (1<<3) // mask allows internals -#define NOSLIP (1<<4) //prevents from slipping on wet floors, in space etc -#define THICKMATERIAL (1<<5) //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body. -#define VOICEBOX_TOGGLABLE (1<<6) // The voicebox in this clothing can be toggled. -#define VOICEBOX_DISABLED (1<<7) // The voicebox is currently turned off. +#define BLOCK_GAS_SMOKE_EFFECT (1<<2) //blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY! +#define ALLOWINTERNALS (1<<3) //mask allows internals +#define NOSLIP (1<<4) //prevents from slipping on wet floors, in space etc +#define THICKMATERIAL (1<<5) //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body. +#define VOICEBOX_TOGGLABLE (1<<6) //The voicebox in this clothing can be toggled. +#define VOICEBOX_DISABLED (1<<7) //The voicebox is currently turned off. +#define SNUG_FIT (1<<8) //Prevents knock-off from things like hat-throwing. +#define ANTI_TINFOIL_MANEUVER (1<<9) //Hats with negative effects when worn (i.e the tinfoil hat). + +// Flags for the organ_flags var on /obj/item/organ + +#define ORGAN_SYNTHETIC (1<<0) //Synthetic organs, or cybernetic organs. Reacts to EMPs and don't deteriorate or heal +#define ORGAN_FROZEN (1<<1) //Frozen organs, don't deteriorate +#define ORGAN_FAILING (1<<2) //Failing organs perform damaging effects until replaced or fixed +#define ORGAN_EXTERNAL (1<<3) //Was this organ implanted/inserted/etc, if true will not be removed during species change. +#define ORGAN_VITAL (1<<4) //Currently only the brain +#define ORGAN_NO_SPOIL (1<<5) //Do not spoil under any circumstances \ No newline at end of file diff --git a/code/__DEFINES/reactions.dm b/code/__DEFINES/reactions.dm index 7cebc37d94..9579571174 100644 --- a/code/__DEFINES/reactions.dm +++ b/code/__DEFINES/reactions.dm @@ -31,41 +31,14 @@ #define STIMULUM_RESEARCH_AMOUNT 50 //Plasma fusion properties #define FUSION_ENERGY_THRESHOLD 3e9 //Amount of energy it takes to start a fusion reaction -#define FUSION_TEMPERATURE_THRESHOLD 1000 //Temperature required to start a fusion reaction #define FUSION_MOLE_THRESHOLD 250 //Mole count required (tritium/plasma) to start a fusion reaction -#define FUSION_RELEASE_ENERGY_SUPER 3e9 //Amount of energy released in the fusion process, super tier -#define FUSION_RELEASE_ENERGY_HIGH 1e9 //Amount of energy released in the fusion process, high tier -#define FUSION_RELEASE_ENERGY_MID 5e8 //Amount of energy released in the fusion process, mid tier -#define FUSION_RELEASE_ENERGY_LOW 1e8 //Amount of energy released in the fusion process, low tier -#define FUSION_MEDIATION_FACTOR 80 //Arbitrary -#define FUSION_SUPER_TIER_THRESHOLD 50 //anything above this is super tier -#define FUSION_HIGH_TIER_THRESHOLD 20 //anything above this and below 50 is high tier -#define FUSION_MID_TIER_THRESHOLD 5 //anything above this and below 20 is mid tier - below this is low tier, but that doesnt need a define -#define FUSION_ENERGY_DIVISOR_SUPER 25 //power_ratio is divided by this during energy calculations -#define FUSION_ENERGY_DIVISOR_HIGH 20 -#define FUSION_ENERGY_DIVISOR_MID 10 -#define FUSION_ENERGY_DIVISOR_LOW 2 -#define FUSION_GAS_CREATION_FACTOR_TRITIUM 0.40 //trit - one gas rather than two, so think about that when calculating stuff - 40% in total -#define FUSION_GAS_CREATION_FACTOR_STIM 0.05 //stim percentage creation from high tier - 5%, 60% in total with pluox -#define FUSION_GAS_CREATION_FACTOR_PLUOX 0.55 //pluox percentage creation from high tier - 55%, 60% in total with stim -#define FUSION_GAS_CREATION_FACTOR_NITRYL 0.20 //nitryl and N2O - 80% in total -#define FUSION_GAS_CREATION_FACTOR_N2O 0.60 //nitryl and N2O - 80% in total -#define FUSION_GAS_CREATION_FACTOR_BZ 0.05 //BZ - 5% - 90% in total with CO2 -#define FUSION_GAS_CREATION_FACTOR_CO2 0.85 //CO2 - 85% - 90% in total with BZ -#define FUSION_MID_TIER_RAD_PROB_FACTOR 2 //probability of radpulse is power ratio * this for whatever tier -#define FUSION_LOW_TIER_RAD_PROB_FACTOR 5 -#define FUSION_EFFICIENCY_BASE 60 //used in the fusion efficiency calculations -#define FUSION_EFFICIENCY_DIVISOR 0.6 //ditto -#define FUSION_RADIATION_FACTOR 15000 //horizontal asymptote -#define FUSION_RADIATION_CONSTANT 30 //equation is form of (ax) / (x + b), where a = radiation factor and b = radiation constant and x = power ratio (https://www.desmos.com/calculator/4i1f296phl) -#define FUSION_ZAP_POWER_ASYMPTOTE 50000 //maximum value - not enough to instacrit but it'll still hurt like shit -#define FUSION_ZAP_POWER_CONSTANT 75 //equation is of from [ax / (x + b)] + c, where a = zap power asymptote, b = zap power constant, c = zap power base and x = power ratio -#define FUSION_ZAP_POWER_BASE 1000 //(https://www.desmos.com/calculator/vvbmhf4unm) -#define FUSION_ZAP_RANGE_SUPER 9 //range of the tesla zaps that occur from fusion -#define FUSION_ZAP_RANGE_HIGH 7 -#define FUSION_ZAP_RANGE_MID 5 -#define FUSION_ZAP_RANGE_LOW 3 -#define FUSION_PARTICLE_FACTOR_SUPER 4 //# of particles fired out is equal to rand(3,6) * this for whatever tier -#define FUSION_PARTICLE_FACTOR_HIGH 3 -#define FUSION_PARTICLE_FACTOR_MID 2 -#define FUSION_PARTICLE_FACTOR_LOW 1 +#define FUSION_TRITIUM_CONVERSION_COEFFICIENT (1e-10) +#define INSTABILITY_GAS_POWER_FACTOR 0.003 +#define FUSION_TRITIUM_MOLES_USED 1 +#define PLASMA_BINDING_ENERGY 20000000 +#define TOROID_VOLUME_BREAKEVEN 1000 +#define FUSION_TEMPERATURE_THRESHOLD 10000 +#define PARTICLE_CHANCE_CONSTANT (-20000000) +#define FUSION_RAD_MAX 2000 +#define FUSION_RAD_COEFFICIENT (-1000) +#define FUSION_INSTABILITY_ENDOTHERMALITY 2 diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm index 174289d3bb..36ea64de2c 100644 --- a/code/__DEFINES/reagents.dm +++ b/code/__DEFINES/reagents.dm @@ -34,3 +34,17 @@ #define DEL_REAGENT 1 // reagent deleted (fully cleared) #define ADD_REAGENT 2 // reagent added #define REM_REAGENT 3 // reagent removed (may still exist) + +//reagent bitflags, used for altering how they works +#define REAGENT_DEAD_PROCESS (1<<0) //calls on_mob_dead() if present in a dead body +#define REAGENT_DONOTSPLIT (1<<1) //Do not split the chem at all during processing +#define REAGENT_ONLYINVERSE (1<<2) //Only invert chem, no splitting +#define REAGENT_ONMOBMERGE (1<<3) //Call on_mob_life proc when reagents are merging. +#define REAGENT_INVISIBLE (1<<4) //Doesn't appear on handheld health analyzers. +#define REAGENT_FORCEONNEW (1<<5) //Forces a on_new() call without a data overhead +#define REAGENT_SNEAKYNAME (1<<6) //When inverted, the inverted chem uses the name of the original chem +#define REAGENT_SPLITRETAINVOL (1<<7) //Retains initial volume of chem when splitting + +//Chemical reaction flags, for determining reaction specialties +#define REACTION_CLEAR_IMPURE (1<<0) //Convert into impure/pure on reaction completion +#define REACTION_CLEAR_INVERSE (1<<1) //Convert into inverse on reaction completion when purity is low enough diff --git a/code/__DEFINES/robots.dm b/code/__DEFINES/robots.dm index 0820d63247..a05e6f6160 100644 --- a/code/__DEFINES/robots.dm +++ b/code/__DEFINES/robots.dm @@ -50,3 +50,7 @@ #define ASSEMBLY_THIRD_STEP 2 #define ASSEMBLY_FOURTH_STEP 3 #define ASSEMBLY_FIFTH_STEP 4 + + +//Checks to determine borg availability depending on the server's config. These are defines in the interest of reducing copypasta +#define BORG_SEC_AVAILABLE (!CONFIG_GET(flag/disable_secborg) && GLOB.security_level >= CONFIG_GET(number/minimum_secborg_alert)) \ No newline at end of file diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm index e655408db1..af06a5a2d0 100644 --- a/code/__DEFINES/say.dm +++ b/code/__DEFINES/say.dm @@ -23,6 +23,8 @@ #define MODE_WHISPER "whisper" #define MODE_WHISPER_CRIT "whispercrit" +#define MODE_CUSTOM_SAY "custom_say" + #define MODE_DEPARTMENT "department" #define MODE_KEY_DEPARTMENT "h" #define MODE_TOKEN_DEPARTMENT ":h" diff --git a/code/__DEFINES/stat.dm b/code/__DEFINES/stat.dm index 1d3ea1347a..b975aa1f89 100644 --- a/code/__DEFINES/stat.dm +++ b/code/__DEFINES/stat.dm @@ -8,6 +8,9 @@ #define UNCONSCIOUS 2 #define DEAD 3 +//Maximum healthiness an individual can have +#define MAX_SATIETY 600 + // bitflags for machine stat variable #define BROKEN (1<<0) #define NOPOWER (1<<1) diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index 3cd64af8c7..332d36f2f4 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -44,6 +44,8 @@ #define STATUS_EFFECT_SLEEPING /datum/status_effect/incapacitating/sleeping //the affected is asleep +#define STATUS_EFFECT_TASED /datum/status_effect/electrode //the affected has been tased, preventing fine muscle control + #define STATUS_EFFECT_PACIFY /datum/status_effect/pacify //the affected is pacified, preventing direct hostile actions #define STATUS_EFFECT_BELLIGERENT /datum/status_effect/belligerent //forces the affected to walk, doing damage if they try to run diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 3394fba90c..d4086bc4d9 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -83,7 +83,9 @@ #define INIT_ORDER_SHUTTLE -21 #define INIT_ORDER_MINOR_MAPPING -40 #define INIT_ORDER_PATH -50 -#define INIT_ORDER_PERSISTENCE -100 +#define INIT_ORDER_PERSISTENCE -95 +#define INIT_ORDER_CHAT -100 //Should be last to ensure chat remains smooth during init. + // Subsystem fire priority, from lowest to highest priority // If the subsystem isn't listed here it's either DEFAULT or PROCESS (if it's a processing subsystem child) @@ -114,6 +116,7 @@ #define FIRE_PRIORITY_MOBS 100 #define FIRE_PRIORITY_TGUI 110 #define FIRE_PRIORITY_TICKER 200 +#define FIRE_PRIORITY_CHAT 400 #define FIRE_PRIORITY_OVERLAYS 500 #define FIRE_PRIORITY_INPUT 1000 // This must always always be the max highest priority. Player input must never be lost. diff --git a/code/__DEFINES/tools.dm b/code/__DEFINES/tools.dm index 878d35608d..00e08129ae 100644 --- a/code/__DEFINES/tools.dm +++ b/code/__DEFINES/tools.dm @@ -8,6 +8,12 @@ #define TOOL_ANALYZER "analyzer" #define TOOL_MINING "mining" #define TOOL_SHOVEL "shovel" +#define TOOL_RETRACTOR "retractor" +#define TOOL_HEMOSTAT "hemostat" +#define TOOL_CAUTERY "cautery" +#define TOOL_DRILL "drill" +#define TOOL_SCALPEL "scalpel" +#define TOOL_SAW "saw" // If delay between the start and the end of tool operation is less than MIN_TOOL_SOUND_DELAY, diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index a4bca2f2c8..e22dcfbbe0 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -81,6 +81,7 @@ #define TRAIT_PUSHIMMUNE "push_immunity" #define TRAIT_SHOCKIMMUNE "shock_immunity" #define TRAIT_STABLEHEART "stable_heart" +#define TRAIT_STABLELIVER "stable_liver" #define TRAIT_RESISTHEAT "resist_heat" #define TRAIT_RESISTHEATHANDS "resist_heat_handsonly" //For when you want to be able to touch hot things, but still want fire to be an issue. #define TRAIT_RESISTCOLD "resist_cold" @@ -95,6 +96,8 @@ #define TRAIT_NOHUNGER "no_hunger" #define TRAIT_EASYDISMEMBER "easy_dismember" #define TRAIT_LIMBATTACHMENT "limb_attach" +#define TRAIT_NOLIMBDISABLE "no_limb_disable" +#define TRAIT_EASYLIMBDISABLE "easy_limb_disable" #define TRAIT_TOXINLOVER "toxinlover" #define TRAIT_NOBREATH "no_breath" #define TRAIT_ANTIMAGIC "anti_magic" @@ -108,6 +111,7 @@ #define TRAIT_NOHARDCRIT "nohardcrit" #define TRAIT_NOSOFTCRIT "nosoftcrit" #define TRAIT_MINDSHIELD "mindshield" +#define TRAIT_DISSECTED "dissected" #define TRAIT_FEARLESS "fearless" #define TRAIT_UNSTABLE "unstable" #define TRAIT_PARALYSIS_L_ARM "para-l-arm" //These are used for brain-based paralysis, where replacing the limb won't fix it @@ -119,6 +123,9 @@ #define TRAIT_STRONG_GRABBER "strong_grabber" #define TRAIT_CALCIUM_HEALER "calcium_healer" #define TRAIT_CAPTAIN_METABOLISM "captain-metabolism" +#define TRAIT_ABDUCTOR_TRAINING "abductor-training" +#define TRAIT_ABDUCTOR_SCIENTIST_TRAINING "abductor-scientist-training" +#define TRAIT_SURGEON "surgeon" //non-mob traits #define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it @@ -163,6 +170,7 @@ #define OBESITY "obesity" #define MAGIC_TRAIT "magic" #define TRAUMA_TRAIT "trauma" +#define DISEASE_TRAIT "disease" #define SPECIES_TRAIT "species" #define ORGAN_TRAIT "organ" #define JOB_TRAIT "job" @@ -176,6 +184,7 @@ // unique trait sources, still defines #define STATUE_MUTE "statue" +#define CLONING_POD_TRAIT "cloning-pod" #define CHANGELING_DRAIN "drain" #define CHANGELING_HIVEMIND_MUTE "ling_mute" #define ABYSSAL_GAZE_BLIND "abyssal_gaze" @@ -205,3 +214,4 @@ #define LOCKED_HELMET_TRAIT "locked-helmet" #define NINJA_SUIT_TRAIT "ninja-suit" #define ANTI_DROP_IMPLANT_TRAIT "anti-drop-implant" +#define ABDUCTOR_ANTAGONIST "abductor-antagonist" \ No newline at end of file diff --git a/code/__DEFINES/voreconstants.dm b/code/__DEFINES/voreconstants.dm index 710b11ae16..9c91de0be2 100644 --- a/code/__DEFINES/voreconstants.dm +++ b/code/__DEFINES/voreconstants.dm @@ -20,7 +20,7 @@ GLOBAL_LIST_INIT(player_sizes_list, list("Macro" = SIZESCALE_HUGE, "Big" = SIZES // Edited to make the new travis check go away */ -GLOBAL_LIST_INIT(vore_sounds, list( +GLOBAL_LIST_INIT(pred_vore_sounds, list( "Gulp" = 'sound/vore/pred/swallow_01.ogg', "Swallow" = 'sound/vore/pred/swallow_02.ogg', "Insertion1" = 'sound/vore/pred/insertion_01.ogg', @@ -40,7 +40,27 @@ GLOBAL_LIST_INIT(vore_sounds, list( "None" = null )) -GLOBAL_LIST_INIT(release_sounds, list( +GLOBAL_LIST_INIT(prey_vore_sounds, list( + "Gulp" = 'sound/vore/prey/swallow_01.ogg', + "Swallow" = 'sound/vore/prey/swallow_02.ogg', + "Insertion1" = 'sound/vore/prey/insertion_01.ogg', + "Insertion2" = 'sound/vore/prey/insertion_02.ogg', + "Tauric Swallow" = 'sound/vore/prey/taurswallow.ogg', + "Stomach Move" = 'sound/vore/prey/stomachmove.ogg', + "Schlorp" = 'sound/vore/prey/schlorp.ogg', + "Squish1" = 'sound/vore/prey/squish_01.ogg', + "Squish2" = 'sound/vore/prey/squish_02.ogg', + "Squish3" = 'sound/vore/prey/squish_03.ogg', + "Squish4" = 'sound/vore/prey/squish_04.ogg', + "Rustle (cloth)" = 'sound/effects/rustle5.ogg', + "Rustle 2 (cloth)" = 'sound/effects/rustle2.ogg', + "Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg', + "Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg', + "Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg', + "None" = null + )) + +GLOBAL_LIST_INIT(pred_release_sounds, list( "Rustle (cloth)" = 'sound/effects/rustle1.ogg', "Rustle 2 (cloth)" = 'sound/effects/rustle2.ogg', "Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg', @@ -51,3 +71,15 @@ GLOBAL_LIST_INIT(release_sounds, list( "Splatter" = 'sound/effects/splat.ogg', "None" = null )) + +GLOBAL_LIST_INIT(prey_release_sounds, list( + "Rustle (cloth)" = 'sound/effects/rustle1.ogg', + "Rustle 2 (cloth)" = 'sound/effects/rustle2.ogg', + "Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg', + "Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg', + "Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg', + "Stomach Move" = 'sound/vore/prey/stomachmove.ogg', + "Pred Escape" = 'sound/vore/prey/escape.ogg', + "Splatter" = 'sound/effects/splat.ogg', + "None" = null + )) diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index fed283adcd..38b779427c 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -514,7 +514,7 @@ used_key_list[input_key] = 1 return input_key -#if DM_VERSION > 512 +#if DM_VERSION > 513 #error Remie said that lummox was adding a way to get a lists #error contents via list.values, if that is true remove this #error otherwise, update the version and bug lummox @@ -564,4 +564,4 @@ if(key in L1) L1[key] += other_value else - L1[key] = other_value + L1[key] = other_value \ No newline at end of file diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index ac17df5773..c19a7a64b0 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -58,6 +58,10 @@ if (CONFIG_GET(flag/log_game)) WRITE_LOG(GLOB.world_game_log, "GAME: [text]") +/proc/log_virus(text) + if (CONFIG_GET(flag/log_virus)) + WRITE_LOG(GLOB.world_virus_log, "VIRUS: [text]") + /proc/log_access(text) if (CONFIG_GET(flag/log_access)) WRITE_LOG(GLOB.world_game_log, "ACCESS: [text]") diff --git a/code/__HELPERS/files.dm b/code/__HELPERS/files.dm index 7f0b5a3c07..5271b407a5 100644 --- a/code/__HELPERS/files.dm +++ b/code/__HELPERS/files.dm @@ -3,7 +3,7 @@ for(var/file in args) src << browse_rsc(file) -/client/proc/browse_files(root="data/logs/", max_iterations=10, list/valid_extensions=list("txt","log","htm", "html")) +/client/proc/browse_files(root="data/logs/", max_iterations=10, list/valid_extensions=list("txt","log","htm", "html", "md")) var/path = root for(var/i=0, i[GLOB.round_id]" : GLOB.round_id - parts += "[GLOB.TAB]Round ID: [info]" + parts += "[FOURSPACES]Round ID: [info]" var/list/voting_results = SSvote.stored_gamemode_votes if(length(voting_results)) - parts += "[GLOB.TAB]Voting: " + parts += "[FOURSPACES]Voting: " var/total_score = 0 for(var/choice in voting_results) var/score = voting_results[choice] total_score += score - parts += "[GLOB.TAB][GLOB.TAB][choice]: [score]" + parts += "[FOURSPACES][FOURSPACES][choice]: [score]" - parts += "[GLOB.TAB]Shift Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]" - parts += "[GLOB.TAB]Station Integrity: [mode.station_was_nuked ? "Destroyed" : "[popcount["station_integrity"]]%"]" + parts += "[FOURSPACES]Shift Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]" + parts += "[FOURSPACES]Station Integrity: [mode.station_was_nuked ? "Destroyed" : "[popcount["station_integrity"]]%"]" var/total_players = GLOB.joined_player_list.len if(total_players) - parts+= "[GLOB.TAB]Total Population: [total_players]" + parts+= "[FOURSPACES]Total Population: [total_players]" if(station_evacuated) - parts += "
[GLOB.TAB]Evacuation Rate: [popcount[POPCOUNT_ESCAPEES]] ([PERCENT(popcount[POPCOUNT_ESCAPEES]/total_players)]%)" - parts += "[GLOB.TAB](on emergency shuttle): [popcount[POPCOUNT_SHUTTLE_ESCAPEES]] ([PERCENT(popcount[POPCOUNT_SHUTTLE_ESCAPEES]/total_players)]%)" - parts += "[GLOB.TAB]Survival Rate: [popcount[POPCOUNT_SURVIVORS]] ([PERCENT(popcount[POPCOUNT_SURVIVORS]/total_players)]%)" + parts += "
[FOURSPACES]Evacuation Rate: [popcount[POPCOUNT_ESCAPEES]] ([PERCENT(popcount[POPCOUNT_ESCAPEES]/total_players)]%)" + parts += "[FOURSPACES](on emergency shuttle): [popcount[POPCOUNT_SHUTTLE_ESCAPEES]] ([PERCENT(popcount[POPCOUNT_SHUTTLE_ESCAPEES]/total_players)]%)" + parts += "[FOURSPACES]Survival Rate: [popcount[POPCOUNT_SURVIVORS]] ([PERCENT(popcount[POPCOUNT_SURVIVORS]/total_players)]%)" if(SSblackbox.first_death) var/list/ded = SSblackbox.first_death if(ded.len) - parts += "[GLOB.TAB]First Death: [ded["name"]], [ded["role"]], at [ded["area"]]. Damage taken: [ded["damage"]].[ded["last_words"] ? " Their last words were: \"[ded["last_words"]]\"" : ""]" + parts += "[FOURSPACES]First Death: [ded["name"]], [ded["role"]], at [ded["area"]]. Damage taken: [ded["damage"]].[ded["last_words"] ? " Their last words were: \"[ded["last_words"]]\"" : ""]" //ignore this comment, it fixes the broken sytax parsing caused by the " above else - parts += "[GLOB.TAB]Nobody died this shift!" + parts += "[FOURSPACES]Nobody died this shift!" if(istype(SSticker.mode, /datum/game_mode/dynamic)) var/datum/game_mode/dynamic/mode = SSticker.mode - parts += "[GLOB.TAB]Threat level: [mode.threat_level]" - parts += "[GLOB.TAB]Threat left: [mode.threat]" - parts += "[GLOB.TAB]Executed rules:" + parts += "[FOURSPACES]Threat level: [mode.threat_level]" + parts += "[FOURSPACES]Threat left: [mode.threat]" + parts += "[FOURSPACES]Executed rules:" for(var/datum/dynamic_ruleset/rule in mode.executed_rules) - parts += "[GLOB.TAB][GLOB.TAB][rule.ruletype] - [rule.name]: -[rule.cost] threat" + parts += "[FOURSPACES][FOURSPACES][rule.ruletype] - [rule.name]: -[rule.cost] threat" return parts.Join("
") /client/proc/roundend_report_file() diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 1ee5ce986f..6908a5057f 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -791,3 +791,6 @@ GLOBAL_LIST_INIT(binary, list("0","1")) rearranged += cword message = "[prefix][jointext(rearranged," ")]" . = message + +#define is_alpha(X) ((text2ascii(X) <= 122) && (text2ascii(X) >= 97)) +#define is_digit(X) ((length(X) == 1) && (length(text2num(X)) == 1)) \ No newline at end of file diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 3c8d62ce3a..27b70d28c5 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -451,10 +451,6 @@ Turf and target are separate in case you want to teleport some distance from a t var/y = min(world.maxy, max(1, A.y + dy)) return locate(x,y,A.z) -/proc/arctan(x) - var/y=arcsin(x/sqrt(1+x*x)) - return y - /* Gets all contents of contents and returns them all in a list. */ @@ -756,7 +752,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( @@ -1550,3 +1545,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) for(var/i in L) if(condition.Invoke(i)) . |= i + +/proc/CallAsync(datum/source, proctype, list/arguments) + set waitfor = FALSE + return call(source, proctype)(arglist(arguments)) \ No newline at end of file diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 3b32745b5c..32f0fe2d8e 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -32,6 +32,7 @@ GLOBAL_LIST_INIT(bitfields, list( "UNIQUE_RENAME" = UNIQUE_RENAME, "USES_TGUI" = USES_TGUI, "FROZEN" = FROZEN, + "SHOVABLE_ONTO" = SHOVABLE_ONTO ), "datum_flags" = list( "DF_USE_TAG" = DF_USE_TAG, @@ -141,6 +142,8 @@ GLOBAL_LIST_INIT(bitfields, list( "THICKMATERIAL" = THICKMATERIAL, "VOICEBOX_TOGGLABLE" = VOICEBOX_TOGGLABLE, "VOICEBOX_DISABLED" = VOICEBOX_DISABLED, + "SNUG_FIT" = SNUG_FIT, + "ANTI_TINFOIL_MANEUVER" = ANTI_TINFOIL_MANEUVER, ), "tesla_flags" = list( "TESLA_MOB_DAMAGE" = TESLA_MOB_DAMAGE, @@ -171,10 +174,32 @@ GLOBAL_LIST_INIT(bitfields, list( "rad_flags" = list( "RAD_PROTECT_CONTENTS" = RAD_PROTECT_CONTENTS, "RAD_NO_CONTAMINATE" = RAD_NO_CONTAMINATE, - ), + ), "disease_flags" = list( "CURABLE" = CURABLE, "CAN_CARRY" = CAN_CARRY, "CAN_RESIST" = CAN_RESIST - ), - )) \ No newline at end of file + ), + "chemical_flags" = list( + "REAGENT_DEAD_PROCESS" = REAGENT_DEAD_PROCESS, + "REAGENT_DONOTSPLIT" = REAGENT_DONOTSPLIT, + "REAGENT_ONLYINVERSE" = REAGENT_ONLYINVERSE, + "REAGENT_ONMOBMERGE" = REAGENT_ONMOBMERGE, + "REAGENT_INVISIBLE" = REAGENT_INVISIBLE, + "REAGENT_FORCEONNEW" = REAGENT_FORCEONNEW, + "REAGENT_SNEAKYNAME" = REAGENT_SNEAKYNAME, + "REAGENT_SPLITRETAINVOL" = REAGENT_SPLITRETAINVOL + ), + "clear_conversion" = list( + "REACTION_CLEAR_IMPURE" = REACTION_CLEAR_IMPURE, + "REACTION_CLEAR_INVERSE" = REACTION_CLEAR_INVERSE + ), + "organ_flags" = list( + "ORGAN_SYNTHETIC" = ORGAN_SYNTHETIC, + "ORGAN_FROZEN" = ORGAN_FROZEN, + "ORGAN_FAILING" = ORGAN_FAILING, + "ORGAN_EXTERNAL" = ORGAN_EXTERNAL, + "ORGAN_VITAL" = ORGAN_VITAL, + "ORGAN_NO_SPOIL" = ORGAN_NO_SPOIL + ), + )) diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index c759658bd4..a2135b93b2 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -33,6 +33,7 @@ GLOBAL_LIST_EMPTY(animated_tails_list_human) GLOBAL_LIST_EMPTY(ears_list) GLOBAL_LIST_EMPTY(wings_list) GLOBAL_LIST_EMPTY(wings_open_list) +GLOBAL_LIST_EMPTY(deco_wings_list) GLOBAL_LIST_EMPTY(r_wings_list) GLOBAL_LIST_EMPTY(insect_wings_list) GLOBAL_LIST_EMPTY(insect_fluffs_list) diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index c883254afe..8b5657a6f6 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -58,3 +58,64 @@ GLOBAL_LIST_EMPTY(latejoiners) //CIT CHANGE - All latejoining people, for traito for(var/i in GLOB.mob_list) var/mob/M = i M.update_config_movespeed() + +GLOBAL_LIST_INIT(noodle_taurs, list( + "Naga", + "Tentacle" + )) + +GLOBAL_LIST_INIT(paw_taurs, list( + "Fox", + "Wolf", + "Otie", + "Drake", + "Lab", + "Shepherd", + "Husky", + "Eevee", + "Panther", + "Horse", + "Cow", + "Tiger" + )) + + //blood types +GLOBAL_LIST_INIT(regular_bloods,list( + "O-", + "O+", + "A-", + "A+", + "B-", + "B+", + "AB-", + "AB+" + )) + +GLOBAL_LIST_INIT(all_types_bloods,list( + "O-", + "O+", + "A-", + "A+", + "B-", + "B+", + "AB-", + "AB+", + "SY", + "X*", + "HF", + "L", + "U", + "GEL", + "BUG" + )) + +GLOBAL_LIST_INIT(blood_types, list( + "blood", + "jellyblood" + )) + +GLOBAL_LIST_INIT(blood_id_types, list( + "blood" = /datum/reagent/blood, + "jellyblood" = /datum/reagent/blood/jellyblood + )) + diff --git a/code/_globalvars/lists/poll_ignore.dm b/code/_globalvars/lists/poll_ignore.dm index f1a7466b35..3a026d2aa5 100644 --- a/code/_globalvars/lists/poll_ignore.dm +++ b/code/_globalvars/lists/poll_ignore.dm @@ -15,6 +15,7 @@ #define POLL_IGNORE_DRONE "drone" #define POLL_IGNORE_DEMON "demon" #define POLL_IGNORE_WIZARD "wizard" +#define POLL_IGNORE_CLONE "clone" GLOBAL_LIST_INIT(poll_ignore_desc, list( POLL_IGNORE_SENTIENCE_POTION = "Sentience potion", @@ -31,7 +32,8 @@ GLOBAL_LIST_INIT(poll_ignore_desc, list( POLL_IGNORE_SWARMER = "Swarmer shells", POLL_IGNORE_DRONE = "Drone shells", POLL_IGNORE_DEMON = "Demons", - POLL_IGNORE_WIZARD = "Wizards" + POLL_IGNORE_WIZARD = "Wizards", + POLL_IGNORE_CLONE = "Defective/SDGF clones" )) GLOBAL_LIST_INIT(poll_ignore, init_poll_ignore()) diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm index bd7f4afe62..8e5da083e3 100644 --- a/code/_globalvars/logging.dm +++ b/code/_globalvars/logging.dm @@ -26,6 +26,8 @@ GLOBAL_VAR(query_debug_log) GLOBAL_PROTECT(query_debug_log) GLOBAL_VAR(world_job_debug_log) GLOBAL_PROTECT(world_job_debug_log) +GLOBAL_VAR(world_virus_log) +GLOBAL_PROTECT(world_virus_log) GLOBAL_LIST_EMPTY(bombers) GLOBAL_PROTECT(bombers) diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm index e7b2ae6cbe..037e5067d8 100644 --- a/code/_globalvars/misc.dm +++ b/code/_globalvars/misc.dm @@ -6,8 +6,6 @@ GLOBAL_VAR_INIT(timezoneOffset, 0) // The difference betwen midnight (of the hos // However it'd be ok to use for accessing attack logs and such too, which are even laggier. GLOBAL_VAR_INIT(fileaccess_timer, 0) -GLOBAL_VAR_INIT(TAB, "    ") - GLOBAL_DATUM_INIT(data_core, /datum/datacore, new) GLOBAL_VAR_INIT(CELLRATE, 0.002) // conversion ratio between a watt-tick and kilojoule diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 5f0e7c9b22..58eabbdbcf 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -200,7 +200,7 @@ if (!target.loc) continue - if(!(SEND_SIGNAL(target.loc, COMSIG_ATOM_CANREACH, next) & COMPONENT_BLOCK_REACH)) + if(!(SEND_SIGNAL(target.loc, COMSIG_ATOM_CANREACH, next) & COMPONENT_BLOCK_REACH) && target.loc.canReachInto(src, ultimate_target, next, view_only, tool)) next += target.loc checking = next @@ -215,6 +215,10 @@ /mob/living/DirectAccess(atom/target) return ..() + GetAllContents() +//This is called reach into but it's called on the deepest things first so uh, make sure to account for that! +/atom/proc/canReachInto(atom/user, atom/target, list/next, view_only, obj/item/tool) + return TRUE + /atom/proc/AllowClick() return FALSE diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 006207c3f3..7f63b74945 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -55,6 +55,17 @@ var/obj/item/W = get_active_held_item() + 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 + if(!W && get_dist(src,A) <= interaction_range) A.attack_robot(src) return diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 4c666d708c..f796f75407 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -157,7 +157,7 @@ var/image/item_overlay = image(holding) item_overlay.alpha = 92 - if(!user.can_equip(holding, slot_id, disable_warning = TRUE)) + if(!user.can_equip(holding, slot_id, TRUE)) item_overlay.color = "#FF0000" else item_overlay.color = "#00ff00" diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 6455b4ccb6..e47797f4d6 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -40,7 +40,7 @@ return TRUE user.changeNext_move(CLICK_CD_MELEE) if(user.a_intent == INTENT_HARM && stat == DEAD && (butcher_results || guaranteed_butcher_results)) //can we butcher it? - GET_COMPONENT_FROM(butchering, /datum/component/butchering, I) + var/datum/component/butchering/butchering = I.GetComponent(/datum/component/butchering) if(butchering && butchering.butchering_enabled) to_chat(user, "You begin to butcher [src]...") playsound(loc, butchering.butcher_sound, 50, TRUE, -1) diff --git a/code/controllers/configuration/config_entry.dm b/code/controllers/configuration/config_entry.dm index 3ac103affc..4406655375 100644 --- a/code/controllers/configuration/config_entry.dm +++ b/code/controllers/configuration/config_entry.dm @@ -1,6 +1,7 @@ #define VALUE_MODE_NUM 0 #define VALUE_MODE_TEXT 1 #define VALUE_MODE_FLAG 2 +#define VALUE_MODE_NUM_LIST 3 #define KEY_MODE_TEXT 0 #define KEY_MODE_TYPE 1 @@ -191,6 +192,18 @@ if(VALUE_MODE_TEXT) new_value = key_value continue_check_value = new_value + if(VALUE_MODE_NUM_LIST) + // this is all copy+pasted from number list up there, but it's super basic so I don't see it being changed soon + var/list/new_list = list() + var/list/values = splittext(key_value," ") + for(var/I in values) + var/temp = text2num(I) + if(isnull(temp)) + log_admin("invalid number list entry in [key_name]: [I]") + continue_check_value = FALSE + new_list += temp + new_value = new_list + continue_check_value = new_list.len if(continue_check_value && continue_check_key && ValidateListEntry(new_key, new_value)) config_entry_value[new_key] = new_value return TRUE diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index cfd57b4850..fb974c85bc 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -70,6 +70,9 @@ /datum/config_entry/flag/disable_peaceborg +/datum/config_entry/number/minimum_secborg_alert //Minimum alert level for secborgs to be chosen. + config_entry_value = 3 + /datum/config_entry/number/traitor_scaling_coeff //how much does the amount of players get divided by to determine traitors config_entry_value = 6 min_val = 1 @@ -364,3 +367,27 @@ /datum/config_entry/number/auto_transfer_delay config_entry_value = 72000 min_val = 0 + +/datum/config_entry/number/dynamic_high_pop_limit + config_entry_value = 55 + min_val = 1 + +/datum/config_entry/number/dynamic_pop_per_requirement + config_entry_value = 6 + min_val = 1 + +/datum/config_entry/keyed_list/dynamic_cost + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM + +/datum/config_entry/keyed_list/dynamic_weight + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM + +/datum/config_entry/keyed_list/dynamic_requirements + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM_LIST + +/datum/config_entry/keyed_list/dynamic_high_population_requirement + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 595e1d9ca0..aab71fd015 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -39,6 +39,8 @@ /datum/config_entry/flag/log_game // log game events +/datum/config_entry/flag/log_virus // log virology data + /datum/config_entry/flag/log_vote // log voting /datum/config_entry/flag/log_whisper // log client whisper @@ -173,6 +175,9 @@ /datum/config_entry/string/banappeals /datum/config_entry/string/wikiurl + config_entry_value = "https://katlin.dog/citadel-wiki" + +/datum/config_entry/string/wikiurltg config_entry_value = "http://www.tgstation13.org/wiki" /datum/config_entry/string/forumurl diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm index 72dfed6af0..58476d472f 100644 --- a/code/controllers/subsystem/blackbox.dm +++ b/code/controllers/subsystem/blackbox.dm @@ -294,7 +294,7 @@ Versioning var/lakey = L.lastattackerckey var/sqlbrute = L.getBruteLoss() var/sqlfire = L.getFireLoss() - var/sqlbrain = L.getBrainLoss() + var/sqlbrain = L.getOrganLoss(ORGAN_SLOT_BRAIN) var/sqloxy = L.getOxyLoss() var/sqltox = L.getToxLoss() var/sqlclone = L.getCloneLoss() @@ -308,7 +308,7 @@ Versioning if(!SSdbcore.Connect()) return - + sqlname = sanitizeSQL(sqlname) sqlkey = sanitizeSQL(sqlkey) sqljob = sanitizeSQL(sqljob) diff --git a/code/controllers/subsystem/chat.dm b/code/controllers/subsystem/chat.dm new file mode 100644 index 0000000000..37e53e8990 --- /dev/null +++ b/code/controllers/subsystem/chat.dm @@ -0,0 +1,67 @@ +SUBSYSTEM_DEF(chat) + name = "Chat" + flags = SS_TICKER|SS_NO_INIT + wait = 1 + priority = FIRE_PRIORITY_CHAT + init_order = INIT_ORDER_CHAT + var/list/payload = list() + + +/datum/controller/subsystem/chat/fire() + for(var/i in payload) + var/client/C = i + C << output(payload[C], "browseroutput:output") + payload -= C + + if(MC_TICK_CHECK) + return + + +/datum/controller/subsystem/chat/proc/queue(target, message, handle_whitespace = TRUE) + if(!target || !message) + return + + if(!istext(message)) + stack_trace("to_chat called with invalid input type") + return + + if(target == world) + target = GLOB.clients + + //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 += "
" + + + //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)) + + if(islist(target)) + for(var/I in target) + var/client/C = CLIENT_FROM_VAR(I) //Grab us a client if possible + + if(!C?.chatOutput || C.chatOutput.broken) //A player who hasn't updated his skin file. + continue + + if(!C.chatOutput.loaded) //Client still loading, put their messages in a queue + C.chatOutput.messageQueue += message + continue + + payload[C] += twiceEncoded + + else + var/client/C = CLIENT_FROM_VAR(target) //Grab us a client if possible + + if(!C?.chatOutput || C.chatOutput.broken) //A player who hasn't updated his skin file. + return + + if(!C.chatOutput.loaded) //Client still loading, put their messages in a queue + C.chatOutput.messageQueue += message + return + + payload[C] += twiceEncoded diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index a0d9226e14..ea7e7ce812 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -110,6 +110,9 @@ SUBSYSTEM_DEF(job) if(job.required_playtime_remaining(player.client)) JobDebug("FOC player not enough xp, Player: [player]") continue + if(!player.client.prefs.pref_species.qualifies_for_rank(job.title, player.client.prefs.features)) + JobDebug("FOC non-human failed, Player: [player]") + continue if(flag && (!(flag in player.client.prefs.be_special))) JobDebug("FOC flag failed, Player: [player], Flag: [flag], ") continue @@ -145,6 +148,10 @@ SUBSYSTEM_DEF(job) JobDebug("GRJ player not old enough, Player: [player]") continue + if(!player.client.prefs.pref_species.qualifies_for_rank(job.title, player.client.prefs.features)) + JobDebug("GRJ non-human failed, Player: [player]") + continue + if(job.required_playtime_remaining(player.client)) JobDebug("GRJ player not enough xp, Player: [player]") continue @@ -327,6 +334,10 @@ SUBSYSTEM_DEF(job) if(job.required_playtime_remaining(player.client)) JobDebug("DO player not enough xp, Player: [player], Job:[job.title]") continue + + if(!player.client.prefs.pref_species.qualifies_for_rank(job.title, player.client.prefs.features)) + JobDebug("DO non-human failed, Player: [player], Job:[job.title]") + continue if(player.mind && job.title in player.mind.restricted_roles) JobDebug("DO incompatible with antagonist role, Player: [player], Job:[job.title]") diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index a365405ce6..345e3bb44c 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -33,6 +33,7 @@ SUBSYSTEM_DEF(mapping) var/list/z_list var/datum/space_level/transit var/datum/space_level/empty_space + var/num_of_res_levels = 1 //dlete dis once #39770 is resolved /datum/controller/subsystem/mapping/proc/HACK_LoadMapConfig() @@ -449,6 +450,11 @@ GLOBAL_LIST_EMPTY(the_station_areas) for(var/i in levels_by_trait(ZTRAIT_RESERVED)) if(reserve.Reserve(width, height, i)) return reserve + //If we didn't return at this point, theres a good chance we ran out of room on the exisiting reserved z levels, so lets try a new one + num_of_res_levels += 1 + var/newReserved = add_new_zlevel("Transit/Reserved [num_of_res_levels]", list(ZTRAIT_RESERVED = TRUE)) + if(reserve.Reserve(width, height, newReserved)) + return reserve else if(!level_trait(z, ZTRAIT_RESERVED)) qdel(reserve) @@ -481,6 +487,7 @@ GLOBAL_LIST_EMPTY(the_station_areas) LAZYINITLIST(unused_turfs["[T.z]"]) unused_turfs["[T.z]"] |= T T.flags_1 |= UNUSED_RESERVATION_TURF_1 + GLOB.areas_by_type[world.area].contents += T CHECK_TICK //DO NOT CALL THIS PROC DIRECTLY, CALL wipe_reservations(). diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm index 77ad712b99..4b91944ec8 100644 --- a/code/controllers/subsystem/throwing.dm +++ b/code/controllers/subsystem/throwing.dm @@ -43,6 +43,7 @@ SUBSYSTEM_DEF(throwing) var/atom/movable/thrownthing var/atom/target var/turf/target_turf + var/target_zone var/init_dir var/maxrange var/speed diff --git a/code/controllers/subsystem/vis_overlays.dm b/code/controllers/subsystem/vis_overlays.dm index 435414a899..107d65a558 100644 --- a/code/controllers/subsystem/vis_overlays.dm +++ b/code/controllers/subsystem/vis_overlays.dm @@ -6,11 +6,9 @@ SUBSYSTEM_DEF(vis_overlays) var/list/vis_overlay_cache var/list/currentrun - var/datum/callback/rotate_cb /datum/controller/subsystem/vis_overlays/Initialize() vis_overlay_cache = list() - rotate_cb = CALLBACK(src, .proc/rotate_vis_overlay) return ..() /datum/controller/subsystem/vis_overlays/fire(resumed = FALSE) @@ -52,7 +50,7 @@ SUBSYSTEM_DEF(vis_overlays) if(!thing.managed_vis_overlays) thing.managed_vis_overlays = list(overlay) - RegisterSignal(thing, COMSIG_ATOM_DIR_CHANGE, rotate_cb) + RegisterSignal(thing, COMSIG_ATOM_DIR_CHANGE, .proc/rotate_vis_overlay) else thing.managed_vis_overlays += overlay diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm index 1bc7d8e3be..5bbc5de4a5 100644 --- a/code/datums/brain_damage/imaginary_friend.dm +++ b/code/datums/brain_damage/imaginary_friend.dm @@ -46,7 +46,7 @@ var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s imaginary friend?", ROLE_PAI, null, null, 75, friend) if(LAZYLEN(candidates)) var/mob/dead/observer/C = pick(candidates) - friend.key = C.key + C.transfer_ckey(friend, FALSE) friend_initialized = TRUE else qdel(src) diff --git a/code/datums/brain_damage/split_personality.dm b/code/datums/brain_damage/split_personality.dm index 653b8a98c0..1a26ea7a14 100644 --- a/code/datums/brain_damage/split_personality.dm +++ b/code/datums/brain_damage/split_personality.dm @@ -26,7 +26,7 @@ var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s split personality?", ROLE_PAI, null, null, 75, stranger_backseat) if(LAZYLEN(candidates)) var/mob/dead/observer/C = pick(candidates) - stranger_backseat.key = C.key + C.transfer_ckey(stranger_backseat, FALSE) log_game("[key_name(stranger_backseat)] became [key_name(owner)]'s split personality.") message_admins("[ADMIN_LOOKUPFLW(stranger_backseat)] became [ADMIN_LOOKUPFLW(owner)]'s split personality.") else @@ -184,7 +184,7 @@ var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s brainwashed mind?", null, null, null, 75, stranger_backseat) if(LAZYLEN(candidates)) var/mob/dead/observer/C = pick(candidates) - stranger_backseat.key = C.key + C.transfer_ckey(stranger_backseat, FALSE) else qdel(src) diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index b3d3b46434..fbe94cbb9e 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -2,6 +2,10 @@ var/dupe_mode = COMPONENT_DUPE_HIGHLANDER var/dupe_type var/datum/parent + //only set to true if you are able to properly transfer this component + //At a minimum RegisterWithParent and UnregisterFromParent should be used + //Make sure you also implement PostTransfer for any post transfer handling + var/can_transfer = FALSE /datum/component/New(datum/P, ...) parent = P @@ -83,7 +87,7 @@ /datum/component/proc/UnregisterFromParent() return -/datum/proc/RegisterSignal(datum/target, sig_type_or_types, proc_or_callback, override = FALSE) +/datum/proc/RegisterSignal(datum/target, sig_type_or_types, proctype, override = FALSE) if(QDELETED(src) || QDELETED(target)) return @@ -96,15 +100,12 @@ if(!lookup) target.comp_lookup = lookup = list() - if(!istype(proc_or_callback, /datum/callback)) //if it wasnt a callback before, it is now - proc_or_callback = CALLBACK(src, proc_or_callback) - var/list/sig_types = islist(sig_type_or_types) ? sig_type_or_types : list(sig_type_or_types) for(var/sig_type in sig_types) if(!override && procs[target][sig_type]) stack_trace("[sig_type] overridden. Use override = TRUE to suppress this warning") - procs[target][sig_type] = proc_or_callback + procs[target][sig_type] = proctype if(!lookup[sig_type]) // Nothing has registered here yet lookup[sig_type] = src @@ -154,7 +155,7 @@ return /datum/component/proc/PostTransfer() - return + return COMPONENT_INCOMPATIBLE //Do not support transfer by default as you must properly support it /datum/component/proc/_GetInverseTypeList(our_type = type) //we can do this one simple trick @@ -171,17 +172,20 @@ var/datum/C = target if(!C.signal_enabled) return NONE - var/datum/callback/CB = C.signal_procs[src][sigtype] - return CB.InvokeAsync(arglist(arguments)) + var/proctype = C.signal_procs[src][sigtype] + return NONE | CallAsync(C, proctype, arguments) . = NONE for(var/I in target) var/datum/C = I if(!C.signal_enabled) continue - var/datum/callback/CB = C.signal_procs[src][sigtype] - . |= CB.InvokeAsync(arglist(arguments)) + var/proctype = C.signal_procs[src][sigtype] + . |= CallAsync(C, proctype, arguments) -/datum/proc/GetComponent(c_type) +// The type arg is casted so initial works, you shouldn't be passing a real instance into this +/datum/proc/GetComponent(datum/component/c_type) + if(initial(c_type.dupe_mode) == COMPONENT_DUPE_ALLOWED) + stack_trace("GetComponent was called to get a component of which multiple copies could be on an object. This can easily break and should be changed. Type: \[[c_type]\]") var/list/dc = datum_components if(!dc) return null @@ -220,10 +224,6 @@ if(ispath(nt)) if(nt == /datum/component) CRASH("[nt] attempted instantiation!") - if(!isnum(dm)) - CRASH("[nt]: Invalid dupe_mode ([dm])!") - if(dt && !ispath(dt)) - CRASH("[nt]: Invalid dupe_type ([dt])!") else new_comp = nt nt = new_comp.type @@ -285,10 +285,13 @@ if(target.parent) target.RemoveComponent() target.parent = src - if(target.PostTransfer() == COMPONENT_INCOMPATIBLE) - var/c_type = target.type - qdel(target) - CRASH("Incompatible [c_type] transfer attempt to a [type]!") + var/result = target.PostTransfer() + switch(result) + if(COMPONENT_INCOMPATIBLE) + var/c_type = target.type + qdel(target) + CRASH("Incompatible [c_type] transfer attempt to a [type]!") + if(target == AddComponent(target)) target._JoinParent() @@ -298,10 +301,13 @@ return var/comps = dc[/datum/component] if(islist(comps)) - for(var/I in comps) - target.TakeComponent(I) + for(var/datum/component/I in comps) + if(I.can_transfer) + target.TakeComponent(I) else - target.TakeComponent(comps) + var/datum/component/C = comps + if(C.can_transfer) + target.TakeComponent(comps) /datum/component/ui_host() return parent diff --git a/code/datums/components/caltrop.dm b/code/datums/components/caltrop.dm index 838a1b576a..f0333072a8 100644 --- a/code/datums/components/caltrop.dm +++ b/code/datums/components/caltrop.dm @@ -37,9 +37,9 @@ if(O.status == BODYPART_ROBOTIC) return - var/feetCover = (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)) || (H.w_uniform && (H.w_uniform.body_parts_covered & FEET)) + var/feetCover = (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)) || (H.w_uniform && (H.w_uniform.body_parts_covered & FEET) || (H.shoes && (H.shoes.body_parts_covered & FEET))) - if(!(flags & CALTROP_BYPASS_SHOES) && (H.shoes || feetCover)) + if(!(flags & CALTROP_BYPASS_SHOES) && feetCover) return if((H.movement_type & FLYING) || H.buckled) diff --git a/code/datums/components/cleaning.dm b/code/datums/components/cleaning.dm index 05c26efcc1..5324a87fee 100644 --- a/code/datums/components/cleaning.dm +++ b/code/datums/components/cleaning.dm @@ -8,32 +8,39 @@ /datum/component/cleaning/proc/Clean() var/atom/movable/AM = parent - var/turf/tile = AM.loc - if(!isturf(tile)) - return - - SEND_SIGNAL(tile, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - for(var/A in tile) + var/turf/T = AM.loc + SEND_SIGNAL(T, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + for(var/A in T) if(is_cleanable(A)) qdel(A) - else if(istype(A, /obj/item)) - var/obj/item/I = A - SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - if(ismob(I.loc)) - var/mob/M = I.loc + else if(isitem(A)) + var/obj/item/cleaned_item = A + SEND_SIGNAL(cleaned_item, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_item.clean_blood() + if(ismob(cleaned_item.loc)) + var/mob/M = cleaned_item.loc M.regenerate_icons() else if(ishuman(A)) var/mob/living/carbon/human/cleaned_human = A if(cleaned_human.lying) if(cleaned_human.head) - SEND_SIGNAL(cleaned_human.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(cleaned_human.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_human.head.clean_blood() + cleaned_human.update_inv_head() if(cleaned_human.wear_suit) - SEND_SIGNAL(cleaned_human.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(cleaned_human.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_human.wear_suit.clean_blood() + cleaned_human.update_inv_wear_suit() else if(cleaned_human.w_uniform) - SEND_SIGNAL(cleaned_human.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(cleaned_human.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_human.w_uniform.clean_blood() + cleaned_human.update_inv_w_uniform() if(cleaned_human.shoes) - SEND_SIGNAL(cleaned_human.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - SEND_SIGNAL(cleaned_human, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(cleaned_human.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_human.shoes.clean_blood() + cleaned_human.update_inv_shoes() + SEND_SIGNAL(cleaned_human, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_human.clean_blood() cleaned_human.wash_cream() cleaned_human.regenerate_icons() - to_chat(cleaned_human, "[AM] cleans your face!") + to_chat(cleaned_human, "[src] cleans your face!") \ No newline at end of file diff --git a/code/datums/components/decal.dm b/code/datums/components/decal.dm index e5547ee0ec..bdc1d3a2f6 100644 --- a/code/datums/components/decal.dm +++ b/code/datums/components/decal.dm @@ -1,6 +1,6 @@ /datum/component/decal dupe_mode = COMPONENT_DUPE_ALLOWED - + can_transfer = TRUE var/cleanable var/description var/mutable_appearance/pic diff --git a/code/datums/components/decals/blood.dm b/code/datums/components/decals/blood.dm index 7fae975678..c8be6251b5 100644 --- a/code/datums/components/decals/blood.dm +++ b/code/datums/components/decals/blood.dm @@ -1,39 +1,13 @@ -/datum/component/decal/blood - dupe_mode = COMPONENT_DUPE_UNIQUE - -/datum/component/decal/blood/Initialize(_icon, _icon_state, _dir, _cleanable=CLEAN_STRENGTH_BLOOD, _color, _layer=ABOVE_OBJ_LAYER) - if(!isitem(parent)) - return COMPONENT_INCOMPATIBLE - . = ..() - RegisterSignal(parent, COMSIG_ATOM_GET_EXAMINE_NAME, .proc/get_examine_name) - -/datum/component/decal/blood/generate_appearance(_icon, _icon_state, _dir, _layer, _color) - var/obj/item/I = parent - if(!_icon) - _icon = 'icons/effects/blood.dmi' - if(!_icon_state) - _icon_state = "itemblood" - var/icon = initial(I.icon) - var/icon_state = initial(I.icon_state) - if(!icon || !icon_state) - // It's something which takes on the look of other items, probably - icon = I.icon - icon_state = I.icon_state - var/static/list/blood_splatter_appearances = list() - //try to find a pre-processed blood-splatter. otherwise, make a new one - var/index = "[REF(icon)]-[icon_state]" - pic = blood_splatter_appearances[index] - - if(!pic) - var/icon/blood_splatter_icon = icon(initial(I.icon), initial(I.icon_state), , 1) //we only want to apply blood-splatters to the initial icon_state for each object - blood_splatter_icon.Blend("#fff", ICON_ADD) //fills the icon_state with white (except where it's transparent) - blood_splatter_icon.Blend(icon(_icon, _icon_state), ICON_MULTIPLY) //adds blood and the remaining white areas become transparant - pic = mutable_appearance(blood_splatter_icon, initial(I.icon_state)) - blood_splatter_appearances[index] = pic - return TRUE - -/datum/component/decal/blood/proc/get_examine_name(datum/source, mob/user, list/override) - var/atom/A = parent - override[EXAMINE_POSITION_ARTICLE] = A.gender == PLURAL? "some" : "a" - override[EXAMINE_POSITION_BEFORE] = " blood-stained " - return COMPONENT_EXNAME_CHANGED +/datum/component/decal/blood + dupe_mode = COMPONENT_DUPE_UNIQUE + +/datum/component/decal/blood/Initialize(_icon, _icon_state, _dir, _cleanable=CLEAN_STRENGTH_BLOOD, _color, _layer=ABOVE_OBJ_LAYER) + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + . = ..() + RegisterSignal(parent, COMSIG_ATOM_GET_EXAMINE_NAME, .proc/get_examine_name) + +/datum/component/decal/blood/proc/get_examine_name(datum/source, mob/user, list/override) + var/atom/A = parent + + return COMPONENT_EXNAME_CHANGED diff --git a/code/datums/components/earhealing.dm b/code/datums/components/earhealing.dm index 6eb71285e0..bd3d57480d 100644 --- a/code/datums/components/earhealing.dm +++ b/code/datums/components/earhealing.dm @@ -26,5 +26,5 @@ if(!HAS_TRAIT(wearer, TRAIT_DEAF)) var/obj/item/organ/ears/ears = wearer.getorganslot(ORGAN_SLOT_EARS) if (ears) - ears.deaf = max(ears.deaf - 1, (ears.ear_damage < UNHEALING_EAR_DAMAGE ? 0 : 1)) // Do not clear deafness while above the unhealing ear damage threshold - ears.ear_damage = max(ears.ear_damage - 0.1, 0) + ears.deaf = max(ears.deaf - 1, (ears.damage < ears.maxHealth ? 0 : 1)) // Do not clear deafness if our ears are too damaged + ears.damage = max(ears.damage - 0.1, 0) diff --git a/code/datums/components/earprotection.dm b/code/datums/components/earprotection.dm index 2084943756..9256c4310a 100644 --- a/code/datums/components/earprotection.dm +++ b/code/datums/components/earprotection.dm @@ -1,11 +1,11 @@ /datum/component/wearertargeting/earprotection signals = list(COMSIG_CARBON_SOUNDBANG) mobtype = /mob/living/carbon + proctype = .proc/reducebang /datum/component/wearertargeting/earprotection/Initialize(_valid_slots) . = ..() valid_slots = _valid_slots - callback = CALLBACK(src, .proc/reducebang) /datum/component/wearertargeting/earprotection/proc/reducebang(datum/source, list/reflist) reflist[1]-- diff --git a/code/datums/components/footstep.dm b/code/datums/components/footstep.dm index e6c9f20de6..c4e65ea120 100644 --- a/code/datums/components/footstep.dm +++ b/code/datums/components/footstep.dm @@ -1,108 +1,108 @@ -/datum/component/footstep - var/steps = 0 - var/volume - var/e_range - -/datum/component/footstep/Initialize(volume_ = 0.5, e_range_ = -1) - if(!isliving(parent)) - return COMPONENT_INCOMPATIBLE - volume = volume_ - e_range = e_range_ - RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED), .proc/play_footstep) - -/datum/component/footstep/proc/play_footstep() - var/turf/open/T = get_turf(parent) - if(!istype(T)) - return - - var/mob/living/LM = parent - var/v = volume - var/e = e_range - if(!T.footstep || LM.buckled || LM.lying || !LM.canmove || LM.resting || LM.buckled || LM.throwing || LM.movement_type & (VENTCRAWLING | FLYING)) - if (LM.lying && !LM.buckled && !(!T.footstep || LM.movement_type & (VENTCRAWLING | FLYING))) //play crawling sound if we're lying - playsound(T, 'sound/effects/footstep/crawl1.ogg', 15 * v) - return - - if(HAS_TRAIT(LM, TRAIT_SILENT_STEP)) - return - - if(iscarbon(LM)) - var/mob/living/carbon/C = LM - if(!C.get_bodypart(BODY_ZONE_L_LEG) && !C.get_bodypart(BODY_ZONE_R_LEG)) - return - if(ishuman(C) && C.m_intent == MOVE_INTENT_WALK) - v /= 2 - e -= 5 - steps++ - - if(steps >= 3) - steps = 0 - - else - return - - if(prob(80) && !LM.has_gravity(T)) // don't need to step as often when you hop around - return - - //begin playsound shenanigans// - - //for barefooted non-clawed mobs like monkeys - if(isbarefoot(LM)) - playsound(T, pick(GLOB.barefootstep[T.barefootstep][1]), - GLOB.barefootstep[T.barefootstep][2] * v, - TRUE, - GLOB.barefootstep[T.barefootstep][3] + e) - return - - //for xenomorphs, dogs, and other clawed mobs - if(isclawfoot(LM)) - if(isalienadult(LM)) //xenos are stealthy and get quieter footsteps - v /= 3 - e -= 5 - - playsound(T, pick(GLOB.clawfootstep[T.clawfootstep][1]), - GLOB.clawfootstep[T.clawfootstep][2] * v, - TRUE, - GLOB.clawfootstep[T.clawfootstep][3] + e) - return - - //for megafauna and other large and imtimidating mobs such as the bloodminer - if(isheavyfoot(LM)) - playsound(T, pick(GLOB.heavyfootstep[T.heavyfootstep][1]), - GLOB.heavyfootstep[T.heavyfootstep][2] * v, - TRUE, - GLOB.heavyfootstep[T.heavyfootstep][3] + e) - return - - //for slimes - if(isslime(LM)) - playsound(T, 'sound/effects/footstep/slime1.ogg', 15 * v) - return - - //for (simple) humanoid mobs (clowns, russians, pirates, etc.) - if(isshoefoot(LM)) - if(!ishuman(LM)) - playsound(T, pick(GLOB.footstep[T.footstep][1]), - GLOB.footstep[T.footstep][2] * v, - TRUE, - GLOB.footstep[T.footstep][3] + e) - return - if(ishuman(LM)) //for proper humans, they're special - var/mob/living/carbon/human/H = LM - var/feetCover = (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)) || (H.w_uniform && (H.w_uniform.body_parts_covered & FEET)) - - if (H.dna.features["taur"] == "Naga" || H.dna.features["taur"] == "Tentacle") //are we a naga or tentacle taur creature - playsound(T, 'sound/effects/footstep/crawl1.ogg', 15 * v) - return - - if(H.shoes || feetCover) //are we wearing shoes - playsound(T, pick(GLOB.footstep[T.footstep][1]), - GLOB.footstep[T.footstep][2] * v, - TRUE, - GLOB.footstep[T.footstep][3] + e) - - if((!H.shoes && !feetCover)) //are we NOT wearing shoes - playsound(T, pick(GLOB.barefootstep[T.barefootstep][1]), - GLOB.barefootstep[T.barefootstep][2] * v, - TRUE, +/datum/component/footstep + var/steps = 0 + var/volume + var/e_range + +/datum/component/footstep/Initialize(volume_ = 0.5, e_range_ = -1) + if(!isliving(parent)) + return COMPONENT_INCOMPATIBLE + volume = volume_ + e_range = e_range_ + RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED), .proc/play_footstep) + +/datum/component/footstep/proc/play_footstep() + var/turf/open/T = get_turf(parent) + if(!istype(T)) + return + + var/mob/living/LM = parent + var/v = volume + var/e = e_range + if(!T.footstep || LM.buckled || LM.lying || !LM.canmove || LM.resting || LM.buckled || LM.throwing || LM.movement_type & (VENTCRAWLING | FLYING)) + if (LM.lying && !LM.buckled && !(!T.footstep || LM.movement_type & (VENTCRAWLING | FLYING))) //play crawling sound if we're lying + playsound(T, 'sound/effects/footstep/crawl1.ogg', 15 * v) + return + + if(HAS_TRAIT(LM, TRAIT_SILENT_STEP)) + return + + if(iscarbon(LM)) + var/mob/living/carbon/C = LM + if(!C.get_bodypart(BODY_ZONE_L_LEG) && !C.get_bodypart(BODY_ZONE_R_LEG)) + return + if(ishuman(C) && C.m_intent == MOVE_INTENT_WALK) + v /= 2 + e -= 5 + steps++ + + if(steps >= 3) + steps = 0 + + else + return + + if(prob(80) && !LM.has_gravity(T)) // don't need to step as often when you hop around + return + + //begin playsound shenanigans// + + //for barefooted non-clawed mobs like monkeys + if(isbarefoot(LM)) + playsound(T, pick(GLOB.barefootstep[T.barefootstep][1]), + GLOB.barefootstep[T.barefootstep][2] * v, + TRUE, + GLOB.barefootstep[T.barefootstep][3] + e) + return + + //for xenomorphs, dogs, and other clawed mobs + if(isclawfoot(LM)) + if(isalienadult(LM)) //xenos are stealthy and get quieter footsteps + v /= 3 + e -= 5 + + playsound(T, pick(GLOB.clawfootstep[T.clawfootstep][1]), + GLOB.clawfootstep[T.clawfootstep][2] * v, + TRUE, + GLOB.clawfootstep[T.clawfootstep][3] + e) + return + + //for megafauna and other large and imtimidating mobs such as the bloodminer + if(isheavyfoot(LM)) + playsound(T, pick(GLOB.heavyfootstep[T.heavyfootstep][1]), + GLOB.heavyfootstep[T.heavyfootstep][2] * v, + TRUE, + GLOB.heavyfootstep[T.heavyfootstep][3] + e) + return + + //for slimes + if(isslime(LM)) + playsound(T, 'sound/effects/footstep/slime1.ogg', 15 * v) + return + + //for (simple) humanoid mobs (clowns, russians, pirates, etc.) + if(isshoefoot(LM)) + if(!ishuman(LM)) + playsound(T, pick(GLOB.footstep[T.footstep][1]), + GLOB.footstep[T.footstep][2] * v, + TRUE, + GLOB.footstep[T.footstep][3] + e) + return + if(ishuman(LM)) //for proper humans, they're special + var/mob/living/carbon/human/H = LM + var/feetCover = (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)) || (H.w_uniform && (H.w_uniform.body_parts_covered & FEET) || (H.shoes && (H.shoes.body_parts_covered & FEET))) + + if (H.dna.features["taur"] == "Naga" || H.dna.features["taur"] == "Tentacle") //are we a naga or tentacle taur creature + playsound(T, 'sound/effects/footstep/crawl1.ogg', 15 * v) + return + + if(feetCover) //are we wearing shoes + playsound(T, pick(GLOB.footstep[T.footstep][1]), + GLOB.footstep[T.footstep][2] * v, + TRUE, + GLOB.footstep[T.footstep][3] + e) + + if(!feetCover) //are we NOT wearing shoes + playsound(T, pick(GLOB.barefootstep[T.barefootstep][1]), + GLOB.barefootstep[T.barefootstep][2] * v, + TRUE, GLOB.barefootstep[T.barefootstep][3] + e) \ No newline at end of file diff --git a/code/datums/components/forensics.dm b/code/datums/components/forensics.dm deleted file mode 100644 index c7a1f7eba5..0000000000 --- a/code/datums/components/forensics.dm +++ /dev/null @@ -1,159 +0,0 @@ -/datum/component/forensics - dupe_mode = COMPONENT_DUPE_UNIQUE - var/list/fingerprints //assoc print = print - var/list/hiddenprints //assoc ckey = realname/gloves/ckey - var/list/blood_DNA //assoc dna = bloodtype - var/list/fibers //assoc print = print - -/datum/component/forensics/InheritComponent(datum/component/forensics/F, original) //Use of | and |= being different here is INTENTIONAL. - fingerprints = fingerprints | F.fingerprints - hiddenprints = hiddenprints | F.hiddenprints - blood_DNA = blood_DNA | F.blood_DNA - fibers = fibers | F.fibers - check_blood() - return ..() - -/datum/component/forensics/Initialize(new_fingerprints, new_hiddenprints, new_blood_DNA, new_fibers) - if(!isatom(parent)) - return COMPONENT_INCOMPATIBLE - fingerprints = new_fingerprints - hiddenprints = new_hiddenprints - blood_DNA = new_blood_DNA - fibers = new_fibers - check_blood() - RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_act) - -/datum/component/forensics/proc/wipe_fingerprints() - fingerprints = null - return TRUE - -/datum/component/forensics/proc/wipe_hiddenprints() - return //no. - -/datum/component/forensics/proc/wipe_blood_DNA() - blood_DNA = null - if(isitem(parent)) - qdel(parent.GetComponent(/datum/component/decal/blood)) - return TRUE - -/datum/component/forensics/proc/wipe_fibers() - fibers = null - return TRUE - -/datum/component/forensics/proc/clean_act(datum/source, strength) - if(strength >= CLEAN_STRENGTH_FINGERPRINTS) - wipe_fingerprints() - if(strength >= CLEAN_STRENGTH_BLOOD) - wipe_blood_DNA() - if(strength >= CLEAN_STRENGTH_FIBERS) - wipe_fibers() - -/datum/component/forensics/proc/add_fingerprint_list(list/_fingerprints) //list(text) - if(!length(_fingerprints)) - return - LAZYINITLIST(fingerprints) - for(var/i in _fingerprints) //We use an associative list, make sure we don't just merge a non-associative list into ours. - fingerprints[i] = i - return TRUE - -/datum/component/forensics/proc/add_fingerprint(mob/living/M, ignoregloves = FALSE) - if(!M) - return - add_hiddenprint(M) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - add_fibers(H) - if(H.gloves) //Check if the gloves (if any) hide fingerprints - var/obj/item/clothing/gloves/G = H.gloves - if(G.transfer_prints) - ignoregloves = TRUE - if(!ignoregloves) - H.gloves.add_fingerprint(H, TRUE) //ignoregloves = 1 to avoid infinite loop. - return - var/full_print = md5(H.dna.uni_identity) - LAZYSET(fingerprints, full_print, full_print) - return TRUE - -/datum/component/forensics/proc/add_fiber_list(list/_fibertext) //list(text) - if(!length(_fibertext)) - return - LAZYINITLIST(fibers) - for(var/i in _fibertext) //We use an associative list, make sure we don't just merge a non-associative list into ours. - fibers[i] = i - return TRUE - -/datum/component/forensics/proc/add_fibers(mob/living/carbon/human/M) - var/fibertext - var/item_multiplier = isitem(src)?1.2:1 - if(M.wear_suit) - fibertext = "Material from \a [M.wear_suit]." - if(prob(10*item_multiplier) && !LAZYACCESS(fibers, fibertext)) - LAZYSET(fibers, fibertext, fibertext) - if(!(M.wear_suit.body_parts_covered & CHEST)) - if(M.w_uniform) - fibertext = "Fibers from \a [M.w_uniform]." - if(prob(12*item_multiplier) && !LAZYACCESS(fibers, fibertext)) //Wearing a suit means less of the uniform exposed. - LAZYSET(fibers, fibertext, fibertext) - if(!(M.wear_suit.body_parts_covered & HANDS)) - if(M.gloves) - fibertext = "Material from a pair of [M.gloves.name]." - if(prob(20*item_multiplier) && !LAZYACCESS(fibers, fibertext)) - LAZYSET(fibers, fibertext, fibertext) - else if(M.w_uniform) - fibertext = "Fibers from \a [M.w_uniform]." - if(prob(15*item_multiplier) && !LAZYACCESS(fibers, fibertext)) - // "Added fibertext: [fibertext]" - LAZYSET(fibers, fibertext, fibertext) - if(M.gloves) - fibertext = "Material from a pair of [M.gloves.name]." - if(prob(20*item_multiplier) && !LAZYACCESS(fibers, fibertext)) - LAZYSET(fibers, fibertext, fibertext) - else if(M.gloves) - fibertext = "Material from a pair of [M.gloves.name]." - if(prob(20*item_multiplier) && !LAZYACCESS(fibers, fibertext)) - LAZYSET(fibers, fibertext, fibertext) - return TRUE - -/datum/component/forensics/proc/add_hiddenprint_list(list/_hiddenprints) //list(ckey = text) - if(!length(_hiddenprints)) - return - LAZYINITLIST(hiddenprints) - for(var/i in _hiddenprints) //We use an associative list, make sure we don't just merge a non-associative list into ours. - hiddenprints[i] = _hiddenprints[i] - return TRUE - -/datum/component/forensics/proc/add_hiddenprint(mob/living/M) - if(!M || !M.key) - return - var/hasgloves = "" - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.gloves) - hasgloves = "(gloves)" - var/current_time = TIME_STAMP("hh:mm:ss", FALSE) - if(!LAZYACCESS(hiddenprints, M.key)) - LAZYSET(hiddenprints, M.key, "First: [M.real_name]\[[current_time]\][hasgloves]. Ckey: [M.ckey]") - else - var/laststamppos = findtext(LAZYACCESS(hiddenprints, M.key), " Last: ") - if(laststamppos) - LAZYSET(hiddenprints, M.key, copytext(hiddenprints[M.key], 1, laststamppos)) - hiddenprints[M.key] += " Last: [M.real_name]\[[current_time]\][hasgloves]. Ckey: [M.ckey]" //made sure to be existing by if(!LAZYACCESS);else - var/atom/A = parent - A.fingerprintslast = M.ckey - return TRUE - -/datum/component/forensics/proc/add_blood_DNA(list/dna) //list(dna_enzymes = type) - if(!length(dna)) - return - LAZYINITLIST(blood_DNA) - for(var/i in dna) - blood_DNA[i] = dna[i] - check_blood() - return TRUE - -/datum/component/forensics/proc/check_blood() - if(!isitem(parent)) - return - if(!length(blood_DNA)) - return - parent.LoadComponent(/datum/component/decal/blood) diff --git a/code/datums/components/infective.dm b/code/datums/components/infective.dm index cd5df8220b..ad2b7ded14 100644 --- a/code/datums/components/infective.dm +++ b/code/datums/components/infective.dm @@ -6,21 +6,28 @@ /datum/component/infective/Initialize(list/datum/disease/_diseases, expire_in) if(islist(_diseases)) - diseases = diseases + diseases = _diseases else diseases = list(_diseases) if(expire_in) expire_time = world.time + expire_in QDEL_IN(src, expire_in) + + if(!ismovableatom(parent)) + return COMPONENT_INCOMPATIBLE + RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean) RegisterSignal(parent, COMSIG_MOVABLE_BUCKLE, .proc/try_infect_buckle) RegisterSignal(parent, COMSIG_MOVABLE_BUMP, .proc/try_infect_collide) RegisterSignal(parent, COMSIG_MOVABLE_CROSSED, .proc/try_infect_crossed) - RegisterSignal(parent, COMSIG_ITEM_ATTACK_ZONE, .proc/try_infect_attack_zone) - RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/try_infect_attack) - RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/try_infect_equipped) RegisterSignal(parent, COMSIG_MOVABLE_IMPACT_ZONE, .proc/try_infect_impact_zone) - RegisterSignal(parent, COMSIG_FOOD_EATEN, .proc/try_infect_eat) - RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean) + if(isitem(parent)) + RegisterSignal(parent, COMSIG_ITEM_ATTACK_ZONE, .proc/try_infect_attack_zone) + RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/try_infect_attack) + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/try_infect_equipped) + if(istype(parent, /obj/item/reagent_containers/food/snacks)) + RegisterSignal(parent, COMSIG_FOOD_EATEN, .proc/try_infect_eat) + else if(istype(parent, /obj/effect/decal/cleanable/blood/gibs)) + RegisterSignal(parent, COMSIG_GIBS_STREAK, .proc/try_infect_streak) /datum/component/infective/proc/try_infect_eat(datum/source, mob/living/eater, mob/living/feeder) for(var/V in diseases) @@ -73,6 +80,9 @@ if(isliving(M)) try_infect(M, BODY_ZONE_PRECISE_L_FOOT) +/datum/component/infective/proc/try_infect_streak(datum/source, list/directions, list/output_diseases) + output_diseases |= diseases + /datum/component/infective/proc/try_infect(mob/living/L, target_zone) for(var/V in diseases) L.ContactContractDisease(V, target_zone) diff --git a/code/datums/components/lockon_aiming.dm b/code/datums/components/lockon_aiming.dm index cc41e793ed..38b707ac19 100644 --- a/code/datums/components/lockon_aiming.dm +++ b/code/datums/components/lockon_aiming.dm @@ -237,6 +237,3 @@ LOCKON_RANGING_BREAK_CHECK cd++ CHECK_TICK - -/datum/component/lockon_aiming/PostTransfer(datum/new_parent) - return COMPONENT_INCOMPATIBLE diff --git a/code/datums/components/mirage_border.dm b/code/datums/components/mirage_border.dm index 2e6f8f79f6..20e3b317ec 100644 --- a/code/datums/components/mirage_border.dm +++ b/code/datums/components/mirage_border.dm @@ -1,4 +1,5 @@ /datum/component/mirage_border + can_transfer = TRUE var/obj/effect/abstract/mirage_holder/holder /datum/component/mirage_border/Initialize(turf/target, direction, range=world.view) diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index 730ffa9ff0..05d8ce6989 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -21,6 +21,8 @@ RegisterSignal(parent, COMSIG_ADD_MOOD_EVENT, .proc/add_event) RegisterSignal(parent, COMSIG_CLEAR_MOOD_EVENT, .proc/clear_event) + RegisterSignal(parent, COMSIG_INCREASE_SANITY, .proc/IncreaseSanity) + RegisterSignal(parent, COMSIG_DECREASE_SANITY, .proc/DecreaseSanity) RegisterSignal(parent, COMSIG_MOB_HUD_CREATED, .proc/modify_hud) var/mob/living/owner = parent @@ -129,29 +131,31 @@ switch(mood_level) if(1) - DecreaseSanity(0.2) + DecreaseSanity(src, 0.2) if(2) - DecreaseSanity(0.125, SANITY_CRAZY) + DecreaseSanity(src, 0.125, SANITY_CRAZY) if(3) - DecreaseSanity(0.075, SANITY_UNSTABLE) + DecreaseSanity(src, 0.075, SANITY_UNSTABLE) if(4) - DecreaseSanity(0.025, SANITY_DISTURBED) + DecreaseSanity(src, 0.025, SANITY_DISTURBED) if(5) - IncreaseSanity(0.1) + IncreaseSanity(src, 0.1) if(6) - IncreaseSanity(0.15) + IncreaseSanity(src, 0.15) if(7) - IncreaseSanity(0.20) + IncreaseSanity(src, 0.20) if(8) - IncreaseSanity(0.25, SANITY_GREAT) + IncreaseSanity(src, 0.25, SANITY_GREAT) if(9) - IncreaseSanity(0.4, SANITY_GREAT) + IncreaseSanity(src, 0.4, SANITY_GREAT) +/* if(insanity_effect != holdmyinsanityeffect) if(insanity_effect > holdmyinsanityeffect) owner.crit_threshold += (insanity_effect - holdmyinsanityeffect) else owner.crit_threshold -= (holdmyinsanityeffect - insanity_effect) +*/ if(HAS_TRAIT(owner, TRAIT_DEPRESSION)) if(prob(0.05)) @@ -214,13 +218,13 @@ /datum/component/mood/proc/setInsanityEffect(newval)//More code so that the previous proc works if(newval == insanity_effect) return - var/mob/living/master = parent - master.crit_threshold = (master.crit_threshold - insanity_effect) + newval + //var/mob/living/master = parent + //master.crit_threshold = (master.crit_threshold - insanity_effect) + newval insanity_effect = newval -/datum/component/mood/proc/DecreaseSanity(amount, minimum = SANITY_INSANE) +/datum/component/mood/proc/DecreaseSanity(datum/source, amount, minimum = SANITY_INSANE) if(sanity < minimum) //This might make KevinZ stop fucking pinging me. - IncreaseSanity(0.5) + IncreaseSanity(src, 0.5) else sanity = max(minimum, sanity - amount) if(sanity < SANITY_UNSTABLE) @@ -229,13 +233,13 @@ else insanity_effect = (MINOR_INSANITY_PEN) -/datum/component/mood/proc/IncreaseSanity(amount, maximum = SANITY_NEUTRAL) +/datum/component/mood/proc/IncreaseSanity(datum/source, amount, maximum = SANITY_NEUTRAL) // Disturbed stops you from getting any more sane - I'm just gonna bung this in here var/mob/living/owner = parent if(HAS_TRAIT(owner, TRAIT_UNSTABLE)) return if(sanity > maximum) - DecreaseSanity(0.5) //Removes some sanity to go back to our current limit. + DecreaseSanity(src, 0.5) //Removes some sanity to go back to our current limit. else sanity = min(maximum, sanity + amount) if(sanity > SANITY_CRAZY) diff --git a/code/datums/components/ntnet_interface.dm b/code/datums/components/ntnet_interface.dm index d945f68ca9..7c364a61ab 100644 --- a/code/datums/components/ntnet_interface.dm +++ b/code/datums/components/ntnet_interface.dm @@ -6,7 +6,7 @@ return /datum/proc/ntnet_send(datum/netdata/data, netid) - GET_COMPONENT(NIC, /datum/component/ntnet_interface) + var/datum/component/ntnet_interface/NIC = GetComponent(/datum/component/ntnet_interface) if(!NIC) return FALSE return NIC.__network_send(data, netid) diff --git a/code/datums/components/orbiter.dm b/code/datums/components/orbiter.dm index 301e50dc42..efa0fd14d5 100644 --- a/code/datums/components/orbiter.dm +++ b/code/datums/components/orbiter.dm @@ -1,8 +1,7 @@ /datum/component/orbiter + can_transfer = TRUE dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS var/list/orbiters - var/datum/callback/orbiter_spy - var/datum/callback/orbited_spy //radius: range to orbit at, radius of the circle formed by orbiting (in pixels) //clockwise: whether you orbit clockwise or anti clockwise @@ -14,8 +13,6 @@ return COMPONENT_INCOMPATIBLE orbiters = list() - orbiter_spy = CALLBACK(src, .proc/orbiter_move_react) - orbited_spy = CALLBACK(src, .proc/move_react) var/atom/master = parent master.orbiters = src @@ -25,7 +22,7 @@ /datum/component/orbiter/RegisterWithParent() var/atom/target = parent while(ismovableatom(target)) - RegisterSignal(target, COMSIG_MOVABLE_MOVED, orbited_spy) + RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/move_react) target = target.loc /datum/component/orbiter/UnregisterFromParent() @@ -40,8 +37,6 @@ for(var/i in orbiters) end_orbit(i) orbiters = null - QDEL_NULL(orbiter_spy) - QDEL_NULL(orbited_spy) return ..() /datum/component/orbiter/InheritComponent(datum/component/orbiter/newcomp, original, list/arguments) @@ -64,7 +59,7 @@ orbiter.orbiting.end_orbit(orbiter) orbiters[orbiter] = TRUE orbiter.orbiting = src - RegisterSignal(orbiter, COMSIG_MOVABLE_MOVED, orbiter_spy) + RegisterSignal(orbiter, COMSIG_MOVABLE_MOVED, .proc/orbiter_move_react) var/matrix/initial_transform = matrix(orbiter.transform) // Head first! @@ -120,7 +115,7 @@ if(orbited?.loc && orbited.loc != newturf) // We want to know when anything holding us moves too var/atom/target = orbited.loc while(ismovableatom(target)) - RegisterSignal(target, COMSIG_MOVABLE_MOVED, orbited_spy, TRUE) + RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/move_react, TRUE) target = target.loc var/atom/curloc = master.loc diff --git a/code/datums/components/phantomthief.dm b/code/datums/components/phantomthief.dm new file mode 100644 index 0000000000..ff1c48936f --- /dev/null +++ b/code/datums/components/phantomthief.dm @@ -0,0 +1,39 @@ +//This component applies a customizable drop_shadow filter to its wearer when they toggle combat mode on or off. This can stack. + +/datum/component/wearertargeting/phantomthief + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + signals = list(COMSIG_COMBAT_TOGGLED) + proctype = .proc/handlefilterstuff + var/filter_x + var/filter_y + var/filter_size + var/filter_border + var/filter_color + +/datum/component/wearertargeting/phantomthief/Initialize(_x = -2, _y = 0, _size = 0, _border = 0, _color = "#E62111", list/_valid_slots = list(SLOT_GLASSES)) + . = ..() + if(. == COMPONENT_INCOMPATIBLE) + return + filter_x = _x + filter_y = _y + filter_size = _size + filter_border = _border + filter_color = _color + valid_slots = _valid_slots + +/datum/component/wearertargeting/phantomthief/proc/handlefilterstuff(datum/source, mob/user, combatmodestate) + if(istype(user)) + var/thefilter = filter(type = "drop_shadow", x = filter_x, y = filter_y, size = filter_size, border = filter_border, color = filter_color) + if(!combatmodestate) + user.filters -= thefilter + else + user.filters += thefilter + +/datum/component/wearertargeting/phantomthief/proc/stripdesiredfilter(mob/user) + if(istype(user)) + var/thefilter = filter(type = "drop_shadow", x = filter_x, y = filter_y, size = filter_size, border = filter_border, color = filter_color) + user.filters -= thefilter + +/datum/component/wearertargeting/phantomthief/on_drop(datum/source, mob/user) + . = ..() + stripdesiredfilter(user) diff --git a/code/datums/components/riding.dm b/code/datums/components/riding.dm index 7b80f87657..0af90f694c 100644 --- a/code/datums/components/riding.dm +++ b/code/datums/components/riding.dm @@ -162,12 +162,12 @@ if(!Process_Spacemove(direction) || !isturf(AM.loc)) return step(AM, direction) - + if((direction & (direction - 1)) && (AM.loc == next)) //moved diagonally last_move_diagonal = TRUE else last_move_diagonal = FALSE - + handle_vehicle_layer() handle_vehicle_offsets() else @@ -195,21 +195,47 @@ . = ..() RegisterSignal(parent, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, .proc/on_host_unarmed_melee) +/datum/component/riding/human/vehicle_mob_unbuckle(datum/source, mob/living/M, force = FALSE) + var/mob/living/carbon/human/H = parent + H.remove_movespeed_modifier(MOVESPEED_ID_HUMAN_CARRYING) + . = ..() + +/datum/component/riding/human/vehicle_mob_buckle(datum/source, mob/living/M, force = FALSE) + . = ..() + var/mob/living/carbon/human/H = parent + H.add_movespeed_modifier(MOVESPEED_ID_HUMAN_CARRYING, multiplicative_slowdown = HUMAN_CARRY_SLOWDOWN) + /datum/component/riding/human/proc/on_host_unarmed_melee(atom/target) - var/mob/living/carbon/human/AM = parent - if(AM.a_intent == INTENT_DISARM && (target in AM.buckled_mobs)) + var/mob/living/carbon/human/H = parent + if(H.a_intent == INTENT_DISARM && (target in H.buckled_mobs)) force_dismount(target) /datum/component/riding/human/handle_vehicle_layer() var/atom/movable/AM = parent if(AM.buckled_mobs && AM.buckled_mobs.len) - if(AM.dir == SOUTH) - AM.layer = ABOVE_MOB_LAYER + for(var/mob/M in AM.buckled_mobs) //ensure proper layering of piggyback and carry, sometimes weird offsets get applied + M.layer = MOB_LAYER + if(!AM.buckle_lying) + if(AM.dir == SOUTH) + AM.layer = ABOVE_MOB_LAYER + else + AM.layer = OBJ_LAYER else - AM.layer = OBJ_LAYER + if(AM.dir == NORTH) + AM.layer = OBJ_LAYER + else + AM.layer = ABOVE_MOB_LAYER else AM.layer = MOB_LAYER +/datum/component/riding/human/get_offsets(pass_index) + var/mob/living/carbon/human/H = parent + if(H.buckle_lying) + return list(TEXT_NORTH = list(0, 6), TEXT_SOUTH = list(0, 6), TEXT_EAST = list(0, 6), TEXT_WEST = list(0, 6)) + else + return list(TEXT_NORTH = list(0, 6), TEXT_SOUTH = list(0, 6), TEXT_EAST = list(-6, 4), TEXT_WEST = list( 6, 4)) + + /datum/component/riding/human/force_dismount(mob/living/user) var/atom/movable/AM = parent AM.unbuckle_mob(user) @@ -273,12 +299,15 @@ M.throw_at(target, 14, 5, AM) M.Knockdown(60) -/datum/component/riding/proc/equip_buckle_inhands(mob/living/carbon/human/user, amount_required = 1) +/datum/component/riding/proc/equip_buckle_inhands(mob/living/carbon/human/user, amount_required = 1, riding_target_override = null) var/atom/movable/AM = parent var/amount_equipped = 0 for(var/amount_needed = amount_required, amount_needed > 0, amount_needed--) var/obj/item/riding_offhand/inhand = new /obj/item/riding_offhand(user) - inhand.rider = user + if(!riding_target_override) + inhand.rider = user + else + inhand.rider = riding_target_override inhand.parent = AM if(user.put_in_hands(inhand, TRUE)) amount_equipped++ @@ -318,7 +347,7 @@ . = ..() /obj/item/riding_offhand/equipped() - if(loc != rider) + if(loc != rider && loc != parent) selfdeleting = TRUE qdel(src) . = ..() diff --git a/code/datums/components/rotation.dm b/code/datums/components/rotation.dm index ff424dc02e..ed3ecd2ff3 100644 --- a/code/datums/components/rotation.dm +++ b/code/datums/components/rotation.dm @@ -44,19 +44,21 @@ if(src.rotation_flags & ROTATION_CLOCKWISE) default_rotation_direction = ROTATION_CLOCKWISE - if(src.rotation_flags & ROTATION_ALTCLICK) +/datum/component/simple_rotation/proc/add_signals() + if(rotation_flags & ROTATION_ALTCLICK) RegisterSignal(parent, COMSIG_CLICK_ALT, .proc/HandRot) RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/ExamineMessage) - if(src.rotation_flags & ROTATION_WRENCH) + if(rotation_flags & ROTATION_WRENCH) RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/WrenchRot) - if(src.rotation_flags & ROTATION_VERBS) +/datum/component/simple_rotation/proc/add_verbs() + if(rotation_flags & ROTATION_VERBS) var/atom/movable/AM = parent - if(src.rotation_flags & ROTATION_FLIP) + if(rotation_flags & ROTATION_FLIP) AM.verbs += /atom/movable/proc/simple_rotate_flip - if(src.rotation_flags & ROTATION_CLOCKWISE) + if(rotation_flags & ROTATION_CLOCKWISE) AM.verbs += /atom/movable/proc/simple_rotate_clockwise - if(src.rotation_flags & ROTATION_COUNTERCLOCKWISE) + if(rotation_flags & ROTATION_COUNTERCLOCKWISE) AM.verbs += /atom/movable/proc/simple_rotate_counterclockwise /datum/component/simple_rotation/proc/remove_verbs() @@ -66,11 +68,30 @@ AM.verbs -= /atom/movable/proc/simple_rotate_clockwise AM.verbs -= /atom/movable/proc/simple_rotate_counterclockwise -/datum/component/simple_rotation/Destroy() +/datum/component/simple_rotation/proc/remove_signals() + UnregisterSignal(parent, list(COMSIG_CLICK_ALT, COMSIG_PARENT_EXAMINE, COMSIG_PARENT_ATTACKBY)) + +/datum/component/simple_rotation/RegisterWithParent() + add_verbs() + add_signals() + . = ..() + +/datum/component/simple_rotation/PostTransfer() + //Because of the callbacks which we don't track cleanly we can't transfer this + //item cleanly, better to let the new of the new item create a new rotation datum + //instead (there's no real state worth transferring) + return COMPONENT_NOTRANSFER + +/datum/component/simple_rotation/UnregisterFromParent() remove_verbs() + remove_signals() + . = ..() + +/datum/component/simple_rotation/Destroy() QDEL_NULL(can_user_rotate) QDEL_NULL(can_be_rotated) QDEL_NULL(after_rotation) + //Signals + verbs removed via UnRegister . = ..() /datum/component/simple_rotation/RemoveComponent() @@ -122,7 +143,7 @@ set name = "Rotate Clockwise" set category = "Object" set src in oview(1) - GET_COMPONENT(rotcomp,/datum/component/simple_rotation) + var/datum/component/simple_rotation/rotcomp = GetComponent(/datum/component/simple_rotation) if(rotcomp) rotcomp.HandRot(usr,ROTATION_CLOCKWISE) @@ -130,7 +151,7 @@ set name = "Rotate Counter-Clockwise" set category = "Object" set src in oview(1) - GET_COMPONENT(rotcomp,/datum/component/simple_rotation) + var/datum/component/simple_rotation/rotcomp = GetComponent(/datum/component/simple_rotation) if(rotcomp) rotcomp.HandRot(usr,ROTATION_COUNTERCLOCKWISE) @@ -138,6 +159,6 @@ set name = "Flip" set category = "Object" set src in oview(1) - GET_COMPONENT(rotcomp,/datum/component/simple_rotation) + var/datum/component/simple_rotation/rotcomp = GetComponent(/datum/component/simple_rotation) if(rotcomp) rotcomp.HandRot(usr,ROTATION_FLIP) diff --git a/code/datums/components/signal_redirect.dm b/code/datums/components/signal_redirect.dm deleted file mode 100644 index db98d5664a..0000000000 --- a/code/datums/components/signal_redirect.dm +++ /dev/null @@ -1,33 +0,0 @@ -// This should only be used by non components trying to listen to a signal -// If you use this inside a component I will replace your eyes with lemons ~ninjanomnom - -/datum/component/redirect - dupe_mode = COMPONENT_DUPE_ALLOWED - var/list/signals - var/datum/callback/turfchangeCB - -/datum/component/redirect/Initialize(list/_signals, flags=NONE) - //It's not our job to verify the right signals are registered here, just do it. - if(!LAZYLEN(_signals)) - return COMPONENT_INCOMPATIBLE - if(flags & REDIRECT_TRANSFER_WITH_TURF && isturf(parent)) - // If they also want to listen to the turf change then we need to set it up so both callbacks run - if(_signals[COMSIG_TURF_CHANGE]) - turfchangeCB = _signals[COMSIG_TURF_CHANGE] - if(!istype(turfchangeCB)) - . = COMPONENT_INCOMPATIBLE - CRASH("Redirect components must be given instanced callbacks, not proc paths.") - _signals[COMSIG_TURF_CHANGE] = CALLBACK(src, .proc/turf_change) - - signals = _signals - -/datum/component/redirect/RegisterWithParent() - for(var/signal in signals) - RegisterSignal(parent, signal, signals[signal]) - -/datum/component/redirect/UnregisterFromParent() - UnregisterSignal(parent, signals) - -/datum/component/redirect/proc/turf_change(datum/source, path, new_baseturfs, flags, list/transfers) - transfers += src - return turfchangeCB?.InvokeAsync(arglist(args)) diff --git a/code/datums/components/storage/concrete/_concrete.dm b/code/datums/components/storage/concrete/_concrete.dm index 0b78605869..f7ca711421 100644 --- a/code/datums/components/storage/concrete/_concrete.dm +++ b/code/datums/components/storage/concrete/_concrete.dm @@ -4,6 +4,7 @@ // /mob/living/Move() in /modules/mob/living/living.dm - hiding storage boxes on mob movement /datum/component/storage/concrete + can_transfer = TRUE var/drop_all_on_deconstruct = TRUE var/drop_all_on_destroy = FALSE var/drop_all_on_break = FALSE diff --git a/code/datums/components/storage/concrete/pockets.dm b/code/datums/components/storage/concrete/pockets.dm index 84be4fdca4..7e4a561422 100644 --- a/code/datums/components/storage/concrete/pockets.dm +++ b/code/datums/components/storage/concrete/pockets.dm @@ -56,7 +56,7 @@ /obj/item/scalpel, /obj/item/reagent_containers/syringe, /obj/item/dnainjector, /obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/dropper, /obj/item/implanter, /obj/item/screwdriver, /obj/item/weldingtool/mini, - /obj/item/firing_pin + /obj/item/firing_pin, /obj/item/gun/ballistic/automatic/pistol )) /datum/component/storage/concrete/pockets/shoes/clown/Initialize() @@ -67,7 +67,7 @@ /obj/item/scalpel, /obj/item/reagent_containers/syringe, /obj/item/dnainjector, /obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/dropper, /obj/item/implanter, /obj/item/screwdriver, /obj/item/weldingtool/mini, - /obj/item/firing_pin, /obj/item/bikehorn)) + /obj/item/firing_pin, /obj/item/bikehorn, /obj/item/gun/ballistic/automatic/pistol)) /datum/component/storage/concrete/pockets/pocketprotector max_items = 3 diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index 0c701cb943..a92ae9e629 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -57,6 +57,10 @@ var/screen_start_x = 4 //These two are where the storage starts being rendered, screen_loc wise. var/screen_start_y = 2 //End + + var/limited_random_access = FALSE //Quick if statement in accessible_items to determine if we care at all about what people can access at once. + var/limited_random_access_stack_position = 0 //If >0, can only access top items + var/limited_random_access_stack_bottom_up = FALSE //If TRUE, above becomes bottom items /datum/component/storage/Initialize(datum/component/storage/concrete/master) if(!isatom(parent)) @@ -96,6 +100,7 @@ RegisterSignal(parent, COMSIG_ITEM_PICKUP, .proc/signal_on_pickup) RegisterSignal(parent, COMSIG_MOVABLE_POST_THROW, .proc/close_all) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/check_views) RegisterSignal(parent, COMSIG_CLICK_ALT, .proc/on_alt_click) RegisterSignal(parent, COMSIG_MOUSEDROP_ONTO, .proc/mousedrop_onto) @@ -145,6 +150,19 @@ var/datum/component/storage/concrete/master = master() return master? master.real_location() : null +//What players can access +//this proc can probably eat a refactor at some point. +/datum/component/storage/proc/accessible_items(random_access = TRUE) + var/list/contents = contents() + if(contents) + if(limited_random_access && random_access) + if(limited_random_access_stack_position && (length(contents) > limited_random_access_stack_position)) + if(limited_random_access_stack_bottom_up) + contents.Cut(1, limited_random_access_stack_position + 1) + else + contents.Cut(1, length(contents) - limited_random_access_stack_position + 1) + return contents + /datum/component/storage/proc/canreach_react(datum/source, list/next) var/datum/component/storage/concrete/master = master() if(!master) @@ -234,7 +252,7 @@ /datum/component/storage/proc/quick_empty(mob/M) var/atom/A = parent - if((!ishuman(M) && (A.loc != M)) || (M.stat != CONSCIOUS) || M.restrained() || !M.canmove) + if(!M.canUseStorage() || !A.Adjacent(M) || M.incapacitated()) return if(check_locked(null, M, TRUE)) return FALSE @@ -283,8 +301,7 @@ /datum/component/storage/proc/_process_numerical_display() . = list() - var/atom/real_location = real_location() - for(var/obj/item/I in real_location.contents) + for(var/obj/item/I in accessible_items()) if(QDELETED(I)) continue if(!.[I.type]) @@ -295,8 +312,8 @@ //This proc determines the size of the inventory to be displayed. Please touch it only if you know what you're doing. /datum/component/storage/proc/orient2hud(mob/user, maxcolumns) - var/atom/real_location = real_location() - var/adjusted_contents = real_location.contents.len + var/list/accessible_contents = accessible_items() + var/adjusted_contents = length(accessible_contents) //Numbered contents display var/list/datum/numbered_display/numbered_contents @@ -328,8 +345,7 @@ if(cy - screen_start_y >= rows) break else - var/atom/real_location = real_location() - for(var/obj/O in real_location) + for(var/obj/O in accessible_items()) if(QDELETED(O)) continue O.mouse_opacity = MOUSE_OPACITY_OPAQUE //This is here so storage items that spawn with contents correctly have the "click around item to equip" @@ -350,9 +366,8 @@ return FALSE var/list/cview = getviewsize(M.client.view) var/maxallowedscreensize = cview[1]-8 - var/atom/real_location = real_location() if(M.active_storage != src && (M.stat == CONSCIOUS)) - for(var/obj/item/I in real_location) + for(var/obj/item/I in accessible_items()) if(I.on_found(M)) return FALSE if(M.active_storage) @@ -360,7 +375,7 @@ orient2hud(M, (isliving(M) ? maxallowedscreensize : 7)) M.client.screen |= boxes M.client.screen |= closer - M.client.screen |= real_location.contents + M.client.screen |= accessible_items() M.active_storage = src LAZYOR(is_using, M) return TRUE @@ -386,6 +401,11 @@ close(M) . = TRUE //returns TRUE if any mobs actually got a close(M) call +/datum/component/storage/proc/check_views() + for(var/mob/M in can_see_contents()) + if(!isobserver(M) && !M.CanReach(src, view_only = TRUE)) + close(M) + /datum/component/storage/proc/emp_act(datum/source, severity) if(emp_shielded) return @@ -587,7 +607,7 @@ return FALSE if(isitem(host)) var/obj/item/IP = host - GET_COMPONENT_FROM(STR_I, /datum/component/storage, I) + var/datum/component/storage/STR_I = I.GetComponent(/datum/component/storage) if((I.w_class >= IP.w_class) && STR_I && !allow_big_nesting) if(!stop_messages) to_chat(M, "[IP] cannot hold [I] as it's a storage item of the same size!") diff --git a/code/datums/components/swarming.dm b/code/datums/components/swarming.dm index 17b2178df6..64844c4c32 100644 --- a/code/datums/components/swarming.dm +++ b/code/datums/components/swarming.dm @@ -12,7 +12,7 @@ RegisterSignal(parent, COMSIG_MOVABLE_UNCROSSED, .proc/leave_swarm) /datum/component/swarming/proc/join_swarm(datum/source, atom/movable/AM) - GET_COMPONENT_FROM(other_swarm, /datum/component/swarming, AM) + var/datum/component/swarming/other_swarm = AM.GetComponent(/datum/component/swarming) if(!other_swarm) return swarm() @@ -21,7 +21,7 @@ other_swarm.swarm_members |= src /datum/component/swarming/proc/leave_swarm(datum/source, atom/movable/AM) - GET_COMPONENT_FROM(other_swarm, /datum/component/swarming, AM) + var/datum/component/swarming/other_swarm = AM.GetComponent(/datum/component/swarming) if(!other_swarm || !(other_swarm in swarm_members)) return swarm_members -= other_swarm diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index 8982530ab6..2c3b7518ba 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -24,8 +24,9 @@ GLOBAL_LIST_EMPTY(uplinks) var/unlock_note var/unlock_code var/failsafe_code + var/datum/ui_state/checkstate -/datum/component/uplink/Initialize(_owner, _lockable = TRUE, _enabled = FALSE, datum/game_mode/_gamemode, starting_tc = 20) +/datum/component/uplink/Initialize(_owner, _lockable = TRUE, _enabled = FALSE, datum/game_mode/_gamemode, starting_tc = 20, datum/ui_state/_checkstate) if(!isitem(parent)) return COMPONENT_INCOMPATIBLE @@ -57,6 +58,7 @@ GLOBAL_LIST_EMPTY(uplinks) active = _enabled gamemode = _gamemode telecrystals = starting_tc + checkstate = _checkstate if(!lockable) active = TRUE locked = FALSE @@ -115,6 +117,7 @@ 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) @@ -123,6 +126,12 @@ GLOBAL_LIST_EMPTY(uplinks) ui.set_style("syndicate") ui.open() +/datum/component/uplink/ui_host(mob/user) + if(istype(parent, /obj/item/implant)) //implants are like organs, not really located inside mobs codewise. + var/obj/item/implant/I = parent + return I.imp_in + return ..() + /datum/component/uplink/ui_data(mob/user) if(!user.mind) return diff --git a/code/datums/components/virtual_reality.dm b/code/datums/components/virtual_reality.dm new file mode 100644 index 0000000000..f8f0679e9b --- /dev/null +++ b/code/datums/components/virtual_reality.dm @@ -0,0 +1,128 @@ +/datum/component/virtual_reality + can_transfer = TRUE + var/datum/mind/mastermind // where is my mind t. pixies + var/datum/mind/current_mind + var/obj/machinery/vr_sleeper/vr_sleeper + var/datum/action/quit_vr/quit_action + var/you_die_in_the_game_you_die_for_real = FALSE + var/datum/component/virtual_reality/inception //The component works on a very fragile link betwixt mind, ckey and death. + +/datum/component/virtual_reality/Initialize(mob/M, obj/machinery/vr_sleeper/gaming_pod, yolo = FALSE, new_char = TRUE) + if(!ismob(parent) || !istype(M)) + return COMPONENT_INCOMPATIBLE + var/mob/vr_M = parent + mastermind = M.mind + RegisterSignal(M, list(COMSIG_MOB_DEATH, COMSIG_PARENT_QDELETED), .proc/game_over) + RegisterSignal(M, COMSIG_MOB_KEY_CHANGE, .proc/switch_player) + RegisterSignal(mastermind, COMSIG_MIND_TRANSFER, .proc/switch_player) + you_die_in_the_game_you_die_for_real = yolo + quit_action = new() + if(gaming_pod) + vr_sleeper = gaming_pod + RegisterSignal(vr_sleeper, COMSIG_ATOM_EMAG_ACT, .proc/you_only_live_once) + RegisterSignal(vr_sleeper, COMSIG_MACHINE_EJECT_OCCUPANT, .proc/revert_to_reality) + vr_M.ckey = M.ckey + var/datum/component/virtual_reality/clusterfk = M.GetComponent(/datum/component/virtual_reality) + if(clusterfk && !clusterfk.inception) + clusterfk.inception = src + SStgui.close_user_uis(M, src) + +/datum/component/virtual_reality/RegisterWithParent() + var/mob/M = parent + current_mind = M.mind + quit_action.Grant(M) + RegisterSignal(quit_action, COMSIG_ACTION_TRIGGER, .proc/revert_to_reality) + RegisterSignal(M, list(COMSIG_MOB_DEATH, COMSIG_PARENT_QDELETED), .proc/game_over) + RegisterSignal(M, COMSIG_MOB_GHOSTIZE, .proc/be_a_quitter) + RegisterSignal(M, COMSIG_MOB_KEY_CHANGE, .proc/pass_me_the_remote) + RegisterSignal(current_mind, COMSIG_MIND_TRANSFER, .proc/pass_me_the_remote) + mastermind.current.audiovisual_redirect = M + if(vr_sleeper) + vr_sleeper.vr_mob = M + +/datum/component/virtual_reality/UnregisterFromParent() + quit_action.Remove(parent) + UnregisterSignal(parent, list(COMSIG_MOB_DEATH, COMSIG_PARENT_QDELETED, COMSIG_MOB_KEY_CHANGE, COMSIG_MOB_GHOSTIZE)) + UnregisterSignal(current_mind, COMSIG_MIND_TRANSFER) + UnregisterSignal(quit_action, COMSIG_ACTION_TRIGGER) + current_mind = null + mastermind.current.audiovisual_redirect = null + +/datum/component/virtual_reality/proc/switch_player(datum/source, mob/new_mob, mob/old_mob) + if(vr_sleeper || !new_mob.mind) + // Machineries currently don't deal up with the occupant being polymorphed et similar... Or did something fuck up? + revert_to_reality() + return + old_mob.audiovisual_redirect = null + new_mob.audiovisual_redirect = parent + +/datum/component/virtual_reality/proc/action_trigger(datum/signal_source, datum/action/source) + if(source != quit_action) + return COMPONENT_ACTION_BLOCK_TRIGGER + revert_to_reality(signal_source) + +/datum/component/virtual_reality/proc/you_only_live_once() + if(you_die_in_the_game_you_die_for_real || vr_sleeper?.only_current_user_can_interact) + return FALSE + you_die_in_the_game_you_die_for_real = TRUE + return TRUE + +/datum/component/virtual_reality/proc/pass_me_the_remote(datum/source, mob/new_mob) + if(new_mob == mastermind.current) + revert_to_reality(source) + return TRUE + new_mob.TakeComponent(src) + return TRUE + +/datum/component/virtual_reality/PostTransfer() + if(!ismob(parent)) + return COMPONENT_INCOMPATIBLE + +/datum/component/virtual_reality/proc/revert_to_reality(datum/source) + quit_it() + +/datum/component/virtual_reality/proc/game_over(datum/source) + quit_it(TRUE, TRUE) + +/datum/component/virtual_reality/proc/be_a_quitter(datum/source, can_reenter_corpse) + quit_it() + return COMPONENT_BLOCK_GHOSTING + +/datum/component/virtual_reality/proc/virtual_reality_in_a_virtual_reality(mob/player, killme = FALSE, datum/component/virtual_reality/yo_dawg) + var/mob/M = parent + quit_it(FALSE, killme, player, yo_dawg) + yo_dawg.inception = null + if(killme) + M.death(FALSE) + +/datum/component/virtual_reality/proc/quit_it(deathcheck = FALSE, cleanup = FALSE, mob/override) + var/mob/M = parent + var/mob/dreamer = override ? override : mastermind.current + if(!mastermind) + to_chat(M, "You feel a dreadful sensation, something terrible happened. You try to wake up, but you find yourself unable to...") + else + var/key_transfer = FALSE + if(inception?.parent) + inception.virtual_reality_in_a_virtual_reality(dreamer, cleanup, src) + else + key_transfer = TRUE + if(key_transfer) + M.transfer_ckey(dreamer, FALSE) + dreamer.stop_sound_channel(CHANNEL_HEARTBEAT) + dreamer.audiovisual_redirect = null + if(deathcheck && you_die_in_the_game_you_die_for_real) + to_chat(mastermind, "You feel everything fading away...") + dreamer.death(FALSE) + if(cleanup) + var/obj/effect/vr_clean_master/cleanbot = locate() in get_area(M) + if(cleanbot) + LAZYADD(cleanbot.corpse_party, M) + if(vr_sleeper) + vr_sleeper.vr_mob = null + vr_sleeper = null + qdel(src) + +/datum/component/virtual_reality/Destroy() + var/datum/action/quit_vr/delet_me = quit_action + . = ..() + qdel(delet_me) \ No newline at end of file diff --git a/code/datums/components/wearertargeting.dm b/code/datums/components/wearertargeting.dm index 0aa0831127..feaa88f934 100644 --- a/code/datums/components/wearertargeting.dm +++ b/code/datums/components/wearertargeting.dm @@ -3,7 +3,7 @@ /datum/component/wearertargeting var/list/valid_slots = list() var/list/signals = list() - var/datum/callback/callback = CALLBACK(GLOBAL_PROC, .proc/pass) + var/proctype = .proc/pass var/mobtype = /mob/living /datum/component/wearertargeting/Initialize() @@ -14,13 +14,9 @@ /datum/component/wearertargeting/proc/on_equip(datum/source, mob/equipper, slot) if((slot in valid_slots) && istype(equipper, mobtype)) - RegisterSignal(equipper, signals, callback, TRUE) + RegisterSignal(equipper, signals, proctype, TRUE) else UnregisterSignal(equipper, signals) /datum/component/wearertargeting/proc/on_drop(datum/source, mob/user) - UnregisterSignal(user, signals) - -/datum/component/wearertargeting/Destroy() - QDEL_NULL(callback) //is likely to ourselves. - return ..() \ No newline at end of file + UnregisterSignal(user, signals) \ No newline at end of file diff --git a/code/datums/components/wet_floor.dm b/code/datums/components/wet_floor.dm index 6d504cefd4..84b0320375 100644 --- a/code/datums/components/wet_floor.dm +++ b/code/datums/components/wet_floor.dm @@ -1,5 +1,6 @@ /datum/component/wet_floor dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + can_transfer = TRUE var/highest_strength = TURF_DRY var/lube_flags = NONE //why do we have this? var/list/time_left_list //In deciseconds. @@ -26,14 +27,19 @@ if(!isopenturf(parent)) return COMPONENT_INCOMPATIBLE add_wet(strength, duration_minimum, duration_add, duration_maximum) - RegisterSignal(parent, COMSIG_TURF_IS_WET, .proc/is_wet) - RegisterSignal(parent, COMSIG_TURF_MAKE_DRY, .proc/dry) permanent = _permanent if(!permanent) START_PROCESSING(SSwet_floors, src) addtimer(CALLBACK(src, .proc/gc, TRUE), 1) //GC after initialization. last_process = world.time +/datum/component/wet_floor/RegisterWithParent() + RegisterSignal(parent, COMSIG_TURF_IS_WET, .proc/is_wet) + RegisterSignal(parent, COMSIG_TURF_MAKE_DRY, .proc/dry) + +/datum/component/wet_floor/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_TURF_IS_WET, COMSIG_TURF_MAKE_DRY)) + /datum/component/wet_floor/Destroy() STOP_PROCESSING(SSwet_floors, src) var/turf/T = parent @@ -138,12 +144,19 @@ /datum/component/wet_floor/PreTransfer() var/turf/O = parent O.cut_overlay(current_overlay) + //That turf is no longer slippery, we're out of here + //Slippery components don't transfer due to callbacks + qdel(O.GetComponent(/datum/component/slippery)) /datum/component/wet_floor/PostTransfer() if(!isopenturf(parent)) return COMPONENT_INCOMPATIBLE var/turf/T = parent T.add_overlay(current_overlay) + //Make sure to add/update any slippery component on the new turf (update_flags calls LoadComponent) + update_flags() + + //NB it's possible we get deleted after this, due to inherit /datum/component/wet_floor/proc/add_wet(type, duration_minimum = 0, duration_add = 0, duration_maximum = MAXIMUM_WET_TIME, _permanent = FALSE) var/static/list/allowed_types = list(TURF_WET_WATER, TURF_WET_LUBE, TURF_WET_ICE, TURF_WET_PERMAFROST) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index f0fb7f6095..cfbd8be32c 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -94,10 +94,23 @@ TOXIN:[M.getToxLoss()] OXY:[M.getOxyLoss()] CLONE:[M.getCloneLoss()] - BRAIN:[M.getBrainLoss()] + BRAIN:[M.getOrganLoss(ORGAN_SLOT_BRAIN)] STAMINA:[M.getStaminaLoss()] AROUSAL:[M.getArousalLoss()] - + "} + if(GLOB.Debug2) + atomsnowflake += {" + HEART:[M.getOrganLoss(ORGAN_SLOT_HEART)] + LIVER:[M.getOrganLoss(ORGAN_SLOT_LIVER)] + LUNGS:[M.getOrganLoss(ORGAN_SLOT_LUNGS)] + EYES:[M.getOrganLoss(ORGAN_SLOT_EYES)] + EARS:[M.getOrganLoss(ORGAN_SLOT_EARS)] + STOMACH:[M.getOrganLoss(ORGAN_SLOT_STOMACH)] + TONGUE:[M.getOrganLoss(ORGAN_SLOT_TONGUE)] + APPENDIX:[M.getOrganLoss(ORGAN_SLOT_APPENDIX)] + "} + atomsnowflake += {" + "} else atomsnowflake += "[D]" @@ -1334,8 +1347,8 @@ L.adjustOxyLoss(amount) newamt = L.getOxyLoss() if("brain") - L.adjustBrainLoss(amount) - newamt = L.getBrainLoss() + L.adjustOrganLoss(ORGAN_SLOT_BRAIN, amount) + newamt = L.getOrganLoss(ORGAN_SLOT_BRAIN) if("clone") L.adjustCloneLoss(amount) newamt = L.getCloneLoss() @@ -1345,6 +1358,30 @@ if("arousal") L.adjustArousalLoss(amount) newamt = L.getArousalLoss() + if("heart") + L.adjustOrganLoss(ORGAN_SLOT_HEART, amount) + newamt = L.getOrganLoss(ORGAN_SLOT_HEART) + if("liver") + L.adjustOrganLoss(ORGAN_SLOT_LIVER, amount) + newamt = L.getOrganLoss(ORGAN_SLOT_LIVER) + if("lungs") + L.adjustOrganLoss(ORGAN_SLOT_LUNGS, amount) + newamt = L.getOrganLoss(ORGAN_SLOT_LUNGS) + if("eye_sight") + L.adjustOrganLoss(ORGAN_SLOT_EYES, amount) + newamt = L.getOrganLoss(ORGAN_SLOT_EYES) + if("ears") + L.adjustOrganLoss(ORGAN_SLOT_EARS, amount) + newamt = L.getOrganLoss(ORGAN_SLOT_EARS) + if("stomach") + L.adjustOrganLoss(ORGAN_SLOT_STOMACH, amount) + newamt = L.getOrganLoss(ORGAN_SLOT_STOMACH) + if("tongue") + L.adjustOrganLoss(ORGAN_SLOT_TONGUE, amount) + newamt = L.getOrganLoss(ORGAN_SLOT_TONGUE) + if("appendix") + L.adjustOrganLoss(ORGAN_SLOT_APPENDIX, amount) + newamt = L.getOrganLoss(ORGAN_SLOT_APPENDIX) else to_chat(usr, "You caused an error. DEBUG: Text:[Text] Mob:[L]") return @@ -1360,4 +1397,4 @@ return var/mob/living/carbon/human/H = locate(href_list["copyoutfit"]) in GLOB.carbon_list if(istype(H)) - H.copy_outfit() \ No newline at end of file + H.copy_outfit() diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index e1432bf9a6..c125a9b7c7 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -144,3 +144,9 @@ if(!((locate(thing) in bodyparts) || (locate(thing) in internal_organs))) return FALSE return ..() + +/mob/living/proc/CanSpreadAirborneDisease() + return !is_mouth_covered() + +/mob/living/carbon/CanSpreadAirborneDisease() + return !((head && (head.flags_cover & HEADCOVERSMOUTH) && (head.armor.getRating("bio") >= 25)) || (wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH) && (wear_mask.armor.getRating("bio") >= 25))) \ No newline at end of file diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index 0af4eea8ac..8a6966666e 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -55,6 +55,13 @@ D.after_add() infectee.med_hud_set_status() + var/turf/source_turf = get_turf(infectee) + log_virus("[key_name(infectee)] was infected by virus: [src.admin_details()] at [loc_name(source_turf)]") + +//Return a string for admin logging uses, should describe the disease in detail +/datum/disease/proc/admin_details() + return "[src.name] : [src.type]" + /datum/disease/proc/stage_act() var/cure = has_cure() @@ -65,15 +72,17 @@ if(!cure) if(prob(stage_prob)) - stage = min(stage + 1,max_stages) + update_stage(min(stage + 1,max_stages)) else if(prob(cure_chance)) - stage = max(stage - 1, 1) + update_stage(max(stage - 1, 1)) if(disease_flags & CURABLE) if(cure && prob(cure_chance)) cure() +/datum/disease/proc/update_stage(new_stage) + stage = new_stage /datum/disease/proc/has_cure() if(!(disease_flags & CURABLE)) diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index a4a4936f0e..8d5e915b31 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -31,9 +31,9 @@ var/id = "" var/processing = FALSE var/mutable = TRUE //set to FALSE to prevent most in-game methods of altering the disease via virology - var/oldres + var/oldres //To prevent setting new cures unless resistance changes. - // The order goes from easy to cure to hard to cure. + // The order goes from easy to cure to hard to cure. Keep in mind that sentient diseases pick two cures from tier 6 and up, ensure they wont react away in bodies. var/static/list/advance_cures = list( list( // level 1 "copper", "silver", "iodine", "iron", "carbon" @@ -110,15 +110,22 @@ return if(symptoms && symptoms.len) - if(!processing) processing = TRUE for(var/datum/symptom/S in symptoms) - S.Start(src) + if(S.Start(src)) //this will return FALSE if the symptom is neutered + S.next_activation = world.time + rand(S.symptom_delay_min * 10, S.symptom_delay_max * 10) + S.on_stage_change(src) for(var/datum/symptom/S in symptoms) S.Activate(src) +// Tell symptoms stage changed +/datum/disease/advance/update_stage(new_stage) + ..() + for(var/datum/symptom/S in symptoms) + S.on_stage_change(src) + // Compares type then ID. /datum/disease/advance/IsSame(datum/disease/advance/D) @@ -138,9 +145,18 @@ A.properties = properties.Copy() A.id = id A.mutable = mutable + A.oldres = oldres //this is a new disease starting over at stage 1, so processing is not copied return A +//Describe this disease to an admin in detail (for logging) +/datum/disease/advance/admin_details() + var/list/name_symptoms = list() + for(var/datum/symptom/S in symptoms) + name_symptoms += S.name + return "[name] sym:[english_list(name_symptoms)] r:[totalResistance()] s:[totalStealth()] ss:[totalStageSpeed()] t:[totalTransmittable()]" + + /* NEW PROCS @@ -191,6 +207,10 @@ /datum/disease/advance/proc/Refresh(new_name = FALSE) GenerateProperties() AssignProperties() + if(processing && symptoms && symptoms.len) + for(var/datum/symptom/S in symptoms) + S.Start(src) + S.on_stage_change(src) id = null var/the_id = GetDiseaseID() @@ -342,28 +362,28 @@ return id -// Add a symptom, if it is over the limit (with a small chance to be able to go over) -// we take a random symptom away and add the new one. +// Add a symptom, if it is over the limit we take a random symptom away and add the new one. /datum/disease/advance/proc/AddSymptom(datum/symptom/S) if(HasSymptom(S)) return - if(symptoms.len < (VIRUS_SYMPTOM_LIMIT - 1) + rand(-1, 1)) - symptoms += S - else + if(!(symptoms.len < (VIRUS_SYMPTOM_LIMIT - 1) + rand(-1, 1))) RemoveSymptom(pick(symptoms)) - symptoms += S + symptoms += S + S.OnAdd(src) // Simply removes the symptom. /datum/disease/advance/proc/RemoveSymptom(datum/symptom/S) symptoms -= S + S.OnRemove(src) // Neuter a symptom, so it will only affect stats /datum/disease/advance/proc/NeuterSymptom(datum/symptom/S) if(!S.neutered) S.neutered = TRUE S.name += " (neutered)" + S.OnRemove(src) /* @@ -417,7 +437,7 @@ var/i = VIRUS_SYMPTOM_LIMIT - var/datum/disease/advance/D = new(0, null) + var/datum/disease/advance/D = new() D.symptoms = list() var/list/symptoms = list() @@ -445,9 +465,6 @@ D.AssignName(new_name) D.Refresh() - for(var/datum/disease/advance/AD in SSdisease.active_diseases) - AD.Refresh() - for(var/mob/living/carbon/human/H in shuffle(GLOB.alive_mob_list)) if(!is_station_level(H.z)) continue @@ -458,8 +475,8 @@ var/list/name_symptoms = list() for(var/datum/symptom/S in D.symptoms) name_symptoms += S.name - message_admins("[key_name_admin(user)] has triggered a custom virus outbreak of [D.name]! It has these symptoms: [english_list(name_symptoms)]") - + message_admins("[key_name_admin(user)] has triggered a custom virus outbreak of [D.admin_details()]") + log_virus("[key_name(user)] has triggered a custom virus outbreak of [D.admin_details()]!") /datum/disease/advance/proc/totalStageSpeed() return properties["stage_rate"] diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/advance/symptoms/choking.dm index 81cdad8042..a54b132de1 100644 --- a/code/datums/diseases/advance/symptoms/choking.dm +++ b/code/datums/diseases/advance/symptoms/choking.dm @@ -144,5 +144,5 @@ Bonus /datum/symptom/asphyxiation/proc/Asphyxiate_death(mob/living/M, datum/disease/advance/A) var/get_damage = rand(25,35) * power M.adjustOxyLoss(get_damage) - M.adjustBrainLoss(get_damage/2) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, get_damage/2) return 1 diff --git a/code/datums/diseases/advance/symptoms/confusion.dm b/code/datums/diseases/advance/symptoms/confusion.dm index e7315c6bb1..260c6888d7 100644 --- a/code/datums/diseases/advance/symptoms/confusion.dm +++ b/code/datums/diseases/advance/symptoms/confusion.dm @@ -55,7 +55,7 @@ Bonus to_chat(M, "You can't think straight!") M.confused = min(100 * power, M.confused + 8) if(brain_damage) - M.adjustBrainLoss(3 * power, 80) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3 * power, 80) M.updatehealth() return diff --git a/code/datums/diseases/advance/symptoms/cough.dm b/code/datums/diseases/advance/symptoms/cough.dm index 83d93c55e0..e4283101f5 100644 --- a/code/datums/diseases/advance/symptoms/cough.dm +++ b/code/datums/diseases/advance/symptoms/cough.dm @@ -70,6 +70,6 @@ BONUS addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 6) addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 12) addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 18) - if(infective) + if(infective && M.CanSpreadAirborneDisease()) A.spread(1) diff --git a/code/datums/diseases/advance/symptoms/deafness.dm b/code/datums/diseases/advance/symptoms/deafness.dm index cc388f0b59..3718104b48 100644 --- a/code/datums/diseases/advance/symptoms/deafness.dm +++ b/code/datums/diseases/advance/symptoms/deafness.dm @@ -50,9 +50,9 @@ Bonus if(5) if(power > 2) var/obj/item/organ/ears/ears = M.getorganslot(ORGAN_SLOT_EARS) - if(istype(ears) && ears.ear_damage < UNHEALING_EAR_DAMAGE) + if(istype(ears) && ears.damage < ears.maxHealth) to_chat(M, "Your ears pop painfully and start bleeding!") - ears.ear_damage = max(ears.ear_damage, UNHEALING_EAR_DAMAGE) + ears.damage = max(ears.damage, ears.maxHealth) M.emote("scream") else to_chat(M, "Your ears pop and begin ringing loudly!") diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index e666c7acd6..1ab3456c22 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -219,8 +219,10 @@ level = 8 passive_message = "The pain from your wounds makes you feel oddly sleepy..." var/deathgasp = FALSE + var/stabilize = FALSE var/active_coma = FALSE //to prevent multiple coma procs threshold_desc = "Stealth 2: Host appears to die when falling into a coma.
\ + Resistance 4: The virus also stabilizes the host while they are in critical condition.
\ Stage Speed 7: Increases healing speed." /datum/symptom/heal/coma/Start(datum/disease/advance/A) @@ -228,9 +230,25 @@ return if(A.properties["stage_rate"] >= 7) power = 1.5 + if(A.properties["resistance"] >= 4) + stabilize = TRUE if(A.properties["stealth"] >= 2) deathgasp = TRUE +/datum/symptom/heal/coma/on_stage_change(datum/disease/advance/A) //mostly copy+pasted from the code for self-respiration's TRAIT_NOBREATH stuff + if(!..()) + return FALSE + if(A.stage >= 4 && stabilize) + ADD_TRAIT(A.affected_mob, TRAIT_NOCRITDAMAGE, DISEASE_TRAIT) + else + REMOVE_TRAIT(A.affected_mob, TRAIT_NOCRITDAMAGE, DISEASE_TRAIT) + return TRUE + +/datum/symptom/heal/coma/End(datum/disease/advance/A) + if(!..()) + return + REMOVE_TRAIT(A.affected_mob, TRAIT_NOCRITDAMAGE, DISEASE_TRAIT) + /datum/symptom/heal/coma/CanHeal(datum/disease/advance/A) var/mob/living/M = A.affected_mob if(HAS_TRAIT(M, TRAIT_DEATHCOMA)) diff --git a/code/datums/diseases/advance/symptoms/oxygen.dm b/code/datums/diseases/advance/symptoms/oxygen.dm index cb7d1a6d6d..65f8307101 100644 --- a/code/datums/diseases/advance/symptoms/oxygen.dm +++ b/code/datums/diseases/advance/symptoms/oxygen.dm @@ -50,3 +50,19 @@ Bonus if(prob(base_message_chance)) to_chat(M, "[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")]") return + +/datum/symptom/oxygen/on_stage_change(datum/disease/advance/A) + if(!..()) + return FALSE + var/mob/living/carbon/M = A.affected_mob + if(A.stage >= 4) + ADD_TRAIT(M, TRAIT_NOBREATH, DISEASE_TRAIT) + else + REMOVE_TRAIT(M, TRAIT_NOBREATH, DISEASE_TRAIT) + return TRUE + +/datum/symptom/oxygen/End(datum/disease/advance/A) + if(!..()) + return + if(A.stage >= 4) + REMOVE_TRAIT(A.affected_mob, TRAIT_NOBREATH, DISEASE_TRAIT) \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm index 8d7cc5ed70..2705e0b168 100644 --- a/code/datums/diseases/advance/symptoms/sensory.dm +++ b/code/datums/diseases/advance/symptoms/sensory.dm @@ -51,7 +51,7 @@ M.hallucination = max(0, M.hallucination - 10) if(A.stage >= 5) - M.adjustBrainLoss(-3) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -3) if(trauma_heal_mild && iscarbon(M)) var/mob/living/carbon/C = M if(prob(10)) @@ -100,8 +100,8 @@ else if(M.eye_blind || M.eye_blurry) M.set_blindness(0) M.set_blurriness(0) - else if(eyes.eye_damage > 0) - M.adjust_eye_damage(-1) + else if(eyes.damage > 0) + eyes.applyOrganDamage(-1) else if(prob(base_message_chance)) - to_chat(M, "[pick("Your eyes feel great.","You feel like your eyes can focus more clearly.", "You don't feel the need to blink.","Your ears feel great.","Your healing feels more acute.")]") \ No newline at end of file + to_chat(M, "[pick("Your eyes feel great.","You feel like your eyes can focus more clearly.", "You don't feel the need to blink.","Your ears feel great.","Your healing feels more acute.")]") diff --git a/code/datums/diseases/advance/symptoms/sneeze.dm b/code/datums/diseases/advance/symptoms/sneeze.dm index 8fe70c542f..5e21fb3dd9 100644 --- a/code/datums/diseases/advance/symptoms/sneeze.dm +++ b/code/datums/diseases/advance/symptoms/sneeze.dm @@ -48,4 +48,5 @@ Bonus M.emote("sniff") else M.emote("sneeze") - A.spread(4 + power) \ No newline at end of file + if(M.CanSpreadAirborneDisease()) //don't spread germs if they covered their mouth + A.spread(4 + power) \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/species.dm b/code/datums/diseases/advance/symptoms/species.dm index d0c32f3244..a8b18ae735 100644 --- a/code/datums/diseases/advance/symptoms/species.dm +++ b/code/datums/diseases/advance/symptoms/species.dm @@ -8,12 +8,14 @@ level = 5 severity = 0 -/datum/symptom/undead_adaptation/Start(datum/disease/advance/A) - if(!..()) - return +/datum/symptom/undead_adaptation/OnAdd(datum/disease/advance/A) A.process_dead = TRUE A.infectable_biotypes |= MOB_UNDEAD +/datum/symptom/undead_adaptation/OnRemove(datum/disease/advance/A) + A.process_dead = FALSE + A.infectable_biotypes -= MOB_UNDEAD + /datum/symptom/inorganic_adaptation name = "Inorganic Biology" desc = "The virus can survive and replicate even in an inorganic environment, increasing its resistance and infection rate." @@ -24,7 +26,8 @@ level = 5 severity = 0 -/datum/symptom/inorganic_adaptation/Start(datum/disease/advance/A) - if(!..()) - return - A.infectable_biotypes |= MOB_INORGANIC \ No newline at end of file +/datum/symptom/inorganic_adaptation/OnAdd(datum/disease/advance/A) + A.infectable_biotypes |= MOB_INORGANIC + +/datum/symptom/inorganic_adaptation/OnRemove(datum/disease/advance/A) + A.infectable_biotypes -= MOB_INORGANIC \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/symptoms.dm b/code/datums/diseases/advance/symptoms/symptoms.dm index e42b68cc05..99dbd397a2 100644 --- a/code/datums/diseases/advance/symptoms/symptoms.dm +++ b/code/datums/diseases/advance/symptoms/symptoms.dm @@ -38,11 +38,10 @@ return CRASH("We couldn't assign an ID!") -// Called when processing of the advance disease, which holds this symptom, starts. +// Called when processing of the advance disease that holds this symptom infects a host and upon each Refresh() of that advance disease. /datum/symptom/proc/Start(datum/disease/advance/A) if(neutered) return FALSE - next_activation = world.time + rand(symptom_delay_min * 10, symptom_delay_max * 10) //so it doesn't instantly activate on infection return TRUE // Called when the advance disease is going to be deleted or when the advance disease stops processing. @@ -60,6 +59,11 @@ next_activation = world.time + rand(symptom_delay_min * 10, symptom_delay_max * 10) return TRUE +/datum/symptom/proc/on_stage_change(datum/disease/advance/A) + if(neutered) + return FALSE + return TRUE + /datum/symptom/proc/Copy() var/datum/symptom/new_symp = new type new_symp.name = name @@ -69,3 +73,9 @@ /datum/symptom/proc/generate_threshold_desc() return + +/datum/symptom/proc/OnAdd(datum/disease/advance/A) //Overload when a symptom needs to be active before processing, like changing biotypes. + return + +/datum/symptom/proc/OnRemove(datum/disease/advance/A) //But dont forget to remove them too. + return \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/advance/symptoms/vision.dm index d1cc6905a6..b4a33cb837 100644 --- a/code/datums/diseases/advance/symptoms/vision.dm +++ b/code/datums/diseases/advance/symptoms/vision.dm @@ -45,7 +45,7 @@ Bonus return var/mob/living/carbon/M = A.affected_mob var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES) - if(istype(eyes)) + if(eyes) switch(A.stage) if(1, 2) if(prob(base_message_chance) && !suppress_warning) @@ -53,20 +53,20 @@ Bonus if(3, 4) to_chat(M, "Your eyes burn!") M.blur_eyes(10) - M.adjust_eye_damage(1) + eyes.applyOrganDamage(1) else M.blur_eyes(20) - M.adjust_eye_damage(5) - if(eyes.eye_damage >= 10) + eyes.applyOrganDamage(5) + if(eyes.damage >= 10) M.become_nearsighted(EYE_DAMAGE) - if(prob(eyes.eye_damage - 10 + 1)) + if(prob(eyes.damage - 10 + 1)) if(!remove_eyes) if(!HAS_TRAIT(M, TRAIT_BLIND)) to_chat(M, "You go blind!") - M.become_blind(EYE_DAMAGE) + eyes.applyOrganDamage(eyes.maxHealth) else M.visible_message("[M]'s eyes fall off their sockets!", "Your eyes fall off their sockets!") eyes.Remove(M) eyes.forceMove(get_turf(M)) else - to_chat(M, "Your eyes burn horrifically!") \ No newline at end of file + to_chat(M, "Your eyes burn horrifically!") diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm index 5708447542..be7e6ceecd 100644 --- a/code/datums/diseases/appendicitis.dm +++ b/code/datums/diseases/appendicitis.dm @@ -27,8 +27,10 @@ A.update_icon() if(prob(3)) to_chat(affected_mob, "You feel a stabbing pain in your abdomen!") + affected_mob.adjustOrganLoss(ORGAN_SLOT_APPENDIX, 5) affected_mob.Stun(rand(40,60)) affected_mob.adjustToxLoss(1) if(3) if(prob(1)) affected_mob.vomit(95) + affected_mob.adjustOrganLoss(ORGAN_SLOT_APPENDIX, 15) diff --git a/code/datums/diseases/brainrot.dm b/code/datums/diseases/brainrot.dm index 0a34501763..98ae74270b 100644 --- a/code/datums/diseases/brainrot.dm +++ b/code/datums/diseases/brainrot.dm @@ -24,7 +24,7 @@ if(prob(2)) to_chat(affected_mob, "You don't feel like yourself.") if(prob(5)) - affected_mob.adjustBrainLoss(1, 170) + affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1, 170) affected_mob.updatehealth() if(3) if(prob(2)) @@ -32,7 +32,7 @@ if(prob(2)) affected_mob.emote("drool") if(prob(10)) - affected_mob.adjustBrainLoss(2, 170) + affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2, 170) affected_mob.updatehealth() if(prob(2)) to_chat(affected_mob, "Your try to remember something important...but can't.") @@ -43,7 +43,7 @@ if(prob(2)) affected_mob.emote("drool") if(prob(15)) - affected_mob.adjustBrainLoss(3, 170) + affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3, 170) affected_mob.updatehealth() if(prob(2)) to_chat(affected_mob, "Strange buzzing fills your head, removing all thoughts.") diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index b295f5f10b..083a1f9c6c 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -67,7 +67,7 @@ if(affected_mob.mind) affected_mob.mind.transfer_to(new_mob) else - new_mob.key = affected_mob.key + affected_mob.transfer_ckey(new_mob) new_mob.name = affected_mob.real_name new_mob.real_name = new_mob.name @@ -82,7 +82,7 @@ to_chat(affected_mob, "Your mob has been taken over by a ghost! Appeal your job ban if you want to avoid this in the future!") message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(affected_mob)]) to replace a jobbaned player.") affected_mob.ghostize(0) - affected_mob.key = C.key + C.transfer_ckey(affected_mob) else to_chat(new_mob, "Your mob has been claimed by death! Appeal your job ban if you want to avoid this in the future!") new_mob.death() diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 33e92e4de5..8a3fd82cb9 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -42,8 +42,8 @@ destination.dna.unique_enzymes = unique_enzymes destination.dna.uni_identity = uni_identity destination.dna.blood_type = blood_type - destination.set_species(species.type, icon_update=0) destination.dna.features = features.Copy() + destination.set_species(species.type, icon_update=0) destination.dna.real_name = real_name destination.dna.nameless = nameless destination.dna.custom_species = custom_species diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index 71545476ff..c7644997ee 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -79,7 +79,7 @@ "[A] kicks your head, knocking you out!") playsound(get_turf(A), 'sound/weapons/genhit1.ogg', 50, 1, -1) D.SetSleeping(300) - D.adjustBrainLoss(15, 150) + D.adjustOrganLoss(ORGAN_SLOT_BRAIN, 15, 150) return TRUE /datum/martial_art/cqc/proc/Pressure(mob/living/carbon/human/A, mob/living/carbon/human/D) diff --git a/code/datums/martial/psychotic_brawl.dm b/code/datums/martial/psychotic_brawl.dm index 8f1a33a8b3..34301516dc 100644 --- a/code/datums/martial/psychotic_brawl.dm +++ b/code/datums/martial/psychotic_brawl.dm @@ -46,7 +46,7 @@ D.apply_damage(rand(5,10), BRUTE, BODY_ZONE_HEAD) A.apply_damage(rand(5,10), BRUTE, BODY_ZONE_HEAD) if(!istype(D.head,/obj/item/clothing/head/helmet/) && !istype(D.head,/obj/item/clothing/head/hardhat)) - D.adjustBrainLoss(5) + D.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5) A.Stun(rand(10,45)) D.Knockdown(rand(5,30))//CIT CHANGE - makes stuns from martial arts always use Knockdown instead of Stun for the sake of consistency if(5,6) diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index e205d7a435..801e8c8c7a 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -224,7 +224,7 @@ H.visible_message("[user] delivers a heavy hit to [H]'s head, knocking [H.p_them()] out cold!", \ "[user] knocks you unconscious!") H.SetSleeping(600) - H.adjustBrainLoss(15, 150) + H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 15, 150) else return ..() diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 8e61801e15..68efe93254 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -19,9 +19,9 @@ - IMPORTANT NOTE 2, if you want a player to become a ghost, use mob.ghostize() It does all the hard work for you. - When creating a new mob which will be a new IC character (e.g. putting a shade in a construct or randomly selecting - a ghost to become a xeno during an event). Simply assign the key or ckey like you've always done. + a ghost to become a xeno during an event), use this mob proc. - new_mob.key = key + mob.transfer_ckey(new_mob) The Login proc will handle making a new mind for that mobtype (including setting up stuff like mind.name). Simple! However if you want that mind to have any special properties like being a traitor etc you will have to do that @@ -89,6 +89,7 @@ return language_holder /datum/mind/proc/transfer_to(mob/new_character, var/force_key_move = 0) + var/old_character = current if(current) // remove ourself from our old body's mind variable current.mind = null SStgui.on_transfer(current, new_character) @@ -99,7 +100,7 @@ if(key) if(new_character.key != key) //if we're transferring into a body with a key associated which is not ours - new_character.ghostize(1) //we'll need to ghostize so that key isn't mobless. + new_character.ghostize(TRUE, TRUE) //we'll need to ghostize so that key isn't mobless. else key = new_character.key @@ -123,6 +124,7 @@ 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 + SEND_SIGNAL(src, COMSIG_MIND_TRANSFER, new_character, old_character) //CIT CHANGE - makes arousal update when transfering bodies if(isliving(new_character)) //New humans and such are by default enabled arousal. Let's always use the new mind's prefs. diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index 69f1a66814..f747c563ad 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -169,3 +169,10 @@ /datum/mood_event/sad_empath/add_effects(mob/sadtarget) description = "[sadtarget.name] seems upset...\n" + +/datum/mood_event/revenant_blight + description = "Just give up, honk...\n" + mood_change = -5 + +/datum/mood_event/revenant_blight/add_effects() + description = "Just give up, [pick("no one will miss you", "there is nothing you can do to help", "even a clown would be more useful than you", "does it even matter in the end?")]...\n" diff --git a/code/datums/mutable_appearance.dm b/code/datums/mutable_appearance.dm index 1b095c555d..31023b3fc7 100644 --- a/code/datums/mutable_appearance.dm +++ b/code/datums/mutable_appearance.dm @@ -10,10 +10,11 @@ // And yes this does have to be in the constructor, BYOND ignores it if you set it as a normal var // Helper similar to image() -/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, plane = FLOAT_PLANE) +/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, plane = FLOAT_PLANE, color = "#FFFFFF") var/mutable_appearance/MA = new() MA.icon = icon MA.icon_state = icon_state MA.layer = layer MA.plane = plane + MA.color = color return MA diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm index 68165af956..8386b59d97 100755 --- a/code/datums/outfit.dm +++ b/code/datums/outfit.dm @@ -112,7 +112,7 @@ H.update_action_buttons_icon() if(implants) for(var/implant_type in implants) - var/obj/item/implant/I = new implant_type(H) + var/obj/item/implant/I = new implant_type I.implant(H, null, TRUE) H.update_body() diff --git a/code/datums/radiation_wave.dm b/code/datums/radiation_wave.dm index 5fb777f9c5..6118428547 100644 --- a/code/datums/radiation_wave.dm +++ b/code/datums/radiation_wave.dm @@ -103,7 +103,6 @@ /obj/structure/cable, /obj/machinery/atmospherics, /obj/item/ammo_casing, - /obj/item/implant, /obj/singularity )) if(!can_contaminate || blacklisted[thing.type]) diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm index 9762426608..34a676603e 100644 --- a/code/datums/ruins/space.dm +++ b/code/datums/ruins/space.dm @@ -282,6 +282,11 @@ name = "Ancient Cloning Lab" description = "An experimental cloning lab snapped off from an ancient ship. The cloner model inside lacks many modern functionalities and security measures." +/datum/map_template/ruin/space/hilbertresearchfacility + id = "hilbert_facility" + suffix = "hilbertshoteltestingsite.dmm" + name = "Hilbert Research Facility" + description = "A research facility of great bluespace discoveries. Long since abandoned, willingly or not..." /datum/map_template/ruin/space/augmentation id = "augmentationfacility" suffix = "augmentationfacility.dmm" diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm index e6147297df..e6d80bedb5 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -177,8 +177,8 @@ /datum/map_template/shuttle/emergency/airless suffix = "airless" name = "Build your own shuttle kit" - description = "Save money by building your own shuttle! The chassis will dock upon purchase, but launch will have to be authorized as usual via shuttle call. Interior and atmosphere not included." - admin_notes = "No brig, no medical facilities, no air." + description = "Save money by building your own shuttle! The chassis will dock upon purchase, but launch will have to be authorized as usual via shuttle call. Interior and lighting not included." + admin_notes = "No brig, no medical facilities, just an empty box." credit_cost = -7500 /datum/map_template/shuttle/emergency/airless/prerequisites_met() @@ -222,9 +222,9 @@ /datum/map_template/shuttle/emergency/luxury suffix = "luxury" name = "Luxury Shuttle" - description = "A luxurious golden shuttle complete with an indoor swimming pool. Each crewmember wishing to board must bring 500 credits, payable in cash and mineral coin." - admin_notes = "Due to the limited space for non paying crew, this shuttle may cause a riot." - credit_cost = 10000 + description = "A luxurious golden shuttle complete with an indoor swimming pool. Entry is free, so long as you can afford the initial cost." + admin_notes = "Fancy, and very roomy!" + credit_cost = 17500 /datum/map_template/shuttle/emergency/discoinferno suffix = "discoinferno" @@ -300,7 +300,7 @@ suffix = "syndicate" name = "Syndicate GM Battlecruiser" credit_cost = 20000 - description = "Manufactured by the Gorlex Marauders, this cruiser has been specially designed with high occupancy in mind, while remaining robust in combat situations. Features a fully stocked EVA storage, armory, medbay, and bar!" + description = "(Emag only) Manufactured by the Gorlex Marauders, this cruiser has been specially designed with high occupancy in mind, while remaining robust in combat situations. Features a fully stocked EVA storage, armory, medbay, and bar!" admin_notes = "An emag exclusive, stocked with syndicate equipment and turrets that will target any simplemob." /datum/map_template/shuttle/emergency/syndicate/prerequisites_met() @@ -333,7 +333,7 @@ /datum/map_template/shuttle/emergency/supermatter suffix = "supermatter" name = "Hyperfractal Gigashuttle" - description = "\"I dunno, this seems kinda needlessly complicated.\"\n\ + description = "(Emag only) \"I dunno, this seems kinda needlessly complicated.\"\n\ \"This shuttle has very a very high safety record, according to CentCom Officer Cadet Yins.\"\n\ \"Are you sure?\"\n\ \"Yes, it has a safety record of N-A-N, which is apparently larger than 100%.\"" @@ -341,7 +341,12 @@ Outside of admin intervention, it cannot explode. \ It does, however, still dust anything on contact, emits high levels of radiation, and induce hallucinations in anyone looking at it without protective goggles. \ Emitters spawn powered on, expect admin notices, they are harmless." - credit_cost = 100000 + credit_cost = 15000 + +/datum/map_template/shuttle/emergency/supermatter/prerequisites_met() + if("emagged" in SSshuttle.shuttle_purchase_requirements_met) + return TRUE + return FALSE /datum/map_template/shuttle/emergency/imfedupwiththisworld suffix = "imfedupwiththisworld" @@ -372,6 +377,12 @@ description = "On the smaller size with a modern design, this shuttle is for the crew who like the cosier things, while still being able to stretch their legs." credit_cost = 1000 +/datum/map_template/shuttle/emergency/gorilla + suffix = "gorilla" + name = "Gorilla Cargo Freighter" + description = "A rustic, barely excuseable shuttle transporting important cargo. Not for crew who are about to go ape." + credit_cost = 2000 + /datum/map_template/shuttle/ferry/base suffix = "base" name = "transport ferry" diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 336945f622..563d06ca57 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -521,7 +521,7 @@ itemUser.adjustToxLoss(-1.5, forced = TRUE) //Because Slime People are people too itemUser.adjustOxyLoss(-1.5) itemUser.adjustStaminaLoss(-1.5) - itemUser.adjustBrainLoss(-1.5) + itemUser.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1.5) itemUser.adjustCloneLoss(-0.5) //Becasue apparently clone damage is the bastion of all health //Heal all those around you, unbiased for(var/mob/living/L in view(7, owner)) @@ -533,7 +533,7 @@ L.adjustToxLoss(-3.5, forced = TRUE) //Because Slime People are people too L.adjustOxyLoss(-3.5) L.adjustStaminaLoss(-3.5) - L.adjustBrainLoss(-3.5) + L.adjustOrganLoss(ORGAN_SLOT_BRAIN, -3.5) L.adjustCloneLoss(-1) //Becasue apparently clone damage is the bastion of all health else if(issilicon(L)) L.adjustBruteLoss(-3.5) diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index e930c77c36..186c988595 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -80,6 +80,36 @@ desc = "You've fallen asleep. Wait a bit and you should wake up. Unless you don't, considering how helpless you are." icon_state = "asleep" +//TASER +/datum/status_effect/electrode + id = "tased" + blocks_combatmode = TRUE + status_type = STATUS_EFFECT_REPLACE + alert_type = null + +/datum/status_effect/electrode/on_creation(mob/living/new_owner, set_duration) + if(isnum(set_duration)) + duration = set_duration + . = ..() + if(iscarbon(owner)) + var/mob/living/carbon/C = owner + if(C.combatmode) + C.toggle_combat_mode(TRUE) + C.add_movespeed_modifier(MOVESPEED_ID_TASED_STATUS, TRUE, override = TRUE, multiplicative_slowdown = 8) + +/datum/status_effect/electrode/on_remove() + if(iscarbon(owner)) + var/mob/living/carbon/C = owner + C.remove_movespeed_modifier(MOVESPEED_ID_TASED_STATUS) + . = ..() + +/datum/status_effect/electrode/tick() + if(owner) + owner.adjustStaminaLoss(5) //if you really want to try to stamcrit someone with a taser alone, you can, but it'll take time and good timing. + +/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 2 + //OTHER DEBUFFS /datum/status_effect/his_wrath //does minor damage over time unless holding His Grace id = "his_wrath" @@ -259,9 +289,9 @@ status_type = STATUS_EFFECT_REPLACE alert_type = null var/mutable_appearance/marked_underlay - var/obj/item/twohanded/required/kinetic_crusher/hammer_synced + var/obj/item/twohanded/kinetic_crusher/hammer_synced -/datum/status_effect/crusher_mark/on_creation(mob/living/new_owner, obj/item/twohanded/required/kinetic_crusher/new_hammer_synced) +/datum/status_effect/crusher_mark/on_creation(mob/living/new_owner, obj/item/twohanded/kinetic_crusher/new_hammer_synced) . = ..() if(.) hammer_synced = new_hammer_synced @@ -358,19 +388,20 @@ else new /obj/effect/temp_visual/bleed(get_turf(owner)) -/mob/living/proc/apply_necropolis_curse(set_curse) +/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) if(!set_curse) set_curse = pick(CURSE_BLINDING, CURSE_SPAWNING, CURSE_WASTING, CURSE_GRASPING) if(QDELETED(C)) - apply_status_effect(STATUS_EFFECT_NECROPOLIS_CURSE, set_curse) + apply_status_effect(STATUS_EFFECT_NECROPOLIS_CURSE, set_curse, duration) + else C.apply_curse(set_curse) - C.duration += 3000 //additional curses add 5 minutes + C.duration += duration * 0.5 //additional curses add half their duration /datum/status_effect/necropolis_curse id = "necrocurse" - duration = 6000 //you're cursed for 10 minutes have fun + duration = 10 MINUTES //you're cursed for 10 minutes have fun tick_interval = 50 alert_type = null var/curse_flags = NONE @@ -378,7 +409,9 @@ var/effect_cooldown = 100 var/obj/effect/temp_visual/curse/wasting_effect = new -/datum/status_effect/necropolis_curse/on_creation(mob/living/new_owner, set_curse) +/datum/status_effect/necropolis_curse/on_creation(mob/living/new_owner, set_curse, _duration) + if(_duration) + duration = _duration . = ..() if(.) apply_curse(set_curse) diff --git a/code/datums/status_effects/gas.dm b/code/datums/status_effects/gas.dm index dfe0a1d94e..0041799314 100644 --- a/code/datums/status_effects/gas.dm +++ b/code/datums/status_effects/gas.dm @@ -5,7 +5,6 @@ alert_type = /obj/screen/alert/status_effect/freon var/icon/cube var/can_melt = TRUE - var/datum/weakref/redirect_component /obj/screen/alert/status_effect/freon name = "Frozen Solid" @@ -13,7 +12,7 @@ icon_state = "frozen" /datum/status_effect/freon/on_apply() - redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) + RegisterSignal(owner, COMSIG_LIVING_RESIST, .proc/owner_resist) if(!owner.stat) to_chat(owner, "You become frozen in a cube!") cube = icon('icons/effects/freeze.dmi', "ice_cube") @@ -40,8 +39,7 @@ owner.cut_overlay(cube) owner.adjust_bodytemperature(100) owner.update_canmove() - qdel(redirect_component.resolve()) - redirect_component = null + UnregisterSignal(owner, COMSIG_LIVING_RESIST) /datum/status_effect/freon/watcher duration = 8 diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm index c8bcd831e2..bc1cfba112 100644 --- a/code/datums/status_effects/status_effect.dm +++ b/code/datums/status_effects/status_effect.dm @@ -11,6 +11,7 @@ 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 var/alert_type = /obj/screen/alert/status_effect //the alert thrown by the status effect, contains name and description + var/blocks_combatmode //Does this status effect prevent the user from toggling combat mode? var/obj/screen/alert/status_effect/linked_alert = null //the alert itself, if it exists /datum/status_effect/New(list/arguments) diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm index dffdc92630..80a5f24250 100644 --- a/code/datums/traits/good.dm +++ b/code/datums/traits/good.dm @@ -16,13 +16,13 @@ mood_quirk = TRUE /datum/quirk/apathetic/add() - GET_COMPONENT_FROM(mood, /datum/component/mood, quirk_holder) + var/datum/component/mood/mood = quirk_holder.GetComponent(/datum/component/mood) if(mood) mood.mood_modifier = 0.8 /datum/quirk/apathetic/remove() if(quirk_holder) - GET_COMPONENT_FROM(mood, /datum/component/mood, quirk_holder) + var/datum/component/mood/mood = quirk_holder.GetComponent(/datum/component/mood) if(mood) mood.mood_modifier = 1 //Change this once/if species get their own mood modifiers. diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index f77fe37333..178e1aaeb0 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -119,7 +119,7 @@ medical_record_text = "Patient has a tumor in their brain that is slowly driving them to brain death." /datum/quirk/brainproblems/on_process() - quirk_holder.adjustBrainLoss(0.2) + quirk_holder.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.2) /datum/quirk/nearsighted //t. errorage name = "Nearsighted" @@ -345,16 +345,19 @@ gain_text = "You find yourself unable to speak!" lose_text = "You feel a growing strength in your vocal chords." medical_record_text = "Functionally mute, patient is unable to use their voice in any capacity." + var/datum/brain_trauma/severe/mute/mute /datum/quirk/mute/add() var/mob/living/carbon/human/H = quirk_holder - H.gain_trauma(TRAIT_MUTE, TRAUMA_RESILIENCE_SURGERY) + mute = new + H.gain_trauma(mute, TRAUMA_RESILIENCE_SURGERY) /datum/quirk/mute/on_process() if(quirk_holder.mind && LAZYLEN(quirk_holder.mind.antag_datums)) to_chat(quirk_holder, "Your antagonistic nature has caused your voice to be heard.") qdel(src) + /datum/quirk/unstable name = "Unstable" desc = "Due to past troubles, you are unable to recover your sanity if you lose it. Be very careful managing your mood!" @@ -363,3 +366,21 @@ gain_text = "There's a lot on your mind right now." lose_text = "Your mind finally feels calm." medical_record_text = "Patient's mind is in a vulnerable state, and cannot recover from traumatic events." + +/datum/quirk/blindness + name = "Blind" + desc = "You are completely blind, nothing can counteract this." + value = -4 + gain_text = "You can't see anything." + lose_text = "You miraculously gain back your vision." + medical_record_text = "Subject has permanent blindness." + +/datum/quirk/blindness/add() + quirk_holder.become_blind(ROUNDSTART_TRAIT) + +/datum/quirk/blindness/on_spawn() + var/mob/living/carbon/human/H = quirk_holder + var/obj/item/clothing/glasses/sunglasses/blindfold/white/glasses = new(get_turf(H)) + if(!H.equip_to_slot_if_possible(glasses, SLOT_GLASSES, bypass_equip_delay_self = TRUE)) //if you can't put it on the user's eyes, put it in their hands, otherwise put it on their eyes eyes + H.put_in_hands(glasses) + H.regenerate_icons() diff --git a/code/datums/weather/weather_types/radiation_storm.dm b/code/datums/weather/weather_types/radiation_storm.dm index f3b8118087..6765cdf2cd 100644 --- a/code/datums/weather/weather_types/radiation_storm.dm +++ b/code/datums/weather/weather_types/radiation_storm.dm @@ -18,7 +18,7 @@ area_type = /area protected_areas = list(/area/maintenance, /area/ai_monitored/turret_protected/ai_upload, /area/ai_monitored/turret_protected/ai_upload_foyer, - /area/ai_monitored/turret_protected/ai, /area/storage/emergency/starboard, /area/storage/emergency/port, /area/shuttle) + /area/ai_monitored/turret_protected/ai, /area/storage/emergency/starboard, /area/storage/emergency/port, /area/shuttle, /area/security/prison) target_trait = ZTRAIT_STATION immunity_type = "rad" diff --git a/code/game/area/Space_Station_13_areas.dm b/code/game/area/Space_Station_13_areas.dm index 8a40fc8b56..798cd9c026 100644 --- a/code/game/area/Space_Station_13_areas.dm +++ b/code/game/area/Space_Station_13_areas.dm @@ -339,6 +339,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/crew_quarters/heads/captain name = "Captain's Office" icon_state = "captain" + clockwork_warp_allowed = FALSE /area/crew_quarters/heads/captain/private name = "Captain's Quarters" diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 6665e4d59b..2a47d6d015 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -36,6 +36,12 @@ var/rad_flags = NONE // Will move to flags_1 when i can be arsed to var/rad_insulation = RAD_NO_INSULATION + var/icon/blood_splatter_icon + var/list/fingerprints + var/list/fingerprintshidden + var/list/blood_DNA + var/list/suit_fibers + /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() @@ -220,7 +226,7 @@ return FALSE /atom/proc/CheckExit() - return 1 + return TRUE /atom/proc/HasProximity(atom/movable/AM as mob|obj) return @@ -235,6 +241,11 @@ SEND_SIGNAL(src, COMSIG_ATOM_BULLET_ACT, P, def_zone) . = P.on_hit(src, 0, def_zone) +//used on altdisarm() for special interactions between the shoved victim (target) and the src, with user being the one shoving the target on it. +// IMPORTANT: if you wish to add a new own shove_act() to a certain object, remember to add SHOVABLE_ONTO to its obj_flags bitfied var first. +/atom/proc/shove_act(mob/living/target, mob/living/user) + return FALSE + /atom/proc/in_contents_of(container)//can take class or object instance as argument if(ispath(container)) if(istype(src.loc, container)) @@ -249,14 +260,26 @@ if(article) . = "[article] [src]" override[EXAMINE_POSITION_ARTICLE] = article + + var/should_override = FALSE + if(SEND_SIGNAL(src, COMSIG_ATOM_GET_EXAMINE_NAME, user, override) & COMPONENT_EXNAME_CHANGED) + should_override = TRUE + + + if(blood_DNA && !istype(src, /obj/effect/decal)) + override[EXAMINE_POSITION_BEFORE] = " blood-stained " + should_override = TRUE + + if(should_override) . = override.Join("") +///Generate the full examine string of this atom (including icon for goonchat) /atom/proc/get_examine_string(mob/user, thats = FALSE) . = "[icon2html(src, user)] [thats? "That's ":""][get_examine_name(user)]" /atom/proc/examine(mob/user) - to_chat(user, get_examine_string(user, TRUE)) + to_chat(user, "[get_examine_string(user, TRUE)].") if(desc) to_chat(user, desc) @@ -321,12 +344,14 @@ //returns the mob's dna info as a list, to be inserted in an object's blood_DNA list /mob/living/proc/get_blood_dna_list() - if(get_blood_id() != "blood") + var/blood_id = get_blood_id() + if(!(blood_id =="blood" || blood_id == "jellyblood")) return return list("ANIMAL DNA" = "Y-") /mob/living/carbon/get_blood_dna_list() - if(get_blood_id() != "blood") + var/blood_id = get_blood_id() + if(!(blood_id =="blood" || blood_id == "jellyblood")) return var/list/blood_dna = list() if(dna) @@ -344,18 +369,116 @@ var/new_blood_dna = L.get_blood_dna_list() if(!new_blood_dna) return FALSE - var/old_length = blood_DNA_length() - add_blood_DNA(new_blood_dna) - if(blood_DNA_length() == old_length) + 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 + if(blood_DNA.len == old_length) return FALSE return TRUE +//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 + //some new blood DNA was added + //to add blood from a mob onto something, and transfer their dna info /atom/proc/add_mob_blood(mob/living/M) var/list/blood_dna = M.get_blood_dna_list() if(!blood_dna) return FALSE - return add_blood_DNA(blood_dna) + return add_blood_DNA(blood_dna, M.diseases) + +//to add blood onto something, with blood dna info to include. +/atom/proc/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) + return FALSE + +/obj/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) + return transfer_blood_dna(blood_dna, diseases) + +/obj/item/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) + . = ..() + if(!.) + return + add_blood_overlay() + +/obj/item/proc/add_blood_overlay() + if(!blood_DNA.len) + return + if(initial(icon) && initial(icon_state)) + blood_splatter_icon = icon(initial(icon), initial(icon_state), , 1) //we only want to apply blood-splatters to the initial icon_state for each object + blood_splatter_icon.Blend("#fff", ICON_ADD) //fills the icon_state with white (except where it's transparent) + blood_splatter_icon.Blend(icon('icons/effects/blood.dmi', "itemblood"), ICON_MULTIPLY) //adds blood and the remaining white areas become transparant + blood_splatter_icon.Blend(blood_DNA_to_color(), ICON_MULTIPLY) + add_overlay(blood_splatter_icon) + +/obj/item/clothing/gloves/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) + . = ..() + transfer_blood = rand(2, 4) + +/turf/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) + var/obj/effect/decal/cleanable/blood/splatter/B = locate() in src + if(!B) + B = new /obj/effect/decal/cleanable/blood/splatter(src, diseases) + B.transfer_blood_dna(blood_dna, diseases) //give blood info to the blood decal. + return TRUE //we bloodied the floor + +/mob/living/carbon/human/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) + if(head) + head.add_blood_DNA(blood_dna, diseases) + update_inv_head() + else if(wear_mask) + wear_mask.add_blood_DNA(blood_dna, diseases) + update_inv_wear_mask() + if(wear_neck) + wear_neck.add_blood_DNA(blood_dna, diseases) + update_inv_neck() + if(wear_suit) + wear_suit.add_blood_DNA(blood_dna, diseases) + update_inv_wear_suit() + else if(w_uniform) + w_uniform.add_blood_DNA(blood_dna, diseases) + update_inv_w_uniform() + if(gloves) + var/obj/item/clothing/gloves/G = gloves + G.add_blood_DNA(blood_dna, diseases) + else + transfer_blood_dna(blood_dna, diseases) + bloody_hands = rand(2, 4) + update_inv_gloves() //handles bloody hands overlays and updating + 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 + +/atom/proc/clean_blood() + if(islist(blood_DNA)) + blood_DNA = null + return TRUE /atom/proc/wash_cream() return TRUE @@ -405,7 +528,7 @@ /atom/proc/component_storage_contents_dump_act(datum/component/storage/src_object, mob/user) var/list/things = src_object.contents() var/datum/progressbar/progress = new(user, things.len, src) - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) while (do_after(user, 10, TRUE, src, FALSE, CALLBACK(STR, /datum/component/storage.proc/handle_mass_item_insertion, things, src_object, user, progress))) stoplag(1) qdel(progress) @@ -709,4 +832,4 @@ Proc for attack log creation, because really why not if(filter_data[name]) filter_data -= name update_filters() - return TRUE + return TRUE \ No newline at end of file diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 83762240bc..2732b3dc82 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -518,6 +518,8 @@ TT.thrower = thrower TT.diagonals_first = diagonals_first TT.callback = callback + if(!QDELETED(thrower)) + TT.target_zone = thrower.zone_selected var/dist_x = abs(target.x - src.x) var/dist_y = abs(target.y - src.y) diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 8506a4133a..65a7c6a954 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -18,7 +18,7 @@ /datum/atom_hud/data /datum/atom_hud/data/human/medical - hud_icons = list(STATUS_HUD, HEALTH_HUD, NANITE_HUD) + hud_icons = list(STATUS_HUD, HEALTH_HUD, NANITE_HUD, RAD_HUD) /datum/atom_hud/data/human/medical/basic @@ -162,6 +162,7 @@ holder.icon_state = "hud[RoundHealth(src)]" var/icon/I = icon(icon, icon_state, dir) holder.pixel_y = I.Height() - world.icon_size + med_hud_set_radstatus() //for carbon suit sensors /mob/living/carbon/med_hud_set_health() @@ -211,6 +212,22 @@ holder.icon_state = "hudhealthy" +/mob/living/proc/med_hud_set_radstatus() + var/image/radholder = hud_list[RAD_HUD] + var/icon/I = icon(icon, icon_state, dir) + radholder.pixel_y = I.Height() - world.icon_size + var/mob/living/M = src + var/rads = M.radiation + switch(rads) + if(-INFINITY to RAD_MOB_SAFE) + radholder.icon_state = "hudradsafe" + if((RAD_MOB_SAFE+1) to RAD_MOB_MUTATE) + radholder.icon_state = "hudraddanger" + if((RAD_MOB_MUTATE+1) to RAD_MOB_VOMIT) + radholder.icon_state = "hudradlethal" + if((RAD_MOB_VOMIT+1) to INFINITY) + radholder.icon_state = "hudradnuke" + /*********************************************** Security HUDs! Basic mode shows only the job. ************************************************/ diff --git a/code/game/gamemodes/clown_ops/clown_weapons.dm b/code/game/gamemodes/clown_ops/clown_weapons.dm index 9d1a3b650c..46cef7df63 100644 --- a/code/game/gamemodes/clown_ops/clown_weapons.dm +++ b/code/game/gamemodes/clown_ops/clown_weapons.dm @@ -39,12 +39,12 @@ /obj/item/clothing/shoes/clown_shoes/banana_shoes/combat/Initialize() . = ..() - GET_COMPONENT(bananium, /datum/component/material_container) + var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container) bananium.insert_amount(max_recharge, MAT_BANANIUM) START_PROCESSING(SSobj, src) /obj/item/clothing/shoes/clown_shoes/banana_shoes/combat/process() - GET_COMPONENT(bananium, /datum/component/material_container) + var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container) var/bananium_amount = bananium.amount(MAT_BANANIUM) if(bananium_amount < max_recharge) bananium.insert_amount(min(recharge_rate, max_recharge - bananium_amount), MAT_BANANIUM) @@ -73,19 +73,19 @@ /obj/item/melee/transforming/energy/sword/bananium/Initialize() . = ..() AddComponent(/datum/component/slippery, 60, GALOSHES_DONT_HELP) - GET_COMPONENT(slipper, /datum/component/slippery) + var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery) slipper.signal_enabled = active /obj/item/melee/transforming/energy/sword/bananium/attack(mob/living/M, mob/living/user) ..() if(active) - GET_COMPONENT(slipper, /datum/component/slippery) + var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery) slipper.Slip(M) /obj/item/melee/transforming/energy/sword/bananium/throw_impact(atom/hit_atom, throwingdatum) . = ..() if(active) - GET_COMPONENT(slipper, /datum/component/slippery) + var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery) slipper.Slip(hit_atom) /obj/item/melee/transforming/energy/sword/bananium/attackby(obj/item/I, mob/living/user, params) @@ -98,7 +98,7 @@ /obj/item/melee/transforming/energy/sword/bananium/transform_weapon(mob/living/user, supress_message_text) ..() - GET_COMPONENT(slipper, /datum/component/slippery) + var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery) slipper.signal_enabled = active /obj/item/melee/transforming/energy/sword/bananium/ignition_effect(atom/A, mob/user) @@ -108,7 +108,7 @@ if(!active) transform_weapon(user, TRUE) user.visible_message("[user] is [pick("slitting [user.p_their()] stomach open with", "falling on")] [src]! It looks like [user.p_theyre()] trying to commit seppuku, but the blade slips off of [user.p_them()] harmlessly!") - GET_COMPONENT(slipper, /datum/component/slippery) + var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery) slipper.Slip(user) return SHAME @@ -130,12 +130,12 @@ /obj/item/shield/energy/bananium/Initialize() . = ..() AddComponent(/datum/component/slippery, 60, GALOSHES_DONT_HELP) - GET_COMPONENT(slipper, /datum/component/slippery) + var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery) slipper.signal_enabled = active /obj/item/shield/energy/bananium/attack_self(mob/living/carbon/human/user) ..() - GET_COMPONENT(slipper, /datum/component/slippery) + var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery) slipper.signal_enabled = active /obj/item/shield/energy/bananium/throw_at(atom/target, range, speed, mob/thrower, spin=1) @@ -149,7 +149,7 @@ if(active) var/caught = hit_atom.hitby(src, 0, 0) if(iscarbon(hit_atom) && !caught)//if they are a carbon and they didn't catch it - GET_COMPONENT(slipper, /datum/component/slippery) + var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery) slipper.Slip(hit_atom) if(thrownby && !caught) throw_at(thrownby, throw_range+2, throw_speed, null, 1) diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm index ab4ac4d5c6..24cfddd14f 100644 --- a/code/game/gamemodes/dynamic/dynamic.dm +++ b/code/game/gamemodes/dynamic/dynamic.dm @@ -107,6 +107,11 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) /// If a only ruleset has been executed. var/only_ruleset_executed = FALSE +/datum/game_mode/dynamic/New() // i have NO IDEA if this is the proper way to do this. + ..() + pop_per_requirement = CONFIG_GET(number/dynamic_pop_per_requirement) + GLOB.dynamic_high_pop_limit = CONFIG_GET(number/dynamic_high_pop_limit) + /datum/game_mode/dynamic/admin_panel() var/list/dat = list("Game Mode Panel

Game Mode Panel

") dat += "Dynamic Mode \[VV\]
" @@ -290,7 +295,6 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) var/midround_injection_cooldown_middle = 0.5*(GLOB.dynamic_midround_delay_max + GLOB.dynamic_midround_delay_min) midround_injection_cooldown = round(CLAMP(EXP_DISTRIBUTION(midround_injection_cooldown_middle), GLOB.dynamic_midround_delay_min, GLOB.dynamic_midround_delay_max)) + world.time - message_admins("Dynamic Mode initialized with a Threat Level of... [threat_level]!") log_game("DYNAMIC: Dynamic Mode initialized with a Threat Level of... [threat_level]!") return TRUE @@ -420,7 +424,6 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) return FALSE starting_rule = pickweight(drafted_rules) - message_admins("Picking a [istype(starting_rule, /datum/dynamic_ruleset/roundstart/delayed/) ? " delayed " : ""] ruleset [starting_rule.name]") log_game("DYNAMIC: Picking a [istype(starting_rule, /datum/dynamic_ruleset/roundstart/delayed/) ? " delayed " : ""] ruleset [starting_rule.name]") roundstart_rules -= starting_rule diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets.dm b/code/game/gamemodes/dynamic/dynamic_rulesets.dm index 66afcbfb92..011b6ec251 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets.dm @@ -3,6 +3,8 @@ var/name = "" /// For admin logging and round end screen, do not change this unless making a new rule type. var/ruletype = "" + /// For config purposes, similar to config_tag for secret game modes. + var/config_tag = null /// If set to TRUE, the rule won't be discarded after being executed, and dynamic will call rule_process() every time it ticks. var/persistent = FALSE /// If set to TRUE, dynamic mode will be able to draft this ruleset again later on. (doesn't apply for roundstart rules) @@ -65,7 +67,18 @@ restricted_roles += protected_roles if(CONFIG_GET(flag/protect_assistant_from_antagonist)) restricted_roles += "Assistant" - + var/weights = CONFIG_GET(keyed_list/dynamic_weight) + var/costs = CONFIG_GET(keyed_list/dynamic_cost) + var/requirementses = CONFIG_GET(keyed_list/dynamic_requirements) // can't damn well use requirements + var/high_population_requirements = CONFIG_GET(keyed_list/dynamic_high_population_requirement) + if(config_tag in weights) + weight = weights[config_tag] + if(config_tag in costs) + cost = costs[config_tag] + if(config_tag in requirementses) + requirements = requirementses[config_tag] + if(config_tag in high_population_requirements) + high_population_requirement = high_population_requirements[config_tag] if (istype(SSticker.mode, /datum/game_mode/dynamic)) mode = SSticker.mode else if (GLOB.master_mode != "dynamic") // This is here to make roundstart forced ruleset function. diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm index 24b4c67357..fde020a3ae 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm @@ -52,6 +52,7 @@ /datum/dynamic_ruleset/latejoin/infiltrator name = "Syndicate Infiltrator" + config_tag = "latejoin_traitor" antag_datum = /datum/antagonist/traitor antag_flag = ROLE_TRAITOR restricted_roles = list("AI", "Cyborg") @@ -72,6 +73,7 @@ /datum/dynamic_ruleset/latejoin/provocateur name = "Provocateur" + config_tag = "latejoin_revolution" antag_datum = /datum/antagonist/rev/head antag_flag = ROLE_REV_HEAD antag_flag_override = ROLE_REV diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm index 2acef4f06b..56b6e57c4d 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm @@ -8,7 +8,7 @@ ruletype = "Midround" /// If the ruleset should be restricted from ghost roles. var/restrict_ghost_roles = TRUE - /// What type the ruleset is restricted to. + /// What type the ruleset is restricted to. var/required_type = /mob/living/carbon/human var/list/living_players = list() var/list/living_antags = list() @@ -101,7 +101,7 @@ log_game("DYNAMIC: Polling [possible_volunteers.len] players to apply for the [name] ruleset.") candidates = pollGhostCandidates("The mode is looking for volunteers to become [antag_flag] for [name]", antag_flag, SSticker.mode, antag_flag, poll_time = 300) - + if(!candidates || candidates.len <= 0) message_admins("The ruleset [name] received no applications.") log_game("DYNAMIC: The ruleset [name] received no applications.") @@ -169,6 +169,7 @@ /datum/dynamic_ruleset/midround/autotraitor name = "Syndicate Sleeper Agent" + config_tag = "midround_traitor" antag_datum = /datum/antagonist/traitor antag_flag = ROLE_TRAITOR restricted_roles = list("AI", "Cyborg", "Positronic Brain") @@ -194,7 +195,7 @@ ..() for(var/mob/living/player in living_players) if(issilicon(player)) // Your assigned role doesn't change when you are turned into a silicon. - living_players -= player + living_players -= player continue if(is_centcom_level(player.z)) living_players -= player // We don't autotator people in CentCom @@ -224,6 +225,7 @@ /datum/dynamic_ruleset/midround/malf name = "Malfunctioning AI" + config_tag = "malf_ai" antag_datum = /datum/antagonist/traitor antag_flag = ROLE_MALF enemy_roles = list("Security Officer", "Warden","Detective","Head of Security", "Captain", "Scientist", "Chemist", "Research Director", "Chief Engineer") @@ -276,6 +278,7 @@ /datum/dynamic_ruleset/midround/from_ghosts/wizard name = "Wizard" + config_tag = "midround_wizard" antag_datum = /datum/antagonist/wizard antag_flag = ROLE_WIZARD enemy_roles = list("Security Officer","Detective","Head of Security", "Captain") @@ -308,6 +311,7 @@ /datum/dynamic_ruleset/midround/from_ghosts/nuclear name = "Nuclear Assault" + config_tag = "midround_nuclear" antag_flag = ROLE_OPERATIVE antag_datum = /datum/antagonist/nukeop enemy_roles = list("AI", "Cyborg", "Security Officer", "Warden","Detective","Head of Security", "Captain") @@ -351,6 +355,7 @@ /datum/dynamic_ruleset/midround/from_ghosts/blob name = "Blob" + config_tag = "blob" antag_datum = /datum/antagonist/blob antag_flag = ROLE_BLOB enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain") @@ -374,6 +379,7 @@ /datum/dynamic_ruleset/midround/from_ghosts/xenomorph name = "Alien Infestation" + config_tag = "xenos" antag_datum = /datum/antagonist/xeno antag_flag = ROLE_ALIEN enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain") @@ -407,7 +413,7 @@ /datum/dynamic_ruleset/midround/from_ghosts/xenomorph/generate_ruleset_body(mob/applicant) var/obj/vent = pick_n_take(vents) var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc) - new_xeno.key = applicant.key + applicant.transfer_ckey(new_xeno, FALSE) message_admins("[ADMIN_LOOKUPFLW(new_xeno)] has been made into an alien by the midround ruleset.") log_game("DYNAMIC: [key_name(new_xeno)] was spawned as an alien by the midround ruleset.") return new_xeno @@ -420,6 +426,7 @@ /datum/dynamic_ruleset/midround/from_ghosts/nightmare name = "Nightmare" + config_tag = "nightmare" antag_datum = /datum/antagonist/nightmare antag_flag = "Nightmare" antag_flag_override = ROLE_ALIEN diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm index 38ce6f68d0..6a9aefa996 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm @@ -7,6 +7,7 @@ /datum/dynamic_ruleset/roundstart/traitor name = "Traitors" + config_tag = "traitor" persistent = TRUE antag_flag = ROLE_TRAITOR antag_datum = /datum/antagonist/traitor/ @@ -48,6 +49,7 @@ /datum/dynamic_ruleset/roundstart/traitorbro name = "Blood Brothers" + config_tag = "traitorbro" antag_flag = ROLE_BROTHER antag_datum = /datum/antagonist/brother/ restricted_roles = list("AI", "Cyborg") @@ -100,6 +102,7 @@ /datum/dynamic_ruleset/roundstart/changeling name = "Changelings" + config_tag = "changeling" antag_flag = ROLE_CHANGELING antag_datum = /datum/antagonist/changeling restricted_roles = list("AI", "Cyborg") @@ -149,6 +152,7 @@ // Dynamic is a wonderful thing that adds wizards to every round and then adds even more wizards during the round. /datum/dynamic_ruleset/roundstart/wizard name = "Wizard" + config_tag = "wizard" antag_flag = ROLE_WIZARD antag_datum = /datum/antagonist/wizard minimum_required_age = 14 @@ -194,6 +198,7 @@ /datum/dynamic_ruleset/roundstart/bloodcult name = "Blood Cult" + config_tag = "cult" antag_flag = ROLE_CULTIST antag_datum = /datum/antagonist/cult minimum_required_age = 14 @@ -254,6 +259,7 @@ /datum/dynamic_ruleset/roundstart/nuclear name = "Nuclear Emergency" + config_tag = "nuclear" antag_flag = ROLE_OPERATIVE antag_datum = /datum/antagonist/nukeop var/datum/antagonist/antag_leader_datum = /datum/antagonist/nukeop/leader @@ -343,6 +349,7 @@ /datum/dynamic_ruleset/roundstart/delayed/revs name = "Revolution" + config_tag = "revolution" persistent = TRUE antag_flag = ROLE_REV_HEAD antag_flag_override = ROLE_REV @@ -433,6 +440,7 @@ /datum/dynamic_ruleset/roundstart/extended name = "Extended" + config_tag = "extended" antag_flag = null antag_datum = null restricted_roles = list() @@ -456,6 +464,7 @@ /datum/dynamic_ruleset/roundstart/clockcult name = "Clockcult" + config_tag = "clockwork_cult" antag_flag = ROLE_SERVANT_OF_RATVAR antag_datum = /datum/antagonist/clockcult restricted_roles = list("AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") @@ -559,6 +568,7 @@ /datum/dynamic_ruleset/roundstart/nuclear/clown_ops name = "Clown Ops" + config_tag = "clownops" antag_datum = /datum/antagonist/nukeop/clownop antag_leader_datum = /datum/antagonist/nukeop/leader/clownop requirements = list(101,101,101,101,101,101,101,101,101,101) @@ -584,6 +594,7 @@ /datum/dynamic_ruleset/roundstart/devil name = "Devil" + config_tag = "devil" antag_flag = ROLE_DEVIL antag_datum = /datum/antagonist/devil restricted_roles = list("Lawyer", "Curator", "Chaplain", "Head of Security", "Captain", "AI") @@ -642,6 +653,7 @@ /datum/dynamic_ruleset/roundstart/monkey name = "Monkey" + config_tag = "monkey" antag_flag = ROLE_MONKEY antag_datum = /datum/antagonist/monkey/leader restricted_roles = list("Cyborg", "AI") @@ -704,6 +716,7 @@ /datum/dynamic_ruleset/roundstart/meteor name = "Meteor" + config_tag = "meteor" persistent = TRUE required_candidates = 0 weight = 3 diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 426d23b4ab..58f551c648 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -317,7 +317,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event /obj/effect/meteor/meaty/xeno/ram_turf(turf/T) if(!isspaceturf(T)) - new /obj/effect/decal/cleanable/xenoblood(T) + new /obj/effect/decal/cleanable/blood/xeno(T) //Station buster Tunguska /obj/effect/meteor/tunguska diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 615d55a818..1767d468ec 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -155,9 +155,9 @@ var/obj/item/U = new uplink_type(H, H.key, tc) H.equip_to_slot_or_del(U, SLOT_IN_BACKPACK) - var/obj/item/implant/weapons_auth/W = new/obj/item/implant/weapons_auth(H) + var/obj/item/implant/weapons_auth/W = new W.implant(H) - var/obj/item/implant/explosive/E = new/obj/item/implant/explosive(H) + var/obj/item/implant/explosive/E = new E.implant(H) H.faction |= ROLE_SYNDICATE H.update_icons() diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 76ea855c77..513fea4360 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -88,17 +88,50 @@ return close_machine(target) -/obj/machinery/sleeper/attackby(obj/item/I, mob/user, params) - if(!state_open && !occupant) - if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-o", initial(icon_state), I)) - return +/obj/machinery/sleeper/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, "[initial(icon_state)]-o", initial(icon_state), I)) + return + return FALSE + +/obj/machinery/sleeper/wrench_act(mob/living/user, obj/item/I) + . = ..() if(default_change_direction_wrench(user, I)) - return + return TRUE + +/obj/machinery/sleeper/crowbar_act(mob/living/user, obj/item/I) + . = ..() if(default_pry_open(I)) - return + return TRUE if(default_deconstruction_crowbar(I)) + return TRUE + +/obj/machinery/sleeper/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() + +/obj/machinery/sleeper/AltClick(mob/user) + if(!user.canUseTopic(src, !issilicon(user))) return - return ..() + if(state_open) + close_machine() + else + open_machine() + +/obj/machinery/sleeper/examine(mob/user) + ..() + to_chat(user, "Alt-click [src] to [state_open ? "close" : "open"] it.") /obj/machinery/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.notcontained_state) @@ -146,7 +179,7 @@ data["occupant"]["toxLoss"] = mob_occupant.getToxLoss() data["occupant"]["fireLoss"] = mob_occupant.getFireLoss() data["occupant"]["cloneLoss"] = mob_occupant.getCloneLoss() - data["occupant"]["brainLoss"] = mob_occupant.getBrainLoss() + data["occupant"]["brainLoss"] = mob_occupant.getOrganLoss(ORGAN_SLOT_BRAIN) data["occupant"]["reagents"] = list() if(mob_occupant.reagents && mob_occupant.reagents.reagent_list.len) for(var/datum/reagent/R in mob_occupant.reagents.reagent_list) @@ -190,7 +223,7 @@ if(inject_chem(chem, usr)) . = TRUE if(scrambled_chems && prob(5)) - to_chat(usr, "Chem System Re-route detected, results may not be as expected!") + to_chat(usr, "Chemical system re-route detected, results may not be as expected!") /obj/machinery/sleeper/emag_act(mob/user) . = ..() diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index e5fd73228a..667c1f6054 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -186,6 +186,7 @@ Class Procs: if(isliving(A)) var/mob/living/L = A L.update_canmove() + SEND_SIGNAL(src, COMSIG_MACHINE_EJECT_OCCUPANT, occupant) occupant = null /obj/machinery/proc/can_be_occupant(atom/movable/am) @@ -498,6 +499,7 @@ Class Procs: /obj/machinery/Exited(atom/movable/AM, atom/newloc) . = ..() if (AM == occupant) + SEND_SIGNAL(src, COMSIG_MACHINE_EJECT_OCCUPANT, occupant) occupant = null /obj/machinery/proc/adjust_item_drop_location(atom/movable/AM) // Adjust item drop location to a 3x3 grid inside the tile, returns slot id from 0 to 8 @@ -566,6 +568,7 @@ Class Procs: updateUsrDialog() /obj/machinery/AltClick(mob/user) + . = ..() if(!user.canUseTopic(src, !issilicon(user)) || !is_operational()) return if(inserted_modify_id) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 5a54ccd5df..1c6e21491c 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -80,7 +80,7 @@ popup.open() /obj/machinery/autolathe/on_deconstruction() - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) materials.retrieve_all() /obj/machinery/autolathe/attackby(obj/item/O, mob/user, params) @@ -164,7 +164,7 @@ var/power = max(2000, (metal_cost+glass_cost)*multiplier/5) - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) if((materials.amount(MAT_METAL) >= metal_cost*multiplier*coeff) && (materials.amount(MAT_GLASS) >= glass_cost*multiplier*coeff)) busy = TRUE use_power(power) @@ -188,7 +188,7 @@ return /obj/machinery/autolathe/proc/make_item(power, metal_cost, glass_cost, multiplier, coeff, is_stack) - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) var/atom/A = drop_location() use_power(power) var/list/materials_used = list(MAT_METAL=metal_cost*coeff*multiplier, MAT_GLASS=glass_cost*coeff*multiplier) @@ -213,7 +213,7 @@ var/T = 0 for(var/obj/item/stock_parts/matter_bin/MB in component_parts) T += MB.rating*75000 - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) materials.max_amount = T T=1.2 for(var/obj/item/stock_parts/manipulator/M in component_parts) @@ -262,7 +262,7 @@ dat += "[D.name]" if(ispath(D.build_path, /obj/item/stack)) - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) var/max_multiplier = min(D.maxstack, D.materials[MAT_METAL] ?round(materials.amount(MAT_METAL)/D.materials[MAT_METAL]):INFINITY,D.materials[MAT_GLASS]?round(materials.amount(MAT_GLASS)/D.materials[MAT_GLASS]):INFINITY) if (max_multiplier>10 && !disabled) dat += " x10" @@ -294,7 +294,7 @@ dat += "[D.name]" if(ispath(D.build_path, /obj/item/stack)) - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) var/max_multiplier = min(D.maxstack, D.materials[MAT_METAL] ?round(materials.amount(MAT_METAL)/D.materials[MAT_METAL]):INFINITY,D.materials[MAT_GLASS]?round(materials.amount(MAT_GLASS)/D.materials[MAT_GLASS]):INFINITY) if (max_multiplier>10 && !disabled) dat += " x10" @@ -309,7 +309,7 @@ return dat /obj/machinery/autolathe/proc/materials_printout() - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) var/dat = "Total amount: [materials.total_amount] / [materials.max_amount] cm3
" for(var/mat_id in materials.materials) var/datum/material/M = materials.materials[mat_id] @@ -322,7 +322,7 @@ var/coeff = (ispath(D.build_path, /obj/item/stack) ? 1 : prod_coeff) - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) if(D.materials[MAT_METAL] && (materials.amount(MAT_METAL) < (D.materials[MAT_METAL] * coeff * amount))) return FALSE if(D.materials[MAT_GLASS] && (materials.amount(MAT_GLASS) < (D.materials[MAT_GLASS] * coeff * amount))) diff --git a/code/game/machinery/bloodbankgen.dm b/code/game/machinery/bloodbankgen.dm new file mode 100644 index 0000000000..c489f6c9c9 --- /dev/null +++ b/code/game/machinery/bloodbankgen.dm @@ -0,0 +1,361 @@ +/obj/machinery/bloodbankgen + name = "blood bank generator" + desc = "Generates universally applicable synthetics for all blood types. Add regular blood to convert." + icon = 'icons/obj/bloodbank.dmi' + icon_state = "bloodbank-off" + density = TRUE + use_power = IDLE_POWER_USE + idle_power_usage = 80 + circuit = /obj/item/circuitboard/machine/bloodbankgen + interaction_flags_machine = INTERACT_MACHINE_OPEN | INTERACT_MACHINE_ALLOW_SILICON + var/draining = FALSE + var/filling = FALSE + var/obj/item/reagent_containers/blood/bag = null + var/obj/item/reagent_containers/blood/outbag = null + var/bloodstored = 0 + var/maxbloodstored = 1000 + var/menustat = "menu" + var/efficiency = 0 + var/productivity = 0 + +/obj/machinery/bloodbankgen/Initialize() + . = ..() + create_reagents(1000) + update_icon() + +/obj/machinery/bloodbankgen/Destroy() + QDEL_NULL(bag) + QDEL_NULL(outbag) + return ..() + +/obj/machinery/bloodbankgen/contents_explosion(severity, target) + ..() + if(bag) + bag.ex_act(severity, target) + if(outbag) + outbag.ex_act(severity, target) + +/obj/machinery/bloodbankgen/handle_atom_del(atom/A) + ..() + if(A == bag) + bag = null + update_icon() + updateUsrDialog() + if(A == outbag) + outbag = null + update_icon() + updateUsrDialog() + +/obj/machinery/bloodbankgen/RefreshParts() + var/E = 0 + var/P = 0 + for(var/obj/item/stock_parts/manipulator/M in component_parts) + E += M.rating + efficiency = E + productivity = P + +/obj/machinery/bloodbankgen/update_icon() + cut_overlays() + if(is_operational()) + icon_state = "bloodbank-on" + + if(panel_open) + add_overlay("bloodbank-panel") + + if(src.bag) + add_overlay("bloodbag-input") + if(bag.reagents.total_volume) + var/mutable_appearance/filling_overlay = mutable_appearance(icon, "input-reagent") + + var/percent = round((bag.reagents.total_volume / bag.volume) * 100) + switch(percent) + if(0 to 9) + filling_overlay.icon_state = "input-reagent0" + if(10 to 24) + filling_overlay.icon_state = "input-reagent10" + if(25 to 49) + filling_overlay.icon_state = "input-reagent25" + if(50 to 74) + filling_overlay.icon_state = "input-reagent50" + if(75 to 79) + filling_overlay.icon_state = "input-reagent75" + if(80 to 90) + filling_overlay.icon_state = "input-reagent80" + if(91 to INFINITY) + filling_overlay.icon_state = "input-reagent100" + + filling_overlay.color = list(mix_color_from_reagents(bag.reagents.reagent_list)) + add_overlay(filling_overlay) + + if(src.outbag) + add_overlay("bloodbag-output") + if(outbag.reagents.total_volume) + var/mutable_appearance/filling_overlay = mutable_appearance(icon, "output-reagent") + + var/percent = round((outbag.reagents.total_volume / outbag.volume) * 100) + switch(percent) + if(0 to 9) + filling_overlay.icon_state = "output-reagent0" + if(10 to 24) + filling_overlay.icon_state = "output-reagent10" + if(25 to 49) + filling_overlay.icon_state = "output-reagent25" + if(50 to 74) + filling_overlay.icon_state = "output-reagent50" + if(75 to 79) + filling_overlay.icon_state = "output-reagent75" + if(80 to 90) + filling_overlay.icon_state = "output-reagent80" + if(91 to INFINITY) + filling_overlay.icon_state = "output-reagent100" + + filling_overlay.color = list(mix_color_from_reagents(outbag.reagents.reagent_list)) + add_overlay(filling_overlay) + return + +/obj/machinery/bloodbankgen/process() + if(!is_operational()) + return PROCESS_KILL + + bloodstored = reagents.total_volume + + var/transfer_amount = 20 + + if(draining) + if(reagents.total_volume >= reagents.maximum_volume) + draining = FALSE + return + + if(bag) + if(bag.reagents.total_volume) + var/datum/reagent/blood/B = bag.reagents.has_reagent("blood") + if(B) + var/amount = reagents.maximum_volume - reagents.total_volume //monitor the machine's internal storage + amount = min(amount, transfer_amount) + if(!amount) + draining = FALSE + updateUsrDialog() + visible_message("[src] beeps loudly.") + playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) + return + + if(bag.blood_type == "SY") //no infinite loops using synthetics. + reagents.add_reagent("syntheticblood", amount) + else + reagents.add_reagent("syntheticblood", (amount+(5*efficiency))) + + if(bag.reagents.total_volume >= amount) + bag.reagents.remove_reagent("blood", amount) + else + visible_message("[src] beeps loudly.") + playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) + draining = FALSE + + bag.update_icon() + update_icon() + updateUsrDialog() + else + draining = FALSE + updateUsrDialog() + return + + if(filling) + if(!reagents || !reagents.total_volume) + filling = FALSE //there ain't anything in the machine yo. + return + if(outbag && outbag.reagents.total_volume < outbag.reagents.maximum_volume) + var/amount = outbag.reagents.maximum_volume - outbag.reagents.total_volume //monitor the output bag's internal storage + amount = min(amount, transfer_amount) + if(!amount) + filling = FALSE + visible_message("[src] pings.") + playsound(loc, 'sound/machines/beep.ogg', 50, 1) + updateUsrDialog() + return + + reagents.trans_to(outbag, amount) + outbag.update_icon() + update_icon() + updateUsrDialog() + else + visible_message("[src] pings.") + playsound(loc, 'sound/machines/beep.ogg', 50, 1) + filling = FALSE + updateUsrDialog() + return + +/obj/machinery/bloodbankgen/attackby(obj/item/O, mob/user, params) + if(user.a_intent == INTENT_HARM) + return ..() + + if(default_deconstruction_screwdriver(user, "bloodbank-off", "bloodbank-off", O)) + if(bag) + var/obj/item/reagent_containers/blood/B = bag + B.forceMove(drop_location()) + bag = null + if(outbag) + var/obj/item/reagent_containers/blood/B = outbag + B.forceMove(drop_location()) + outbag = null + update_icon() + return + + if(default_deconstruction_crowbar(O)) + return + + if(istype(O, /obj/item/reagent_containers/blood)) + . = 1 //no afterattack + if(!panel_open) + if(bag && outbag) + to_chat(user, "This machine already has bags attached.") + + if(!bag && !outbag) + var/choice = alert(user, "Choose where to place [O]", "", "Input", "Cancel", "Output") + switch(choice) + if("Cancel") + return FALSE + if("Input") + attachinput(O, user) + if("Output") + attachoutput(O, user) + else if(!bag) + attachinput(O, user) + else if(!outbag) + attachoutput(O, user) + else + to_chat(user, "Close the maintenance panel first.") + return + + else + to_chat(user, "You cannot put this in [src]!") + +/obj/machinery/bloodbankgen/ui_interact(mob/user) + . = ..() + + if(!is_operational()) + return + + var/dat + switch(menustat) + if("noblood") + dat += "
You do not have enough blood product to create synthetics.
" + menustat = "menu" + if("complete") + dat += "
Operation complete.
" + menustat = "menu" + if("nobagspace") + dat += "
Not enough space left in container. Please replace receptical.
" + menustat = "menu" + + dat+= "
Current Synthetics stockpile: [reagents.total_volume] units.
" + + dat += "
Supply Bag
" + if(bag) + dat += "
Current Capacity: [bag.reagents.total_volume] of [bag.reagents.maximum_volume]" + if(bag.reagents && bag.reagents.total_volume) + dat += "
Drain" + + dat += "
Detach" + + + dat += "

Synthetics Bag
" + if(outbag) + dat += "
Current Capacity:[outbag.reagents.total_volume] of [outbag.reagents.maximum_volume]" + if(!(outbag.reagents.total_volume >= outbag.reagents.maximum_volume)) + dat += "
Fill" + dat += "
Detach" + + if(!bag && !outbag) + dat += "
No containers inside, please insert container.
" + + var/datum/browser/popup = new(user, "bloodbankgen", name, 350, 520) + popup.set_content(dat) + popup.open() + +/obj/machinery/bloodbankgen/proc/activateinput() + if(bag) + draining = TRUE + update_icon() + else + to_chat(usr, "There is no blood bag in the input slot.") + return + +/obj/machinery/bloodbankgen/proc/activateoutput() + if(outbag) + filling = TRUE + update_icon() + else + to_chat(usr, "There is no blood bag in the output slot.") + return + +/obj/machinery/bloodbankgen/proc/check_container_volume(list/reagents, multiplier = 1) + var/sum_reagents = 0 + for(var/R in reagents) + sum_reagents += reagents[R] + sum_reagents *= multiplier + + if(outbag.reagents.total_volume + sum_reagents > outbag.reagents.maximum_volume) + menustat = "nobagspace" + return FALSE + + return TRUE + +/obj/machinery/bloodbankgen/proc/detachinput() + if(bag) + bag.forceMove(drop_location()) + if(usr && Adjacent(usr) && !issiliconoradminghost(usr)) + usr.put_in_hands(bag) + bag = null + update_icon() + +/obj/machinery/bloodbankgen/proc/detachoutput() + if(outbag) + outbag.forceMove(drop_location()) + if(usr && Adjacent(usr) && !issiliconoradminghost(usr)) + usr.put_in_hands(outbag) + outbag = null + update_icon() + +/obj/machinery/bloodbankgen/proc/attachinput(obj/item/O, mob/user) + if(!bag) + if(!user.transferItemToLoc(O, src)) + return + bag = O + to_chat(user, "You add [O] to the machine's input slot.") + update_icon() + updateUsrDialog() + else + to_chat(user, "There is already something in this slot!") + +/obj/machinery/bloodbankgen/proc/attachoutput(obj/item/O, mob/user) + if(!outbag) + if(!user.transferItemToLoc(O, src)) + return + outbag = O + to_chat(user, "You add [O] to the machine's output slot.") + update_icon() + updateUsrDialog() + else + to_chat(user, "There is already something in this slot!") + +/obj/machinery/bloodbankgen/Topic(href, href_list) + if(..() || panel_open) + return + + usr.set_machine(src) + + if(href_list["activateinput"]) + activateinput() + updateUsrDialog() + + else if(href_list["detachinput"]) + detachinput() + updateUsrDialog() + + else if(href_list["activateoutput"]) + activateoutput() + updateUsrDialog() + + else if(href_list["detachoutput"]) + detachoutput() + updateUsrDialog() diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index a175558f74..89c5e56b71 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -175,11 +175,12 @@ //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") + ADD_TRAIT(H, TRAIT_STABLEHEART, CLONING_POD_TRAIT) + ADD_TRAIT(H, TRAIT_STABLELIVER, CLONING_POD_TRAIT) + ADD_TRAIT(H, TRAIT_EMOTEMUTE, CLONING_POD_TRAIT) + ADD_TRAIT(H, TRAIT_MUTE, CLONING_POD_TRAIT) + ADD_TRAIT(H, TRAIT_NOBREATH, CLONING_POD_TRAIT) + ADD_TRAIT(H, TRAIT_NOCRITDAMAGE, CLONING_POD_TRAIT) H.Unconscious(80) clonemind.transfer_to(H) @@ -241,13 +242,14 @@ var/obj/item/I = pick_n_take(unattached_flesh) if(isorgan(I)) var/obj/item/organ/O = I + O.organ_flags &= ~ORGAN_FROZEN O.Insert(mob_occupant) else if(isbodypart(I)) var/obj/item/bodypart/BP = I BP.attach_limb(mob_occupant) //Premature clones may have brain damage. - mob_occupant.adjustBrainLoss(-((speed_coeff / 2) * dmg_mult)) + mob_occupant.adjustOrganLoss(ORGAN_SLOT_BRAIN, -((speed_coeff / 2) * dmg_mult)) use_power(7500) //This might need tweaking. @@ -261,6 +263,7 @@ for(var/i in unattached_flesh) if(isorgan(i)) var/obj/item/organ/O = i + O.organ_flags &= ~ORGAN_FROZEN O.Insert(mob_occupant) else if(isbodypart(i)) var/obj/item/bodypart/BP = i @@ -346,6 +349,9 @@ if(mess) //Clean that mess and dump those gibs! for(var/obj/fl in unattached_flesh) fl.forceMove(T) + if(istype(fl, /obj/item/organ)) + var/obj/item/organ/O = fl + O.organ_flags &= ~ORGAN_FROZEN unattached_flesh.Cut() mess = FALSE new /obj/effect/gibspawner/generic(get_turf(src)) @@ -356,11 +362,12 @@ if(!mob_occupant) return - REMOVE_TRAIT(mob_occupant, TRAIT_STABLEHEART, "cloning") - REMOVE_TRAIT(mob_occupant, TRAIT_EMOTEMUTE, "cloning") - REMOVE_TRAIT(mob_occupant, TRAIT_MUTE, "cloning") - REMOVE_TRAIT(mob_occupant, TRAIT_NOCRITDAMAGE, "cloning") - REMOVE_TRAIT(mob_occupant, TRAIT_NOBREATH, "cloning") + REMOVE_TRAIT(mob_occupant, TRAIT_STABLEHEART, CLONING_POD_TRAIT) + REMOVE_TRAIT(mob_occupant, TRAIT_STABLELIVER, CLONING_POD_TRAIT) + REMOVE_TRAIT(mob_occupant, TRAIT_EMOTEMUTE, CLONING_POD_TRAIT) + REMOVE_TRAIT(mob_occupant, TRAIT_MUTE, CLONING_POD_TRAIT) + REMOVE_TRAIT(mob_occupant, TRAIT_NOCRITDAMAGE, CLONING_POD_TRAIT) + REMOVE_TRAIT(mob_occupant, TRAIT_NOBREATH, CLONING_POD_TRAIT) if(grab_ghost_when == CLONER_MATURE_CLONE) mob_occupant.grab_ghost() @@ -442,7 +449,7 @@ 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.setBrainLoss(CLONE_INITIAL_DAMAGE) + //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. @@ -458,8 +465,9 @@ for(var/o in H.internal_organs) var/obj/item/organ/organ = o - if(!istype(organ) || organ.vital) + if(!istype(organ) || (organ.organ_flags & ORGAN_VITAL)) continue + organ.organ_flags |= ORGAN_FROZEN organ.Remove(H, special=TRUE) organ.forceMove(src) unattached_flesh += organ diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 7dcd85d310..11935e2bfc 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -17,7 +17,7 @@ network += lowertext(i) /obj/machinery/computer/security/check_eye(mob/user) - if( (stat & (NOPOWER|BROKEN)) || user.incapacitated() || user.eye_blind ) + if(CHECK_BITFIELD(stat, NOPOWER|BROKEN) || is_blind(user) || !in_view_range(user, src) || !user.canUseTopic(src, !issilicon(user), FALSE)) user.unset_machine() return if(!(user in watchers)) @@ -30,14 +30,6 @@ if(!C.can_use()) user.unset_machine() return - if(!issilicon(user)) - if(!Adjacent(user)) - user.unset_machine() - return - else if(iscyborg(user)) - var/list/viewing = viewers(src) - if(!viewing.Find(user)) - user.unset_machine() /obj/machinery/computer/security/on_unset_machine(mob/user) watchers.Remove(user) @@ -97,36 +89,22 @@ user.unset_machine() playsound(src, 'sound/machines/terminal_off.ogg', 25, 0) return - if(C) - var/camera_fail = 0 - if(!C.can_use() || user.machine != src || user.eye_blind || user.incapacitated()) - camera_fail = 1 - else if(iscyborg(user)) - var/list/viewing = viewers(src) - if(!viewing.Find(user)) - camera_fail = 1 - else if(!issilicon(user)) - if(!Adjacent(user)) - camera_fail = 1 - - if(camera_fail) - user.unset_machine() - return 0 - - 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) - else + if(!C || !C.can_use() || CHECK_BITFIELD(stat, NOPOWER|BROKEN) || is_blind(user) || !in_view_range(user, src) || !user.canUseTopic(src, !issilicon(user), FALSE)) user.unset_machine() + return FALSE + + 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) //returns the list of cameras accessible from this computer /obj/machinery/computer/security/proc/get_available_cameras() diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 0cce853c49..886851a6a8 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -374,7 +374,6 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) else if((ACCESS_HOP in scan.access) && ((target_dept==1) || !target_dept)) region_access |= 1 - region_access |= 6 get_subordinates("Head of Personnel") if((ACCESS_HOS in scan.access) && ((target_dept==2) || !target_dept)) region_access |= 2 @@ -388,6 +387,9 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) if((ACCESS_CE in scan.access) && ((target_dept==5) || !target_dept)) region_access |= 5 get_subordinates("Chief Engineer") + if((ACCESS_QM in scan.access) && ((target_dept==6) || !target_dept)) + region_access |= 6 + get_subordinates("Quartermaster") if(region_access) authenticated = 1 else if ((!( authenticated ) && issilicon(usr)) && (!modify)) @@ -607,7 +609,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) typed_circuit.target_dept = target_dept else target_dept = typed_circuit.target_dept - var/list/dept_list = list("general","security","medical","science","engineering") + var/list/dept_list = list("civilian","security","medical","science","engineering","cargo") name = "[dept_list[target_dept]] department console" /obj/machinery/computer/card/minor/hos @@ -631,3 +633,9 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) icon_screen = "idce" light_color = LIGHT_COLOR_YELLOW + +/obj/machinery/computer/card/minor/qm + target_dept = 6 + icon_screen = "idqm" + + light_color = LIGHT_COLOR_ORANGE \ No newline at end of file diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 26f0d06ecb..5cbd2d8975 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -159,11 +159,11 @@ if(scanner && HasEfficientPod() && scanner.scan_level >= AUTOCLONING_MINIMAL_LEVEL) if(!autoprocess) - dat += "Autoprocess" + dat += "Autoclone" else - dat += "Stop autoprocess" + dat += "Stop autoclone" else - dat += "Autoprocess" + dat += "Autoclone" dat += "

Cloning Pod Status

" dat += "
[temp] 
" @@ -228,7 +228,7 @@ dat += "

[src.active_record.fields["name"]]

" dat += "Scan ID [src.active_record.fields["id"]] Clone
" - var/obj/item/implant/health/H = locate(src.active_record.fields["imp"]) + var/obj/item/implant/health/H = locate(active_record.fields["imp"]) if ((H) && (istype(H))) dat += "Health Implant Data:
[H.sensehealth()]

" diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index d4fe3e27a2..c912586ea3 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -575,7 +575,7 @@ if(user) if(message) if(authenticated) - if(user.canUseTopic(src, BE_CLOSE)) + if(user.canUseTopic(src, !issilicon(user))) if(!record1 || record1 == active1) if(!record2 || record2 == active2) return 1 diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm deleted file mode 100644 index a852612d9d..0000000000 --- a/code/game/machinery/computer/prisoner.dm +++ /dev/null @@ -1 +0,0 @@ -/obj/machinery/computer/prisoner diff --git a/code/game/machinery/computer/prisoner/management.dm b/code/game/machinery/computer/prisoner/management.dm index e231a1748a..653f6bf48b 100644 --- a/code/game/machinery/computer/prisoner/management.dm +++ b/code/game/machinery/computer/prisoner/management.dm @@ -35,11 +35,11 @@ dat += "
Chemical Implants
" var/turf/Tr = null for(var/obj/item/implant/chem/C in GLOB.tracked_chem_implants) - Tr = get_turf(C) - if((Tr) && (Tr.z != src.z)) - continue//Out of range if(!C.imp_in) continue + Tr = get_turf(C.imp_in) + if((Tr) && (Tr.z != src.z)) + continue//Out of range dat += "ID: [C.imp_in.name] | Remaining Units: [C.reagents.total_volume]
" dat += "| Inject: " dat += "((1))" @@ -48,9 +48,9 @@ dat += "********************************
" dat += "
Tracking Implants
" for(var/obj/item/implant/tracking/T in GLOB.tracked_implants) - if(!isliving(T.imp_in)) + if(!T.imp_in || !isliving(T.imp_in)) continue - Tr = get_turf(T) + Tr = get_turf(T.imp_in) if((Tr) && (Tr.z != src.z)) continue//Out of range diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 1823e34100..efb1039b8b 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -801,7 +801,7 @@ What a mess.*/ /obj/machinery/computer/secure_data/proc/canUseSecurityRecordsConsole(mob/user, message1 = 0, record1, record2) if(user) if(authenticated) - if(user.canUseTopic(src, BE_CLOSE)) + if(user.canUseTopic(src, !issilicon(user))) if(!trim(message1)) return 0 if(!record1 || record1 == active1) diff --git a/code/game/machinery/computer/telecrystalconsoles.dm b/code/game/machinery/computer/telecrystalconsoles.dm index 692bc8f038..67407d220e 100644 --- a/code/game/machinery/computer/telecrystalconsoles.dm +++ b/code/game/machinery/computer/telecrystalconsoles.dm @@ -33,7 +33,7 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E if(uplinkholder) to_chat(user, "[src] already has an uplink in it.") return - GET_COMPONENT_FROM(hidden_uplink, /datum/component/uplink, I) + var/datum/component/uplink/hidden_uplink = I.GetComponent(/datum/component/uplink) if(hidden_uplink) if(!user.transferItemToLoc(I, src)) return @@ -57,7 +57,7 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E /obj/machinery/computer/telecrystals/uplinker/proc/donateTC(amt, addLog = 1) if(uplinkholder && linkedboss) - GET_COMPONENT_FROM(hidden_uplink, /datum/component/uplink, uplinkholder) + var/datum/component/uplink/hidden_uplink = uplinkholder.GetComponent(/datum/component/uplink) if(amt < 0) linkedboss.storedcrystals += hidden_uplink.telecrystals if(addLog) @@ -71,7 +71,7 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E /obj/machinery/computer/telecrystals/uplinker/proc/giveTC(amt, addLog = 1) if(uplinkholder && linkedboss) - GET_COMPONENT_FROM(hidden_uplink, /datum/component/uplink, uplinkholder) + var/datum/component/uplink/hidden_uplink = uplinkholder.GetComponent(/datum/component/uplink) if(amt < 0) hidden_uplink.telecrystals += linkedboss.storedcrystals if(addLog) @@ -94,7 +94,7 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E dat += "No linked management consoles detected. Scan for uplink stations using the management console.

" if(uplinkholder) - GET_COMPONENT_FROM(hidden_uplink, /datum/component/uplink, uplinkholder) + var/datum/component/uplink/hidden_uplink = uplinkholder.GetComponent(/datum/component/uplink) dat += "[hidden_uplink.telecrystals] telecrystals remain in this uplink.
" if(linkedboss) dat += "Donate TC: 1 | 5 | All" @@ -170,7 +170,7 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E for(var/obj/machinery/computer/telecrystals/uplinker/A in TCstations) dat += "[A.name] | " if(A.uplinkholder) - GET_COMPONENT_FROM(hidden_uplink, /datum/component/uplink, A.uplinkholder) + var/datum/component/uplink/hidden_uplink = A.uplinkholder.GetComponent(/datum/component/uplink) dat += "[hidden_uplink.telecrystals] telecrystals." if(storedcrystals) dat+= "
Add TC: 1 | 5 | 10 | All" diff --git a/code/game/machinery/computer/teleporter.dm b/code/game/machinery/computer/teleporter.dm index b9b95eecd0..b5869ef36b 100644 --- a/code/game/machinery/computer/teleporter.dm +++ b/code/game/machinery/computer/teleporter.dm @@ -10,6 +10,7 @@ var/obj/machinery/teleport/station/power_station var/calibrating var/turf/target + var/obj/item/implant/imp_t /obj/machinery/computer/teleporter/Initialize() . = ..() @@ -89,6 +90,7 @@ say("Processing hub calibration to target...") calibrating = 1 + power_station.update_icon() spawn(50 * (3 - power_station.teleporter_hub.accurate)) //Better parts mean faster calibration calibrating = 0 if(check_hub_connection()) @@ -96,6 +98,7 @@ say("Calibration complete.") else say("Error: Unable to detect hub.") + power_station.update_icon() updateDialog() updateDialog() @@ -109,6 +112,9 @@ /obj/machinery/computer/teleporter/proc/reset_regime() target = null + if(imp_t) + UnregisterSignal(imp_t, COMSIG_IMPLANT_REMOVING) + imp_t = null if(regime_set == "Teleporter") regime_set = "Gate" else @@ -124,18 +130,32 @@ L[avoid_assoc_duplicate_keys(A.name, areaindex)] = R for(var/obj/item/implant/tracking/I in GLOB.tracked_implants) - if(!I.imp_in || !isliving(I.loc)) + if(!I.imp_in || !isliving(I.imp_in)) continue else - var/mob/living/M = I.loc + var/mob/living/M = I.imp_in if(M.stat == DEAD) if(M.timeofdeath + 6000 < world.time) continue - if(is_eligible(I)) - L[avoid_assoc_duplicate_keys(M.real_name, areaindex)] = I + if(is_eligible(M)) + L[avoid_assoc_duplicate_keys(M.real_name, areaindex)] = M var/desc = input("Please select a location to lock in.", "Locking Computer") as null|anything in L + if(!user.canUseTopic(src, !issilicon(user), NO_DEXTERY)) //check if we are still around + return target = L[desc] + if(imp_t) + UnregisterSignal(imp_t, COMSIG_IMPLANT_REMOVING) + imp_t = null + if(isliving(target)) //make sure the living mob is still implanted to be a valid target + var/mob/living/M = target + var/obj/item/implant/tracking/I = locate() in M.implants + if(I) + RegisterSignal(I, COMSIG_IMPLANT_REMOVING, .proc/untarget_implant) + imp_t = I + else + target = null + return var/turf/T = get_turf(target) log_game("[key_name(user)] has set the teleporter target to [target] at [AREACOORD(T)]") @@ -149,6 +169,8 @@ to_chat(user, "No active connected stations located.") return var/desc = input("Please select a station to lock in.", "Locking Computer") as null|anything in L + if(!user.canUseTopic(src, !issilicon(user), NO_DEXTERY)) //again, check if we are still around + return var/obj/machinery/teleport/station/target_station = L[desc] if(!target_station || !target_station.teleporter_hub) return @@ -164,6 +186,14 @@ target_station.teleporter_console.stat &= ~NOPOWER target_station.teleporter_console.update_icon() +/obj/machinery/computer/teleporter/proc/untarget_implant() //untargets from mob the racker was once implanted in to prevent issues. + target = null + if(power_station) + power_station.engaged = FALSE + power_station.teleporter_hub?.update_icon() + UnregisterSignal(imp_t, COMSIG_IMPLANT_REMOVING) + imp_t = null + /obj/machinery/computer/teleporter/proc/is_eligible(atom/movable/AM) var/turf/T = get_turf(AM) if(!T) diff --git a/modular_citadel/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm similarity index 69% rename from modular_citadel/code/game/machinery/cryopod.dm rename to code/game/machinery/cryopod.dm index 15e7d34c65..e358f10346 100644 --- a/modular_citadel/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -20,105 +20,146 @@ req_one_access = list(ACCESS_HEADS, ACCESS_ARMORY) //Heads of staff or the warden can go here to claim recover items from their department that people went were cryodormed with. var/mode = null + var/menu = 1 //Which menu screen to display + //Used for logging people entering cryosleep and important items they are carrying. var/list/frozen_crew = list() var/list/frozen_items = list() - var/storage_type = "crewmembers" - var/storage_name = "Cryogenic Oversight Control" + // Used for containing rare items traitors need to steal, so it's not + // game-over if they get iced + var/list/objective_items = list() + // A cache of theft datums so you don't have to re-create them for + // each item check + var/list/theft_cache = list() + var/allow_items = TRUE +/obj/machinery/computer/cryopod/attack_ai() + attack_hand() + /obj/machinery/computer/cryopod/ui_interact(mob/user = usr) - . = ..() + if(!is_operational()) + return user.set_machine(src) add_fingerprint(user) - var/dat + var/dat = "" - dat += "

[storage_name]
" - dat += "Welcome, [user.real_name].


" - dat += "View storage log.
" - if(allow_items) - dat += "View objects.
" - dat += "Recover object.
" - dat += "Recover all objects.
" + dat += "

Welcome, [user.real_name].


" + dat += "

" - user << browse(dat, "window=cryopod_console") - onclose(user, "cryopod_console") + switch(src.menu) + if(1) + dat += "View crew storage log

" + if(allow_items) + dat += "View objects storage log

" + dat += "Recover object

" + dat += "Recover all objects
" + if(2) + dat += "<< Back

" + dat += "

Recently stored Crew




" + if(!frozen_crew.len) + dat += "There has been no storage usage at this terminal.
" + else + for(var/person in frozen_crew) + dat += "[person]
" + dat += "
" + if(3) + dat += "<< Back

" + dat += "

Recently stored objects




" + if(!frozen_items.len) + dat += "There has been no storage usage at this terminal.
" + else + for(var/obj/item/I in frozen_items) + dat += "[I.name]
" + dat += "
" + + var/datum/browser/popup = new(user, "cryopod_console", "Cryogenic System Control") + popup.set_content(dat) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() /obj/machinery/computer/cryopod/Topic(href, href_list) if(..()) - return 1 + return TRUE var/mob/user = usr add_fingerprint(user) - if(href_list["log"]) - - var/dat = "Recently stored [storage_type]


" - for(var/person in frozen_crew) - dat += "[person]
" - dat += "
" - - user << browse(dat, "window=cryolog") - - if(href_list["view"]) - if(!allow_items) return - - var/dat = "Recently stored objects


" - for(var/obj/item/I in frozen_items) - dat += "[I.name]
" - dat += "
" - - user << browse(dat, "window=cryoitems") - - else if(href_list["item"]) + if(href_list["item"]) if(!allowed(user)) to_chat(user, "Access Denied.") + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + updateUsrDialog() return if(!allow_items) return if(frozen_items.len == 0) to_chat(user, "There is nothing to recover from storage.") + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + updateUsrDialog() return var/obj/item/I = input(user, "Please choose which object to retrieve.","Object recovery",null) as null|anything in frozen_items + playsound(src, "terminal_type", 25, 0) if(!I) return if(!(I in frozen_items)) to_chat(user, "\The [I] is no longer in storage.") + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + updateUsrDialog() return visible_message("The console beeps happily as it disgorges \the [I].") + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) - I.forceMove(get_turf(src)) + I.forceMove(drop_location()) + if(user && Adjacent(user) && !issiliconoradminghost(user)) + user.put_in_hands(I) frozen_items -= I + updateUsrDialog() else if(href_list["allitems"]) + playsound(src, "terminal_type", 25, 0) if(!allowed(user)) to_chat(user, "Access Denied.") + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + updateUsrDialog() return if(!allow_items) return if(frozen_items.len == 0) to_chat(user, "There is nothing to recover from storage.") + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) return visible_message("The console beeps happily as it disgorges the desired objects.") + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) for(var/obj/item/I in frozen_items) - I.forceMove(get_turf(src)) + I.forceMove(drop_location()) frozen_items -= I + updateUsrDialog() + else if (href_list["menu"]) + src.menu = text2num(href_list["menu"]) + playsound(src, "terminal_type", 25, 0) + updateUsrDialog() + + ui_interact(usr) updateUsrDialog() + return /obj/item/circuitboard/cryopodcontrol name = "Circuit board (Cryogenic Oversight Console)" build_path = "/obj/machinery/computer/cryopod" +/obj/machinery/computer/cryopod/contents_explosion() + return //Cryopods themselves. /obj/machinery/cryopod @@ -176,16 +217,17 @@ /obj/item/gun/energy/laser/cyborg ) -/obj/machinery/cryopod/Initialize() +/obj/machinery/cryopod/Initialize(mapload) . = ..() update_icon() - find_control_computer(TRUE) + find_control_computer(mapload) /obj/machinery/cryopod/proc/find_control_computer(urgent = FALSE) for(var/obj/machinery/computer/cryopod/C in get_area(src)) control_computer = C if(C) return C + break // Don't send messages unless we *need* the computer, and less than five minutes have passed since last time we messaged if(!control_computer && urgent && last_no_computer_message + 5*60*10 < world.time) @@ -193,7 +235,7 @@ message_admins("Cryopod in [get_area(src)] could not find control computer!") last_no_computer_message = world.time - return null + return control_computer != null /obj/machinery/cryopod/close_machine(mob/user) if(!control_computer) @@ -242,10 +284,75 @@ despawn_occupant() +#define CRYO_DESTROY 0 +#define CRYO_PRESERVE 1 +#define CRYO_OBJECTIVE 2 + +/obj/machinery/cryopod/proc/should_preserve_item(obj/item/I) + for(var/datum/objective_item/steal/T in control_computer.theft_cache) + if(istype(I, T.targetitem) && T.check_special_completion(I)) + return CRYO_OBJECTIVE + for(var/T in preserve_items) + if(istype(I, T) && !(I.type in do_not_preserve_items)) + return CRYO_PRESERVE + return CRYO_DESTROY + // This function can not be undone; do not call this unless you are sure /obj/machinery/cryopod/proc/despawn_occupant() + if(!control_computer) + find_control_computer() + var/mob/living/mob_occupant = occupant + //Handle Borg stuff first + if(iscyborg(mob_occupant)) + var/mob/living/silicon/robot/R = mob_occupant + if(!istype(R)) return ..() + + R.contents -= R.mmi + qdel(R.mmi) + for(var/obj/item/I in R.module) // the tools the borg has; metal, glass, guns etc + for(var/obj/item/O in I) // the things inside the tools, if anything; mainly for janiborg trash bags + if(should_preserve_item(O) != CRYO_DESTROY) // Preserve important things inside the item + continue + O.forceMove(src) + R.module.remove_module(I, TRUE) //delete the module itself so it doesn't transfer over. + + //Drop all items into the pod. + for(var/obj/item/I in mob_occupant) + mob_occupant.doUnEquip(I) + I.forceMove(src) + + if(I.contents.len) //Make sure we catch anything not handled by qdel() on the items. + if(should_preserve_item(I) != CRYO_DESTROY) // Don't remove the contents of things that need preservation + continue + for(var/obj/item/O in I.contents) + if(istype(O, /obj/item/tank)) //Stop eating pockets, you fuck! + continue + O.forceMove(src) + + //Delete all items not on the preservation list. + var/list/items = contents + items -= mob_occupant // Don't delete the occupant + + for(var/obj/item/I in items) + if(istype(I, /obj/item/pda)) + var/obj/item/pda/P = I + QDEL_NULL(P.id) + qdel(P) + continue + + var/preserve = should_preserve_item(I) + if(preserve == CRYO_DESTROY) + qdel(I) + else if(control_computer && control_computer.allow_items) + control_computer.frozen_items += I + if(preserve == CRYO_OBJECTIVE) + control_computer.objective_items += I + I.loc = null + else + I.forceMove(loc) + //Update any existing objectives involving this mob. for(var/datum/objective/O in GLOB.objectives) // We don't want revs to get objectives that aren't for heads of staff. Letting @@ -302,30 +409,6 @@ announcer.announce("CRYOSTORAGE", mob_occupant.real_name, announce_rank, list()) visible_message("\The [src] hums and hisses as it moves [mob_occupant.real_name] into storage.") - - for(var/obj/item/W in mob_occupant.GetAllContents()) - if(W.loc.loc && (( W.loc.loc == loc ) || (W.loc.loc == control_computer))) - continue//means we already moved whatever this thing was in - //I'm a professional, okay - for(var/T in preserve_items) - if(istype(W, T)) - if(control_computer && control_computer.allow_items) - control_computer.frozen_items += W - mob_occupant.transferItemToLoc(W, control_computer, TRUE) - else - mob_occupant.transferItemToLoc(W, loc, TRUE) - - for(var/obj/item/W in mob_occupant.GetAllContents()) - qdel(W)//because we moved all items to preserve away - //and yes, this totally deletes their bodyparts one by one, I just couldn't bother - - if(iscyborg(mob_occupant)) - var/mob/living/silicon/robot/R = occupant - if(!istype(R)) return ..() - - R.contents -= R.mmi - qdel(R.mmi) - // Ghost and delete the mob. if(!mob_occupant.get_ghost(1)) mob_occupant.ghostize(0) // Players who cryo out may not re-enter the round @@ -334,6 +417,10 @@ open_machine() name = initial(name) +#undef CRYO_DESTROY +#undef CRYO_PRESERVE +#undef CRYO_OBJECTIVE + /obj/machinery/cryopod/MouseDrop_T(mob/living/target, mob/user) if(!istype(target) || user.incapacitated() || !target.Adjacent(user) || !Adjacent(user) || !ismob(target) || (!ishuman(user) && !iscyborg(user)) || !istype(user.loc, /turf) || target.buckled) return @@ -358,7 +445,7 @@ var/generic_plsnoleave_message = " Please adminhelp before leaving the round, even if there are no administrators online!" - if(target == user && world.time - target.client.cryo_warned > 5 * 600)//if we haven't warned them in the last 5 minutes + if(target == user && world.time - target.client.cryo_warned > 5 MINUTES)//if we haven't warned them in the last 5 minutes var/caught = FALSE if(target.mind.assigned_role in GLOB.command_positions) alert("You're a Head of Staff![generic_plsnoleave_message] Be sure to put your locker items back into your locker!") @@ -366,13 +453,13 @@ if(iscultist(target) || is_servant_of_ratvar(target)) to_chat(target, "You're a Cultist![generic_plsnoleave_message]") caught = TRUE - if(istype(SSticker.mode, /datum/antagonist/blob)) - if(target.mind in GLOB.overminds) - alert("You're a Blob![generic_plsnoleave_message]") - caught = TRUE if(is_devil(target)) alert("You're a Devil![generic_plsnoleave_message]") caught = TRUE + if(istype(SSticker.mode, /datum/antagonist/gang)) + if(target.mind.has_antag_datum(/datum/antagonist/gang)) + alert("You're a Gangster![generic_plsnoleave_message]") + caught = TRUE if(istype(SSticker.mode, /datum/antagonist/rev)) if(target.mind.has_antag_datum(/datum/antagonist/rev/head)) alert("You're a Head Revolutionary![generic_plsnoleave_message]") @@ -385,8 +472,9 @@ target.client.cryo_warned = world.time return - if(!Adjacent(user)) + if(!target || user.incapacitated() || !target.Adjacent(user) || !Adjacent(user) || (!ishuman(user) && !iscyborg(user)) || !istype(user.loc, /turf) || target.buckled) return + //rerun the checks in case of shenanigans if(target == user) visible_message("[user] starts climbing into the cryo pod.") @@ -396,7 +484,6 @@ if(occupant) to_chat(user, "\The [src] is in use.") return - close_machine(target) to_chat(target, "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round.") @@ -407,4 +494,4 @@ //Attacks/effects. /obj/machinery/cryopod/blob_act() - return //Sorta gamey, but we don't really want these to be destroyed. + return //Sorta gamey, but we don't really want these to be destroyed. \ No newline at end of file diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 2e78d72b96..eaf8faef12 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -74,7 +74,8 @@ to_chat(user, "You start adding [I] to [src]...") if(do_after(user, 50, target=src)) W.use(5) - new /turf/closed/wall/mineral/wood/nonmetal(get_turf(src)) + var/turf/T = get_turf(src) + T.PlaceOnTop(/turf/closed/wall/mineral/wood/nonmetal) qdel(src) return return ..() diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index 7895fb8c9f..c9e1e7195b 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -89,11 +89,11 @@ return C return null -/obj/machinery/dna_scannernew/close_machine(mob/living/carbon/user) +/obj/machinery/dna_scannernew/close_machine(atom/movable/target) if(!state_open) return FALSE - ..(user) + ..(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) @@ -111,7 +111,7 @@ return TRUE /obj/machinery/dna_scannernew/open_machine() - if(state_open) + if(state_open || panel_open) return FALSE ..() @@ -126,23 +126,48 @@ return open_machine() -/obj/machinery/dna_scannernew/attackby(obj/item/I, mob/user, params) - - 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 +/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/wrench_act(mob/living/user, obj/item/I) + . = ..() + if(default_change_direction_wrench(user, I)) + return TRUE + +/obj/machinery/dna_scannernew/crowbar_act(mob/living/user, obj/item/I) + . = ..() if(default_pry_open(I)) - return - + return TRUE if(default_deconstruction_crowbar(I)) - return + 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() /obj/machinery/dna_scannernew/interact(mob/user) toggle_open(user) +/obj/machinery/dna_scannernew/AltClick(mob/user) + if(!user.canUseTopic(src, !issilicon(user))) + return + interact(user) + /obj/machinery/dna_scannernew/MouseDrop_T(mob/target, mob/user) if(user.stat || user.lying || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !user.IsAdvancedToolUser()) return diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index a2da7de29a..3ac386e1fb 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -326,7 +326,7 @@ else //for simple_animals & borgs L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) var/turf/location = get_turf(src) - //add_blood doesn't work for borgs/xenos, but add_blood_floor does. + //add_blood_DNA doesn't work for borgs/xenos, but add_blood_floor does. if(iscarbon(L)) var/mob/living/carbon/C = L C.bleed(DOOR_CRUSH_DAMAGE) diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm index 7c92c158b3..b121057315 100644 --- a/code/game/machinery/droneDispenser.dm +++ b/code/game/machinery/droneDispenser.dm @@ -146,7 +146,7 @@ if((stat & (NOPOWER|BROKEN)) || !anchored) return - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) if(!materials.has_materials(using_materials)) return // We require more minerals @@ -211,7 +211,7 @@ /obj/machinery/droneDispenser/attackby(obj/item/I, mob/living/user) if(istype(I, /obj/item/crowbar)) - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) materials.retrieve_all() I.play_tool_sound(src) to_chat(user, "You retrieve the materials from [src].") diff --git a/code/game/machinery/exp_cloner.dm b/code/game/machinery/exp_cloner.dm index e8364d2271..25e5948b51 100644 --- a/code/game/machinery/exp_cloner.dm +++ b/code/game/machinery/exp_cloner.dm @@ -42,17 +42,18 @@ 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") + ADD_TRAIT(H, TRAIT_STABLEHEART, CLONING_POD_TRAIT) + ADD_TRAIT(H, TRAIT_STABLELIVER, CLONING_POD_TRAIT) + ADD_TRAIT(H, TRAIT_EMOTEMUTE, CLONING_POD_TRAIT) + ADD_TRAIT(H, TRAIT_MUTE, CLONING_POD_TRAIT) + ADD_TRAIT(H, TRAIT_NOBREATH, CLONING_POD_TRAIT) + ADD_TRAIT(H, TRAIT_NOCRITDAMAGE, CLONING_POD_TRAIT) H.Unconscious(80) - var/list/candidates = pollCandidatesForMob("Do you want to play as [clonename]'s defective clone?", null, null, null, 100, H) + var/list/candidates = pollCandidatesForMob("Do you want and agree to play as a [clonename]'s defective clone, respect their character and not engage in ERP without permission from the original?", null, null, null, 100, H, POLL_IGNORE_CLONE) if(LAZYLEN(candidates)) var/mob/dead/observer/C = pick(candidates) - H.key = C.key + C.transfer_ckey(H) if(grab_ghost_when == CLONER_FRESH_CLONE) H.grab_ghost() diff --git a/code/game/machinery/gulag_teleporter.dm b/code/game/machinery/gulag_teleporter.dm index 47136e8c27..a2d0460d25 100644 --- a/code/game/machinery/gulag_teleporter.dm +++ b/code/game/machinery/gulag_teleporter.dm @@ -135,17 +135,19 @@ The console is located at computer/gulag_teleporter.dm if(linked_reclaimer) linked_reclaimer.stored_items[occupant] = list() var/mob/living/mob_occupant = occupant - for(var/obj/item/W in mob_occupant) - if(!is_type_in_typecache(W, telegulag_required_items) && mob_occupant.temporarilyRemoveItemFromInventory(W)) - if(istype(W, /obj/item/restraints/handcuffs)) - W.forceMove(get_turf(src)) - continue - if(linked_reclaimer) - linked_reclaimer.stored_items[mob_occupant] += W - linked_reclaimer.contents += W - W.forceMove(linked_reclaimer) - else - W.forceMove(src) + for(var/A in mob_occupant.get_equipped_items(TRUE)) + var/obj/item/I = A + if(is_type_in_typecache(I, telegulag_required_items) || !mob_occupant.temporarilyRemoveItemFromInventory(I)) + continue + if(istype(I, /obj/item/restraints/handcuffs)) + I.forceMove(get_turf(src)) + continue + if(linked_reclaimer) + linked_reclaimer.stored_items[mob_occupant] += I + linked_reclaimer.contents += I + I.forceMove(linked_reclaimer) + else + I.forceMove(src) /obj/machinery/gulag_teleporter/proc/handle_prisoner(obj/item/id, datum/data/record/R) if(!ishuman(occupant)) diff --git a/code/game/machinery/harvester.dm b/code/game/machinery/harvester.dm index 1fccadda21..db015eb7c1 100644 --- a/code/game/machinery/harvester.dm +++ b/code/game/machinery/harvester.dm @@ -138,7 +138,7 @@ to_chat(user, "[src] is currently occupied!") return if(state_open) - to_chat(user, "[src] must be closed to [panel_open ? "close" : "open"] it's maintenance hatch!") + to_chat(user, "[src] must be closed to [panel_open ? "close" : "open"] its maintenance hatch!") return if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-o", initial(icon_state), I)) return diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index b217c14e53..621ca266bb 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -8,14 +8,14 @@ icon_state = "iv_drip" anchored = FALSE mouse_drag_pointer = MOUSE_ACTIVE_POINTER - var/mob/living/carbon/attached = null + var/mob/living/carbon/attached var/mode = IV_INJECTING - var/obj/item/reagent_containers/beaker = null + 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/machinery/iv_drip/Initialize() +/obj/machinery/iv_drip/Initialize(mapload) . = ..() update_icon() @@ -84,6 +84,8 @@ if(Adjacent(target) && usr.Adjacent(target)) if(beaker) usr.visible_message("[usr] attaches [src] to [target].", "You attach [src] to [target].") + log_combat(usr, target, "attached", src, "containing: [beaker.name] - ([beaker.reagents.log_list()])") + add_fingerprint(usr) attached = target START_PROCESSING(SSmachines, src) update_icon() @@ -100,6 +102,8 @@ return beaker = W to_chat(user, "You attach [W] to [src].") + user.log_message("attached a [W] to [src] at [AREACOORD(src)] containing ([beaker.reagents.log_list()])", LOG_ATTACK) + add_fingerprint(user) update_icon() return else @@ -142,10 +146,11 @@ if(!amount) if(prob(5)) visible_message("[src] pings.") + playsound(loc, 'sound/machines/beep.ogg', 50, 1) return // If the human is losing too much blood, beep. - if(attached.blood_volume < ( (BLOOD_VOLUME_SAFE*attached.blood_ratio) && prob(5) ) ) + if(attached.blood_volume < ((BLOOD_VOLUME_SAFE*attached.blood_ratio) && prob(5) && ishuman(attached))) //really couldn't care less about monkeys visible_message("[src] beeps loudly.") playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) attached.transfer_blood_to(beaker, amount) @@ -178,9 +183,10 @@ if(usr.incapacitated()) return - if(beaker) - beaker.forceMove(drop_location()) + if(usr && Adjacent(usr) && !issiliconoradminghost(usr)) + if(!usr.put_in_hands(beaker)) + beaker.forceMove(drop_location()) beaker = null update_icon() @@ -195,27 +201,27 @@ if(usr.incapacitated()) return - mode = !mode to_chat(usr, "The IV drip is now [mode ? "injecting" : "taking blood"].") update_icon() /obj/machinery/iv_drip/examine(mob/user) - ..() + . = ..() if(get_dist(user, src) > 2) return - to_chat(user, "The IV drip is [mode ? "injecting" : "taking blood"].") + . += "[src] is [mode ? "injecting" : "taking blood"].\n" if(beaker) if(beaker.reagents && beaker.reagents.reagent_list.len) - to_chat(user, "Attached is \a [beaker] with [beaker.reagents.total_volume] units of liquid.") + . += "\tAttached is \a [beaker] with [beaker.reagents.total_volume] units of liquid.\n" else - to_chat(user, "Attached is an empty [beaker.name].") + . += "\tAttached is an empty [beaker.name].\n" else - to_chat(user, "No chemicals are attached.") + . += "\tNo chemicals are attached.\n" - to_chat(user, "[attached ? attached : "No one"] is attached.") + . += "\t[attached ? attached : "No one"] is attached." + to_chat(user,.) #undef IV_TAKING -#undef IV_INJECTING +#undef IV_INJECTING \ No newline at end of file diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index b0a75c99dc..165170cf0f 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -40,6 +40,8 @@ var/stun_projectile = null //stun mode projectile type var/stun_projectile_sound + var/nonlethal_projectile //projectile to use in stun mode when the target is resting, if any + var/nonlethal_projectile_sound var/lethal_projectile = null //lethal mode projectile type var/lethal_projectile_sound @@ -535,13 +537,22 @@ T = closer break + var/mob/living/carbon/C + if(iscarbon(target)) + C = target + update_icon() var/obj/item/projectile/A //any emagged turrets drains 2x power and uses a different projectile? if(mode == TURRET_STUN) - use_power(reqpower) - A = new stun_projectile(T) - playsound(loc, stun_projectile_sound, 75, 1) + if(nonlethal_projectile && C && C.resting) + use_power(reqpower*0.5) + A = new nonlethal_projectile(T) + playsound(loc, nonlethal_projectile_sound, 75, 1) + else + use_power(reqpower) + A = new stun_projectile(T) + playsound(loc, stun_projectile_sound, 75, 1) else use_power(reqpower * 2) A = new lethal_projectile(T) @@ -653,6 +664,8 @@ base_icon_state = "standard" stun_projectile = /obj/item/projectile/energy/electrode stun_projectile_sound = 'sound/weapons/taser.ogg' + nonlethal_projectile = /obj/item/projectile/beam/disabler + nonlethal_projectile_sound = 'sound/weapons/taser2.ogg' lethal_projectile = /obj/item/projectile/beam/laser lethal_projectile_sound = 'sound/weapons/laser.ogg' desc = "An energy blaster auto-turret." @@ -662,6 +675,8 @@ base_icon_state = "standard" stun_projectile = /obj/item/projectile/energy/electrode stun_projectile_sound = 'sound/weapons/taser.ogg' + nonlethal_projectile = /obj/item/projectile/beam/disabler + nonlethal_projectile_sound = 'sound/weapons/taser2.ogg' lethal_projectile = /obj/item/projectile/beam/laser/heavylaser lethal_projectile_sound = 'sound/weapons/lasercannonfire.ogg' desc = "An energy blaster auto-turret." @@ -681,6 +696,8 @@ /obj/machinery/porta_turret/ai faction = list("silicon") + nonlethal_projectile = /obj/item/projectile/beam/disabler + nonlethal_projectile_sound = 'sound/weapons/taser2.ogg' /obj/machinery/porta_turret/ai/assess_perp(mob/living/carbon/human/perp) return 10 //AI turrets shoot at everything not in their faction diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 9d431487e0..1a8bc7ece4 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -32,10 +32,10 @@ mat_mod *= 50000 for(var/obj/item/stock_parts/manipulator/M in component_parts) amt_made = 12.5 * M.rating //% of materials salvaged - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) materials.max_amount = mat_mod amount_produced = min(50, amt_made) + 50 - GET_COMPONENT(butchering, /datum/component/butchering) + var/datum/component/butchering/butchering = GetComponent(/datum/component/butchering) butchering.effectiveness = amount_produced butchering.bonus_modifier = amount_produced/5 @@ -99,7 +99,7 @@ /obj/machinery/recycler/proc/eat(atom/AM0, sound=TRUE) var/list/to_eat if(isitem(AM0)) - to_eat = AM0.GetAllContents() + to_eat = AM0.GetAllContentsIgnoring(GLOB.typecache_mob) else to_eat = list(AM0) @@ -144,7 +144,7 @@ qdel(L) return else - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) var/material_amount = materials.get_item_material_amount(I) if(!material_amount) qdel(I) @@ -195,7 +195,7 @@ L.Unconscious(100) L.adjustBruteLoss(crush_damage) if(L.stat == DEAD && (L.butcher_results || L.guaranteed_butcher_results)) - GET_COMPONENT(butchering, /datum/component/butchering) + var/datum/component/butchering/butchering = GetComponent(/datum/component/butchering) butchering.Butcher(src,L) /obj/machinery/recycler/deathtrap diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 90166dacf0..f35caf514c 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -210,13 +210,13 @@ add_fingerprint(user) /obj/machinery/suit_storage_unit/proc/cook() + var/mob/living/mob_occupant = occupant if(uv_cycles) uv_cycles-- uv = TRUE locked = TRUE update_icon() if(occupant) - var/mob/living/mob_occupant = occupant if(uv_super) mob_occupant.adjustFireLoss(rand(20, 36)) else @@ -245,10 +245,29 @@ visible_message("[src]'s door slides open. The glowing yellow lights dim to a gentle green.") else visible_message("[src]'s door slides open, barraging you with the nauseating smell of charred flesh.") + mob_occupant.radiation = 0 playsound(src, 'sound/machines/airlockclose.ogg', 25, 1) - for(var/obj/item/I in src) //Scorches away blood and forensic evidence, although the SSU itself is unaffected - SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRONG) - var/datum/component/radioactive/contamination = I.GetComponent(/datum/component/radioactive) + var/list/things_to_clear = list() //Done this way since using GetAllContents on the SSU itself would include circuitry and such. + if(suit) + things_to_clear += suit + things_to_clear += suit.GetAllContents() + if(helmet) + things_to_clear += helmet + things_to_clear += helmet.GetAllContents() + if(mask) + things_to_clear += mask + things_to_clear += mask.GetAllContents() + if(storage) + things_to_clear += storage + things_to_clear += storage.GetAllContents() + if(occupant) + things_to_clear += occupant + things_to_clear += occupant.GetAllContents() + for(var/atom/movable/AM in things_to_clear) //Scorches away blood and forensic evidence, although the SSU itself is unaffected + SEND_SIGNAL(AM, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRONG) + AM.clean_blood() + AM.fingerprints = list() + var/datum/component/radioactive/contamination = AM.GetComponent(/datum/component/radioactive) if(contamination) qdel(contamination) open_machine(FALSE) @@ -418,4 +437,4 @@ if(I) I.forceMove(loc) . = TRUE - update_icon() + update_icon() \ No newline at end of file diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index a1ed7fb848..8a33241d46 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -1,3 +1,7 @@ +GLOBAL_VAR_INIT(singularity_counter, 0) + +#define METEOR_DISASTER_MODIFIER 0.5 + //////////////////////////////////////// //Singularity beacon //////////////////////////////////////// @@ -13,39 +17,57 @@ stat = 0 verb_say = "states" var/cooldown = 0 - - var/active = 0 + var/active = FALSE + var/meteor_buff = FALSE var/icontype = "beacon" - /obj/machinery/power/singularity_beacon/proc/Activate(mob/user = null) + if(active) + return FALSE if(surplus() < 1500) if(user) to_chat(user, "The connected wire doesn't have enough current.") - return + return FALSE + if(is_station_level(z)) + increment_meteor_waves() for(var/obj/singularity/singulo in GLOB.singularities) if(singulo.z == z) singulo.target = src icon_state = "[icontype]1" - active = 1 + active = TRUE if(user) to_chat(user, "You activate the beacon.") + return TRUE - -/obj/machinery/power/singularity_beacon/proc/Deactivate(mob/user = null) +/obj/machinery/power/singularity_beacon/proc/Deactivate(mob/user) + if(!active) + return FALSE for(var/obj/singularity/singulo in GLOB.singularities) if(singulo.target == src) singulo.target = null icon_state = "[icontype]0" - active = 0 + active = FALSE if(user) to_chat(user, "You deactivate the beacon.") + if(meteor_buff) + decrement_meteor_waves() + return TRUE +/obj/machinery/power/singularity_beacon/proc/increment_meteor_waves() + meteor_buff = TRUE + GLOB.singularity_counter++ + for(var/datum/round_event_control/meteor_wave/W in SSevents.control) + W.weight += round(initial(W.weight) * METEOR_DISASTER_MODIFIER) + +/obj/machinery/power/singularity_beacon/proc/decrement_meteor_waves() + meteor_buff = FALSE + GLOB.singularity_counter-- + for(var/datum/round_event_control/meteor_wave/W in SSevents.control) + W.weight -= round(initial(W.weight) * METEOR_DISASTER_MODIFIER) /obj/machinery/power/singularity_beacon/attack_ai(mob/user) return - /obj/machinery/power/singularity_beacon/attack_hand(mob/user) . = ..() if(.) @@ -86,6 +108,12 @@ if(!active) return + var/is_on_station = is_station_level(z) + if(meteor_buff && !is_on_station) + decrement_meteor_waves() + else if(!meteor_buff && is_on_station) + increment_meteor_waves() + if(surplus() >= 1500) add_load(1500) if(cooldown <= world.time) @@ -133,3 +161,5 @@ /obj/item/sbeacondrop/clownbomb desc = "A label on it reads: Warning: Activating this device will send a silly explosive to your location." droptype = /obj/machinery/syndicatebomb/badmin/clown + +#undef METEOR_DISASTER_MODIFIER diff --git a/code/game/machinery/telecomms/computers/message.dm b/code/game/machinery/telecomms/computers/message.dm index ebb40148d8..64f4cc7835 100644 --- a/code/game/machinery/telecomms/computers/message.dm +++ b/code/game/machinery/telecomms/computers/message.dm @@ -421,6 +421,7 @@ "name" = "[customsender]", "job" = "[customjob]", "message" = custommessage, + "emoji_message" = emoji_parse(custommessage), "targets" = list("[customrecepient.owner] ([customrecepient.ownjob])") )) // this will log the signal and transmit it to the target diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm index cc390e1fc0..56870c5198 100644 --- a/code/game/machinery/telecomms/machines/message_server.dm +++ b/code/game/machinery/telecomms/machines/message_server.dm @@ -106,10 +106,11 @@ return "Everyone" return data["targets"][1] -/datum/signal/subspace/pda/proc/format_message() +/datum/signal/subspace/pda/proc/format_message(emojify = FALSE) + var/message = emojify ? data["emoji_message"] : data["message"] if (logged && data["photo"]) - return "\"[data["message"]]\" (Photo)" - return "\"[data["message"]]\"" + return "\"[message]\" (Photo)" + return "\"[message]\"" /datum/signal/subspace/pda/broadcast() if (!logged) // Can only go through if a message server logs it diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 1f1f13ee22..ae71a0b844 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -209,5 +209,7 @@ icon_state = "controller-o" else if(stat & (BROKEN|NOPOWER)) icon_state = "controller-p" + else if(teleporter_console && teleporter_console.calibrating) + icon_state = "controller-c" else icon_state = "controller" diff --git a/code/game/machinery/turnstile.dm b/code/game/machinery/turnstile.dm new file mode 100644 index 0000000000..1fd78056d4 --- /dev/null +++ b/code/game/machinery/turnstile.dm @@ -0,0 +1,84 @@ +/obj/machinery/turnstile + name = "turnstile" + desc = "A mechanical door that permits one-way access and prevents tailgating." + icon = 'icons/obj/turnstile.dmi' + icon_state = "turnstile_map" + density = FALSE + armor = list(melee = 50, bullet = 50, laser = 50, energy = 50, bomb = 10, bio = 100, rad = 100, fire = 90, acid = 70) + anchored = TRUE + use_power = FALSE + idle_power_usage = 2 + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + layer = OPEN_DOOR_LAYER + +/obj/machinery/turnstile/Initialize() + . = ..() + icon_state = "turnstile" + +/obj/machinery/turnstile/CanAtmosPass(turf/T) + return TRUE + +/obj/machinery/turnstile/bullet_act(obj/item/projectile/P, def_zone) + return -1 //Pass through! + +/obj/machinery/turnstile/proc/allowed_access(var/mob/B) + if(B.pulledby && ismob(B.pulledby)) + return allowed(B.pulledby) | allowed(B) + else + return allowed(B) + +/obj/machinery/turnstile/CanPass(atom/movable/AM, turf/T) + if(ismob(AM)) + var/mob/B = AM + if(isliving(AM)) + var/mob/living/M = AM + + if(world.time - M.last_bumped <= 5) + return FALSE + M.last_bumped = world.time + + var/allowed_access = FALSE + var/turf/behind = get_step(src, dir) + + if(B in behind.contents) + allowed_access = allowed_access(B) + else + to_chat(usr, "\the [src] resists your efforts.") + return FALSE + + if(allowed_access) + flick("operate", src) + playsound(src,'sound/items/ratchet.ogg',50,0,3) + return TRUE + else + flick("deny", src) + playsound(src,'sound/machines/deniedbeep.ogg',50,0,3) + return FALSE + if(ispath(AM, /obj/item/)) + return TRUE + else + return FALSE + +/obj/machinery/turnstile/CheckExit(atom/movable/AM as mob|obj, target) + if(isliving(AM)) + var/mob/living/M = AM + var/outdir = dir + if(allowed_access(M)) + switch(dir) + if(NORTH) + outdir = SOUTH + if(SOUTH) + outdir = NORTH + if(EAST) + outdir = WEST + if(WEST) + outdir = EAST + var/turf/outturf = get_step(src, outdir) + var/canexit = (target == src.loc) | (target == outturf) + + if(!canexit && world.time - M.last_bumped <= 5) + to_chat(usr, "\the [src] resists your efforts.") + M.last_bumped = world.time + return canexit + else + return TRUE \ No newline at end of file diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index 5e8515d3d5..8be079656b 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -11,10 +11,6 @@ var/obj/item/color_source var/max_wash_capacity = 5 -/obj/machinery/washing_machine/ComponentInitialize() - . = ..() - AddComponent(/datum/component/redirect, list(COMSIG_COMPONENT_CLEAN_ACT = CALLBACK(src, .proc/clean_blood))) - /obj/machinery/washing_machine/examine(mob/user) ..() to_chat(user, "Alt-click it to start a wash cycle.") @@ -59,7 +55,8 @@ M.Translate(rand(-3, 3), rand(-1, 3)) animate(src, transform=M, time=2) -/obj/machinery/washing_machine/proc/clean_blood() +/obj/machinery/washing_machine/clean_blood() + ..() if(!busy) bloody_mess = FALSE update_icon() @@ -67,7 +64,8 @@ /obj/machinery/washing_machine/proc/wash_cycle() for(var/X in contents) var/atom/movable/AM = X - SEND_SIGNAL(AM, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(AM, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + AM.clean_blood() AM.machine_wash(src) busy = FALSE diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index f9fa2544b8..564f308df3 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -6,6 +6,7 @@ dir_in = 1 //Facing North. max_integrity = 250 deflect_chance = 5 + force = 20 armor = list("melee" = 25, "bullet" = 20, "laser" = 30, "energy" = 15, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) max_temperature = 25000 infra_luminosity = 6 @@ -13,6 +14,7 @@ internal_damage_threshold = 35 max_equip = 3 step_energy_drain = 3 + leg_overload_coeff = 300 /obj/mecha/combat/gygax/dark desc = "A lightweight exosuit, painted in a dark scheme. This model appears to have some modifications." @@ -20,6 +22,7 @@ icon_state = "darkgygax" max_integrity = 300 deflect_chance = 15 + force = 25 armor = list("melee" = 40, "bullet" = 40, "laser" = 50, "energy" = 35, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) max_temperature = 35000 leg_overload_coeff = 100 diff --git a/code/game/mecha/combat/neovgre.dm b/code/game/mecha/combat/neovgre.dm new file mode 100644 index 0000000000..2b2ed150e2 --- /dev/null +++ b/code/game/mecha/combat/neovgre.dm @@ -0,0 +1,96 @@ +/obj/mecha/combat/neovgre + name = "Neovgre, the Anima Bulwark" + desc = "Nezbere's most powerful creation, a mighty war machine of unmatched power said to have ended wars in a single night." + icon = 'icons/mecha/neovgre.dmi' + icon_state = "neovgre" + max_integrity = 500 //This is THE ratvarian superweaon, its deployment is an investment + armor = list("melee" = 50, "bullet" = 40, "laser" = 25, "energy" = 25, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) //Its similar to the clockwork armour albeit with a few buffs becuase RATVARIAN SUPERWEAPON!! + force = 50 //SMASHY SMASHY!! + internal_damage_threshold = 0 + step_in = 3 + pixel_x = -16 + layer = ABOVE_MOB_LAYER + breach_time = 100 //ten seconds till all goes to shit + recharge_rate = 100 + wreckage = /obj/structure/mecha_wreckage/durand/neovgre + +/obj/mecha/combat/neovgre/GrantActions(mob/living/user, human_occupant = 0) //No Eject action for you sonny jim, your life for Ratvar! + internals_action.Grant(user, src) + cycle_action.Grant(user, src) + lights_action.Grant(user, src) + stats_action.Grant(user, src) + strafing_action.Grant(user, src) + +/obj/mecha/combat/neovgre/RemoveActions(mob/living/user, human_occupant = 0) + internals_action.Remove(user) + cycle_action.Remove(user) + lights_action.Remove(user) + stats_action.Remove(user) + strafing_action.Remove(user) + +/obj/mecha/combat/neovgre/MouseDrop_T(mob/M, mob/user) + if(!is_servant_of_ratvar(user)) + to_chat(user, "BEGONE HERETIC!") + return + else + ..() + +/obj/mecha/combat/neovgre/moved_inside(mob/living/carbon/human/H) + var/list/Itemlist = H.get_contents() + for(var/obj/item/clockwork/slab/W in Itemlist) + to_chat(H, "You safely store [W] inside [src].") + qdel(W) + . = ..() + +/obj/mecha/combat/neovgre/obj_destruction() + for(var/mob/M in src) + to_chat(M, "You are consumed by the fires raging within Neovgre...") + M.dust() + playsound(src, 'sound/magic/lightning_chargeup.ogg', 100, 0) + src.visible_message("The reactor has gone critical, its going to blow!") + addtimer(CALLBACK(src,.proc/go_critical),breach_time) + +/obj/mecha/combat/neovgre/proc/go_critical() + explosion(get_turf(loc), 3, 5, 10, 20, 30) + Destroy(src) + +/obj/mecha/combat/neovgre/container_resist(mob/living/user) + to_chat(user, "Neovgre requires a lifetime commitment friend, no backing out now!") + return + +/obj/mecha/combat/neovgre/process() + ..() + if(GLOB.ratvar_awakens) // At this point only timley intervention by lord singulo could hople to stop the superweapon + cell.charge = INFINITY + max_integrity = INFINITY + obj_integrity = max_integrity + CHECK_TICK //Just to be on the safe side lag wise + else if(cell.charge < cell.maxcharge) + for(var/obj/effect/clockwork/sigil/transmission/T in range(SIGIL_ACCESS_RANGE, src)) + var/delta = min(recharge_rate, cell.maxcharge - cell.charge) + if (get_clockwork_power() <= delta) + cell.charge += delta + adjust_clockwork_power(-delta) + CHECK_TICK + +/obj/mecha/combat/neovgre/Initialize() + .=..() + GLOB.neovgre_exists ++ + var/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy/neovgre/N = new + N.attach(src) + +/obj/structure/mecha_wreckage/durand/neovgre + name = "\improper Neovgre wreckage?" + desc = "On closer inspection this looks like the wreck of a durand with some spraypainted cardboard duct taped to it!" + +/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy/neovgre + equip_cooldown = 8 //Rapid fire heavy laser cannon, simple yet elegant + energy_drain = 30 + name = "Aribter Laser Cannon" + desc = "Please re-attach this to neovgre and stop asking questions about why it looks like a normal Nanotrasen issue Solaris laser cannon - Nezbere" + fire_sound = "sound/weapons/neovgre_laser.ogg" + +/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy/neovgre/can_attach(obj/mecha/combat/neovgre/M) + if(istype(M)) + return 1 + return 0 diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index 21bbdfd14b..ae3fdb15b4 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -166,7 +166,7 @@ Toxin Content: [patient.getToxLoss()]%
Burn Severity: [patient.getFireLoss()]%
[patient.getCloneLoss() ? "Subject appears to have cellular damage." : ""]
- [patient.getBrainLoss() ? "Significant brain damage detected." : ""]
+ [patient.getOrganLoss(ORGAN_SLOT_BRAIN) ? "Significant brain damage detected." : ""]
[length(patient.get_traumas()) ? "Brain Traumas detected." : ""]
"} diff --git a/code/game/mecha/equipment/tools/mining_tools.dm b/code/game/mecha/equipment/tools/mining_tools.dm index d539e0a9d5..4044951c42 100644 --- a/code/game/mecha/equipment/tools/mining_tools.dm +++ b/code/game/mecha/equipment/tools/mining_tools.dm @@ -13,6 +13,8 @@ energy_drain = 10 force = 15 harmful = TRUE + tool_behaviour = TOOL_DRILL + toolspeed = 0.9 var/drill_delay = 7 var/drill_level = DRILL_BASIC @@ -98,12 +100,12 @@ /obj/item/mecha_parts/mecha_equipment/drill/attach(obj/mecha/M) ..() - GET_COMPONENT_FROM(butchering, /datum/component/butchering, src) + var/datum/component/butchering/butchering = src.GetComponent(/datum/component/butchering) butchering.butchering_enabled = TRUE /obj/item/mecha_parts/mecha_equipment/drill/detach(atom/moveto) ..() - GET_COMPONENT_FROM(butchering, /datum/component/butchering, src) + var/datum/component/butchering/butchering = src.GetComponent(/datum/component/butchering) butchering.butchering_enabled = FALSE /obj/item/mecha_parts/mecha_equipment/drill/proc/drill_mob(mob/living/target, mob/user) @@ -113,7 +115,7 @@ if(target.stat == DEAD && target.getBruteLoss() >= 200) log_combat(user, target, "gibbed", name) if(LAZYLEN(target.butcher_results) || LAZYLEN(target.guaranteed_butcher_results)) - GET_COMPONENT_FROM(butchering, /datum/component/butchering, src) + var/datum/component/butchering/butchering = src.GetComponent(/datum/component/butchering) butchering.Butcher(chassis, target) else target.gib() @@ -141,6 +143,7 @@ drill_delay = 4 drill_level = DRILL_HARDENED force = 15 + toolspeed = 0.7 /obj/item/mecha_parts/mecha_equipment/mining_scanner diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm index ea9465184a..36708fcf90 100644 --- a/code/game/mecha/equipment/tools/work_tools.dm +++ b/code/game/mecha/equipment/tools/work_tools.dm @@ -11,6 +11,8 @@ var/dam_force = 20 var/obj/mecha/working/ripley/cargo_holder harmful = TRUE + tool_behaviour = TOOL_RETRACTOR + toolspeed = 0.8 /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/can_attach(obj/mecha/working/ripley/M as obj) if(..()) diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 2e5a13beb2..9f8f3ef742 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -279,12 +279,12 @@ name = "\improper Melon Seed \"Scattershot\"" desc = "A weapon for combat exosuits. Shoots a spread of pellets, shaped as seed." icon_state = "mecha_scatter" - equip_cooldown = 30 + equip_cooldown = 20 projectile = /obj/item/projectile/bullet/seed - projectiles = 4 - projectile_energy_cost = 55 + projectiles = 20 + projectile_energy_cost = 25 projectiles_per_shot = 10 - variance = 20 + variance = 25 harmful = TRUE /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index e1dc80911f..4acf7981bc 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -47,7 +47,7 @@ //maximum stocking amount (default 300000, 600000 at T4) for(var/obj/item/stock_parts/matter_bin/M in component_parts) T += M.rating - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) materials.max_amount = (200000 + (T*50000)) //resources adjustment coefficient (1 -> 0.85 -> 0.7 -> 0.55) @@ -109,7 +109,7 @@ /obj/machinery/mecha_part_fabricator/proc/output_available_resources() var/output - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) for(var/mat_id in materials.materials) var/datum/material/M = materials.materials[mat_id] output += "[M.name]: [M.amount] cm³" @@ -130,7 +130,7 @@ /obj/machinery/mecha_part_fabricator/proc/check_resources(datum/design/D) if(D.reagents_list.len) // No reagents storage - no reagent designs. return FALSE - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) if(materials.has_materials(get_resources_w_coeff(D))) return TRUE return FALSE @@ -140,7 +140,7 @@ desc = "It's building \a [initial(D.name)]." var/list/res_coef = get_resources_w_coeff(D) - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) materials.use_amount(res_coef) add_overlay("fab-active") use_power = ACTIVE_POWER_USE @@ -384,14 +384,14 @@ break if(href_list["remove_mat"] && href_list["material"]) - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) materials.retrieve_sheets(text2num(href_list["remove_mat"]), href_list["material"]) updateUsrDialog() return /obj/machinery/mecha_part_fabricator/on_deconstruction() - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) materials.retrieve_all() ..() diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 22aac63d2b..7348c8a575 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -49,6 +49,8 @@ var/lights = FALSE var/lights_power = 6 var/last_user_hud = 1 // used to show/hide the mecha hud while preserving previous preference + var/breach_time = 0 + var/recharge_rate = 0 var/bumpsmash = 0 //Whether or not the mech destroys walls by running into it. //inner atmos diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index ef3ba969e9..19656f2d7d 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -47,7 +47,7 @@ /obj/mecha/working/ripley/update_icon() ..() - GET_COMPONENT(C,/datum/component/armor_plate) + var/datum/component/armor_plate/C = GetComponent(/datum/component/armor_plate) if (C.amount) cut_overlays() if(C.amount < 3) diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 9c3df5395f..693d32e545 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -89,6 +89,7 @@ buckled_mob.clear_alert("buckled") buckled_mobs -= buckled_mob SEND_SIGNAL(src, COMSIG_MOVABLE_UNBUCKLE, buckled_mob, force) + SEND_SIGNAL(src, COMSIG_MOVABLE_UNBUCKLE, src, force) post_unbuckle_mob(.) diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index d5aff99f32..2eb4a6aa0c 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -8,6 +8,7 @@ /obj/effect/decal/cleanable/Initialize(mapload, list/datum/disease/diseases) . = ..() + LAZYINITLIST(blood_DNA) //Kinda needed if (random_icon_states && (icon_state == initial(icon_state)) && length(random_icon_states) > 0) icon_state = pick(random_icon_states) create_reagents(300) @@ -27,7 +28,7 @@ /obj/effect/decal/cleanable/proc/replace_decal(obj/effect/decal/cleanable/C) // Returns true if we should give up in favor of the pre-existing decal if(mergeable_decal) - return TRUE + qdel(C) /obj/effect/decal/cleanable/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/reagent_containers/glass) || istype(W, /obj/item/reagent_containers/food/drinks)) @@ -81,7 +82,9 @@ add_blood = bloodiness bloodiness -= add_blood S.bloody_shoes[blood_state] = min(MAX_SHOE_BLOODINESS,S.bloody_shoes[blood_state]+add_blood) - S.add_blood_DNA(return_blood_DNA()) + if(blood_DNA && blood_DNA.len) + S.add_blood_DNA(blood_DNA) + S.add_blood_overlay() S.blood_state = blood_state update_icon() H.update_inv_shoes() @@ -90,4 +93,4 @@ if((blood_state != BLOOD_STATE_OIL) && (blood_state != BLOOD_STATE_NOT_BLOODY)) return bloodiness else - return 0 + return FALSE diff --git a/code/game/objects/effects/decals/cleanable/aliens.dm b/code/game/objects/effects/decals/cleanable/aliens.dm index ca2a8ccaff..a4d0da1bbe 100644 --- a/code/game/objects/effects/decals/cleanable/aliens.dm +++ b/code/game/objects/effects/decals/cleanable/aliens.dm @@ -1,71 +1,70 @@ -// Note: BYOND is object oriented. There is no reason for this to be copy/pasted blood code. -/obj/effect/decal/cleanable/xenoblood +/obj/effect/decal/cleanable/blood/xeno name = "xeno blood" desc = "It's green and acidic. It looks like... blood?" - icon = 'icons/effects/blood.dmi' - icon_state = "xfloor1" - random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7") - bloodiness = BLOOD_AMOUNT_PER_DECAL - blood_state = BLOOD_STATE_XENO + color = BLOOD_COLOR_XENO -/obj/effect/decal/cleanable/xenoblood/Initialize() +/obj/effect/decal/cleanable/blood/splatter/xeno + color = BLOOD_COLOR_XENO + +/obj/effect/decal/cleanable/blood/gibs/xeno + color = BLOOD_COLOR_XENO + gibs_reagent_id = "liquidxenogibs" + gibs_bloodtype = "X*" + +/obj/effect/decal/cleanable/blood/gibs/xeno/Initialize(mapload, list/datum/disease/diseases) . = ..() - add_blood_DNA(list("UNKNOWN DNA" = "X*")) + update_icon() -/obj/effect/decal/cleanable/xenoblood/xsplatter - random_icon_states = list("xgibbl1", "xgibbl2", "xgibbl3", "xgibbl4", "xgibbl5") +/obj/effect/decal/cleanable/blood/gibs/xeno/update_icon() + add_atom_colour(blood_DNA_to_color(), FIXED_COLOUR_PRIORITY) + cut_overlays() + var/mutable_appearance/flesh = mutable_appearance(icon, "[icon_state]x_flesh") + flesh.appearance_flags = RESET_COLOR + flesh.color = body_colors + add_overlay(flesh) -/obj/effect/decal/cleanable/xenoblood/xgibs - name = "xeno gibs" - desc = "Gnarly..." - icon = 'icons/effects/blood.dmi' - icon_state = "xgib1" - layer = LOW_OBJ_LAYER - random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6") - mergeable_decal = FALSE - -/obj/effect/decal/cleanable/xenoblood/xgibs/proc/streak(list/directions) - set waitfor = 0 +/obj/effect/decal/cleanable/blood/gibs/xeno/streak(list/directions) + set waitfor = FALSE + var/list/diseases = list() + SEND_SIGNAL(src, COMSIG_GIBS_STREAK, directions, diseases) var/direction = pick(directions) - for(var/i = 0, i < pick(1, 200; 2, 150; 3, 50), i++) + for(var/i in 0 to pick(0, 200; 1, 150; 2, 50)) sleep(2) if(i > 0) - new /obj/effect/decal/cleanable/xenoblood/xsplatter(loc) + var/obj/effect/decal/cleanable/blood/splatter/xeno/splat = new /obj/effect/decal/cleanable/blood/splatter/xeno(loc, diseases) + splat.transfer_blood_dna(blood_DNA, diseases) if(!step_to(src, get_step(src, direction), 0)) break -/obj/effect/decal/cleanable/xenoblood/xgibs/ex_act() - return +/obj/effect/decal/cleanable/blood/gibs/xeno/up + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1") -/obj/effect/decal/cleanable/xenoblood/xgibs/up - random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6","xgibup1","xgibup1","xgibup1") +/obj/effect/decal/cleanable/blood/gibs/xeno/down + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1") -/obj/effect/decal/cleanable/xenoblood/xgibs/down - random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6","xgibdown1","xgibdown1","xgibdown1") +/obj/effect/decal/cleanable/blood/gibs/xeno/body + random_icon_states = list("gibhead", "gibtorso") -/obj/effect/decal/cleanable/xenoblood/xgibs/body - random_icon_states = list("xgibhead", "xgibtorso") +/obj/effect/decal/cleanable/blood/gibs/xeno/torso + random_icon_states = list("gibtorso") -/obj/effect/decal/cleanable/xenoblood/xgibs/torso - random_icon_states = list("xgibtorso") +/obj/effect/decal/cleanable/blood/gibs/xeno/limb + random_icon_states = list("gibleg", "gibarm") -/obj/effect/decal/cleanable/xenoblood/xgibs/limb - random_icon_states = list("xgibleg", "xgibarm") +/obj/effect/decal/cleanable/blood/gibs/xeno/core + random_icon_states = list("gibmid1", "gibmid2", "gibmid3") -/obj/effect/decal/cleanable/xenoblood/xgibs/core - random_icon_states = list("xgibmid1", "xgibmid2", "xgibmid3") - -/obj/effect/decal/cleanable/xenoblood/xgibs/larva +/obj/effect/decal/cleanable/blood/gibs/xeno/larva random_icon_states = list("xgiblarva1", "xgiblarva2") -/obj/effect/decal/cleanable/xenoblood/xgibs/larva/body +/obj/effect/decal/cleanable/blood/gibs/xeno/larva/body random_icon_states = list("xgiblarvahead", "xgiblarvatorso") /obj/effect/decal/cleanable/blood/xtracks - icon_state = "xtracks" + icon_state = "tracks" random_icon_states = null /obj/effect/decal/cleanable/blood/xtracks/Initialize() - . = ..() - add_blood_DNA(list("Unknown DNA" = "X*")) + add_blood_DNA(list("UNKNOWN DNA" = "X*")) + . = ..() \ No newline at end of file diff --git a/code/game/objects/effects/decals/cleanable/gibs.dm b/code/game/objects/effects/decals/cleanable/gibs.dm new file mode 100644 index 0000000000..03eeca7d0b --- /dev/null +++ b/code/game/objects/effects/decals/cleanable/gibs.dm @@ -0,0 +1,231 @@ +/obj/effect/decal/cleanable/blood/gibs + name = "gibs" + desc = "They look bloody and gruesome." + icon_state = "gibbl5" + layer = LOW_OBJ_LAYER + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6") + mergeable_decal = FALSE + var/body_colors = "#e3ba84" //a default color just in case. + var/gibs_reagent_id = "liquidgibs" + var/gibs_bloodtype = "A+" + +/obj/effect/decal/cleanable/blood/gibs/Initialize(mapload, list/datum/disease/diseases) + . = ..() + if(random_icon_states && (icon_state == initial(icon_state)) && length(random_icon_states) > 0) + icon_state = pick(random_icon_states) + if(gibs_reagent_id) + reagents.add_reagent(gibs_reagent_id, 5) + if(gibs_bloodtype) + add_blood_DNA(list("Non-human DNA" = gibs_bloodtype, diseases)) + update_icon() + + +/obj/effect/decal/cleanable/blood/gibs/update_icon() + add_atom_colour(blood_DNA_to_color(), FIXED_COLOUR_PRIORITY) + cut_overlays() + var/mutable_appearance/guts = mutable_appearance(icon, "[icon_state]_guts") + guts.appearance_flags = RESET_COLOR + add_overlay(guts) + var/mutable_appearance/flesh = mutable_appearance(icon, "[icon_state]_flesh") + flesh.appearance_flags = RESET_COLOR + flesh.color = body_colors + add_overlay(flesh) + +/obj/effect/decal/cleanable/blood/gibs/ex_act(severity, target) + return + +/obj/effect/decal/cleanable/blood/gibs/Crossed(mob/living/L) + if(istype(L) && has_gravity(loc)) + playsound(loc, 'sound/effects/gib_step.ogg', !HAS_TRAIT(L,TRAIT_LIGHT_STEP) ? 20 : 50, 1) + . = ..() + +/obj/effect/decal/cleanable/blood/gibs/proc/streak(list/directions) + set waitfor = FALSE + var/list/diseases = list() + SEND_SIGNAL(src, COMSIG_GIBS_STREAK, directions, diseases) + var/direction = pick(directions) + for(var/i in 0 to pick(0, 200; 1, 150; 2, 50)) + sleep(2) + if(i > 0) + var/obj/effect/decal/cleanable/blood/splatter/splat = new /obj/effect/decal/cleanable/blood/splatter(loc, diseases) + splat.transfer_blood_dna(blood_DNA, diseases) + if(!step_to(src, get_step(src, direction), 0)) + break + +/obj/effect/decal/cleanable/blood/gibs/up + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1") + +/obj/effect/decal/cleanable/blood/gibs/down + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1") + +/obj/effect/decal/cleanable/blood/gibs/body + random_icon_states = list("gibhead", "gibtorso") + +/obj/effect/decal/cleanable/blood/gibs/torso + random_icon_states = list("gibtorso") + +/obj/effect/decal/cleanable/blood/gibs/limb + random_icon_states = list("gibleg", "gibarm") + +/obj/effect/decal/cleanable/blood/gibs/core + random_icon_states = list("gibmid1", "gibmid2", "gibmid3") + +/obj/effect/decal/cleanable/blood/gibs/old + name = "old rotting gibs" + desc = "Space Jesus, why didn't anyone clean this up? It smells terrible." + bloodiness = 0 + +/obj/effect/decal/cleanable/blood/gibs/old/Initialize(mapload, list/datum/disease/diseases) + . = ..() + setDir(pick(GLOB.cardinals)) + icon_state += "-old" + update_icon() + +/obj/effect/decal/cleanable/blood/drip + name = "drips of blood" + desc = "It's gooey." + icon_state = "1" + random_icon_states = list("drip1","drip2","drip3","drip4","drip5") + bloodiness = 0 + var/drips = 1 + +/obj/effect/decal/cleanable/blood/drip/can_bloodcrawl_in() + return TRUE + +/obj/effect/decal/cleanable/blood/gibs/human + +/obj/effect/decal/cleanable/blood/gibs/human/Initialize(mapload, list/datum/disease/diseases) + . = ..() + update_icon() + +/obj/effect/decal/cleanable/blood/gibs/human/up + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1") + +/obj/effect/decal/cleanable/blood/gibs/human/down + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1") + +/obj/effect/decal/cleanable/blood/gibs/human/body + random_icon_states = list("gibhead", "gibtorso") + +/obj/effect/decal/cleanable/blood/gibs/human/torso + random_icon_states = list("gibtorso") + +/obj/effect/decal/cleanable/blood/gibs/human/limb + random_icon_states = list("gibleg", "gibarm") + +/obj/effect/decal/cleanable/blood/gibs/human/core + random_icon_states = list("gibmid1", "gibmid2", "gibmid3") + + +//Lizards +/obj/effect/decal/cleanable/blood/gibs/human/lizard + body_colors = "117720" + gibs_reagent_id = "liquidgibs" + gibs_bloodtype = "L" + +/obj/effect/decal/cleanable/blood/gibs/human/lizard/Initialize(mapload, list/datum/disease/diseases) + . = ..() + update_icon() + +/obj/effect/decal/cleanable/blood/gibs/human/lizard/up + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1") + +/obj/effect/decal/cleanable/blood/gibs/human/lizard/down + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1") + +/obj/effect/decal/cleanable/blood/gibs/human/lizard/body + random_icon_states = list("gibhead", "gibtorso") + +/obj/effect/decal/cleanable/blood/gibs/human/lizard/torso + random_icon_states = list("gibtorso") + +/obj/effect/decal/cleanable/blood/gibs/human/lizard/limb + random_icon_states = list("gibleg", "gibarm") + +/obj/effect/decal/cleanable/blood/gibs/human/lizard/core + random_icon_states = list("gibmid1", "gibmid2", "gibmid3") + +// Slime Gibs +/obj/effect/decal/cleanable/blood/gibs/slime + desc = "They look gooey and gruesome." + gibs_reagent_id = "liquidslimegibs" + gibs_bloodtype = "GEL" + +/obj/effect/decal/cleanable/blood/gibs/slime/Initialize(mapload, list/datum/disease/diseases) + . = ..() + update_icon() + +/obj/effect/decal/cleanable/blood/gibs/slime/update_icon() + add_atom_colour(body_colors, FIXED_COLOUR_PRIORITY) + cut_overlays() + var/mutable_appearance/guts = mutable_appearance(icon, "[icon_state]s_guts") + guts.appearance_flags = RESET_COLOR + guts.color = body_colors + add_overlay(guts) + var/mutable_appearance/flesh = mutable_appearance(icon, "[icon_state]_flesh") + flesh.appearance_flags = RESET_COLOR + flesh.color = body_colors + add_overlay(flesh) + +/obj/effect/decal/cleanable/blood/gibs/slime/up + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1") + +/obj/effect/decal/cleanable/blood/gibs/slime/down + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1") + +/obj/effect/decal/cleanable/blood/gibs/slime/body + random_icon_states = list("gibhead", "gibtorso") + +/obj/effect/decal/cleanable/blood/gibs/slime/torso + random_icon_states = list("gibtorso") + +/obj/effect/decal/cleanable/blood/gibs/slime/limb + random_icon_states = list("gibleg", "gibarm") + +/obj/effect/decal/cleanable/blood/gibs/slime/core + random_icon_states = list("gibmid1", "gibmid2", "gibmid3") + +/obj/effect/decal/cleanable/blood/gibs/synth + desc = "They look sludgy and disgusting." + gibs_reagent_id = "liquidsyntheticgibs" + gibs_bloodtype = "SY" + +/obj/effect/decal/cleanable/blood/gibs/synth/Initialize(mapload, list/datum/disease/diseases) + . = ..() + update_icon() + +//IPCs +/obj/effect/decal/cleanable/blood/gibs/ipc + desc = "They look sharp yet oozing." + body_colors = "00ff00" + gibs_reagent_id = "liquidoilgibs" + gibs_bloodtype = "HF" + +/obj/effect/decal/cleanable/blood/gibs/ipc/Initialize(mapload, list/datum/disease/diseases) + . = ..() + update_icon() + +/obj/effect/decal/cleanable/blood/gibs/ipc/update_icon() + add_atom_colour(blood_DNA_to_color(), FIXED_COLOUR_PRIORITY) + cut_overlays() + var/mutable_appearance/guts = mutable_appearance(icon, "[icon_state]r-overlay") + guts.appearance_flags = RESET_COLOR + add_overlay(guts) + +/obj/effect/decal/cleanable/blood/gibs/ipc/up + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1") + +/obj/effect/decal/cleanable/blood/gibs/ipc/down + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1") + +/obj/effect/decal/cleanable/blood/gibs/ipc/body + random_icon_states = list("gibhead", "gibtorso") + +/obj/effect/decal/cleanable/blood/gibs/ipc/torso + random_icon_states = list("gibtorso") + +/obj/effect/decal/cleanable/blood/gibs/ipc/limb + random_icon_states = list("gibleg", "gibarm") + +/obj/effect/decal/cleanable/blood/gibs/ipc/core + random_icon_states = list("gibmid1", "gibmid2", "gibmid3") diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index 35f06c2768..842b230b53 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -1,31 +1,45 @@ /obj/effect/decal/cleanable/blood name = "blood" - desc = "It's red and gooey. Perhaps it's the chef's cooking?" + desc = "It's gooey. Perhaps it's the chef's cooking?" icon = 'icons/effects/blood.dmi' icon_state = "floor1" random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7") - blood_state = BLOOD_STATE_HUMAN - bloodiness = BLOOD_AMOUNT_PER_DECAL + blood_state = BLOOD_STATE_BLOOD + bloodiness = MAX_SHOE_BLOODINESS + color = BLOOD_COLOR_HUMAN //default so we don't have white splotches everywhere. /obj/effect/decal/cleanable/blood/replace_decal(obj/effect/decal/cleanable/blood/C) - C.add_blood_DNA(return_blood_DNA()) - if (bloodiness) - if (C.bloodiness < MAX_SHOE_BLOODINESS) - C.bloodiness += bloodiness - return ..() + if (C.blood_DNA) + blood_DNA |= C.blood_DNA.Copy() + update_icon() + ..() + +/obj/effect/decal/cleanable/blood/transfer_blood_dna() + ..() + update_icon() + +/obj/effect/decal/cleanable/blood/transfer_mob_blood_dna() + . = ..() + update_icon() + +/obj/effect/decal/cleanable/blood/update_icon() + color = blood_DNA_to_color() /obj/effect/decal/cleanable/blood/old name = "dried blood" - desc = "Looks like it's been here a while. Eew." + desc = "Looks like it's been here a while. Eew." bloodiness = 0 /obj/effect/decal/cleanable/blood/old/Initialize(mapload, list/datum/disease/diseases) - icon_state += "-old" //This IS necessary because the parent /blood type uses icon randomization. - add_blood_DNA(list("Non-human DNA" = "A+")) // Needs to happen before ..() - return ..() + ..() + icon_state += "-old" + add_blood_DNA(list("Non-human DNA" = "A+")) + +/obj/effect/decal/cleanable/blood/splats + random_icon_states = list("gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5") /obj/effect/decal/cleanable/blood/splatter - random_icon_states = list("gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5") + random_icon_states = list("splatter1", "splatter2", "splatter3", "splatter4", "splatter5") /obj/effect/decal/cleanable/blood/tracks icon_state = "tracks" @@ -39,84 +53,23 @@ random_icon_states = null var/list/existing_dirs = list() +/obj/effect/decal/cleanable/trail_holder/update_icon() + color = blood_DNA_to_color() + +/obj/effect/cleanable/trail_holder/Initialize() + . = ..() + update_icon() + /obj/effect/decal/cleanable/trail_holder/can_bloodcrawl_in() return TRUE -/obj/effect/decal/cleanable/blood/gibs - name = "gibs" - desc = "They look bloody and gruesome." - icon = 'icons/effects/blood.dmi' - icon_state = "gibbl5" - layer = LOW_OBJ_LAYER - random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6") - mergeable_decal = FALSE +/obj/effect/decal/cleanable/trail_holder/transfer_blood_dna() + ..() + update_icon() -/obj/effect/decal/cleanable/blood/gibs/Initialize(mapload, list/datum/disease/diseases) +/obj/effect/decal/cleanable/trail_holder/transfer_mob_blood_dna() . = ..() - reagents.add_reagent("liquidgibs", 5) - -/obj/effect/decal/cleanable/blood/gibs/ex_act(severity, target) - return - -/obj/effect/decal/cleanable/blood/gibs/Crossed(mob/living/L) - if(istype(L) && has_gravity(loc)) - playsound(loc, 'sound/effects/gib_step.ogg', HAS_TRAIT(L, TRAIT_LIGHT_STEP) ? 20 : 50, 1) - . = ..() - -/obj/effect/decal/cleanable/blood/gibs/proc/streak(list/directions) - set waitfor = 0 - var/direction = pick(directions) - for(var/i = 0, i < pick(1, 200; 2, 150; 3, 50), i++) - sleep(2) - if(i > 0) - var/list/datum/disease/diseases - GET_COMPONENT(infective, /datum/component/infective) - if(infective) - diseases = infective.diseases - new /obj/effect/decal/cleanable/blood/splatter(loc, diseases) - if(!step_to(src, get_step(src, direction), 0)) - break - -/obj/effect/decal/cleanable/blood/gibs/up - random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1") - -/obj/effect/decal/cleanable/blood/gibs/down - random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1") - -/obj/effect/decal/cleanable/blood/gibs/body - random_icon_states = list("gibhead", "gibtorso") - -/obj/effect/decal/cleanable/blood/gibs/torso - random_icon_states = list("gibtorso") - -/obj/effect/decal/cleanable/blood/gibs/limb - random_icon_states = list("gibleg", "gibarm") - -/obj/effect/decal/cleanable/blood/gibs/core - random_icon_states = list("gibmid1", "gibmid2", "gibmid3") - -/obj/effect/decal/cleanable/blood/gibs/old - name = "old rotting gibs" - desc = "Space Jesus, why didn't anyone clean this up? It smells terrible." - bloodiness = 0 - -/obj/effect/decal/cleanable/blood/gibs/old/Initialize(mapload, list/datum/disease/diseases) - . = ..() - setDir(pick(1,2,4,8)) - icon_state += "-old" - add_blood_DNA(list("Non-human DNA" = "A+")) - -/obj/effect/decal/cleanable/blood/drip - name = "drips of blood" - desc = "It's red." - icon_state = "1" - random_icon_states = list("drip1","drip2","drip3","drip4","drip5") - bloodiness = 0 - var/drips = 1 - -/obj/effect/decal/cleanable/blood/drip/can_bloodcrawl_in() - return TRUE - + update_icon() //BLOODY FOOTPRINTS /obj/effect/decal/cleanable/blood/footprints @@ -127,15 +80,16 @@ random_icon_states = null var/entered_dirs = 0 var/exited_dirs = 0 - blood_state = BLOOD_STATE_HUMAN //the icon state to load images from + blood_state = BLOOD_STATE_BLOOD //the icon state to load images from var/list/shoe_types = list() /obj/effect/decal/cleanable/blood/footprints/Crossed(atom/movable/O) - ..() if(ishuman(O)) var/mob/living/carbon/human/H = O var/obj/item/clothing/shoes/S = H.shoes if(S && S.bloody_shoes[blood_state]) + if(color != bloodtype_to_color(S.last_bloodtype)) + return S.bloody_shoes[blood_state] = max(S.bloody_shoes[blood_state] - BLOOD_LOSS_PER_STEP, 0) shoe_types |= S.type if (!(entered_dirs & H.dir)) @@ -143,21 +97,21 @@ update_icon() /obj/effect/decal/cleanable/blood/footprints/Uncrossed(atom/movable/O) - ..() if(ishuman(O)) var/mob/living/carbon/human/H = O var/obj/item/clothing/shoes/S = H.shoes if(S && S.bloody_shoes[blood_state]) + if(color != bloodtype_to_color(S.last_bloodtype))//last entry - we check its color + return S.bloody_shoes[blood_state] = max(S.bloody_shoes[blood_state] - BLOOD_LOSS_PER_STEP, 0) shoe_types |= S.type if (!(exited_dirs & H.dir)) exited_dirs |= H.dir update_icon() - /obj/effect/decal/cleanable/blood/footprints/update_icon() + ..() cut_overlays() - for(var/Ddir in GLOB.cardinals) if(entered_dirs & Ddir) var/image/bloodstep_overlay = GLOB.bloody_footprints_cache["entered-[blood_state]-[Ddir]"] @@ -170,7 +124,7 @@ GLOB.bloody_footprints_cache["exited-[blood_state]-[Ddir]"] = bloodstep_overlay = image(icon, "[blood_state]2", dir = Ddir) add_overlay(bloodstep_overlay) - alpha = BLOODY_FOOTPRINT_BASE_ALPHA+bloodiness + alpha = BLOODY_FOOTPRINT_BASE_ALPHA + bloodiness /obj/effect/decal/cleanable/blood/footprints/examine(mob/user) @@ -179,16 +133,62 @@ . += "You recognise the footprints as belonging to:\n" for(var/shoe in shoe_types) var/obj/item/clothing/shoes/S = shoe - . += "[icon2html(initial(S.icon), user)] Some [initial(S.name)].\n" + . += "some [initial(S.name)] [icon2html(initial(S.icon), user)]\n" to_chat(user, .) /obj/effect/decal/cleanable/blood/footprints/replace_decal(obj/effect/decal/cleanable/C) if(blood_state != C.blood_state) //We only replace footprints of the same type as us return + if(color != C.color) + return ..() /obj/effect/decal/cleanable/blood/footprints/can_bloodcrawl_in() if((blood_state != BLOOD_STATE_OIL) && (blood_state != BLOOD_STATE_NOT_BLOODY)) - return 1 - return 0 + return TRUE + return FALSE + +/* Eventually TODO: make snowflake trails like baycode's +/obj/effect/decal/cleanable/blood/footprints/tracks/shoe + name = "footprints" + desc = "They look like tracks left by footwear." + icon_state = FOOTPRINT_SHOE + print_state = FOOTPRINT_SHOE + +/obj/effect/decal/cleanable/blood/footprints/tracks/foot + name = "footprints" + desc = "They look like tracks left by a bare foot." + icon_state = FOOTPRINT_FOOT + print_state = FOOTPRINT_FOOT + +/obj/effect/decal/cleanable/blood/footprints/tracks/snake + name = "tracks" + desc = "They look like tracks left by a giant snake." + icon_state = FOOTPRINT_SNAKE + print_state = FOOTPRINT_SNAKE + +/obj/effect/decal/cleanable/blood/footprints/tracks/paw + name = "footprints" + desc = "They look like tracks left by paws." + icon_state = FOOTPRINT_PAW + print_state = FOOTPRINT_PAW + +/obj/effect/decal/cleanable/blood/footprints/tracks/claw + name = "footprints" + desc = "They look like tracks left by claws." + icon_state = FOOTPRINT_CLAW + print_state = FOOTPRINT_CLAW + +/obj/effect/decal/cleanable/blood/footprints/tracks/wheels + name = "tracks" + desc = "They look like tracks left by wheels." + gender = PLURAL + icon_state = FOOTPRINT_WHEEL + print_state = FOOTPRINT_WHEEL + +/obj/effect/decal/cleanable/blood/footprints/tracks/body + name = "trails" + desc = "A trail left by something being dragged." + icon_state = FOOTPRINT_DRAG + print_state = FOOTPRINT_DRAG */ diff --git a/code/game/objects/effects/decals/cleanable/robots.dm b/code/game/objects/effects/decals/cleanable/robots.dm index 484e0438e2..02bf51bdd9 100644 --- a/code/game/objects/effects/decals/cleanable/robots.dm +++ b/code/game/objects/effects/decals/cleanable/robots.dm @@ -11,6 +11,10 @@ bloodiness = BLOOD_AMOUNT_PER_DECAL mergeable_decal = FALSE +/obj/effect/decal/cleanable/robot_debris/Initialize(mapload, list/datum/disease/diseases) + . = ..() + reagents.add_reagent("liquidoilgibs", 5) + /obj/effect/decal/cleanable/robot_debris/proc/streak(list/directions) set waitfor = 0 var/direction = pick(directions) @@ -50,6 +54,7 @@ /obj/effect/decal/cleanable/oil/Initialize() . = ..() reagents.add_reagent("oil", 30) + reagents.add_reagent("liquidoilgibs", 5) /obj/effect/decal/cleanable/oil/streak random_icon_states = list("streak1", "streak2", "streak3", "streak4", "streak5") diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 79deac475b..028110170a 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -288,7 +288,7 @@ contained = "\[[contained]\]" var/where = "[AREACOORD(location)]" - if(carry.my_atom.fingerprintslast) + if(carry.my_atom && carry.my_atom.fingerprintslast) var/mob/M = get_mob_by_key(carry.my_atom.fingerprintslast) var/more = "" if(M) diff --git a/code/game/objects/effects/proximity.dm b/code/game/objects/effects/proximity.dm index de17582f27..6c9525008d 100644 --- a/code/game/objects/effects/proximity.dm +++ b/code/game/objects/effects/proximity.dm @@ -5,7 +5,6 @@ var/list/checkers //list of /obj/effect/abstract/proximity_checkers var/current_range var/ignore_if_not_on_turf //don't check turfs in range if the host's loc isn't a turf - var/datum/component/movement_tracker /datum/proximity_monitor/New(atom/_host, range, _ignore_if_not_on_turf = TRUE) checkers = list() @@ -15,15 +14,17 @@ SetHost(_host) /datum/proximity_monitor/proc/SetHost(atom/H,atom/R) + if(H == host) + return + if(host) + UnregisterSignal(host, COMSIG_MOVABLE_MOVED) if(R) hasprox_receiver = R else if(hasprox_receiver == host) //Default case hasprox_receiver = H host = H + RegisterSignal(host, COMSIG_MOVABLE_MOVED, .proc/HandleMove) last_host_loc = host.loc - if(movement_tracker) - QDEL_NULL(movement_tracker) - movement_tracker = host.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED = CALLBACK(src, .proc/HandleMove))) SetRange(current_range,TRUE) /datum/proximity_monitor/Destroy() @@ -31,7 +32,6 @@ last_host_loc = null hasprox_receiver = null QDEL_LIST(checkers) - QDEL_NULL(movement_tracker) return ..() /datum/proximity_monitor/proc/HandleMove() diff --git a/code/game/objects/effects/spawners/gibspawner.dm b/code/game/objects/effects/spawners/gibspawner.dm index e99a2fcbc6..dd39bc567a 100644 --- a/code/game/objects/effects/spawners/gibspawner.dm +++ b/code/game/objects/effects/spawners/gibspawner.dm @@ -1,25 +1,69 @@ /obj/effect/gibspawner - var/sparks = 0 //whether sparks spread + var/sparks = FALSE //whether sparks spread var/virusProb = 20 //the chance for viruses to spread on the gibs + var/gib_mob_type //generate a fake mob to transfer DNA from if we weren't passed a mob. + var/gib_mob_species //We'll want to nip-pick their species for blood type stuff + var/sound_to_play = 'sound/effects/blobattack.ogg' + var/sound_vol = 60 var/list/gibtypes = list() //typepaths of the gib decals to spawn var/list/gibamounts = list() //amount to spawn for each gib decal type we'll spawn. var/list/gibdirections = list() //of lists of possible directions to spread each gib decal type towards. -/obj/effect/gibspawner/Initialize(mapload, datum/dna/MobDNA, list/datum/disease/diseases) +/obj/effect/gibspawner/Initialize(mapload, mob/living/source_mob, list/datum/disease/diseases) . = ..() - - if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len) - to_chat(world, "Gib list length mismatch!") + if(gibtypes.len != gibamounts.len) + stack_trace("Gib list amount length mismatch!") + return + if(gibamounts.len != gibdirections.len) + stack_trace("Gib list dir length mismatch!") return var/obj/effect/decal/cleanable/blood/gibs/gib = null + if(sound_to_play && isnum(sound_vol)) + playsound(src, sound_to_play, sound_vol, TRUE) + if(sparks) var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread s.set_up(2, 1, loc) s.start() + var/list/dna_to_add //find the dna to pass to the spawned gibs. do note this can be null if the mob doesn't have blood. add_blood_DNA() has built in null handling. + var/body_coloring = "" + if(source_mob) + dna_to_add = source_mob.get_blood_dna_list() //ez pz + if(ishuman(source_mob)) + var/mob/living/carbon/human/H = source_mob + if(H.dna.species.use_skintones) + body_coloring = "#[skintone2hex(H.skin_tone)]" + else + body_coloring = "#[H.dna.features["mcolor"]]" + + else if(gib_mob_type) + var/mob/living/temp_mob = new gib_mob_type(src) //generate a fake mob so that we pull the right type of DNA for the gibs. + if(gib_mob_species) + if(ishuman(temp_mob)) + var/mob/living/carbon/human/H = temp_mob + H.set_species(gib_mob_species) + dna_to_add = temp_mob.get_blood_dna_list() + if(H.dna.species.use_skintones) + body_coloring = "#[skintone2hex(H.skin_tone)]" + else + body_coloring = "#[H.dna.features["mcolor"]]" + qdel(H) + else + dna_to_add = temp_mob.get_blood_dna_list() + qdel(temp_mob) + else if(!issilicon(temp_mob)) + dna_to_add = temp_mob.get_blood_dna_list() + qdel(temp_mob) + else + qdel(temp_mob) + else + dna_to_add = list("Non-human DNA" = random_blood_type()) //else, generate a random bloodtype for it. + + for(var/i = 1, i<= gibtypes.len, i++) if(gibamounts[i]) for(var/j = 1, j<= gibamounts[i], j++) @@ -29,10 +73,11 @@ var/mob/living/carbon/digester = loc digester.stomach_contents += gib - if(MobDNA) + if(dna_to_add && dna_to_add.len) + gib.add_blood_DNA(dna_to_add) + gib.body_colors = body_coloring + gib.update_icon() - else if(istype(src, /obj/effect/gibspawner/generic)) // Probably a monkey - gib.add_blood_DNA(list("Non-human DNA" = "A+")) var/list/directions = gibdirections[i] if(isturf(loc)) if(directions.len) @@ -41,80 +86,158 @@ return INITIALIZE_HINT_QDEL - /obj/effect/gibspawner/generic gibtypes = list(/obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/core) - gibamounts = list(2,2,1) + gibamounts = list(2, 2, 1) + sound_vol = 40 /obj/effect/gibspawner/generic/Initialize() - playsound(src, 'sound/effects/blobattack.ogg', 40, 1) - gibdirections = list(list(WEST, NORTHWEST, SOUTHWEST, NORTH),list(EAST, NORTHEAST, SOUTHEAST, SOUTH), list()) - . = ..() + if(!gibdirections.len) + gibdirections = list(list(WEST, NORTHWEST, SOUTHWEST, NORTH),list(EAST, NORTHEAST, SOUTHEAST, SOUTH), list()) + return ..() + +/obj/effect/gibspawner/generic/animal + gib_mob_type = /mob/living/simple_animal/pet /obj/effect/gibspawner/human - gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/up, /obj/effect/decal/cleanable/blood/gibs/down, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/body, /obj/effect/decal/cleanable/blood/gibs/limb, /obj/effect/decal/cleanable/blood/gibs/core) - gibamounts = list(1,1,1,1,1,1,1) + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/human/up, /obj/effect/decal/cleanable/blood/gibs/human/down, /obj/effect/decal/cleanable/blood/gibs/human, /obj/effect/decal/cleanable/blood/gibs/human, /obj/effect/decal/cleanable/blood/gibs/human/body, /obj/effect/decal/cleanable/blood/gibs/human/limb, /obj/effect/decal/cleanable/blood/gibs/human/core) + gibamounts = list(1, 1, 1, 1, 1, 1, 1) + gib_mob_type = /mob/living/carbon/human + gib_mob_species = /datum/species/human + sound_vol = 50 /obj/effect/gibspawner/human/Initialize() - playsound(src, 'sound/effects/blobattack.ogg', 50, 1) - gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list()) - . = ..() + if(!gibdirections.len) + gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list()) + return ..() - -/obj/effect/gibspawner/humanbodypartless //only the gibs that don't look like actual full bodyparts (except torso). - gibtypes = list(/obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/core, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/core, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/torso) +/obj/effect/gibspawner/human/bodypartless //only the gibs that don't look like actual full bodyparts (except torso). + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/human, /obj/effect/decal/cleanable/blood/gibs/human/core, /obj/effect/decal/cleanable/blood/gibs/human, /obj/effect/decal/cleanable/blood/gibs/human/core, /obj/effect/decal/cleanable/blood/gibs/human, /obj/effect/decal/cleanable/blood/gibs/human/torso) gibamounts = list(1, 1, 1, 1, 1, 1) -/obj/effect/gibspawner/humanbodypartless/Initialize() - playsound(src, 'sound/effects/blobattack.ogg', 50, 1) - gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list()) - . = ..() +/obj/effect/gibspawner/human/bodypartless/Initialize() + if(!gibdirections.len) + gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list()) + return ..() +/obj/effect/gibspawner/lizard + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/human/lizard/up, /obj/effect/decal/cleanable/blood/gibs/human/lizard/down, /obj/effect/decal/cleanable/blood/gibs/human/lizard, /obj/effect/decal/cleanable/blood/gibs/human/lizard, /obj/effect/decal/cleanable/blood/gibs/human/lizard/body, /obj/effect/decal/cleanable/blood/gibs/human/lizard/limb, /obj/effect/decal/cleanable/blood/gibs/human/lizard/core) + gibamounts = list(1, 1, 1, 1, 1, 1, 1) + gib_mob_type = /mob/living/carbon/human/species/lizard + gib_mob_species = /datum/species/lizard + sound_vol = 50 + +/obj/effect/gibspawner/lizard/Initialize() + if(!gibdirections.len) + gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list()) + return ..() + +/obj/effect/gibspawner/lizard/bodypartless + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/human/lizard, /obj/effect/decal/cleanable/blood/gibs/human/lizard/core, /obj/effect/decal/cleanable/blood/gibs/human/lizard, /obj/effect/decal/cleanable/blood/gibs/human/lizard/core, /obj/effect/decal/cleanable/blood/gibs/human/lizard, /obj/effect/decal/cleanable/blood/gibs/human/lizard/torso) + gibamounts = list(1, 1, 1, 1, 1, 1) + +/obj/effect/gibspawner/lizard/bodypartless/Initialize() + if(!gibdirections.len) + gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list()) + return ..() + +/obj/effect/gibspawner/slime + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/slime/up, /obj/effect/decal/cleanable/blood/gibs/slime/down, /obj/effect/decal/cleanable/blood/gibs/slime, /obj/effect/decal/cleanable/blood/gibs/slime, /obj/effect/decal/cleanable/blood/gibs/slime/body, /obj/effect/decal/cleanable/blood/gibs/slime/limb, /obj/effect/decal/cleanable/blood/gibs/slime/core) + gibamounts = list(1, 1, 1, 1, 1, 1, 1) + gib_mob_type = /mob/living/carbon/human/species/roundstartslime + gib_mob_species = /datum/species/jelly/roundstartslime + sound_vol = 50 + +/obj/effect/gibspawner/slime/Initialize() + if(!gibdirections.len) + gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list()) + return ..() + +/obj/effect/gibspawner/slime/bodypartless //only the gibs that don't look like actual full bodyparts (except torso). + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/slime, /obj/effect/decal/cleanable/blood/gibs/slime/core, /obj/effect/decal/cleanable/blood/gibs/slime, /obj/effect/decal/cleanable/blood/gibs/slime/core, /obj/effect/decal/cleanable/blood/gibs/slime, /obj/effect/decal/cleanable/blood/gibs/slime/torso) + gibamounts = list(1, 1, 1, 1, 1, 1) + +/obj/effect/gibspawner/slime/bodypartless/Initialize() + if(!gibdirections.len) + gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list()) + return ..() + +/obj/effect/gibspawner/ipc + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/ipc/up, /obj/effect/decal/cleanable/blood/gibs/ipc/down, /obj/effect/decal/cleanable/blood/gibs/ipc, /obj/effect/decal/cleanable/blood/gibs/ipc, /obj/effect/decal/cleanable/blood/gibs/ipc/body, /obj/effect/decal/cleanable/blood/gibs/ipc/limb, /obj/effect/decal/cleanable/blood/gibs/ipc/core) + gibamounts = list(1, 1, 1, 1, 1, 1, 1) + gib_mob_type = /mob/living/carbon/human/species/ipc + gib_mob_species = /datum/species/ipc + sound_vol = 50 + sparks = TRUE + sound_to_play = 'sound/effects/bang.ogg' + +/obj/effect/gibspawner/ipc/Initialize() + if(!gibdirections.len) + gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list()) + return ..() + +/obj/effect/gibspawner/ipc/bodypartless //only the gibs that don't look like actual full bodyparts (except torso). + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/ipc, /obj/effect/decal/cleanable/blood/gibs/ipc/core, /obj/effect/decal/cleanable/blood/gibs/ipc, /obj/effect/decal/cleanable/blood/gibs/ipc/core, /obj/effect/decal/cleanable/blood/gibs/ipc, /obj/effect/decal/cleanable/blood/gibs/ipc/torso) + gibamounts = list(1, 1, 1, 1, 1, 1) + +/obj/effect/gibspawner/ipc/bodypartless/Initialize() + if(!gibdirections.len) + gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list()) + return ..() /obj/effect/gibspawner/xeno - gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs/up, /obj/effect/decal/cleanable/xenoblood/xgibs/down, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/body, /obj/effect/decal/cleanable/xenoblood/xgibs/limb, /obj/effect/decal/cleanable/xenoblood/xgibs/core) - gibamounts = list(1,1,1,1,1,1,1) + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno/up, /obj/effect/decal/cleanable/blood/gibs/xeno/down, /obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/xeno/body, /obj/effect/decal/cleanable/blood/gibs/xeno/limb, /obj/effect/decal/cleanable/blood/gibs/xeno/core) + gibamounts = list(1, 1, 1, 1, 1, 1, 1) + gib_mob_type = /mob/living/carbon/alien /obj/effect/gibspawner/xeno/Initialize() - playsound(src, 'sound/effects/blobattack.ogg', 60, 1) - gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list()) - . = ..() + if(!gibdirections.len) + gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list()) + return ..() - -/obj/effect/gibspawner/xenobodypartless //only the gibs that don't look like actual full bodyparts (except torso). - gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/core, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/core, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/torso) +/obj/effect/gibspawner/xeno/bodypartless //only the gibs that don't look like actual full bodyparts (except torso). + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/xeno/core, /obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/xeno/core, /obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/xeno/torso) gibamounts = list(1, 1, 1, 1, 1, 1) +/obj/effect/gibspawner/xeno/bodypartless/Initialize() + if(!gibdirections.len) + gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list()) + return ..() -/obj/effect/gibspawner/xenobodypartless/Initialize() - playsound(src, 'sound/effects/blobattack.ogg', 60, 1) - gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list()) - . = ..() +/obj/effect/gibspawner/xeno/xenoperson + gib_mob_type = /mob/living/carbon/human/species/xeno + gib_mob_species = /datum/species/xeno + +/obj/effect/gibspawner/xeno/xenoperson/bodypartless /obj/effect/gibspawner/larva - gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva/body, /obj/effect/decal/cleanable/xenoblood/xgibs/larva/body) + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno/larva, /obj/effect/decal/cleanable/blood/gibs/xeno/larva, /obj/effect/decal/cleanable/blood/gibs/xeno/larva/body, /obj/effect/decal/cleanable/blood/gibs/xeno/larva/body) gibamounts = list(1, 1, 1, 1) + gib_mob_type = /mob/living/carbon/alien/larva /obj/effect/gibspawner/larva/Initialize() - playsound(src, 'sound/effects/blobattack.ogg', 60, 1) - gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST), list(), GLOB.alldirs) - . = ..() + if(!gibdirections.len) + gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST), list(), GLOB.alldirs) + return ..() -/obj/effect/gibspawner/larvabodypartless - gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva) +/obj/effect/gibspawner/larva/bodypartless + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno/larva, /obj/effect/decal/cleanable/blood/gibs/xeno/larva, /obj/effect/decal/cleanable/blood/gibs/xeno/larva) gibamounts = list(1, 1, 1) -/obj/effect/gibspawner/larvabodypartless/Initialize() - playsound(src, 'sound/effects/blobattack.ogg', 60, 1) - gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST), list()) - . = ..() +/obj/effect/gibspawner/larva/bodypartless/Initialize() + if(!gibdirections.len) + gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST), list()) + return ..() /obj/effect/gibspawner/robot - sparks = 1 + sparks = TRUE gibtypes = list(/obj/effect/decal/cleanable/robot_debris/up, /obj/effect/decal/cleanable/robot_debris/down, /obj/effect/decal/cleanable/robot_debris, /obj/effect/decal/cleanable/robot_debris, /obj/effect/decal/cleanable/robot_debris, /obj/effect/decal/cleanable/robot_debris/limb) - gibamounts = list(1,1,1,1,1,1) + gibamounts = list(1, 1, 1, 1, 1, 1) + gib_mob_type = /mob/living/silicon/robot /obj/effect/gibspawner/robot/Initialize() - gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs) - gibamounts[6] = pick(0,1,2) - . = ..() + if(!gibdirections.len) + gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs) + gibamounts[6] = pick(0, 1, 2) + return ..() + diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index 7d02d9d383..fbad000098 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -6,7 +6,9 @@ layer = BELOW_MOB_LAYER var/splatter_type = "splatter" -/obj/effect/temp_visual/dir_setting/bloodsplatter/Initialize(mapload, set_dir) +/obj/effect/temp_visual/dir_setting/bloodsplatter/Initialize(mapload, set_dir, new_color) + if(new_color) + color = new_color if(set_dir in GLOB.diagonals) icon_state = "[splatter_type][pick(1, 2, 6)]" else @@ -41,7 +43,7 @@ animate(src, pixel_x = target_pixel_x, pixel_y = target_pixel_y, alpha = 0, time = duration) /obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter - splatter_type = "xsplatter" + color = BLOOD_COLOR_XENO /obj/effect/temp_visual/dir_setting/speedbike_trail name = "speedbike trails" diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index c98cef2b87..9ce2e66abf 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -111,7 +111,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) var/list/grind_results //A reagent list containing the reagents this item produces when ground up in a grinder - this can be an empty list to allow for reagent transferring only var/list/juice_results //A reagent list containing blah blah... but when JUICED in a grinder! - /obj/item/Initialize() materials = typelist("materials", materials) @@ -408,12 +407,12 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) SEND_SIGNAL(src, COMSIG_ITEM_EQUIPPED, user, slot) for(var/X in actions) var/datum/action/A = X - if(item_action_slot_check(slot, user)) //some items only give their actions buttons when in a specific slot. + if(item_action_slot_check(slot, user, A)) //some items only give their actions buttons when in a specific slot. A.Grant(user) item_flags |= IN_INVENTORY //sometimes we only want to grant the item's action if it's equipped in a specific slot. -/obj/item/proc/item_action_slot_check(slot, mob/user) +/obj/item/proc/item_action_slot_check(slot, mob/user, datum/action/A) if(slot == SLOT_IN_BACKPACK || slot == SLOT_LEGCUFFED) //these aren't true slots, so avoid granting actions there return FALSE return TRUE @@ -421,10 +420,10 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) //the mob M is attempting to equip this item into the slot passed through as 'slot'. Return 1 if it can do this and 0 if it can't. //if this is being done by a mob other than M, it will include the mob equipper, who is trying to equip the item to mob M. equipper will be null otherwise. //If you are making custom procs but would like to retain partial or complete functionality of this one, include a 'return ..()' to where you want this to happen. -//Set disable_warning to 1 if you wish it to not give you outputs. +//Set disable_warning to TRUE if you wish it to not give you outputs. /obj/item/proc/mob_can_equip(mob/living/M, mob/living/equipper, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE) if(!M) - return 0 + return FALSE return M.can_equip(src, slot, disable_warning, bypass_equip_delay_self) @@ -514,12 +513,12 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) log_combat(user, M, "attacked", "[src.name]", "(INTENT: [uppertext(user.a_intent)])") - M.adjust_blurriness(3) - M.adjust_eye_damage(rand(2,4)) var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES) if (!eyes) return - if(eyes.eye_damage >= 10) + M.adjust_blurriness(3) + eyes.applyOrganDamage(rand(2,4)) + if(eyes.damage >= 10) M.adjust_blurriness(15) if(M.stat != DEAD) to_chat(M, "Your eyes start to bleed profusely!") @@ -533,10 +532,21 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) M.adjust_blurriness(10) M.Unconscious(20) M.Knockdown(40) - if (prob(eyes.eye_damage - 10 + 1)) + if (prob(eyes.damage - 10 + 1)) M.become_blind(EYE_DAMAGE) to_chat(M, "You go blind!") +/obj/item/clean_blood() + . = ..() + if(.) + if(blood_splatter_icon) + cut_overlay(blood_splatter_icon) + +/obj/item/clothing/gloves/clean_blood() + . = ..() + if(.) + transfer_blood = 0 + /obj/item/singularity_pull(S, current_size) ..() if(current_size >= STAGE_FOUR) diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index cf706359f7..5e798e1281 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -439,6 +439,9 @@ RLD /obj/item/construction/rcd/proc/rcd_create(atom/A, mob/user) var/list/rcd_results = A.rcd_vals(user, src) + var/turf/the_turf = get_turf(A) + var/turf_coords = "[COORD(the_turf)]" + investigate_log("[user] is attempting to use [src] on [A] (loc [turf_coords] at [the_turf]) with cost [rcd_results["cost"]], delay [rcd_results["delay"]], mode [rcd_results["mode"]].", INVESTIGATE_RCD) if(!rcd_results) return FALSE if(do_after(user, rcd_results["delay"] * delay_mod, target = A)) @@ -447,7 +450,7 @@ RLD if(A.rcd_act(user, src, rcd_results["mode"])) useResource(rcd_results["cost"], user) activate() - investigate_log("[user] used [src] on [cached] (now [A]) with cost [rcd_results["cost"]], delay [rcd_results["delay"]], mode [rcd_results["mode"]].", INVESTIGATE_RCD) + investigate_log("[user] used [src] on [cached] (loc [turf_coords] at [the_turf]) with cost [rcd_results["cost"]], delay [rcd_results["delay"]], mode [rcd_results["mode"]].", INVESTIGATE_RCD) playsound(src, 'sound/machines/click.ogg', 50, 1) return TRUE diff --git a/code/game/objects/items/RCL.dm b/code/game/objects/items/RCL.dm index 63f460f9aa..93293155a3 100644 --- a/code/game/objects/items/RCL.dm +++ b/code/game/objects/items/RCL.dm @@ -20,8 +20,8 @@ var/ghetto = FALSE lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' - var/datum/component/mobhook var/datum/radial_menu/persistent/wiring_gui_menu + var/mob/listeningTo /obj/item/twohanded/rcl/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/stack/cable_coil)) @@ -86,7 +86,7 @@ /obj/item/twohanded/rcl/Destroy() QDEL_NULL(loaded) last = null - QDEL_NULL(mobhook) + listeningTo = null QDEL_NULL(wiring_gui_menu) return ..() @@ -141,9 +141,8 @@ /obj/item/twohanded/rcl/dropped(mob/wearer) ..() - if(mobhook) - active = FALSE - QDEL_NULL(mobhook) + UnregisterSignal(wearer, COMSIG_MOVABLE_MOVED) + listeningTo = null last = null /obj/item/twohanded/rcl/attack_self(mob/user) @@ -158,13 +157,12 @@ break obj/item/twohanded/rcl/proc/getMobhook(mob/to_hook) - if(to_hook) - if(mobhook && mobhook.parent != to_hook) - QDEL_NULL(mobhook) - if (!mobhook) - mobhook = to_hook.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED = CALLBACK(src, .proc/trigger))) - else - QDEL_NULL(mobhook) + if(listeningTo == to_hook) + return + if(listeningTo) + UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) + RegisterSignal(to_hook, COMSIG_MOVABLE_MOVED, .proc/trigger) + listeningTo = to_hook /obj/item/twohanded/rcl/proc/trigger(mob/user) if(active) diff --git a/code/game/objects/items/RSF.dm b/code/game/objects/items/RSF.dm index 01205ee889..9c343c2e06 100644 --- a/code/game/objects/items/RSF.dm +++ b/code/game/objects/items/RSF.dm @@ -182,7 +182,7 @@ RSF to_chat(user, "Fabricating Cookie..") var/obj/item/reagent_containers/food/snacks/cookie/S = new /obj/item/reagent_containers/food/snacks/cookie(T) if(toxin) - S.reagents.add_reagent("chloralhydratedelayed", 10) + S.reagents.add_reagent("chloralhydrate", 10) if (iscyborg(user)) var/mob/living/silicon/robot/R = user R.cell.charge -= 100 diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index 699efaac2e..10fbab56be 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -153,7 +153,9 @@ /area/centcom, /area/asteroid, /area/tdome, - /area/wizard_station + /area/wizard_station, + /area/hilbertshotel, + /area/hilbertshotelstorage ) for (var/type in SPECIALS) if ( istype(A,type) ) diff --git a/code/game/objects/items/body_egg.dm b/code/game/objects/items/body_egg.dm index 80fc0f43fd..f0d20afbbd 100644 --- a/code/game/objects/items/body_egg.dm +++ b/code/game/objects/items/body_egg.dm @@ -17,26 +17,27 @@ /obj/item/organ/body_egg/Insert(var/mob/living/carbon/M, special = 0) ..() ADD_TRAIT(owner, TRAIT_XENO_HOST, TRAIT_GENERIC) - START_PROCESSING(SSobj, src) owner.med_hud_set_status() INVOKE_ASYNC(src, .proc/AddInfectionImages, owner) /obj/item/organ/body_egg/Remove(var/mob/living/carbon/M, special = 0) - STOP_PROCESSING(SSobj, src) if(owner) REMOVE_TRAIT(owner, TRAIT_XENO_HOST, TRAIT_GENERIC) owner.med_hud_set_status() INVOKE_ASYNC(src, .proc/RemoveInfectionImages, owner) ..() -/obj/item/organ/body_egg/process() +/obj/item/organ/body_egg/on_death() + . = ..() if(!owner) return - if(!(src in owner.internal_organs)) - Remove(owner) - return egg_process() +/obj/item/organ/body_egg/on_life() + . = ..() + egg_process() + + /obj/item/organ/body_egg/proc/egg_process() return @@ -44,8 +45,8 @@ RemoveInfectionImages() AddInfectionImages() -/obj/item/organ/body_egg/proc/AddInfectionImages() +/obj/item/organ/body_egg/proc/AddInfectionImages(mob/living/carbon/C) return -/obj/item/organ/body_egg/proc/RemoveInfectionImages() +/obj/item/organ/body_egg/proc/RemoveInfectionImages(mob/living/carbon/C) return diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 05ffcbf2fd..0e422a3fe9 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -80,6 +80,7 @@ righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' item_flags = NO_MAT_REDEMPTION | NOBLUDGEON var/prox_check = TRUE //If the emag requires you to be in range + var/uses = 15 /obj/item/card/emag/bluespace name = "bluespace cryptographic sequencer" @@ -110,6 +111,37 @@ user.visible_message("[src] fizzles and sparks. It seems like it's out of charges.") playsound(src, 'sound/effects/light_flicker.ogg', 100, 1) +/obj/item/card/emag/examine(mob/user) + . = ..() + to_chat(user, "It has [uses ? uses : "no"] charges left.") + +/obj/item/card/emag/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/emagrecharge)) + var/obj/item/emagrecharge/ER = W + if(ER.uses) + uses += ER.uses + to_chat(user, "You have added [ER.uses] charges to [src]. It now has [uses] charges.") + playsound(src, "sparks", 100, 1) + ER.uses = 0 + else + to_chat(user, "[ER] has no charges left.") + return + . = ..() + +/obj/item/emagrecharge + name = "electromagnet charging device" + desc = "A small cell with two prongs lazily jabbed into it. It looks like it's made for charging the small batteries found in electromagnetic devices, sadly this can't be recharged like a normal cell." + icon = 'icons/obj/module.dmi' + icon_state = "cell_mini" + item_flags = NOBLUDGEON + var/uses = 5 //Dictates how many charges the device adds to compatible items + +/obj/item/emagrecharge/examine(mob/user) + . = ..() + if(uses) + to_chat(user, "It can add up to [uses] charges to compatible devices") + else + to_chat(user, "It has a small, red, blinking light coming from inside of it. It's spent.") /obj/item/card/emagfake desc = "It's a card with a magnetic strip attached to some circuitry. Closer inspection shows that this card is a poorly made replica, with a \"DonkCo\" logo stamped on the back." @@ -342,12 +374,41 @@ update_label("John Doe", "Clowny") lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' assignment = "Prisoner" - registered_name = "Scum" + access = list(ACCESS_ENTER_GENPOP) + + //Lavaland labor camp var/goal = 0 //How far from freedom? var/points = 0 + //Genpop + var/sentence = 0 //When world.time is greater than this number, the card will have its ACCESS_ENTER_GENPOP access replaced with ACCESS_LEAVE_GENPOP the next time it's checked, unless this value is 0/null + var/crime= "\[REDACTED\]" -/obj/item/card/id/prisoner/attack_self(mob/user) - to_chat(usr, "You have accumulated [points] out of the [goal] points you need for freedom.") +/obj/item/card/id/prisoner/GetAccess() + if((sentence && world.time >= sentence) || (goal && points >= goal)) + access = list(ACCESS_LEAVE_GENPOP) + return ..() + +/obj/item/card/id/prisoner/process() + if(!sentence) + STOP_PROCESSING(SSobj, src) + return + if(world.time >= sentence) + playsound(loc, 'sound/machines/ping.ogg', 50, 1) + if(isliving(loc)) + to_chat(loc, "[src] buzzes: You have served your sentence! You may now exit prison through the turnstiles and collect your belongings.") + STOP_PROCESSING(SSobj, src) + return + +/obj/item/card/id/prisoner/examine(mob/user) + . = ..() + if(sentence && world.time < sentence) + to_chat(user, "You're currently serving a sentence for [crime]. [DisplayTimeText(sentence - world.time)] left.") + else if(goal) + to_chat(user, "You have accumulated [points] out of the [goal] points you need for freedom.") + else if(!sentence) + to_chat(user, "You are currently serving a permanent sentence for [crime].") + else + to_chat(user, "Your sentence is up! You're free!") /obj/item/card/id/prisoner/one name = "Prisoner #13-001" @@ -422,3 +483,58 @@ update_label("John Doe", "Clowny") name = "APC Access ID" desc = "A special ID card that allows access to APC terminals." access = list(ACCESS_ENGINE_EQUIP) + +//Polychromatic Knight Badge + +/obj/item/card/id/knight + var/id_color = "#00FF00" //defaults to green + name = "knight badge" + icon_state = "knight" + desc = "A badge denoting the owner as a knight! It has a strip for swiping like an ID" + +/obj/item/card/id/knight/update_label(newname, newjob) + if(newname || newjob) + name = "[(!newname) ? "knight badge" : "[newname]'s Knight Badge"][(!newjob) ? "" : " ([newjob])"]" + return + + name = "[(!registered_name) ? "knight badge" : "[registered_name]'s Knight Badge"][(!assignment) ? "" : " ([assignment])"]" + +/obj/item/card/id/knight/update_icon() + var/mutable_appearance/id_overlay = mutable_appearance(icon, "knight_overlay") + + if(id_color) + id_overlay.color = id_color + cut_overlays() + + add_overlay(id_overlay) + +/obj/item/card/id/knight/AltClick(mob/living/user) + . = ..() + if(!in_range(src, user)) //Basic checks to prevent abuse + 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 id?", "Confirm Repaint", "Yes", "No") == "Yes") + var/energy_color_input = input(usr,"","Choose Energy Color",id_color) as color|null + if(!in_range(src, user) || !energy_color_input) + return + if(user.incapacitated() || !istype(user)) + to_chat(user, "You can't do that right now!") + return + id_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1) + update_icon() + +/obj/item/card/id/knight/Initialize() + . = ..() + update_icon() + +/obj/item/card/id/knight/examine(mob/user) + ..() + to_chat(user, "Alt-click to recolor it.") + +/obj/item/card/id/knight/blue + id_color = "#0000FF" + +/obj/item/card/id/knight/captain + id_color = "#FFD700" \ No newline at end of file diff --git a/code/game/objects/items/chrono_eraser.dm b/code/game/objects/items/chrono_eraser.dm index 5db5aa416e..911a07c288 100644 --- a/code/game/objects/items/chrono_eraser.dm +++ b/code/game/objects/items/chrono_eraser.dm @@ -37,7 +37,7 @@ PA = new(src) user.put_in_hands(PA) -/obj/item/chrono_eraser/item_action_slot_check(slot, mob/user) +/obj/item/chrono_eraser/item_action_slot_check(slot, mob/user, datum/action/A) if(slot == SLOT_BACK) return 1 diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index c260a95afd..ac7879f9ec 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -59,7 +59,7 @@ name = "Department Management Console (Computer Board)" build_path = /obj/machinery/computer/card/minor var/target_dept = 1 - var/list/dept_list = list("General","Security","Medical","Science","Engineering") + var/list/dept_list = list("Civilian","Security","Medical","Science","Engineering","Cargo") /obj/item/circuitboard/computer/card/minor/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/screwdriver)) diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 2a01a7e18f..1059a310eb 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -31,6 +31,15 @@ /obj/item/stock_parts/manipulator = 1, /obj/item/stack/sheet/glass = 1) +/obj/item/circuitboard/machine/bloodbankgen + name = "Blood Bank Generator (Machine Board)" + build_path = /obj/machinery/bloodbankgen + req_components = list( + /obj/item/stock_parts/matter_bin = 1, + /obj/item/stock_parts/manipulator = 1, + /obj/item/stack/cable_coil = 5, + /obj/item/stack/sheet/glass = 1) + /obj/item/circuitboard/machine/clonepod name = "Clone Pod (Machine Board)" build_path = /obj/machinery/clonepod @@ -399,6 +408,7 @@ /obj/machinery/smartfridge/food = "food", /obj/machinery/smartfridge/drinks = "drinks", /obj/machinery/smartfridge/extract = "slimes", + /obj/machinery/smartfridge/organ = "organs", /obj/machinery/smartfridge/chemistry = "chems", /obj/machinery/smartfridge/chemistry/virology = "viruses", /obj/machinery/smartfridge/disks = "disks") diff --git a/code/game/objects/items/control_wand.dm b/code/game/objects/items/control_wand.dm index fa4524528b..c98484b81e 100644 --- a/code/game/objects/items/control_wand.dm +++ b/code/game/objects/items/control_wand.dm @@ -33,7 +33,7 @@ // Airlock remote works by sending NTNet packets to whatever it's pointed at. /obj/item/door_remote/afterattack(atom/A, mob/user) . = ..() - GET_COMPONENT_FROM(target_interface, /datum/component/ntnet_interface, A) + var/datum/component/ntnet_interface/target_interface = A.GetComponent(/datum/component/ntnet_interface) if(!target_interface) return diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 99d6c874e8..d014f70315 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -1,6 +1,9 @@ #define RANDOM_GRAFFITI "Random Graffiti" #define RANDOM_LETTER "Random Letter" +#define RANDOM_PUNCTUATION "Random Punctuation" #define RANDOM_NUMBER "Random Number" +#define RANDOM_SYMBOL "Random Symbol" +#define RANDOM_DRAWING "Random Drawing" #define RANDOM_ORIENTED "Random Oriented" #define RANDOM_RUNE "Random Rune" #define RANDOM_ANY "Random Anything" @@ -32,16 +35,16 @@ var/drawtype var/text_buffer = "" - var/list/graffiti = list("amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa","body","cyka","arrow","star","poseur tag","prolizard","antilizard", "tile") //cit edit - var/list/letters = list("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z") - var/list/numerals = list("0","1","2","3","4","5","6","7","8","9") - var/list/oriented = list("arrow","body") // These turn to face the same way as the drawer - var/list/runes = list("rune1","rune2","rune3","rune4","rune5","rune6") - var/list/randoms = list(RANDOM_ANY, RANDOM_RUNE, RANDOM_ORIENTED, - RANDOM_NUMBER, RANDOM_GRAFFITI, RANDOM_LETTER) - var/list/graffiti_large_h = list("yiffhell", "secborg", "paint") + var/static/list/graffiti = list("amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa","body","cyka","star","poseur tag","prolizard","antilizard", "tile") + var/static/list/symbols = list("danger","firedanger","electricdanger","biohazard","radiation","safe","evac","space","med","trade","shop","food","peace","like","skull","nay","heart","credit") + var/static/list/drawings = list("smallbrush","brush","largebrush","splatter","snake","stickman","carp","ghost","clown","taser","disk","fireaxe","toolbox","corgi","cat","toilet","blueprint","beepsky","scroll","bottle","shotgun") + var/static/list/oriented = list("arrow","line","thinline","shortline","body","chevron","footprint","clawprint","pawprint") // These turn to face the same way as the drawer + var/static/list/runes = list("rune1","rune2","rune3","rune4","rune5","rune6") + var/static/list/randoms = list(RANDOM_ANY, RANDOM_RUNE, RANDOM_ORIENTED, + RANDOM_NUMBER, RANDOM_GRAFFITI, RANDOM_LETTER, RANDOM_SYMBOL, RANDOM_PUNCTUATION, RANDOM_DRAWING) + var/static/list/graffiti_large_h = list("yiffhell", "secborg", "paint") - var/list/all_drawables + var/static/list/all_drawables = graffiti + symbols + drawings + oriented + runes + graffiti_large_h var/paint_mode = PAINT_NORMAL @@ -54,8 +57,6 @@ var/instant = FALSE var/self_contained = TRUE // If it deletes itself when it is empty - var/list/validSurfaces = list(/turf/open/floor) - var/edible = TRUE // That doesn't mean eating it is a good idea var/list/reagent_contents = list("nutriment" = 1) @@ -71,6 +72,9 @@ var/datum/team/gang/gang //For marking territory. var/gang_tag_delay = 30 //this is the delay for gang mode tag applications on anything that gang = true on. +/obj/item/toy/crayon/proc/isValidSurface(surface) + return istype(surface, /turf/open/floor) + /obj/item/toy/crayon/suicide_act(mob/user) user.visible_message("[user] is jamming [src] up [user.p_their()] nose and into [user.p_their()] brain. It looks like [user.p_theyre()] trying to commit suicide!") return (BRUTELOSS|OXYLOSS) @@ -81,7 +85,6 @@ if(name == "crayon") name = "[item_color] crayon" - all_drawables = graffiti + letters + numerals + oriented + runes + graffiti_large_h drawtype = pick(all_drawables) refill() @@ -153,55 +156,62 @@ to_chat(user, "The cap on [src] is now [is_capped ? "on" : "off"].") update_icon() -/obj/item/toy/crayon/ui_data() - var/list/data = list() - data["drawables"] = list() - var/list/D = data["drawables"] +/obj/item/toy/crayon/proc/staticDrawables() + + . = list() var/list/g_items = list() - D += list(list("name" = "Graffiti", "items" = g_items)) + . += list(list("name" = "Graffiti", "items" = g_items)) for(var/g in graffiti) g_items += list(list("item" = g)) var/list/glh_items = list() - D += list(list("name" = "Graffiti Large Horizontal", "items" = glh_items)) + . += list(list("name" = "Graffiti Large Horizontal", "items" = glh_items)) for(var/glh in graffiti_large_h) glh_items += list(list("item" = glh)) - var/list/L_items = list() - D += list(list("name" = "Letters", "items" = L_items)) - for(var/L in letters) - L_items += list(list("item" = L)) + var/list/S_items = list() + . += list(list("name" = "Symbols", "items" = S_items)) + for(var/S in symbols) + S_items += list(list("item" = S)) - var/list/N_items = list() - D += list(list(name = "Numerals", "items" = N_items)) - for(var/N in numerals) - N_items += list(list("item" = N)) + var/list/D_items = list() + . += list(list("name" = "Drawings", "items" = D_items)) + for(var/D in drawings) + D_items += list(list("item" = D)) var/list/O_items = list() - D += list(list(name = "Oriented", "items" = O_items)) + . += list(list(name = "Oriented", "items" = O_items)) for(var/O in oriented) O_items += list(list("item" = O)) var/list/R_items = list() - D += list(list(name = "Runes", "items" = R_items)) + . += list(list(name = "Runes", "items" = R_items)) for(var/R in runes) R_items += list(list("item" = R)) var/list/rand_items = list() - D += list(list(name = "Random", "items" = rand_items)) + . += list(list(name = "Random", "items" = rand_items)) for(var/i in randoms) rand_items += list(list("item" = i)) - data["selected_stencil"] = drawtype - data["text_buffer"] = text_buffer - data["has_cap"] = has_cap - data["is_capped"] = is_capped - data["can_change_colour"] = can_change_colour - data["current_colour"] = paint_color +/obj/item/toy/crayon/ui_data() - return data + var/static/list/crayon_drawables + + if (!crayon_drawables) + crayon_drawables = staticDrawables() + + . = list() + .["drawables"] = crayon_drawables + .["selected_stencil"] = drawtype + .["text_buffer"] = text_buffer + + .["has_cap"] = has_cap + .["is_capped"] = is_capped + .["can_change_colour"] = can_change_colour + .["current_colour"] = paint_color /obj/item/toy/crayon/ui_act(action, list/params) if(..()) @@ -216,6 +226,7 @@ if(stencil in all_drawables + randoms) drawtype = stencil . = TRUE + text_buffer = "" if(stencil in graffiti_large_h) paint_mode = PAINT_LARGE_HORIZONTAL text_buffer = "" @@ -223,8 +234,13 @@ paint_mode = PAINT_NORMAL if("select_colour") if(can_change_colour) - paint_color = input(usr,"","Choose Color",paint_color) as color|null - . = TRUE + var/chosen_colour = input(usr,"","Choose Color",paint_color) as color|null + + if (!isnull(chosen_colour)) + paint_color = chosen_colour + . = TRUE + else + . = FALSE if("enter_text") var/txt = stripped_input(usr,"Choose what to write.", "Scribbles",default = text_buffer) @@ -235,18 +251,16 @@ update_icon() /obj/item/toy/crayon/proc/crayon_text_strip(text) - var/list/base = string2charlist(lowertext(text)) - var/list/out = list() - for(var/a in base) - if(a in (letters|numerals)) - out += a - return jointext(out,"") + var/static/regex/crayon_r = new /regex(@"[^\w!?,.=%#&+\/\-]") + return replacetext(lowertext(text), crayon_r, "") /obj/item/toy/crayon/afterattack(atom/target, mob/user, proximity, params) . = ..() if(!proximity || !check_allowed_items(target)) return + var/static/list/punctuation = list("!","?",".",",","/","+","-","=","%","#","&") + var/cost = 1 if(paint_mode == PAINT_LARGE_HORIZONTAL) cost = 5 @@ -264,13 +278,19 @@ if(istype(target, /obj/effect/decal/cleanable)) target = target.loc - if(!is_type_in_list(target,validSurfaces)) + if(!isValidSurface(target)) return var/drawing = drawtype switch(drawtype) if(RANDOM_LETTER) - drawing = pick(letters) + drawing = ascii2text(rand(97, 122)) // a-z + if(RANDOM_PUNCTUATION) + drawing = pick(punctuation) + if(RANDOM_SYMBOL) + drawing = pick(symbols) + if(RANDOM_DRAWING) + drawing = pick(drawings) if(RANDOM_GRAFFITI) drawing = pick(graffiti) if(RANDOM_RUNE) @@ -278,17 +298,24 @@ if(RANDOM_ORIENTED) drawing = pick(oriented) if(RANDOM_NUMBER) - drawing = pick(numerals) + drawing = ascii2text(rand(48, 57)) // 0-9 if(RANDOM_ANY) drawing = pick(all_drawables) var/temp = "rune" - if(drawing in letters) + var/ascii = (length(drawing) == 1) ? TRUE : FALSE + if(ascii && is_alpha(drawing)) temp = "letter" - else if(drawing in graffiti) - temp = "graffiti" - else if(drawing in numerals) + else if(ascii && is_digit(drawing)) temp = "number" + else if(drawing in punctuation) + temp = "punctuation mark" + else if(drawing in symbols) + temp = "symbol" + else if(drawing in drawings) + temp = "drawing" + else if(drawing in graffiti|oriented) + temp = "graffiti" // If a gang member is using a gang spraycan, it'll behave differently var/gang_mode = FALSE @@ -338,7 +365,7 @@ return if(length(text_buffer)) - drawing = copytext(text_buffer,1,2) + drawing = text_buffer[1] var/list/turf/affected_turfs = list() @@ -362,7 +389,7 @@ if(PAINT_LARGE_HORIZONTAL) var/turf/left = locate(target.x-1,target.y,target.z) var/turf/right = locate(target.x+1,target.y,target.z) - if(is_type_in_list(left, validSurfaces) && is_type_in_list(right, validSurfaces)) + if(isValidSurface(left) && isValidSurface(right)) var/obj/effect/decal/cleanable/crayon/C = new(left, paint_color, drawing, temp, graf_rot, PAINT_LARGE_HORIZONTAL_ICON) C.add_hiddenprint(user) affected_turfs += left @@ -377,8 +404,9 @@ else to_chat(user, "You spray a [temp] on \the [target.name]") - if(length(text_buffer)) + if(length(text_buffer) > 1) text_buffer = copytext(text_buffer,2) + SStgui.update_uis(src) if(post_noise) audible_message("You hear spraying.") @@ -516,7 +544,7 @@ charges = -1 -/obj/item/toy/crayon/rainbow/afterattack(atom/target, mob/user, proximity) +/obj/item/toy/crayon/rainbow/afterattack(atom/target, mob/user, proximity, params) paint_color = rgb(rand(0,255), rand(0,255), rand(0,255)) . = ..() @@ -533,7 +561,7 @@ /obj/item/storage/crayons/Initialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 7 STR.can_hold = typecacheof(list(/obj/item/toy/crayon)) @@ -591,12 +619,14 @@ can_change_colour = TRUE gang = TRUE //Gang check is true for all things upon the honored hierarchy of spraycans, except those that are FALSE. - validSurfaces = list(/turf/open/floor, /turf/closed/wall) reagent_contents = list("welding_fuel" = 1, "ethanol" = 1) pre_noise = TRUE post_noise = FALSE +/obj/item/toy/crayon/spraycan/isValidSurface(surface) + return (istype(surface, /turf/open/floor) || istype(surface, /turf/closed/wall)) + /obj/item/toy/crayon/spraycan/suicide_act(mob/user) var/mob/living/carbon/human/H = user if(is_capped || !actually_paints) @@ -622,8 +652,8 @@ return (OXYLOSS) -/obj/item/toy/crayon/spraycan/New() - ..() +/obj/item/toy/crayon/spraycan/Initialize() + . = ..() // If default crayon red colour, pick a more fun spraycan colour if(!paint_color) paint_color = pick("#DA0000","#FF9300","#FFF200","#A8E61D","#00B7EF", @@ -640,7 +670,7 @@ to_chat(user, "It is empty.") to_chat(user, "Alt-click [src] to [ is_capped ? "take the cap off" : "put the cap on"].") -/obj/item/toy/crayon/spraycan/afterattack(atom/target, mob/user, proximity) +/obj/item/toy/crayon/spraycan/afterattack(atom/target, mob/user, proximity, params) if(!proximity) return @@ -656,8 +686,7 @@ playsound(user.loc, 'sound/effects/spray.ogg', 25, 1, 5) var/mob/living/carbon/C = target - user.visible_message("[user] sprays [src] into the face of [target]!") - to_chat(target, "[user] sprays [src] into your face!") + C.visible_message("[user] sprays [src] into the face of [C]!", "[user] sprays [src] into your face!") if(C.client) C.blur_eyes(3) @@ -678,13 +707,20 @@ return - if(istype(target, /obj/structure/window)) + if(isobj(target)) if(actually_paints) + if(color_hex2num(paint_color) < 350 && !istype(target, /obj/structure/window) && !istype(target, /obj/effect/decal/cleanable/crayon)) //Colors too dark are rejected + to_chat(usr, "A color that dark on an object like this? Surely not...") + return FALSE + target.add_atom_colour(paint_color, WASHABLE_COLOUR_PRIORITY) - if(color_hex2num(paint_color) < 255) - target.set_opacity(255) - else - target.set_opacity(initial(target.opacity)) + + if(istype(target, /obj/structure/window)) + if(color_hex2num(paint_color) < 255) + target.set_opacity(255) + else + target.set_opacity(initial(target.opacity)) + . = use_charges(user, 2) var/fraction = min(1, . / reagents.maximum_volume) reagents.reaction(target, TOUCH, fraction * volume_multiplier) @@ -692,6 +728,7 @@ if(pre_noise || post_noise) playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5) + user.visible_message("[user] coats [target] with spray paint!", "You coat [target] with spray paint.") return . = ..() @@ -709,7 +746,7 @@ desc = "A metallic container containing shiny synthesised paint." charges = -1 -/obj/item/toy/crayon/spraycan/borg/afterattack(atom/target,mob/user,proximity) +/obj/item/toy/crayon/spraycan/borg/afterattack(atom/target,mob/user,proximity, params) var/diff = ..() if(!iscyborg(user)) to_chat(user, "How did you get this?") @@ -754,7 +791,9 @@ reagent_contents = list("lube" = 1, "banana" = 1) volume_multiplier = 5 - validSurfaces = list(/turf/open/floor) + +/obj/item/toy/crayon/spraycan/lubecan/isValidSurface(surface) + return istype(surface, /turf/open/floor) /obj/item/toy/crayon/spraycan/mimecan name = "silent spraycan" @@ -792,8 +831,16 @@ if(user.mind && user.mind.has_antag_datum(/datum/antagonist/gang) || isobserver(user)) to_chat(user, "This spraycan has been specially modified with a stage 2 nozzle kit, making it faster.") +/obj/item/toy/crayon/spraycan/infinite + name = "infinite spraycan" + charges = -1 + desc = "Now with 30% more bluespace technology." + #undef RANDOM_GRAFFITI #undef RANDOM_LETTER +#undef RANDOM_PUNCTUATION +#undef RANDOM_SYMBOL +#undef RANDOM_DRAWING #undef RANDOM_NUMBER #undef RANDOM_ORIENTED #undef RANDOM_RUNE diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 5bef86c6d2..f5799e1a22 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -39,7 +39,6 @@ /obj/item/defibrillator/loaded/Initialize() //starts with hicap . = ..() - paddles = make_paddles() cell = new(src) update_icon() return @@ -193,7 +192,7 @@ remove_paddles(user) update_icon() -/obj/item/defibrillator/item_action_slot_check(slot, mob/user) +/obj/item/defibrillator/item_action_slot_check(slot, mob/user, datum/action/A) if(slot == user.getBackSlot()) return 1 @@ -208,8 +207,8 @@ var/M = get(paddles, /mob) remove_paddles(M) QDEL_NULL(paddles) - . = ..() - update_icon() + QDEL_NULL(cell) + return ..() /obj/item/defibrillator/proc/deductcharge(chrgdeductamt) if(cell) @@ -244,13 +243,12 @@ w_class = WEIGHT_CLASS_NORMAL slot_flags = ITEM_SLOT_BELT -/obj/item/defibrillator/compact/item_action_slot_check(slot, mob/user) +/obj/item/defibrillator/compact/item_action_slot_check(slot, mob/user, datum/action/A) if(slot == user.getBeltSlot()) return TRUE /obj/item/defibrillator/compact/loaded/Initialize() . = ..() - paddles = make_paddles() cell = new(src) update_icon() @@ -262,7 +260,6 @@ /obj/item/defibrillator/compact/combat/loaded/Initialize() . = ..() - paddles = make_paddles() cell = new /obj/item/stock_parts/cell/infinite(src) update_icon() @@ -297,31 +294,28 @@ var/grab_ghost = FALSE var/tlimit = DEFIB_TIME_LIMIT * 10 - var/datum/component/mobhook + var/mob/listeningTo /obj/item/twohanded/shockpaddles/equipped(mob/user, slot) . = ..() - if(req_defib) - if (mobhook && mobhook.parent != user) - QDEL_NULL(mobhook) - if (!mobhook) - mobhook = user.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED = CALLBACK(src, .proc/check_range))) + if(!req_defib) + return + RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/check_range) /obj/item/twohanded/shockpaddles/Moved() . = ..() check_range() /obj/item/twohanded/shockpaddles/proc/check_range() - if(!req_defib) + if(!req_defib || !defib) return if(!in_range(src,defib)) var/mob/living/L = loc if(istype(L)) to_chat(L, "[defib]'s paddles overextend and come out of your hands!") - L.temporarilyRemoveItemFromInventory(src,TRUE) else visible_message("[src] snap back into [defib].") - snap_back() + snap_back() /obj/item/twohanded/shockpaddles/proc/recharge(var/time) if(req_defib || !time) @@ -362,14 +356,14 @@ /obj/item/twohanded/shockpaddles/dropped(mob/user) if(!req_defib) return ..() - if (mobhook) - QDEL_NULL(mobhook) if(user) + UnregisterSignal(user, COMSIG_MOVABLE_MOVED) var/obj/item/twohanded/offhand/O = user.get_inactive_held_item() if(istype(O)) O.unwield() - to_chat(user, "The paddles snap back into the main unit.") - snap_back() + if(user != loc) + to_chat(user, "The paddles snap back into the main unit.") + snap_back() return unwield(user) /obj/item/twohanded/shockpaddles/proc/snap_back() @@ -440,9 +434,20 @@ do_help(H, user) -/obj/item/twohanded/shockpaddles/proc/can_defib(mob/living/carbon/H) +/obj/item/twohanded/shockpaddles/proc/can_defib(mob/living/carbon/H) //Our code here is different than tg, if it breaks in testing; BUG_PROBABLE_CAUSE + var/obj/item/organ/heart = H.getorgan(/obj/item/organ/heart) + if(H.suiciding || H.hellbound || HAS_TRAIT(H, TRAIT_HUSK)) + return + if((world.time - H.timeofdeath) > tlimit) + return + if((H.getBruteLoss() >= MAX_REVIVE_BRUTE_DAMAGE) || (H.getFireLoss() >= MAX_REVIVE_FIRE_DAMAGE)) + return + if(!heart || (heart.organ_flags & ORGAN_FAILING)) + return var/obj/item/organ/brain/BR = H.getorgan(/obj/item/organ/brain) - return (!H.suiciding && !(HAS_TRAIT(H, TRAIT_NOCLONE)) && !H.hellbound && ((world.time - H.timeofdeath) < tlimit) && (H.getBruteLoss() < 180) && (H.getFireLoss() < 180) && H.getorgan(/obj/item/organ/heart) && BR && !BR.damaged_brain) + if(QDELETED(BR) || BR.brain_death || (BR.organ_flags & ORGAN_FAILING) || H.suiciding) + return + return TRUE /obj/item/twohanded/shockpaddles/proc/shock_touching(dmg, mob/H) if(req_defib) @@ -557,14 +562,12 @@ if(do_after(user, primetimer, target = H)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process user.visible_message("[user] places [src] on [H]'s chest.", "You place [src] on [H]'s chest.") playsound(src, 'sound/machines/defib_charge.ogg', 75, 0) - var/tplus = world.time - H.timeofdeath - // past this much time the patient is unrecoverable - // (in deciseconds) - // brain damage starts setting in on the patient after - // some time left rotting + // patients rot when they are killed, and die when they are dead + var/tplus = world.time - H.timeofdeath //length of time spent dead var/tloss = deathtimer var/total_burn = 0 var/total_brute = 0 + var/obj/item/organ/heart = H.getorgan(/obj/item/organ/heart) if(do_after(user, primetimer2, target = H)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total for(var/obj/item/carried_item in H.contents) if(istype(carried_item, /obj/item/clothing/suit/space)) @@ -589,16 +592,26 @@ failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's soul appears to be on another plane of existence. Further attempts futile." else if (tplus > tlimit) failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Body has decayed for too long. Further attempts futile." - else if (!H.getorgan(/obj/item/organ/heart)) + else if (!heart) failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's heart is missing." + else if (heart.organ_flags & ORGAN_FAILING) + failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's heart too damaged." else if(total_burn >= 180 || total_brute >= 180) failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Severe tissue damage makes recovery of patient impossible via defibrillator. Further attempts futile." else if(H.get_ghost()) failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - No activity in patient's brain. Further attempts may be successful." else var/obj/item/organ/brain/BR = H.getorgan(/obj/item/organ/brain) - if(!BR || BR.damaged_brain) - failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's brain is missing or damaged beyond point of no return. Further attempts futile." + if(BR) //BUG_PROBABLE_CAUSE - slight difference between us and tg + if(BR.organ_flags & ORGAN_FAILING) + failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's brain tissue is damaged making recovery of patient impossible via defibrillator. Further attempts futile." + if(BR.brain_death) + failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's brain damaged beyond point of no return. Further attempts futile." + if(H.suiciding || BR.brainmob?.suiciding) + failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - No intelligence pattern can be detected in patient's brain. Further attempts futile." + else + failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's brain is missing. Further attempts futile." + if(failed) user.visible_message(failed) @@ -623,7 +636,7 @@ H.Jitter(100) SEND_SIGNAL(H, COMSIG_LIVING_MINOR_SHOCK) if(tplus > tloss) - H.adjustBrainLoss( max(0, min(99, ((tlimit - tplus) / tlimit * 100))), 150) + H.adjustOrganLoss(ORGAN_SLOT_BRAIN, max(0, min(99, ((tlimit - tplus) / tlimit * 100))), 150) log_combat(user, H, "revived", defib) if(req_defib) if(defib.healdisk) @@ -641,7 +654,11 @@ playsound(src, 'sound/machines/defib_failed.ogg', 50, 0) else if(H.undergoing_cardiac_arrest()) H.set_heartattack(FALSE) - user.visible_message("[req_defib ? "[defib]" : "[src]"] pings: Patient's heart is now beating again.") + if(!(heart.organ_flags & ORGAN_FAILING)) + H.set_heartattack(FALSE) + user.visible_message("[req_defib ? "[defib]" : "[src]"] pings: Patient's heart is now beating again.") + else + user.visible_message("[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed, heart damage detected.") playsound(src, 'sound/machines/defib_zap.ogg', 50, 1, -1) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 45baa542d4..b0494539ce 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -714,6 +714,7 @@ GLOBAL_LIST_EMPTY(PDAs) return if((last_text && world.time < last_text + 10) || (everyone && last_everyone && world.time < last_everyone + PDA_SPAM_DELAY)) return + var/emoji_message = emoji_parse(message) if(prob(1)) message += "\nSent from my PDA" // Send the signal @@ -734,7 +735,8 @@ GLOBAL_LIST_EMPTY(PDAs) "name" = "[owner]", "job" = "[ownjob]", "message" = message, - "targets" = string_targets + "targets" = string_targets, + "emoji_message" = emoji_message )) if (picture) signal.data["photo"] = picture @@ -751,13 +753,13 @@ GLOBAL_LIST_EMPTY(PDAs) // Log it in our logs tnote += "→ To [target_text]:
[signal.format_message()]
" // Show it to ghosts - var/ghost_message = "[owner] PDA Message --> [target_text]: [signal.format_message()]" + var/ghost_message = "[owner] PDA Message --> [target_text]: [signal.format_message(TRUE)]" for(var/mob/M in GLOB.player_list) if(isobserver(M) && M.client && (M.client.prefs.chat_toggles & CHAT_GHOSTPDA)) to_chat(M, "[FOLLOW_LINK(M, user)] [ghost_message]") // Log in the talk log user.log_talk(message, LOG_PDA, tag="PDA: [initial(name)] to [target_text]") - to_chat(user, "Message sent to [target_text]: \"[message]\"") + to_chat(user, "Message sent to [target_text]: \"[emoji_message]\"") if (!silent) playsound(src, 'sound/machines/terminal_success.ogg', 15, 1) // Reset the photo @@ -787,7 +789,7 @@ GLOBAL_LIST_EMPTY(PDAs) hrefstart = "" hrefend = "" - to_chat(L, "[icon2html(src)] Message from [hrefstart][signal.data["name"]] ([signal.data["job"]])[hrefend], [signal.format_message()] (Reply)") + to_chat(L, "[icon2html(src)] Message from [hrefstart][signal.data["name"]] ([signal.data["job"]])[hrefend], [signal.format_message(TRUE)] (Reply)") update_icon(TRUE) diff --git a/code/game/objects/items/devices/PDA/virus_cart.dm b/code/game/objects/items/devices/PDA/virus_cart.dm index d85c5d72d8..28bc559b93 100644 --- a/code/game/objects/items/devices/PDA/virus_cart.dm +++ b/code/game/objects/items/devices/PDA/virus_cart.dm @@ -70,7 +70,7 @@ difficulty++ //if cartridge has manifest access it has extra snowflake difficulty else difficulty += 2 - GET_COMPONENT_FROM(hidden_uplink, /datum/component/uplink, target) + var/datum/component/uplink/hidden_uplink = target.GetComponent(/datum/component/uplink) if(!target.detonatable || prob(difficulty * 15) || (hidden_uplink)) U.show_message("An error flashes on your [src].", 1) else @@ -95,7 +95,7 @@ charges-- var/lock_code = "[rand(100,999)] [pick(GLOB.phonetic_alphabet)]" to_chat(U, "Virus Sent! The unlock code to the target is: [lock_code]") - GET_COMPONENT_FROM(hidden_uplink, /datum/component/uplink, target) + var/datum/component/uplink/hidden_uplink = target.GetComponent(/datum/component/uplink) if(!hidden_uplink) hidden_uplink = target.AddComponent(/datum/component/uplink) hidden_uplink.unlock_code = lock_code diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index f39d2ba0d6..dffbb46cbb 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -116,7 +116,7 @@ appearance = saved_appearance if(istype(M.buckled, /obj/vehicle)) var/obj/vehicle/V = M.buckled - GET_COMPONENT_FROM(VRD, /datum/component/riding, V) + var/datum/component/riding/VRD = V.GetComponent(/datum/component/riding) if(VRD) VRD.force_dismount(M) else diff --git a/code/game/objects/items/devices/dogborg_sleeper.dm b/code/game/objects/items/devices/dogborg_sleeper.dm index 7f3c7f3bfc..c1a9136f76 100644 --- a/code/game/objects/items/devices/dogborg_sleeper.dm +++ b/code/game/objects/items/devices/dogborg_sleeper.dm @@ -211,7 +211,7 @@ data["occupant"]["toxLoss"] = mob_occupant.getToxLoss() data["occupant"]["fireLoss"] = mob_occupant.getFireLoss() data["occupant"]["cloneLoss"] = mob_occupant.getCloneLoss() - data["occupant"]["brainLoss"] = mob_occupant.getBrainLoss() + data["occupant"]["brainLoss"] = mob_occupant.getOrganLoss(ORGAN_SLOT_BRAIN) data["occupant"]["reagents"] = list() if(mob_occupant.reagents.reagent_list.len) for(var/datum/reagent/R in mob_occupant.reagents.reagent_list) @@ -544,4 +544,26 @@ user.visible_message("[hound.name]'s garbage processor groans lightly as [trashman] slips inside.", "Your garbage compactor groans lightly as [trashman] slips inside.") playsound(hound, 'sound/effects/bin_close.ogg', 80, 1) return + else if(issilicon(target)) + var/mob/living/silicon/trashbot = target + if (!trashbot.devourable) + to_chat(user, "[target] registers an error code to your [src]") + return + if(patient) + to_chat(user,"Your [src] is already occupied.") + return + if(trashbot.buckled) + to_chat(user,"[trashbot] is buckled and can not be put into your [src].") + return + user.visible_message("[hound.name] is ingesting [trashbot] into their [src].", "You start ingesting [trashbot] into your [src.name]...") + if(do_after(user, 30, target = trashbot) && !patient && !trashbot.buckled && length(contents) < max_item_count) + if(!in_range(src, trashbot)) //Proximity is probably old news by now, do a new check. + return //If they moved away, you can't eat them. + trashbot.forceMove(src) + trashbot.reset_perspective(src) + update_gut() + user.visible_message("[hound.name]'s garbage processor groans lightly as [trashbot] slips inside.", "Your garbage compactor groans lightly as [trashbot] slips inside.") + playsound(hound, 'sound/effects/bin_close.ogg', 80, 1) + return + return diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 722510dccb..b937f961c0 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -96,7 +96,7 @@ if(BODY_ZONE_PRECISE_MOUTH) - if((M.head && M.head.flags_cover & HEADCOVERSMOUTH) || (M.wear_mask && M.wear_mask.flags_cover & MASKCOVERSMOUTH)) + if(M.is_mouth_covered()) to_chat(user, "You're going to need to remove that [(M.head && M.head.flags_cover & HEADCOVERSMOUTH) ? "helmet" : "mask"] first.") return diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm index 38133e37bc..110676de1b 100644 --- a/code/game/objects/items/devices/geiger_counter.dm +++ b/code/game/objects/items/devices/geiger_counter.dm @@ -158,7 +158,7 @@ if(!M.radiation) to_chat(user, "[icon2html(src, user)] Radiation levels within normal boundaries.") else - to_chat(user, "[icon2html(src, user)] Subject is irradiated. Radiation levels: [M.radiation].") + to_chat(user, "[icon2html(src, user)] Subject is irradiated. Radiation levels: [M.radiation] rad.") if(rad_strength) to_chat(user, "[icon2html(src, user)] Target contains radioactive contamination. Radioactive strength: [rad_strength]") @@ -203,21 +203,25 @@ return TRUE /obj/item/geiger_counter/cyborg - var/datum/component/mobhook + var/mob/listeningTo /obj/item/geiger_counter/cyborg/equipped(mob/user) . = ..() - if (mobhook && mobhook.parent != user) - QDEL_NULL(mobhook) - if (!mobhook) - mobhook = user.AddComponent(/datum/component/redirect, list(COMSIG_ATOM_RAD_ACT = CALLBACK(src, .proc/redirect_rad_act))) + if(listeningTo == user) + return + if(listeningTo) + UnregisterSignal(listeningTo, COMSIG_ATOM_RAD_ACT) + RegisterSignal(user, COMSIG_ATOM_RAD_ACT, .proc/redirect_rad_act) + listeningTo = user /obj/item/geiger_counter/cyborg/proc/redirect_rad_act(datum/source, amount) rad_act(amount) /obj/item/geiger_counter/cyborg/dropped() . = ..() - QDEL_NULL(mobhook) + if(listeningTo) + UnregisterSignal(listeningTo, COMSIG_ATOM_RAD_ACT) + listeningTo = null #undef RAD_LEVEL_NORMAL #undef RAD_LEVEL_MODERATE diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index 637bb794d3..9d1b670e71 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -167,8 +167,19 @@ GLOBAL_LIST_EMPTY(GPS_list) gpstag = "Eerie Signal" desc = "Report to a coder immediately." invisibility = INVISIBILITY_MAXIMUM + var/obj/item/implant/gps/implant -/obj/item/gps/mining/internal +/obj/item/gps/internal/Initialize(mapload, obj/item/implant/gps/_implant) + . = ..() + implant = _implant + +/obj/item/gps/internal/Destroy() + if(implant?.imp_in) + qdel(implant) + else + return ..() + +/obj/item/gps/internal/mining icon_state = "gps-m" gpstag = "MINER" desc = "A positioning system helpful for rescuing trapped or injured miners, keeping one on you at all times while mining might just save your life." diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 7c136f556e..926810cfbf 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -413,3 +413,16 @@ /obj/item/radio/off // Station bounced radios, their only difference is spawning with the speakers off, this was made to help the lag. listening = 0 // And it's nice to have a subtype too for future features. dog_fashion = /datum/dog_fashion/back + +/obj/item/radio/internal + var/obj/item/implant/radio/implant + +/obj/item/radio/internal/Initialize(mapload, obj/item/implant/radio/_implant) + . = ..() + implant = _implant + +/obj/item/radio/internal/Destroy() + if(implant?.imp_in) + qdel(implant) + else + return ..() diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 0059938720..d644e0637e 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -135,7 +135,7 @@ SLIME SCANNER var/mob/living/carbon/human/H = M if(H.undergoing_cardiac_arrest() && H.stat != DEAD) to_chat(user, "Subject suffering from heart attack: Apply defibrillation or other electric shock immediately!") - if(H.undergoing_liver_failure() && H.stat != DEAD) + if(H.undergoing_liver_failure() && H.stat != DEAD) //might be depreciated BUG_PROBABLE_CAUSE to_chat(user, "Subject is suffering from liver failure: Apply Corazone and begin a liver transplant immediately!") var/msg = "*---------*\nAnalyzing results for [M]:\n\tOverall status: [mob_status]\n" @@ -157,12 +157,8 @@ SLIME SCANNER msg += "\tSubject appears to have [M.getCloneLoss() > 30 ? "Severe" : "Minor"] cellular damage.\n" if(advanced) msg += "\tCellular Damage Level: [M.getCloneLoss()].\n" - if (M.getBrainLoss() >= 200 || !M.getorgan(/obj/item/organ/brain)) - msg += "\tSubject's brain function is non-existent.\n" - else if (M.getBrainLoss() >= 120) - msg += "\tSevere brain damage detected. Subject likely to have mental traumas.\n" - else if (M.getBrainLoss() >= 45) - msg += "\tBrain damage detected.\n" + if (!M.getorgan(/obj/item/organ/brain)) + to_chat(user, "\tSubject lacks a brain.") //Unsure how this won't proc for 50% of the cit playerbase (This is a joke everyone on cit a cute.) if(ishuman(M) && advanced) // Should I make this not advanced? var/mob/living/carbon/human/H = M var/obj/item/organ/liver/L = H.getorganslot("liver") @@ -194,6 +190,14 @@ SLIME SCANNER if(Br.cached_size>5) msg += "\tSubject has a sizeable bosom with a [Br.size] cup.\n" + if (M.getOrganLoss(ORGAN_SLOT_BRAIN) >= 200 || !M.getorgan(/obj/item/organ/brain)) + msg += "\tSubject's brain function is non-existent.\n" + else if (M.getOrganLoss(ORGAN_SLOT_BRAIN) >= 120) + msg += "\tSevere brain damage detected. Subject likely to have mental traumas.\n" + else if (M.getOrganLoss(ORGAN_SLOT_BRAIN) >= 45) + msg += "\tBrain damage detected.\n" + + if(iscarbon(M)) var/mob/living/carbon/C = M if(LAZYLEN(C.get_traumas())) var/list/trauma_text = list() @@ -212,11 +216,10 @@ SLIME SCANNER if(C.roundstart_quirks.len) msg += "\tSubject has the following physiological traits: [C.get_trait_string()].\n" if(advanced) - msg += "\tBrain Activity Level: [(200 - M.getBrainLoss())/2]%.\n" + msg += "\tBrain Activity Level: [(200 - M.getOrganLoss(ORGAN_SLOT_BRAIN))/2]%.\n" if(M.radiation) msg += "\tSubject is irradiated.\n" - if(advanced) - msg += "\tRadiation Level: [M.radiation]%.\n" + msg += "\tRadiation Level: [M.radiation] rad\n" if(advanced && M.hallucinating()) msg += "\tSubject is hallucinating.\n" @@ -247,11 +250,11 @@ SLIME SCANNER healthy = FALSE msg += "\tSubject is deaf.\n" else - if(ears.ear_damage) - msg += "\tSubject has [ears.ear_damage > UNHEALING_EAR_DAMAGE? "permanent ": "temporary "]hearing damage.\n" + if(ears.damage) + to_chat(user, "\tSubject has [ears.damage > ears.maxHealth ? "permanent ": "temporary "]hearing damage.") healthy = FALSE if(ears.deaf) - msg += "\tSubject is [ears.ear_damage > UNHEALING_EAR_DAMAGE ? "permanently ": "temporarily "] deaf.\n" + to_chat(user, "\tSubject is [ears.damage > ears.maxHealth ? "permanently ": "temporarily "] deaf.") healthy = FALSE if(healthy) msg += "\tHealthy.\n" @@ -267,13 +270,13 @@ SLIME SCANNER if(HAS_TRAIT(C, TRAIT_NEARSIGHT)) msg += "\tSubject is nearsighted.\n" healthy = FALSE - if(eyes.eye_damage > 30) + if(eyes.damage > 30) msg += "\tSubject has severe eye damage.\n" healthy = FALSE - else if(eyes.eye_damage > 20) + else if(eyes.damage > 20) msg += "\tSubject has significant eye damage.\n" healthy = FALSE - else if(eyes.eye_damage) + else if(eyes.damage) msg += "\tSubject has minor eye damage.\n" healthy = FALSE if(healthy) @@ -297,6 +300,59 @@ SLIME SCANNER for(var/obj/item/bodypart/org in damaged) msg += "\t\t[capitalize(org.name)]: [(org.brute_dam > 0) ? "[org.brute_dam]" : "0"]-[(org.burn_dam > 0) ? "[org.burn_dam]" : "0"]\n" + //Organ damages report + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/minor_damage + var/major_damage + var/max_damage + var/report_organs = FALSE + + //Piece together the lists to be reported + for(var/O in H.internal_organs) + var/obj/item/organ/organ = O + if(organ.organ_flags & ORGAN_FAILING) + report_organs = TRUE //if we report one organ, we report all organs, even if the lists are empty, just for consistency + if(max_damage) + max_damage += ", " //prelude the organ if we've already reported an organ + max_damage += organ.name //this just slaps the organ name into the string of text + else + max_damage = "\tNon-Functional Organs: " //our initial statement + max_damage += organ.name + else if(organ.damage > organ.high_threshold) + report_organs = TRUE + if(major_damage) + major_damage += ", " + major_damage += organ.name + else + major_damage = "\tSeverely Damaged Organs: " + major_damage += organ.name + else if(organ.damage > organ.low_threshold) + report_organs = TRUE + if(minor_damage) + minor_damage += ", " + minor_damage += organ.name + else + minor_damage = "\tMildly Damaged Organs: " + minor_damage += organ.name + + if(report_organs) //we either finish the list, or set it to be empty if no organs were reported in that category + if(!max_damage) + max_damage = "\tNon-Functional Organs: " + else + max_damage += "" + if(!major_damage) + major_damage = "\tSeverely Damaged Organs: " + else + major_damage += "" + if(!minor_damage) + minor_damage = "\tMildly Damaged Organs: " + else + minor_damage += "" + msg += "[minor_damage]" + msg += "[major_damage]" + msg += "[max_damage]" + // Species and body temperature if(ishuman(M)) @@ -354,7 +410,7 @@ SLIME SCANNER msg += "Subject is bleeding!\n" var/blood_percent = round((C.blood_volume / (BLOOD_VOLUME_NORMAL * C.blood_ratio))*100) var/blood_type = C.dna.blood_type - if(blood_id != "blood")//special blood substance + if(blood_id != ("blood" || "jellyblood"))//special blood substance var/datum/reagent/R = GLOB.chemical_reagents_list[blood_id] if(R) blood_type = R.name @@ -385,7 +441,7 @@ SLIME SCANNER if(M.reagents.reagent_list.len) var/list/datum/reagent/reagents = list() for(var/datum/reagent/R in M.reagents.reagent_list) - if(R.invisible) + if(R.chemical_flags & REAGENT_INVISIBLE) continue reagents += R @@ -404,6 +460,21 @@ SLIME SCANNER msg += "[R.name]\n" else msg += "Subject is not addicted to any reagents.\n" + + if(M.reagents.has_reagent("fermiTox")) + var/datum/reagent/fermiTox = M.reagents.has_reagent("fermiTox") + switch(fermiTox.volume) + if(5 to 10) + msg += "Subject contains a low amount of toxic isomers.\n" + if(10 to 25) + msg += "Subject contains toxic isomers.\n" + if(25 to 50) + msg += "Subject contains a substantial amount of toxic isomers.\n" + if(50 to 95) + msg += "Subject contains a high amount of toxic isomers.\n" + if(95 to INFINITY) + msg += "Subject contains a extremely dangerous amount of toxic isomers.\n" + msg += "*---------*" to_chat(user, msg) diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 2c234a59ba..fc768cd38e 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -195,7 +195,7 @@ effective or pretty fucking useless. Deactivate() return -/obj/item/shadowcloak/item_action_slot_check(slot, mob/user) +/obj/item/shadowcloak/item_action_slot_check(slot, mob/user, datum/action/A) if(slot == SLOT_BELT) return 1 diff --git a/code/game/objects/items/eightball.dm b/code/game/objects/items/eightball.dm index bdaa716075..9dc3e421fd 100644 --- a/code/game/objects/items/eightball.dm +++ b/code/game/objects/items/eightball.dm @@ -206,7 +206,7 @@ switch(action) if("vote") var/selected_answer = params["answer"] - if(!selected_answer in possible_answers) + if(!(selected_answer in possible_answers)) return else votes[user.ckey] = selected_answer diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm index 71687f0d5a..6ea68bf548 100644 --- a/code/game/objects/items/granters.dm +++ b/code/game/objects/items/granters.dm @@ -302,7 +302,7 @@ spellname = "charge" icon_state ="bookcharge" desc = "This book is made of 100% postconsumer wizard." - remarks = list("I feel ALIVE!", "I CAN TASTE THE MANA!", "What a RUSH!", "I'm FLYING through these pages!", "THIS GENIUS IS MAKING IT!", "This book is ACTION PAcKED!", "HE'S DONE IT", "LETS GOOOOOOOOOOOO") + remarks = list("I feel ALIVE!", "I CAN TASTE THE MANA!", "What a RUSH!", "I'm FLYING through these pages!", "THIS GENIUS IS MAKING IT!", "This book is ACTION PAcKED!", "HE'S DONE IT", "LETS GOOOOOOOOOOOO", "Just wait faster is all...") /obj/item/book/granter/spell/charge/recoil(mob/user) ..() @@ -432,6 +432,14 @@ user.mind.teach_crafting_recipe(crafting_recipe_type) to_chat(user,"You learned how to make [initial(R.name)].") +/obj/item/book/granter/crafting_recipe/threads //Durathread crafting book + name = "Credible Threads" + desc = "A simple book about sewing and usefull clothing crafting with cloth and durathreads." + crafting_recipe_types = list(/datum/crafting_recipe/durathread_duffelbag, /datum/crafting_recipe/durathread_toolbelt, /datum/crafting_recipe/durathread_bandolier, /datum/crafting_recipe/durathread_helmet, /datum/crafting_recipe/durathread_vest) + icon_state = "tailers_art1" + oneuse = FALSE + remarks = list("Durathread is cloth thats also fire-resistant?", "Strong threads that can be used with leather for some light weight storage!", "The cloth can withstand a beating it said but not that much...") + /obj/item/book/granter/crafting_recipe/cooking_sweets_101 //We start at 101 for 103 and 105 name = "Cooking Desserts 101" desc = "A cook book that teaches you some more of the newest desserts. AI approved, and a best seller on Honkplanet." @@ -440,7 +448,15 @@ 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?") -//Later content when I have free time - Trilby Date:02-Aug-2019 +/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) + icon_state = "cooking_learing_ice" + oneuse = FALSE + remarks = list("Looks like these would sell much better in a plasma fire...", "Using glass bowls rather then cones?", "Mixing soda and ice-cream?", "Tall glasses with of liquids and solids...", "Just add a bit of icecream and cherry on top?") + +//Later content when I have free time - Trilby Date:24-Aug-2019 /obj/item/book/granter/crafting_recipe/under_the_oven //Illegal cook book name = "Under The Oven" @@ -449,11 +465,3 @@ icon_state = "cooking_learing_illegal" oneuse = FALSE remarks = list() - -/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() - icon_state = "cooking_learing_ice" - oneuse = FALSE - remarks = list() \ No newline at end of file diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm index 709fedbe5a..1956a1f317 100644 --- a/code/game/objects/items/grenades/plastic.dm +++ b/code/game/objects/items/grenades/plastic.dm @@ -174,6 +174,7 @@ gender = PLURAL var/open_panel = 0 can_attach_mob = TRUE + full_damage_on_mobs = TRUE /obj/item/grenade/plastic/c4/New() wires = new /datum/wires/explosive/c4(src) diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index a306b48385..246dd77684 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -1,5 +1,6 @@ /obj/item/restraints breakouttime = 600 + var/demoralize_criminals = TRUE // checked on carbon/carbon.dm to decide wheter to apply the handcuffed negative moodlet or not. /obj/item/restraints/suicide_act(mob/living/carbon/user) user.visible_message("[user] is strangling [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!") @@ -220,6 +221,7 @@ name = "fake handcuffs" desc = "Fake handcuffs meant for gag purposes." breakouttime = 10 //Deciseconds = 1s + demoralize_criminals = FALSE /obj/item/restraints/handcuffs/fake/kinky name = "kinky handcuffs" diff --git a/code/game/objects/items/his_grace.dm b/code/game/objects/items/his_grace.dm index 3be57d23f1..7e7dddefb6 100644 --- a/code/game/objects/items/his_grace.dm +++ b/code/game/objects/items/his_grace.dm @@ -29,7 +29,7 @@ . = ..() START_PROCESSING(SSprocessing, src) GLOB.poi_list += src - AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_POST_THROW = CALLBACK(src, .proc/move_gracefully))) + RegisterSignal(src, COMSIG_MOVABLE_POST_THROW, .proc/move_gracefully) /obj/item/his_grace/Destroy() STOP_PROCESSING(SSprocessing, src) diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index 5e8250ea00..ccb82f7029 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -358,6 +358,8 @@ slot_flags = ITEM_SLOT_BELT attack_verb = list("sawed", "torn", "cut", "chopped", "diced") hitsound = 'sound/weapons/chainsawhit.ogg' + tool_behaviour = TOOL_SAW + toolspeed = 1.5 //slower than a real saw /obj/item/nullrod/claymore/glowing icon_state = "swordon" @@ -513,7 +515,8 @@ slot_flags = ITEM_SLOT_BELT attack_verb = list("sawed", "torn", "cut", "chopped", "diced") hitsound = 'sound/weapons/chainsawhit.ogg' - + tool_behaviour = TOOL_SAW + toolspeed = 0.5 /obj/item/nullrod/hammmer icon_state = "hammeron" @@ -539,6 +542,8 @@ attack_verb = list("sawed", "torn", "cut", "chopped", "diced") hitsound = 'sound/weapons/chainsawhit.ogg' total_mass = TOTAL_MASS_HAND_REPLACEMENT + tool_behaviour = TOOL_SAW + toolspeed = 2 /obj/item/nullrod/chainsaw/Initialize() . = ..() diff --git a/code/game/objects/items/implants/implant.dm b/code/game/objects/items/implants/implant.dm index 482cfb0d8e..0786172f25 100644 --- a/code/game/objects/items/implants/implant.dm +++ b/code/game/objects/items/implants/implant.dm @@ -72,7 +72,7 @@ else return FALSE - forceMove(target) + moveToNullspace() imp_in = target target.implants += src if(activated) @@ -89,12 +89,12 @@ return TRUE /obj/item/implant/proc/removed(mob/living/source, silent = FALSE, special = 0) - moveToNullspace() + SEND_SIGNAL(src, COMSIG_IMPLANT_REMOVING, args) imp_in = null source.implants -= src for(var/X in actions) var/datum/action/A = X - A.Grant(source) + A.Remove(source) if(ishuman(source)) var/mob/living/carbon/human/H = source H.sec_hud_set_implants() diff --git a/code/game/objects/items/implants/implant_chem.dm b/code/game/objects/items/implants/implant_chem.dm index c6c8be1a83..8da1d1e472 100644 --- a/code/game/objects/items/implants/implant_chem.dm +++ b/code/game/objects/items/implants/implant_chem.dm @@ -3,6 +3,7 @@ desc = "Injects things." icon_state = "reagents" activated = FALSE + var/obj/item/imp_chemholder/chemholder /obj/item/implant/chem/get_data() var/dat = {"Implant Specifications:
@@ -29,6 +30,26 @@ GLOB.tracked_chem_implants -= src return ..() +/obj/item/implant/chem/implant(mob/living/target, mob/user, silent = FALSE) + . = ..() + if(!.) + return + if(chemholder) + chemholder.forceMove(target) + return + chemholder = new(imp_in, src) + reagents.trans_to(chemholder, reagents.total_volume) + +/obj/item/implant/chem/removed(mob/target, silent = FALSE, special = 0) + . = ..() + if(!.) + return + if(!special) + chemholder.reagents.trans_to(src, chemholder.reagents.total_volume) + QDEL_NULL(chemholder) + else + chemholder?.moveToNullspace() + /obj/item/implant/chem/trigger(emote, mob/living/source) if(emote == "deathgasp") if(istype(source) && !(source.stat == DEAD)) @@ -45,13 +66,12 @@ injectamount = reagents.total_volume else injectamount = cause - reagents.trans_to(R, injectamount) + chemholder.reagents.trans_to(R, injectamount) to_chat(R, "You hear a faint beep.") - if(!reagents.total_volume) + if(!chemholder.reagents.total_volume) to_chat(R, "You hear a faint click from your chest.") qdel(src) - /obj/item/implantcase/chem name = "implant case - 'Remote Chemical'" desc = "A glass case containing a remote chemical implant." @@ -63,3 +83,17 @@ return TRUE else return ..() + +/obj/item/imp_chemholder + var/obj/item/implant/chem/implant + +/obj/item/imp_chemholder/Initialize(mapload, obj/item/implant/chem/_implant) + . = ..() + create_reagents(50) + implant = _implant + +/obj/item/imp_chemholder/Destroy() + if(implant?.imp_in) + qdel(implant) + else + return ..() \ No newline at end of file diff --git a/code/game/objects/items/implants/implant_clown.dm b/code/game/objects/items/implants/implant_clown.dm index ae1fef109d..bb98e72b30 100644 --- a/code/game/objects/items/implants/implant_clown.dm +++ b/code/game/objects/items/implants/implant_clown.dm @@ -11,7 +11,7 @@ /obj/item/implant/sad_trombone/trigger(emote, mob/source) if(emote == "deathgasp") - playsound(loc, 'sound/misc/sadtrombone.ogg', 50, 0) + playsound(source.loc, 'sound/misc/sadtrombone.ogg', 50, 0) /obj/item/implanter/sad_trombone name = "implanter (sad trombone)" diff --git a/code/game/objects/items/implants/implant_explosive.dm b/code/game/objects/items/implants/implant_explosive.dm index e749a6c4be..b93c9419a3 100644 --- a/code/game/objects/items/implants/implant_explosive.dm +++ b/code/game/objects/items/implants/implant_explosive.dm @@ -11,8 +11,9 @@ var/popup = FALSE // is the DOUWANNABLOWUP window open? var/active = FALSE -/obj/item/implant/explosive/on_mob_death(mob/living/L, gibbed) - activate("death") +/obj/item/implant/explosive/trigger(emote, mob/source) + if(emote == "deathgasp") + activate("death") /obj/item/implant/explosive/get_data() var/dat = {"Implant Specifications:
@@ -29,32 +30,18 @@ /obj/item/implant/explosive/activate(cause) . = ..() if(!cause || !imp_in || active) - return 0 + return FALSE if(cause == "action_button" && !popup) popup = TRUE var/response = alert(imp_in, "Are you sure you want to activate your [name]? This will cause you to explode!", "[name] Confirmation", "Yes", "No") popup = FALSE if(response == "No") - return 0 - heavy = round(heavy) - medium = round(medium) - weak = round(weak) - to_chat(imp_in, "You activate your [name].") - active = TRUE - var/turf/boomturf = get_turf(imp_in) - message_admins("[ADMIN_LOOKUPFLW(imp_in)] has activated their [name] at [ADMIN_VERBOSEJMP(boomturf)], with cause of [cause].") -//If the delay is short, just blow up already jeez - if(delay <= 7) - explosion(src,heavy,medium,weak,weak, flame_range = weak) - if(imp_in) - imp_in.gib(1) - qdel(src) - return - timed_explosion() + return FALSE + addtimer(CALLBACK(src, .proc/timed_explosion, cause), 1) /obj/item/implant/explosive/implant(mob/living/target) for(var/X in target.implants) - if(istype(X, type)) + if(istype(X, /obj/item/implant/explosive)) var/obj/item/implant/explosive/imp_e = X imp_e.heavy += heavy imp_e.medium += medium @@ -65,22 +52,37 @@ return ..() -/obj/item/implant/explosive/proc/timed_explosion() - imp_in.visible_message("[imp_in] starts beeping ominously!") - playsound(loc, 'sound/items/timer.ogg', 30, 0) - sleep(delay*0.25) - if(imp_in && !imp_in.stat) +/obj/item/implant/explosive/proc/timed_explosion(cause) + if(cause == "death" && imp_in.stat != DEAD) + return FALSE + heavy = round(heavy) + medium = round(medium) + weak = round(weak) + to_chat(imp_in, "You activate your [name].") + active = TRUE + var/turf/boomturf = get_turf(imp_in) + message_admins("[ADMIN_LOOKUPFLW(imp_in)] has activated their [name] at [ADMIN_VERBOSEJMP(boomturf)], with cause of [cause].") + if(delay > 7) + imp_in?.visible_message("[imp_in] starts beeping ominously!") + playsound(get_turf(imp_in ? imp_in : src), 'sound/items/timer.ogg', 30, 0) + addtimer(CALLBACK(src, .proc/double_pain, TRUE), delay * 0.25) + addtimer(CALLBACK(src, .proc/double_pain), delay * 0.5) + addtimer(CALLBACK(src, .proc/double_pain), delay * 0.75) + addtimer(CALLBACK(src, .proc/boom_goes_the_weasel), delay) + else //If the delay is short, just blow up already jeez + boom_goes_the_weasel() + +/obj/item/implant/explosive/proc/double_pain(message = FALSE) + playsound(get_turf(imp_in ? imp_in : src), 'sound/items/timer.ogg', 30, 0) + if(!imp_in) + return + if(message && imp_in.stat == CONSCIOUS) imp_in.visible_message("[imp_in] doubles over in pain!") - imp_in.Knockdown(140) - playsound(loc, 'sound/items/timer.ogg', 30, 0) - sleep(delay*0.25) - playsound(loc, 'sound/items/timer.ogg', 30, 0) - sleep(delay*0.25) - playsound(loc, 'sound/items/timer.ogg', 30, 0) - sleep(delay*0.25) - explosion(src,heavy,medium,weak,weak, flame_range = weak) - if(imp_in) - imp_in.gib(1) + imp_in.Knockdown(140) + +/obj/item/implant/explosive/proc/boom_goes_the_weasel() + explosion(get_turf(imp_in ? imp_in : src), heavy, medium, weak, weak, flame_range = weak) + imp_in?.gib(TRUE) qdel(src) /obj/item/implant/explosive/macro @@ -95,17 +97,7 @@ /obj/item/implant/explosive/macro/implant(mob/living/target) for(var/X in target.implants) if(istype(X, type)) - return 0 - - for(var/Y in target.implants) - if(istype(Y, /obj/item/implant/explosive)) - var/obj/item/implant/explosive/imp_e = Y - heavy += imp_e.heavy - medium += imp_e.medium - weak += imp_e.weak - delay += imp_e.delay - qdel(imp_e) - break + return FALSE return ..() diff --git a/code/game/objects/items/implants/implant_mindshield.dm b/code/game/objects/items/implants/implant_mindshield.dm index b9907cbfca..2a99c6e1ec 100644 --- a/code/game/objects/items/implants/implant_mindshield.dm +++ b/code/game/objects/items/implants/implant_mindshield.dm @@ -1,7 +1,6 @@ /obj/item/implant/mindshield name = "mindshield implant" desc = "Protects against brainwashing." - resistance_flags = INDESTRUCTIBLE activated = 0 /obj/item/implant/mindshield/get_data() diff --git a/code/game/objects/items/implants/implant_misc.dm b/code/game/objects/items/implants/implant_misc.dm index 3a4295c61e..75b0c67798 100644 --- a/code/game/objects/items/implants/implant_misc.dm +++ b/code/game/objects/items/implants/implant_misc.dm @@ -69,62 +69,4 @@ healthstring = "Oxygen Deprivation Damage => [round(L.getOxyLoss())]
Fire Damage => [round(L.getFireLoss())]
Toxin Damage => [round(L.getToxLoss())]
Brute Force Damage => [round(L.getBruteLoss())]
" if (!healthstring) healthstring = "ERROR" - return healthstring - -/obj/item/implant/radio - name = "internal radio implant" - activated = TRUE - var/obj/item/radio/radio - var/radio_key - var/subspace_transmission = FALSE - icon = 'icons/obj/radio.dmi' - icon_state = "walkietalkie" - -/obj/item/implant/radio/activate() - . = ..() - // needs to be GLOB.deep_inventory_state otherwise it won't open - radio.ui_interact(usr, "main", null, FALSE, null, GLOB.deep_inventory_state) - -/obj/item/implant/radio/Initialize(mapload) - . = ..() - - radio = new(src) - // almost like an internal headset, but without the - // "must be in ears to hear" restriction. - radio.name = "internal radio" - radio.subspace_transmission = subspace_transmission - radio.canhear_range = 0 - if(radio_key) - radio.keyslot = new radio_key - radio.recalculateChannels() - -/obj/item/implant/radio/mining - radio_key = /obj/item/encryptionkey/headset_cargo - -/obj/item/implant/radio/syndicate - desc = "Are you there God? It's me, Syndicate Comms Agent." - radio_key = /obj/item/encryptionkey/syndicate - subspace_transmission = TRUE - -/obj/item/implant/radio/slime - name = "slime radio" - icon = 'icons/obj/surgery.dmi' - icon_state = "adamantine_resonator" - radio_key = /obj/item/encryptionkey/headset_sci - subspace_transmission = TRUE - -/obj/item/implant/radio/get_data() - var/dat = {"Implant Specifications:
- Name: Internal Radio Implant
- Life: 24 hours
- Implant Details: Allows user to use an internal radio, useful if user expects equipment loss, or cannot equip conventional radios."} - return dat - -/obj/item/implanter/radio - name = "implanter (internal radio)" - imp_type = /obj/item/implant/radio - -/obj/item/implanter/radio/syndicate - name = "implanter (internal syndicate radio)" - imp_type = /obj/item/implant/radio/syndicate - + return healthstring \ No newline at end of file diff --git a/code/game/objects/items/implants/implant_radio.dm b/code/game/objects/items/implants/implant_radio.dm new file mode 100644 index 0000000000..5d3d579a4e --- /dev/null +++ b/code/game/objects/items/implants/implant_radio.dm @@ -0,0 +1,69 @@ +/obj/item/implant/radio + name = "internal radio implant" + activated = TRUE + var/obj/item/radio/internal/radio + var/radio_key + var/subspace_transmission = FALSE + icon = 'icons/obj/radio.dmi' + icon_state = "walkietalkie" + +/obj/item/implant/radio/activate() + . = ..() + // needs to be GLOB.deep_inventory_state otherwise it won't open + radio.ui_interact(usr, "main", null, FALSE, null, GLOB.deep_inventory_state) + +/obj/item/implant/radio/implant(mob/living/target, mob/user, silent = FALSE) + . = ..() + if(!.) + return + if(radio) + radio.forceMove(target) + return + radio = new(target) + // almost like an internal headset, but without the + // "must be in ears to hear" restriction. + radio.name = "internal radio" + radio.subspace_transmission = subspace_transmission + radio.canhear_range = 0 + if(radio_key) + radio.keyslot = new radio_key + radio.recalculateChannels() + +/obj/item/implant/radio/removed(mob/target, silent = FALSE, special = 0) + . = ..() + if(!.) + return + if(!special) + qdel(radio) + else + radio?.moveToNullspace() + +/obj/item/implant/radio/mining + radio_key = /obj/item/encryptionkey/headset_cargo + +/obj/item/implant/radio/syndicate + desc = "Are you there God? It's me, Syndicate Comms Agent." + radio_key = /obj/item/encryptionkey/syndicate + subspace_transmission = TRUE + +/obj/item/implant/radio/slime + name = "slime radio" + icon = 'icons/obj/surgery.dmi' + icon_state = "adamantine_resonator" + radio_key = /obj/item/encryptionkey/headset_sci + subspace_transmission = TRUE + +/obj/item/implant/radio/get_data() + var/dat = {"Implant Specifications:
+ Name: Internal Radio Implant
+ Life: 24 hours
+ Implant Details: Allows user to use an internal radio, useful if user expects equipment loss, or cannot equip conventional radios."} + return dat + +/obj/item/implanter/radio + name = "implanter (internal radio)" + imp_type = /obj/item/implant/radio + +/obj/item/implanter/radio/syndicate + name = "implanter (internal syndicate radio)" + imp_type = /obj/item/implant/radio/syndicate \ No newline at end of file diff --git a/code/game/objects/items/implants/implant_storage.dm b/code/game/objects/items/implants/implant_storage.dm index ec6b4d64c3..1f44b5318e 100644 --- a/code/game/objects/items/implants/implant_storage.dm +++ b/code/game/objects/items/implants/implant_storage.dm @@ -4,30 +4,44 @@ icon_state = "storage" item_color = "r" var/max_slot_stacking = 4 + var/obj/item/storage/bluespace_pocket/pocket /obj/item/implant/storage/activate() . = ..() - SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SHOW, imp_in, TRUE) + SEND_SIGNAL(pocket, COMSIG_TRY_STORAGE_SHOW, imp_in, TRUE) /obj/item/implant/storage/removed(source, silent = FALSE, special = 0) - . = ..() - if(.) - if(!special) - qdel(GetComponent(/datum/component/storage/concrete/implant)) + if(!special) + qdel(pocket) + else + pocket?.moveToNullspace() + return ..() /obj/item/implant/storage/implant(mob/living/target, mob/user, silent = FALSE) for(var/X in target.implants) if(istype(X, type)) var/obj/item/implant/storage/imp_e = X - GET_COMPONENT_FROM(STR, /datum/component/storage, imp_e) + var/datum/component/storage/STR = imp_e.pocket.GetComponent(/datum/component/storage) if(!STR || (STR && STR.max_items < max_slot_stacking)) - imp_e.AddComponent(/datum/component/storage/concrete/implant) + imp_e.pocket.AddComponent(/datum/component/storage/concrete/implant) qdel(src) return TRUE return FALSE - AddComponent(/datum/component/storage/concrete/implant) + . = ..() + if(.) + if(pocket) + pocket.forceMove(target) + else + pocket = new(target) - return ..() +/obj/item/storage/bluespace_pocket + name = "internal bluespace pocket" + icon_state = "pillbox" + w_class = WEIGHT_CLASS_TINY + desc = "A tiny yet spacious pocket, usually found implanted inside sneaky syndicate agents and nowhere else." + component_type = /datum/component/storage/concrete/implant + resistance_flags = INDESTRUCTIBLE //A bomb! + item_flags = DROPDEL /obj/item/implanter/storage name = "implanter (storage)" diff --git a/code/game/objects/items/implants/implant_track.dm b/code/game/objects/items/implants/implant_track.dm index 913c577f2c..4b7ae3bbac 100644 --- a/code/game/objects/items/implants/implant_track.dm +++ b/code/game/objects/items/implants/implant_track.dm @@ -3,8 +3,8 @@ desc = "Track with this." activated = 0 -/obj/item/implant/tracking/New() - ..() +/obj/item/implant/tracking/Initialize() + . = ..() GLOB.tracked_implants += src /obj/item/implant/tracking/Destroy() @@ -15,7 +15,31 @@ imp_type = /obj/item/implant/tracking /obj/item/implanter/tracking/gps - imp_type = /obj/item/gps/mining/internal + imp_type = /obj/item/implant/gps + +/obj/item/implant/gps + name = "\improper GPS implant" + desc = "Track with this and a GPS." + activated = FALSE + var/obj/item/gps/internal/mining/real_gps + +/obj/item/implant/gps/implant(mob/living/target, mob/user, silent = FALSE) + . = ..() + if(!.) + return + if(real_gps) + real_gps.forceMove(target) + else + real_gps = new(target) + +/obj/item/implant/gps/removed(mob/living/source, silent = FALSE, special = 0) + . = ..() + if(!.) + return + if(!special) + qdel(real_gps) + else + real_gps?.moveToNullspace() /obj/item/implant/tracking/get_data() var/dat = {"Implant Specifications:
diff --git a/code/game/objects/items/implants/implantuplink.dm b/code/game/objects/items/implants/implant_uplink.dm similarity index 93% rename from code/game/objects/items/implants/implantuplink.dm rename to code/game/objects/items/implants/implant_uplink.dm index 9000fbbe34..9895c1e34c 100644 --- a/code/game/objects/items/implants/implantuplink.dm +++ b/code/game/objects/items/implants/implant_uplink.dm @@ -1,23 +1,23 @@ -/obj/item/implant/uplink - name = "uplink implant" - desc = "Sneeki breeki." - icon = 'icons/obj/radio.dmi' - icon_state = "radio" - lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' - righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' - var/starting_tc = 0 - -/obj/item/implant/uplink/Initialize(mapload, _owner) - . = ..() - AddComponent(/datum/component/uplink, _owner, TRUE, FALSE, null, starting_tc) - -/obj/item/implanter/uplink - name = "implanter (uplink)" - imp_type = /obj/item/implant/uplink - -/obj/item/implanter/uplink/precharged - name = "implanter (precharged uplink)" - imp_type = /obj/item/implant/uplink/precharged - -/obj/item/implant/uplink/precharged - starting_tc = 10 +/obj/item/implant/uplink + name = "uplink implant" + desc = "Sneeki breeki." + icon = 'icons/obj/radio.dmi' + icon_state = "radio" + lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' + var/starting_tc = 0 + +/obj/item/implant/uplink/Initialize(mapload, _owner) + . = ..() + AddComponent(/datum/component/uplink, _owner, TRUE, FALSE, null, starting_tc, GLOB.not_incapacitated_state) + +/obj/item/implanter/uplink + name = "implanter (uplink)" + imp_type = /obj/item/implant/uplink + +/obj/item/implanter/uplink/precharged + name = "implanter (precharged uplink)" + imp_type = /obj/item/implant/uplink/precharged + +/obj/item/implant/uplink/precharged + starting_tc = 10 diff --git a/code/game/objects/items/manuals.dm b/code/game/objects/items/manuals.dm index 02d0a1c36a..6ae34e9ca2 100644 --- a/code/game/objects/items/manuals.dm +++ b/code/game/objects/items/manuals.dm @@ -244,7 +244,7 @@ ..() /obj/item/book/manual/wiki/proc/initialize_wikibook() - var/wikiurl = CONFIG_GET(string/wikiurl) + var/wikiurl = CONFIG_GET(string/wikiurltg) if(wikiurl) dat = {" @@ -270,13 +270,67 @@ "} -/obj/item/book/manual/wiki/chemistry +/obj/item/book/manual/wiki/cit + name = "Citadel infobook" + icon_state ="book8" + author = "Nanotrasen" + title = "Citadel infobook" + page_link = "" + window_size = "1500x800" //Too squashed otherwise + +/obj/item/book/manual/wiki/cit/initialize_wikibook() + var/wikiurl = CONFIG_GET(string/wikiurl) + if(wikiurl) + dat = {" + + + + + + +

You start skimming through the manual...

+ + + + + + "} + +/obj/item/book/manual/wiki/cit/chemistry name = "Chemistry Textbook" icon_state ="chemistrybook" author = "Nanotrasen" title = "Chemistry Textbook" + page_link = "main/guides/guide_chemistry" + +/obj/item/book/manual/wiki/cit/chem_recipies + name = "Chemistry Recipies" + icon_state ="chemrecibook" + author = "Chemcat" + title = "Chemistry Recipies" + page_link = "main/guides/chem_recipies" + +/obj/item/book/manual/wiki/chemistry + name = "Outdated Chemistry Textbook" + icon_state ="chemistrybook_old" + author = "Nanotrasen" + title = "Outdated Chemistry Textbook" page_link = "Guide_to_chemistry" +/obj/item/book/manual/wiki/chemistry/Initialize() + ..() + new /obj/item/book/manual/wiki/cit/chemistry(loc) + new /obj/item/book/manual/wiki/cit/chem_recipies(loc) + /obj/item/book/manual/wiki/engineering_construction name = "Station Repairs and Construction" icon_state ="bookEngineering" diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index d854ab9f5a..624dbdd8ef 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -142,6 +142,8 @@ w_class = WEIGHT_CLASS_NORMAL sharpness = IS_SHARP light_color = "#40ceff" + tool_behaviour = TOOL_SAW + toolspeed = 0.7 /obj/item/melee/transforming/energy/sword/cyborg/saw/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) return 0 @@ -231,3 +233,152 @@ desc = "An extremely sharp blade made out of hard light. Packs quite a punch." icon_state = "lightblade" item_state = "lightblade" + +/*///////////////////////////////////////////////////////////////////////// +///////////// The TRUE Energy Sword /////////////////////////// +*////////////////////////////////////////////////////////////////////////// + +/obj/item/melee/transforming/energy/sword/cx + name = "non-eutactic blade" + desc = "The Non-Eutactic Blade utilizes a hardlight blade that is dynamically 'forged' on demand to create a deadly sharp edge that is unbreakable." + icon_state = "cxsword_hilt" + item_state = "cxsword" + force = 3 + force_on = 21 + throwforce = 5 + throwforce_on = 20 + hitsound = "swing_hit" //it starts deactivated + hitsound_on = 'sound/weapons/nebhit.ogg' + attack_verb_off = list("tapped", "poked") + throw_speed = 3 + throw_range = 5 + sharpness = IS_SHARP + embedding = list("embedded_pain_multiplier" = 6, "embed_chance" = 20, "embedded_fall_chance" = 60) + armour_penetration = 10 + block_chance = 35 + light_color = "#37FFF7" + actions_types = list() + +/obj/item/melee/transforming/energy/sword/cx/pre_altattackby(atom/A, mob/living/user, params) //checks if it can do right click memes + altafterattack(A, user, TRUE, params) + return TRUE + +/obj/item/melee/transforming/energy/sword/cx/altafterattack(atom/target, mob/living/carbon/user, proximity_flag, click_parameters) //does right click memes + if(istype(user)) + user.visible_message("[user] points the tip of [src] at [target].", "You point the tip of [src] at [target].") + return TRUE + +/obj/item/melee/transforming/energy/sword/cx/transform_weapon(mob/living/user, supress_message_text) + active = !active //I'd use a ..() here but it'd inherit from the regular esword's proc instead, so SPAGHETTI CODE + if(active) //also I'd need to rip out the iconstate changing bits + force = force_on + throwforce = throwforce_on + hitsound = hitsound_on + throw_speed = 4 + if(attack_verb_on.len) + attack_verb = attack_verb_on + w_class = w_class_on + START_PROCESSING(SSobj, src) + set_light(brightness_on) + update_icon() + else + force = initial(force) + throwforce = initial(throwforce) + hitsound = initial(hitsound) + throw_speed = initial(throw_speed) + if(attack_verb_off.len) + attack_verb = attack_verb_off + w_class = initial(w_class) + STOP_PROCESSING(SSobj, src) + set_light(0) + update_icon() + transform_messages(user, supress_message_text) + add_fingerprint(user) + return TRUE + +/obj/item/melee/transforming/energy/sword/cx/transform_messages(mob/living/user, supress_message_text) + playsound(user, active ? 'sound/weapons/nebon.ogg' : 'sound/weapons/neboff.ogg', 65, 1) + if(!supress_message_text) + to_chat(user, "[src] [active ? "is now active":"can now be concealed"].") + +/obj/item/melee/transforming/energy/sword/cx/update_icon() + var/mutable_appearance/blade_overlay = mutable_appearance(icon, "cxsword_blade") + var/mutable_appearance/gem_overlay = mutable_appearance(icon, "cxsword_gem") + + if(light_color) + blade_overlay.color = light_color + gem_overlay.color = light_color + + cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other + + add_overlay(gem_overlay) + + if(active) + add_overlay(blade_overlay) + if(ismob(loc)) + var/mob/M = loc + M.update_inv_hands() + +/obj/item/melee/transforming/energy/sword/cx/AltClick(mob/living/user) + if(!in_range(src, user)) //Basic checks to prevent abuse + 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) + light_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1) + update_icon() + update_light() + +/obj/item/melee/transforming/energy/sword/cx/examine(mob/user) + ..() + to_chat(user, "Alt-click to recolor it.") + +/obj/item/melee/transforming/energy/sword/cx/worn_overlays(isinhands, icon_file) + . = ..() + if(active) + if(isinhands) + var/mutable_appearance/blade_inhand = mutable_appearance(icon_file, "cxsword_blade") + blade_inhand.color = light_color + . += blade_inhand + +//Broken version. Not a toy, but not as strong. +/obj/item/melee/transforming/energy/sword/cx/broken + name = "misaligned non-eutactic blade" + desc = "The Non-Eutactic Blade utilizes a hardlight blade that is dynamically 'forged' on demand to create a deadly sharp edge that is unbreakable. This one seems to have a damaged handle and misaligned components, causing the blade to be unstable at best" + force_on = 15 //As strong a survival knife/bone dagger + +/obj/item/melee/transforming/energy/sword/cx/attackby(obj/item/W, mob/living/user, params) + if(istype(W, /obj/item/melee/transforming/energy/sword/cx)) + if(HAS_TRAIT(W, TRAIT_NODROP) || HAS_TRAIT(src, TRAIT_NODROP)) + to_chat(user, "\the [HAS_TRAIT(src, TRAIT_NODROP) ? src : W] is stuck to your hand, you can't attach it to \the [HAS_TRAIT(src, TRAIT_NODROP) ? W : src]!") + 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()) + qdel(W) + qdel(src) + else + return ..() + +//////// Tatortot NEB /////////////// (same stats as regular esword) +/obj/item/melee/transforming/energy/sword/cx/traitor + name = "\improper Dragon's Tooth Sword" + desc = "The Dragon's Tooth sword is a blackmarket modification of a Non-Eutactic Blade, \ + which utilizes a hardlight blade that is dynamically 'forged' on demand to create a deadly sharp edge that is unbreakable. \ + It appears to have a wooden grip and a shaved down guard." + icon_state = "cxsword_hilt_traitor" + force_on = 30 + armour_penetration = 50 + embedding = list("embedded_pain_multiplier" = 10, "embed_chance" = 75, "embedded_fall_chance" = 0, "embedded_impact_pain_multiplier" = 10) + block_chance = 50 + hitsound_on = 'sound/weapons/blade1.ogg' + light_color = "#37F0FF" + +/obj/item/melee/transforming/energy/sword/cx/traitor/transform_messages(mob/living/user, supress_message_text) + playsound(user, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 35, 1) + if(!supress_message_text) + to_chat(user, "[src] [active ? "is now active":"can now be concealed"].") diff --git a/code/game/objects/items/melee/transforming.dm b/code/game/objects/items/melee/transforming.dm index aabb930bb2..850810bdb2 100644 --- a/code/game/objects/items/melee/transforming.dm +++ b/code/game/objects/items/melee/transforming.dm @@ -69,7 +69,7 @@ var/datum/component/butchering/BT = LoadComponent(/datum/component/butchering) BT.butchering_enabled = TRUE else - GET_COMPONENT(BT, /datum/component/butchering) + var/datum/component/butchering/BT = GetComponent(/datum/component/butchering) if(BT) BT.butchering_enabled = FALSE transform_messages(user, supress_message_text) diff --git a/code/game/objects/items/mop.dm b/code/game/objects/items/mop.dm index 7524fc9007..3f7fe7ee8d 100644 --- a/code/game/objects/items/mop.dm +++ b/code/game/objects/items/mop.dm @@ -27,6 +27,7 @@ /obj/item/mop/proc/clean(turf/A) if(reagents.has_reagent("water", 1) || reagents.has_reagent("holywater", 1) || reagents.has_reagent("vodka", 1) || reagents.has_reagent("cleaner", 1)) SEND_SIGNAL(A, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM) + A.clean_blood() for(var/obj/effect/O in A) if(is_cleanable(O)) qdel(O) diff --git a/code/game/objects/items/paint.dm b/code/game/objects/items/paint.dm index a6f5830dd4..cc2f5e9be7 100644 --- a/code/game/objects/items/paint.dm +++ b/code/game/objects/items/paint.dm @@ -90,14 +90,14 @@ add_fingerprint(user) -/obj/item/paint/afterattack(turf/target, mob/user, proximity) +/obj/item/paint/afterattack(atom/target, mob/user, proximity) . = ..() if(!proximity) return if(paintleft <= 0) icon_state = "paint_empty" return - if(!istype(target) || isspaceturf(target)) + if(!isturf(target) || isspaceturf(target)) return var/newcolor = "#" + item_color target.add_atom_colour(newcolor, WASHABLE_COLOUR_PRIORITY) @@ -105,12 +105,14 @@ /obj/item/paint/paint_remover gender = PLURAL name = "paint remover" - desc = "Used to remove color from floors and walls." + desc = "Used to remove color from anything." icon_state = "paint_neutral" -/obj/item/paint/paint_remover/afterattack(turf/target, mob/user, proximity) +/obj/item/paint/paint_remover/afterattack(atom/target, mob/user, proximity) . = ..() if(!proximity) return - if(istype(target) && target.color != initial(target.color)) + if(!isturf(target) || !isobj(target)) + return + if(target.color != initial(target.color)) target.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm index a73be6e12e..30442d7304 100644 --- a/code/game/objects/items/pet_carrier.dm +++ b/code/game/objects/items/pet_carrier.dm @@ -122,7 +122,7 @@ 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) + if(!do_after(user, rand(300, 400), 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,7 +132,7 @@ 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) + if(!do_after(user, 200, 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!") @@ -185,7 +185,7 @@ occupant_weight += occupant.mob_size /obj/item/pet_carrier/proc/remove_occupant(mob/living/occupant, turf/new_turf) - if(!occupant in occupants || !istype(occupant)) + if(!(occupant in occupants) || !istype(occupant)) return occupant.forceMove(new_turf ? new_turf : drop_location()) occupants -= occupant diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm index 8582725cda..7b3dcb1e00 100644 --- a/code/game/objects/items/religion.dm +++ b/code/game/objects/items/religion.dm @@ -82,14 +82,6 @@ /obj/item/banner/security/mundane inspiration_available = FALSE -/datum/crafting_recipe/security_banner - name = "Securistan Banner" - result = /obj/item/banner/security/mundane - time = 40 - reqs = list(/obj/item/stack/rods = 2, - /obj/item/clothing/under/rank/security = 1) - category = CAT_MISC - /obj/item/banner/medical name = "meditopia banner" desc = "The banner of Meditopia, generous benefactors that cure wounds and shelter the weak." @@ -103,14 +95,6 @@ /obj/item/banner/medical/check_inspiration(mob/living/carbon/human/H) return H.stat //Meditopia is moved to help those in need -/datum/crafting_recipe/medical_banner - name = "Meditopia Banner" - result = /obj/item/banner/medical/mundane - time = 40 - reqs = list(/obj/item/stack/rods = 2, - /obj/item/clothing/under/rank/medical = 1) - category = CAT_MISC - /obj/item/banner/medical/special_inspiration(mob/living/carbon/human/H) H.adjustToxLoss(-15) H.setOxyLoss(0) @@ -129,14 +113,6 @@ /obj/item/banner/science/check_inspiration(mob/living/carbon/human/H) return H.on_fire //Sciencia is pleased by dedication to the art of Toxins -/datum/crafting_recipe/science_banner - name = "Sciencia Banner" - result = /obj/item/banner/science/mundane - time = 40 - reqs = list(/obj/item/stack/rods = 2, - /obj/item/clothing/under/rank/scientist = 1) - category = CAT_MISC - /obj/item/banner/cargo name = "cargonia banner" desc = "The banner of the eternal Cargonia, with the mystical power of conjuring any object into existence." @@ -147,14 +123,6 @@ /obj/item/banner/cargo/mundane inspiration_available = FALSE -/datum/crafting_recipe/cargo_banner - name = "Cargonia Banner" - result = /obj/item/banner/cargo/mundane - time = 40 - reqs = list(/obj/item/stack/rods = 2, - /obj/item/clothing/under/rank/cargotech = 1) - category = CAT_MISC - /obj/item/banner/engineering name = "engitopia banner" desc = "The banner of Engitopia, wielders of limitless power." @@ -168,14 +136,6 @@ /obj/item/banner/engineering/special_inspiration(mob/living/carbon/human/H) H.radiation = 0 -/datum/crafting_recipe/engineering_banner - name = "Engitopia Banner" - result = /obj/item/banner/engineering/mundane - time = 40 - reqs = list(/obj/item/stack/rods = 2, - /obj/item/clothing/under/rank/engineer = 1) - category = CAT_MISC - /obj/item/banner/command name = "command banner" desc = "The banner of Command, a staunch and ancient line of bueraucratic kings and queens." @@ -189,14 +149,6 @@ /obj/item/banner/command/check_inspiration(mob/living/carbon/human/H) return HAS_TRAIT(H, TRAIT_MINDSHIELD) //Command is stalwart but rewards their allies. -/datum/crafting_recipe/command_banner - name = "Command Banner" - result = /obj/item/banner/command/mundane - time = 40 - reqs = list(/obj/item/stack/rods = 2, - /obj/item/clothing/under/captainparade = 1) - category = CAT_MISC - /obj/item/banner/red name = "red banner" icon_state = "banner-red" @@ -216,7 +168,7 @@ /obj/item/storage/backpack/bannerpack/Initialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_combined_w_class = 27 //6 more then normal, for the tradeoff of declaring yourself an antag at all times. /obj/item/storage/backpack/bannerpack/red @@ -286,7 +238,6 @@ var/staffcooldown = 0 var/staffwait = 30 - /obj/item/godstaff/afterattack(atom/target, mob/user, proximity_flag, click_parameters) . = ..() if(staffcooldown + staffwait > world.time) @@ -332,19 +283,16 @@ heat_protection = FEET max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT - /obj/item/clothing/shoes/plate/red icon_state = "crusader-red" /obj/item/clothing/shoes/plate/blue icon_state = "crusader-blue" - /obj/item/storage/box/itemset/crusader name = "Crusader's Armour Set" //i can't into ck2 references desc = "This armour is said to be based on the armor of kings on another world thousands of years ago, who tended to assassinate, conspire, and plot against everyone who tried to do the same to them. Some things never change." - /obj/item/storage/box/itemset/crusader/blue/New() ..() contents = list() @@ -354,7 +302,6 @@ new /obj/item/clothing/gloves/plate/blue(src) new /obj/item/clothing/shoes/plate/blue(src) - /obj/item/storage/box/itemset/crusader/red/New() ..() contents = list() @@ -364,7 +311,6 @@ new /obj/item/clothing/gloves/plate/red(src) new /obj/item/clothing/shoes/plate/red(src) - /obj/item/claymore/weak desc = "This one is rusted." force = 30 diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index 5454b0fdb8..0e5d3add5f 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -746,3 +746,73 @@ ..() hud = new /obj/item/clothing/glasses/hud/security(src) return + + +/********************************************************************** + Grippers oh god oh fuck +***********************************************************************/ + +/obj/item/weapon/gripper + name = "circuit gripper" + desc = "A simple grasping tool for inserting circuitboards into machinary." + icon = 'icons/obj/device.dmi' + icon_state = "gripper" + + item_flags = NOBLUDGEON + + //Has a list of items that it can hold. + var/list/can_hold = list( + /obj/item/circuitboard + ) + + var/obj/item/wrapped = null // Item currently being held. + +/obj/item/weapon/gripper/attack_self() + if(wrapped) + wrapped.forceMove(get_turf(wrapped)) + wrapped = null + return ..() + +/obj/item/weapon/gripper/afterattack(var/atom/target, var/mob/living/user, proximity, params) + + if(!proximity) + return + + if(!wrapped) + for(var/obj/item/thing in src.contents) + wrapped = thing + break + + if(wrapped) //Already have an item. + //Temporary put wrapped into user so target's attackby() checks pass. + wrapped.loc = user + + //Pass the attack on to the target. This might delete/relocate wrapped. + var/resolved = target.attackby(wrapped,user) + if(!resolved && wrapped && target) + wrapped.afterattack(target,user,1) + //If wrapped was neither deleted nor put into target, put it back into the gripper. + if(wrapped && user && (wrapped.loc == user)) + wrapped.loc = src + else + wrapped = null + 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 + + //We can grab the item, finally. + if(grab) + to_chat(user, "You collect \the [I].") + I.loc = src + wrapped = I + return + else + to_chat(user, "Your gripper cannot hold \the [target].") diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index cd2ccff170..95110692c9 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -254,7 +254,7 @@ to_chat(user, "The MMI indicates that their mind is currently inactive; it might change!") return - if(BM.stat == DEAD || (M.brain && M.brain.damaged_brain)) + if(BM.stat == DEAD || (M.brain && M.brain.organ_flags & ORGAN_FAILING)) to_chat(user, "Sticking a dead brain into the frame would sort of defeat the purpose!") return diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index d5806494e6..e1834078a6 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -9,7 +9,7 @@ var/locked = FALSE var/installed = 0 var/require_module = 0 - var/module_type = null + var/list/module_type // if true, is not stored in the robot to be ejected // if module is reset var/one_use = FALSE @@ -18,7 +18,7 @@ if(R.stat == DEAD) to_chat(user, "[src] will not function on a deceased cyborg.") return FALSE - if(module_type && !istype(R.module, module_type)) + if(module_type && !is_type_in_list(R.module, module_type)) to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") to_chat(user, "There's no mounting point for the module!") return FALSE @@ -93,7 +93,6 @@ desc = "Used to cool a mounted disabler, increasing the potential current in it and thus its recharge rate." icon_state = "cyborg_upgrade3" require_module = 1 - //module_type = /obj/item/robot_module/security /obj/item/borg/upgrade/disablercooler/action(mob/living/silicon/robot/R, user = usr) . = ..() @@ -141,7 +140,7 @@ desc = "A diamond drill replacement for the mining module's standard drill." icon_state = "cyborg_upgrade3" require_module = 1 - module_type = /obj/item/robot_module/miner + module_type = list(/obj/item/robot_module/miner) /obj/item/borg/upgrade/ddrill/action(mob/living/silicon/robot/R, user = usr) . = ..() @@ -173,7 +172,7 @@ desc = "A satchel of holding replacement for mining cyborg's ore satchel module." icon_state = "cyborg_upgrade3" require_module = 1 - module_type = /obj/item/robot_module/miner + module_type = list(/obj/item/robot_module/miner) /obj/item/borg/upgrade/soh/action(mob/living/silicon/robot/R) . = ..() @@ -200,7 +199,7 @@ desc = "A trash bag of holding replacement for the janiborg's standard trash bag." icon_state = "cyborg_upgrade3" require_module = 1 - module_type = /obj/item/robot_module/janitor + module_type = list(/obj/item/robot_module/janitor, /obj/item/robot_module/scrubpup) /obj/item/borg/upgrade/tboh/action(mob/living/silicon/robot/R) . = ..() @@ -227,7 +226,7 @@ desc = "An advanced mop replacement for the janiborg's standard mop." icon_state = "cyborg_upgrade3" require_module = 1 - module_type = /obj/item/robot_module/janitor + module_type = list(/obj/item/robot_module/janitor, /obj/item/robot_module/scrubpup) /obj/item/borg/upgrade/amop/action(mob/living/silicon/robot/R) . = ..() @@ -276,7 +275,7 @@ icon_state = "ash_plating" resistance_flags = LAVA_PROOF | FIRE_PROOF require_module = 1 - module_type = /obj/item/robot_module/miner + module_type = list(/obj/item/robot_module/miner) /obj/item/borg/upgrade/lavaproof/action(mob/living/silicon/robot/R, user = usr) . = ..() @@ -405,7 +404,9 @@ to produce more advanced and complex medical reagents." icon_state = "cyborg_upgrade3" require_module = 1 - module_type = /obj/item/robot_module/medical + module_type = list(/obj/item/robot_module/medical, + /obj/item/robot_module/syndicate_medical, + /obj/item/robot_module/medihound) var/list/additional_reagents = list() /obj/item/borg/upgrade/hypospray/action(mob/living/silicon/robot/R, user = usr) @@ -467,7 +468,9 @@ defibrillator, for on the scene revival." icon_state = "cyborg_upgrade3" require_module = 1 - module_type = /obj/item/robot_module/medical + module_type = list(/obj/item/robot_module/medical, + /obj/item/robot_module/syndicate_medical, + /obj/item/robot_module/medihound) /obj/item/borg/upgrade/defib/action(mob/living/silicon/robot/R, user = usr) . = ..() @@ -489,7 +492,9 @@ out procedures" icon_state = "cyborg_upgrade3" require_module = 1 - module_type = /obj/item/robot_module/medical + module_type = list(/obj/item/robot_module/medical, + /obj/item/robot_module/syndicate_medical, + /obj/item/robot_module/medihound) /obj/item/borg/upgrade/processor/action(mob/living/silicon/robot/R, user = usr) . = ..() @@ -514,7 +519,7 @@ /obj/item/robot_module/medical, /obj/item/robot_module/syndicate_medical, /obj/item/robot_module/medihound, - /obj/item/robot_module/borgi) + /obj/item/robot_module/borgi) /obj/item/borg/upgrade/advhealth/action(mob/living/silicon/robot/R, user = usr) . = ..() @@ -593,25 +598,32 @@ R.update_transform() /obj/item/borg/upgrade/rped - name = "engineering cyborg RPED" + name = "engineering cyborg BSRPED" desc = "A rapid part exchange device for the engineering cyborg." icon = 'icons/obj/storage.dmi' - icon_state = "borgrped" + icon_state = "borg_BS_RPED" require_module = TRUE - module_type = /obj/item/robot_module/engineering + module_type = list(/obj/item/robot_module/engineering) /obj/item/borg/upgrade/rped/action(mob/living/silicon/robot/R, user = usr) . = ..() if(.) + var/obj/item/storage/part_replacer/bluespace/cyborg/BSRPED = locate() in R var/obj/item/storage/part_replacer/cyborg/RPED = locate() in R - if(RPED) - to_chat(user, "This unit is already equipped with a RPED module.") + if(!RPED) + RPED = locate() in R.module + if(!BSRPED) + BSRPED = locate() in R.module //There's gotta be a smarter way to do this. + if(BSRPED) + to_chat(user, "This unit is already equipped with a BSRPED module.") return FALSE - RPED = new(R.module) - R.module.basic_modules += RPED - R.module.add_module(RPED, FALSE, TRUE) + BSRPED = new(R.module) + SEND_SIGNAL(RPED, COMSIG_TRY_STORAGE_QUICK_EMPTY) + qdel(RPED) + R.module.basic_modules += BSRPED + R.module.add_module(BSRPED, FALSE, TRUE) /obj/item/borg/upgrade/rped/deactivate(mob/living/silicon/robot/R, user = usr) . = ..() @@ -626,7 +638,9 @@ icon = 'icons/obj/device.dmi' icon_state = "pinpointer_crew" require_module = TRUE - module_type = /obj/item/robot_module/medical + module_type = list(/obj/item/robot_module/medical, + /obj/item/robot_module/syndicate_medical, + /obj/item/robot_module/medihound) /obj/item/borg/upgrade/pinpointer/action(mob/living/silicon/robot/R, user = usr) . = ..() @@ -664,3 +678,33 @@ desc = "Allows you to to turn a cyborg into a clown, honk." icon_state = "cyborg_upgrade3" new_module = /obj/item/robot_module/clown + +// Citadel's Vtech Controller +/obj/effect/proc_holder/silicon/cyborg/vtecControl + name = "vTec Control" + desc = "Allows finer-grained control of the vTec speed boost." + action_icon = 'icons/mob/actions.dmi' + action_icon_state = "Chevron_State_0" + + var/currentState = 0 + var/maxReduction = 1 + + +/obj/effect/proc_holder/silicon/cyborg/vtecControl/Click(mob/living/silicon/robot/user) + var/mob/living/silicon/robot/self = usr + + currentState = (currentState + 1) % 3 + + if(istype(self)) + switch(currentState) + if (0) + self.speed = initial(self.speed) + if (1) + self.speed = initial(self.speed) - maxReduction * 0.5 + if (2) + self.speed = initial(self.speed) - maxReduction * 1 + + action.button_icon_state = "Chevron_State_[currentState]" + action.UpdateButtonIcon() + + return diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 5610cbad9a..886997eab9 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -17,7 +17,6 @@ var/self_delay = 50 /obj/item/stack/medical/attack(mob/living/M, mob/user) - if(M.stat == DEAD && !stop_bleeding) var/t_him = "it" if(M.gender == MALE) diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 47c881bbdf..c9fc59a3fe 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -25,6 +25,7 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ merge_type = /obj/item/stack/sheet/glass grind_results = list(/datum/reagent/silicon = 20) point_value = 1 + tableVariant = /obj/structure/table/glass /obj/item/stack/sheet/glass/suicide_act(mob/living/carbon/user) user.visible_message("[user] begins to slice [user.p_their()] neck with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") @@ -88,6 +89,7 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \ resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/plasmaglass grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/toxin/plasma = 10) + tableVariant = /obj/structure/table/plasmaglass /obj/item/stack/sheet/plasmaglass/fifty amount = 50 diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 7df165461b..46c0d47388 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -232,6 +232,7 @@ GLOBAL_LIST_INIT(gold_recipes, list ( \ grind_results = list("silver" = 20) point_value = 20 merge_type = /obj/item/stack/sheet/mineral/silver + tableVariant = /obj/structure/table/optable 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), \ diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 8c808d0e5f..c085306892 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -107,6 +107,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ merge_type = /obj/item/stack/sheet/metal grind_results = list("iron" = 20) point_value = 2 + tableVariant = /obj/structure/table /obj/item/stack/sheet/metal/ratvar_act() new /obj/item/stack/tile/brass(loc, amount) @@ -168,6 +169,7 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \ merge_type = /obj/item/stack/sheet/plasteel grind_results = list("iron" = 20, "plasma" = 20) point_value = 23 + tableVariant = /obj/structure/table/reinforced /obj/item/stack/sheet/plasteel/Initialize(mapload, new_amount, merge = TRUE) recipes = GLOB.plasteel_recipes @@ -474,6 +476,7 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \ novariants = FALSE grind_results = list("iron" = 5, "teslium" = 15, "holyoil" = 1) merge_type = /obj/item/stack/tile/brass + tableVariant = /obj/structure/table/reinforced/brass /obj/item/stack/tile/brass/narsie_act() new /obj/item/stack/sheet/runed_metal(loc, amount) @@ -526,6 +529,7 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \ novariants = FALSE grind_results = list("iron" = 5, "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 /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 diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 4217a58f81..7654199cf5 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -22,6 +22,7 @@ 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. //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) /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 @@ -389,9 +390,9 @@ . = ..() /obj/item/stack/proc/copy_evidences(obj/item/stack/from) - add_blood_DNA(from.return_blood_DNA()) - add_fingerprint_list(from.return_fingerprints()) - add_hiddenprint_list(from.return_hiddenprints()) + blood_DNA = from.blood_DNA + fingerprints = from.fingerprints + fingerprintshidden = from.fingerprintshidden fingerprintslast = from.fingerprintslast //TODO bloody overlay @@ -436,4 +437,4 @@ /datum/stack_recipe_list/New(title, recipes) src.title = title - src.recipes = recipes + src.recipes = recipes \ No newline at end of file diff --git a/code/game/objects/items/stacks/telecrystal.dm b/code/game/objects/items/stacks/telecrystal.dm index c1fb396529..9b5ca2b066 100644 --- a/code/game/objects/items/stacks/telecrystal.dm +++ b/code/game/objects/items/stacks/telecrystal.dm @@ -9,10 +9,11 @@ item_flags = NOBLUDGEON /obj/item/stack/telecrystal/attack(mob/target, mob/user) - if(target == user) //You can't go around smacking people with crystals to find out if they have an uplink or not. - for(var/obj/item/implant/uplink/I in target) - if(I && I.imp_in) - GET_COMPONENT_FROM(hidden_uplink, /datum/component/uplink, I) + if(target == user && isliving(user)) //You can't go around smacking people with crystals to find out if they have an uplink or not. + var/mob/living/L = user + for(var/obj/item/implant/uplink/I in L.implants) + if(I?.imp_in) + var/datum/component/uplink/hidden_uplink = I.GetComponent(/datum/component/uplink) if(hidden_uplink) hidden_uplink.telecrystals += amount use(amount) diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 3b28c30402..847e1b521e 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -99,33 +99,117 @@ icon_state = "tile-carpet" turf_type = /turf/open/floor/carpet resistance_flags = FLAMMABLE - -/obj/item/stack/tile/carpet/fifty - amount = 50 + tableVariant = /obj/structure/table/wood/fancy /obj/item/stack/tile/carpet/black name = "black carpet" icon_state = "tile-carpet-black" turf_type = /turf/open/floor/carpet/black + tableVariant = /obj/structure/table/wood/fancy/black + +/obj/item/stack/tile/carpet/blackred + name = "red carpet" + icon_state = "tile-carpet-blackred" + turf_type = /turf/open/floor/carpet/blackred + tableVariant = /obj/structure/table/wood/fancy/blackred + +/obj/item/stack/tile/carpet/monochrome + name = "monochrome carpet" + icon_state = "tile-carpet-monochrome" + turf_type = /turf/open/floor/carpet/monochrome + tableVariant = /obj/structure/table/wood/fancy/monochrome + +/obj/item/stack/tile/carpet/blue + name = "blue carpet" + icon_state = "tile-carpet-blue" + item_state = "tile-carpet-blue" + turf_type = /turf/open/floor/carpet/blue + tableVariant = /obj/structure/table/wood/fancy/blue + +/obj/item/stack/tile/carpet/cyan + name = "cyan carpet" + icon_state = "tile-carpet-cyan" + item_state = "tile-carpet-cyan" + turf_type = /turf/open/floor/carpet/cyan + tableVariant = /obj/structure/table/wood/fancy/cyan + +/obj/item/stack/tile/carpet/green + name = "green carpet" + icon_state = "tile-carpet-green" + item_state = "tile-carpet-green" + turf_type = /turf/open/floor/carpet/green + tableVariant = /obj/structure/table/wood/fancy/green + +/obj/item/stack/tile/carpet/orange + name = "orange carpet" + icon_state = "tile-carpet-orange" + item_state = "tile-carpet-orange" + turf_type = /turf/open/floor/carpet/orange + tableVariant = /obj/structure/table/wood/fancy/orange + +/obj/item/stack/tile/carpet/purple + name = "purple carpet" + icon_state = "tile-carpet-purple" + item_state = "tile-carpet-purple" + turf_type = /turf/open/floor/carpet/purple + tableVariant = /obj/structure/table/wood/fancy/purple + +/obj/item/stack/tile/carpet/red + name = "red carpet" + icon_state = "tile-carpet-red" + item_state = "tile-carpet-red" + turf_type = /turf/open/floor/carpet/red + tableVariant = /obj/structure/table/wood/fancy/red + +/obj/item/stack/tile/carpet/royalblack + name = "royal black carpet" + icon_state = "tile-carpet-royalblack" + item_state = "tile-carpet-royalblack" + turf_type = /turf/open/floor/carpet/royalblack + tableVariant = /obj/structure/table/wood/fancy/royalblack + +/obj/item/stack/tile/carpet/royalblue + name = "royal blue carpet" + icon_state = "tile-carpet-royalblue" + item_state = "tile-carpet-royalblue" + turf_type = /turf/open/floor/carpet/royalblue + tableVariant = /obj/structure/table/wood/fancy/royalblue + +/obj/item/stack/tile/carpet/fifty + amount = 50 /obj/item/stack/tile/carpet/black/fifty amount = 50 -/obj/item/stack/tile/carpet/blackred - name = "red carpet" - icon_state = "tile-carpet-blackred" - turf_type = /turf/open/floor/carpet/blackred - /obj/item/stack/tile/carpet/blackred/fifty - amount = 50 - -/obj/item/stack/tile/carpet/monochrome - name = "monochrome carpet" - icon_state = "tile-carpet-monochrome" - turf_type = /turf/open/floor/carpet/monochrome + amount = 50 /obj/item/stack/tile/carpet/monochrome/fifty - amount = 50 + amount = 50 + +/obj/item/stack/tile/carpet/blue/fifty + amount = 50 + +/obj/item/stack/tile/carpet/cyan/fifty + amount = 50 + +/obj/item/stack/tile/carpet/green/fifty + amount = 50 + +/obj/item/stack/tile/carpet/orange/fifty + amount = 50 + +/obj/item/stack/tile/carpet/purple/fifty + amount = 50 + +/obj/item/stack/tile/carpet/red/fifty + amount = 50 + +/obj/item/stack/tile/carpet/royalblack/fifty + amount = 50 + +/obj/item/stack/tile/carpet/royalblue/fifty + amount = 50 /obj/item/stack/tile/fakespace name = "astral carpet" diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index b5d7282b07..a79eb299da 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -23,7 +23,7 @@ /obj/item/storage/backpack/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_combined_w_class = 21 STR.max_w_class = WEIGHT_CLASS_NORMAL STR.max_items = 21 @@ -34,7 +34,7 @@ /obj/item/storage/backpack/old/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_combined_w_class = 12 /obj/item/storage/backpack/holding @@ -46,6 +46,7 @@ item_flags = NO_MAT_REDEMPTION armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 50) component_type = /datum/component/storage/concrete/bluespace/bag_of_holding + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE /obj/item/storage/backpack/holding/satchel name = "satchel of holding" @@ -53,10 +54,11 @@ icon_state = "holdingsat" item_state = "holdingsat" species_exception = list(/datum/species/angel) + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE /obj/item/storage/backpack/holding/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.allow_big_nesting = TRUE STR.max_w_class = WEIGHT_CLASS_GIGANTIC STR.max_combined_w_class = 35 @@ -81,10 +83,11 @@ icon_state = "giftbag0" item_state = "giftbag" w_class = WEIGHT_CLASS_BULKY + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE /obj/item/storage/backpack/santabag/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_w_class = WEIGHT_CLASS_NORMAL STR.max_combined_w_class = 60 @@ -133,6 +136,8 @@ desc = "It's a special backpack made exclusively for Nanotrasen officers." icon_state = "captainpack" item_state = "captainpack" + resistance_flags = FIRE_PROOF + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE /obj/item/storage/backpack/industrial name = "industrial backpack" @@ -140,6 +145,7 @@ icon_state = "engiepack" item_state = "engiepack" resistance_flags = FIRE_PROOF + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE /obj/item/storage/backpack/botany name = "botany backpack" @@ -194,6 +200,8 @@ desc = "A tough satchel with extra pockets." icon_state = "satchel-eng" item_state = "engiepack" + resistance_flags = FIRE_PROOF + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE /obj/item/storage/backpack/satchel/med name = "medical satchel" @@ -252,7 +260,7 @@ /obj/item/storage/backpack/satchel/bone/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_combined_w_class = 20 STR.max_items = 15 @@ -261,6 +269,8 @@ desc = "An exclusive satchel for Nanotrasen officers." icon_state = "satchel-cap" item_state = "captainpack" + resistance_flags = FIRE_PROOF + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE /obj/item/storage/backpack/satchel/flat name = "smuggler's satchel" @@ -276,7 +286,7 @@ /obj/item/storage/backpack/satchel/flat/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_combined_w_class = 6 STR.cant_hold = typecacheof(list(/obj/item/storage/backpack/satchel/flat)) //muh recursive backpacks @@ -328,7 +338,7 @@ /obj/item/storage/backpack/duffelbag/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_combined_w_class = 30 /obj/item/storage/backpack/duffelbag/captain @@ -385,6 +395,8 @@ desc = "A large duffel bag for holding extra tools and supplies." icon_state = "duffel-eng" item_state = "duffel-eng" + resistance_flags = FIRE_PROOF + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE /obj/item/storage/backpack/duffelbag/durathread name = "durathread duffel bag" @@ -400,6 +412,7 @@ icon_state = "duffel-drone" item_state = "duffel-drone" resistance_flags = FIRE_PROOF + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE /obj/item/storage/backpack/duffelbag/drone/PopulateContents() new /obj/item/screwdriver(src) @@ -427,10 +440,11 @@ icon_state = "duffel-syndie" item_state = "duffel-syndieammo" slowdown = 0 + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE /obj/item/storage/backpack/duffelbag/syndie/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.silent = TRUE /obj/item/storage/backpack/duffelbag/syndie/hitman @@ -479,12 +493,9 @@ desc = "A large duffel bag for holding surgical tools. Bears the logo of an advanced med-tech firm." /obj/item/storage/backpack/duffelbag/syndie/surgery_adv/PopulateContents() - new /obj/item/hemostat/adv(src) - new /obj/item/circular_saw/adv(src) - new /obj/item/scalpel/adv(src) - new /obj/item/retractor/adv(src) - new /obj/item/cautery/adv(src) - new /obj/item/surgicaldrill/adv(src) + new /obj/item/scalpel/advanced(src) + new /obj/item/retractor/advanced(src) + new /obj/item/surgicaldrill/advanced(src) new /obj/item/surgical_drapes(src) new /obj/item/storage/firstaid/tactical(src) new /obj/item/clothing/suit/straight_jacket(src) @@ -583,7 +594,7 @@ // For ClownOps. /obj/item/storage/backpack/duffelbag/clown/syndie/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) slowdown = 0 STR.silent = TRUE diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index e4debeff49..eafa79798e 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -21,7 +21,7 @@ /obj/item/storage/bag/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.allow_quick_gather = TRUE STR.allow_quick_empty = TRUE STR.display_numerical_stacking = TRUE @@ -44,11 +44,13 @@ /obj/item/storage/bag/trash/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) 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.limited_random_access = TRUE + STR.limited_random_access_stack_position = 3 /obj/item/storage/bag/trash/suicide_act(mob/user) user.visible_message("[user] puts [src] over [user.p_their()] head and starts chomping at the insides! Disgusting!") @@ -81,12 +83,14 @@ desc = "The latest and greatest in custodial convenience, a trashbag that is capable of holding vast quantities of garbage." icon_state = "bluetrashbag" item_flags = NO_MAT_REDEMPTION + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE /obj/item/storage/bag/trash/bluespace/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_combined_w_class = 60 STR.max_items = 60 + STR.limited_random_access_stack_position = 5 /obj/item/storage/bag/trash/bluespace/cyborg insertable = FALSE @@ -104,11 +108,12 @@ w_class = WEIGHT_CLASS_NORMAL component_type = /datum/component/storage/concrete/stack var/spam_protection = FALSE //If this is TRUE, the holder won't receive any messages when they fail to pick up ore through crossing it - var/datum/component/mobhook + var/mob/listeningTo + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE /obj/item/storage/bag/ore/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage/concrete/stack) + var/datum/component/storage/concrete/stack/STR = GetComponent(/datum/component/storage/concrete/stack) STR.allow_quick_empty = TRUE STR.can_hold = typecacheof(list(/obj/item/stack/ore)) STR.max_w_class = WEIGHT_CLASS_HUGE @@ -116,15 +121,17 @@ /obj/item/storage/bag/ore/equipped(mob/user) . = ..() - if (mobhook && mobhook.parent != user) - QDEL_NULL(mobhook) - if (!mobhook) - mobhook = user.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED = CALLBACK(src, .proc/Pickup_ores))) + if(listeningTo == user) + return + if(listeningTo) + UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) + RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/Pickup_ores) + listeningTo = user /obj/item/storage/bag/ore/dropped() . = ..() - if (mobhook) - QDEL_NULL(mobhook) + UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) + listeningTo = null /obj/item/storage/bag/ore/proc/Pickup_ores(mob/living/user) var/show_message = FALSE @@ -134,7 +141,7 @@ return if (istype(user.pulling, /obj/structure/ore_box)) box = user.pulling - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) if(STR) for(var/A in tile) if (!is_type_in_typecache(A, STR.can_hold)) @@ -164,7 +171,7 @@ /obj/item/storage/bag/ore/cyborg/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage/concrete/stack) + var/datum/component/storage/concrete/stack/STR = GetComponent(/datum/component/storage/concrete/stack) STR.allow_quick_empty = TRUE STR.can_hold = typecacheof(list(/obj/item/stack/ore)) STR.max_w_class = WEIGHT_CLASS_HUGE @@ -176,7 +183,7 @@ /obj/item/storage/bag/ore/large/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage/concrete/stack) + var/datum/component/storage/concrete/stack/STR = GetComponent(/datum/component/storage/concrete/stack) STR.allow_quick_empty = TRUE STR.can_hold = typecacheof(list(/obj/item/stack/ore)) STR.max_w_class = WEIGHT_CLASS_HUGE @@ -189,7 +196,7 @@ /obj/item/storage/bag/ore/holding/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage/concrete/stack) + var/datum/component/storage/concrete/stack/STR = GetComponent(/datum/component/storage/concrete/stack) STR.max_items = INFINITY STR.max_combined_w_class = INFINITY STR.max_combined_stack_amount = INFINITY @@ -207,7 +214,7 @@ /obj/item/storage/bag/plants/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_w_class = WEIGHT_CLASS_NORMAL STR.max_combined_w_class = 100 STR.max_items = 100 @@ -247,7 +254,7 @@ /obj/item/storage/bag/sheetsnatcher/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage/concrete/stack) + var/datum/component/storage/concrete/stack/STR = GetComponent(/datum/component/storage/concrete/stack) STR.allow_quick_empty = TRUE STR.can_hold = typecacheof(list(/obj/item/stack/sheet)) STR.cant_hold = typecacheof(list(/obj/item/stack/sheet/mineral/sandstone, /obj/item/stack/sheet/mineral/wood)) @@ -264,7 +271,7 @@ /obj/item/storage/bag/sheetsnatcher/borg/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage/concrete/stack) + var/datum/component/storage/concrete/stack/STR = GetComponent(/datum/component/storage/concrete/stack) STR.max_combined_stack_amount = 500 // ----------------------------- @@ -281,7 +288,7 @@ /obj/item/storage/bag/books/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_w_class = WEIGHT_CLASS_NORMAL STR.max_combined_w_class = 21 STR.max_items = 7 @@ -306,15 +313,14 @@ /obj/item/storage/bag/tray/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.insert_preposition = "on" /obj/item/storage/bag/tray/attack(mob/living/M, mob/living/user) . = ..() // Drop all the things. All of them. var/list/obj/item/oldContents = contents.Copy() - GET_COMPONENT(STR, /datum/component/storage) - STR.quick_empty() + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_QUICK_EMPTY) // Make each item scatter a bit for(var/obj/item/I in oldContents) spawn() @@ -360,11 +366,11 @@ /obj/item/storage/bag/chemistry/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_combined_w_class = 200 STR.max_items = 50 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)) + 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)) /* * Biowaste bag (mostly for xenobiologists) @@ -380,7 +386,7 @@ /obj/item/storage/bag/bio/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_combined_w_class = 200 STR.max_items = 25 STR.insert_preposition = "in" @@ -391,9 +397,10 @@ icon = 'icons/obj/chemical.dmi' icon_state = "bspace_biobag" desc = "A bag for the safe transportation and disposal of biowaste and other biological materials." + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE /obj/item/storage/bag/bio/holding/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_combined_w_class = INFINITY STR.max_items = 100 diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 4495e9da14..713dbe4133 100755 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -40,10 +40,11 @@ icon_state = "utilitybelt" item_state = "utility" content_overlays = TRUE + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE //because this is easier than trying to have showers wash all contents. /obj/item/storage/belt/utility/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) var/static/list/can_hold = typecacheof(list( /obj/item/crowbar, /obj/item/screwdriver, @@ -126,7 +127,7 @@ /obj/item/storage/belt/medical/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_w_class = WEIGHT_CLASS_BULKY STR.can_hold = typecacheof(list( /obj/item/healthanalyzer, @@ -184,12 +185,9 @@ content_overlays = FALSE /obj/item/storage/belt/medical/surgery_belt_adv/PopulateContents() - new /obj/item/hemostat/adv(src) - new /obj/item/circular_saw/adv(src) - new /obj/item/scalpel/adv(src) - new /obj/item/retractor/adv(src) - new /obj/item/cautery/adv(src) - new /obj/item/surgicaldrill/adv(src) + new /obj/item/scalpel/advanced(src) + new /obj/item/retractor/advanced(src) + new /obj/item/surgicaldrill/advanced(src) new /obj/item/surgical_drapes(src) /obj/item/storage/belt/security @@ -201,7 +199,7 @@ /obj/item/storage/belt/security/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 5 STR.max_w_class = WEIGHT_CLASS_NORMAL STR.can_hold = typecacheof(list( @@ -240,7 +238,7 @@ /obj/item/storage/belt/mining/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 6 STR.max_w_class = WEIGHT_CLASS_BULKY STR.max_combined_w_class = 20 @@ -299,7 +297,7 @@ /obj/item/storage/belt/mining/primitive/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 5 /obj/item/storage/belt/soulstone @@ -310,7 +308,7 @@ /obj/item/storage/belt/soulstone/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 6 STR.can_hold = typecacheof(list( /obj/item/soulstone @@ -333,7 +331,7 @@ /obj/item/storage/belt/champion/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 1 STR.can_hold = list( /obj/item/clothing/mask/luchador @@ -344,10 +342,11 @@ desc = "A set of tactical webbing worn by Syndicate boarding parties." icon_state = "militarywebbing" item_state = "militarywebbing" + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE /obj/item/storage/belt/military/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_w_class = WEIGHT_CLASS_SMALL /obj/item/storage/belt/military/snack @@ -360,7 +359,7 @@ /obj/item/storage/belt/military/snack/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 6 STR.max_w_class = WEIGHT_CLASS_SMALL STR.can_hold = typecacheof(list( @@ -428,7 +427,7 @@ /obj/item/storage/belt/military/assault/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 6 /obj/item/storage/belt/durathread @@ -481,7 +480,7 @@ /obj/item/storage/belt/grenade/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 30 STR.display_numerical_stacking = TRUE STR.max_combined_w_class = 60 @@ -530,10 +529,11 @@ desc = "A belt designed to hold various rods of power. A veritable fanny pack of exotic magic." icon_state = "soulstonebelt" item_state = "soulstonebelt" + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE /obj/item/storage/belt/wands/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 6 STR.can_hold = typecacheof(list( /obj/item/gun/magic/wand @@ -559,7 +559,7 @@ /obj/item/storage/belt/janitor/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 6 STR.max_w_class = WEIGHT_CLASS_BULKY // Set to this so the light replacer can fit. STR.can_hold = typecacheof(list( @@ -586,7 +586,7 @@ /obj/item/storage/belt/bandolier/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 18 STR.display_numerical_stacking = TRUE STR.can_hold = typecacheof(list( @@ -599,10 +599,10 @@ icon_state = "bandolier-durathread" item_state = "bandolier-durathread" resistance_flags = FIRE_PROOF - + /obj/item/storage/belt/bandolier/durathread/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 32 STR.display_numerical_stacking = TRUE STR.can_hold = typecacheof(list( @@ -617,9 +617,12 @@ /obj/item/storage/belt/medolier/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 15 STR.display_numerical_stacking = FALSE + STR.allow_quick_gather = TRUE + STR.allow_quick_empty = TRUE + STR.click_gather = TRUE STR.can_hold = typecacheof(list( /obj/item/reagent_containers/syringe/dart )) @@ -628,6 +631,25 @@ for(var/i in 1 to 16) new /obj/item/reagent_containers/syringe/dart/(src) +/obj/item/storage/belt/medolier/afterattack(obj/target, mob/user , proximity) + if(!(istype(target, /obj/item/reagent_containers/glass/beaker))) + return + if(!proximity) + return + if(!target.reagents) + return + + for(var/obj/item/reagent_containers/syringe/dart/D in contents) + if(round(target.reagents.total_volume, 1) <= 0) + to_chat(user, "You soak as many of the darts as you can with the contents from [target].") + return + if(D.mode == SYRINGE_INJECT) + continue + + D.afterattack(target, user, proximity) + + ..() + /obj/item/storage/belt/holster name = "shoulder holster" desc = "A holster to carry a handgun and ammo. WARNING: Badasses only." @@ -637,7 +659,7 @@ /obj/item/storage/belt/holster/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 3 STR.max_w_class = WEIGHT_CLASS_NORMAL STR.can_hold = typecacheof(list( @@ -661,7 +683,7 @@ /obj/item/storage/belt/fannypack/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 3 STR.max_w_class = WEIGHT_CLASS_SMALL @@ -728,7 +750,7 @@ /obj/item/storage/belt/sabre/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 1 STR.rustle_sound = FALSE STR.max_w_class = WEIGHT_CLASS_BULKY diff --git a/code/game/objects/items/storage/book.dm b/code/game/objects/items/storage/book.dm index df7b203f91..c658eee3d5 100644 --- a/code/game/objects/items/storage/book.dm +++ b/code/game/objects/items/storage/book.dm @@ -11,7 +11,7 @@ /obj/item/storage/book/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 1 /obj/item/storage/book/attack_self(mob/user) @@ -140,7 +140,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible", else if(iscarbon(M)) var/mob/living/carbon/C = M if(!istype(C.head, /obj/item/clothing/head)) - C.adjustBrainLoss(10, 80) + C.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 80) to_chat(C, "You feel dumber.") if(smack) diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index 903c319644..dde0e0715b 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -33,6 +33,7 @@ resistance_flags = FLAMMABLE var/foldable = /obj/item/stack/sheet/cardboard var/illustration = "writing" + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE //exploits ahoy /obj/item/storage/box/Initialize(mapload) . = ..() @@ -397,7 +398,7 @@ /obj/item/storage/box/donkpockets/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.can_hold = typecacheof(list(/obj/item/reagent_containers/food/snacks/donkpocket)) /obj/item/storage/box/donkpockets/PopulateContents() @@ -412,7 +413,7 @@ /obj/item/storage/box/monkeycubes/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 7 STR.can_hold = typecacheof(list(/obj/item/reagent_containers/food/snacks/monkeycube)) @@ -567,7 +568,7 @@ /obj/item/storage/box/snappops/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.can_hold = typecacheof(list(/obj/item/toy/snappop)) STR.max_items = 8 @@ -585,7 +586,7 @@ /obj/item/storage/box/matches/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 10 STR.can_hold = typecacheof(list(/obj/item/match)) @@ -608,7 +609,7 @@ /obj/item/storage/box/lights/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 21 STR.can_hold = typecacheof(list(/obj/item/light/tube, /obj/item/light/bulb)) STR.max_combined_w_class = 21 diff --git a/code/game/objects/items/storage/briefcase.dm b/code/game/objects/items/storage/briefcase.dm index ed547bc17d..782ffd3add 100644 --- a/code/game/objects/items/storage/briefcase.dm +++ b/code/game/objects/items/storage/briefcase.dm @@ -17,7 +17,7 @@ /obj/item/storage/briefcase/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_w_class = WEIGHT_CLASS_NORMAL STR.max_combined_w_class = 21 @@ -48,7 +48,7 @@ /obj/item/storage/briefcase/lawyer/family/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_w_class = WEIGHT_CLASS_NORMAL STR.max_combined_w_class = 14 diff --git a/code/game/objects/items/storage/dakis.dm b/code/game/objects/items/storage/dakis.dm index 08748bf37e..2703581a94 100644 --- a/code/game/objects/items/storage/dakis.dm +++ b/code/game/objects/items/storage/dakis.dm @@ -13,7 +13,7 @@ /obj/item/storage/daki/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_w_class = WEIGHT_CLASS_SMALL STR.max_combined_w_class = 21 STR.max_items = 3 diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index 95639918bb..f0a9ad019b 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -25,7 +25,7 @@ var/fancy_open = FALSE /obj/item/storage/fancy/PopulateContents() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) for(var/i = 1 to STR.max_items) new spawn_type(src) @@ -72,7 +72,7 @@ /obj/item/storage/fancy/donut_box/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 6 STR.can_hold = typecacheof(list(/obj/item/reagent_containers/food/snacks/donut)) @@ -93,7 +93,7 @@ /obj/item/storage/fancy/egg_box/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 12 STR.can_hold = typecacheof(list(/obj/item/reagent_containers/food/snacks/egg)) @@ -115,7 +115,7 @@ /obj/item/storage/fancy/candle_box/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 5 /obj/item/storage/fancy/candle_box/attack_self(mob_user) @@ -138,7 +138,7 @@ /obj/item/storage/fancy/cigarettes/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 6 STR.can_hold = typecacheof(list(/obj/item/clothing/mask/cigarette, /obj/item/lighter)) @@ -276,7 +276,7 @@ /obj/item/storage/fancy/rollingpapers/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 10 STR.can_hold = typecacheof(list(/obj/item/rollingpaper)) @@ -300,7 +300,7 @@ /obj/item/storage/fancy/cigarettes/cigars/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 5 STR.can_hold = typecacheof(list(/obj/item/clothing/mask/cigarette/cigar)) @@ -347,6 +347,6 @@ /obj/item/storage/fancy/heart_box/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 8 STR.can_hold = typecacheof(list(/obj/item/reagent_containers/food/snacks/tinychocolate)) diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index 312ef35430..822a1d5011 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -170,7 +170,7 @@ /obj/item/storage/firstaid/tactical/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_w_class = WEIGHT_CLASS_NORMAL /obj/item/storage/firstaid/tactical/PopulateContents() @@ -200,7 +200,7 @@ /obj/item/storage/pill_bottle/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.allow_quick_gather = TRUE STR.click_gather = TRUE STR.can_hold = typecacheof(list(/obj/item/reagent_containers/pill, /obj/item/dice)) @@ -337,7 +337,7 @@ /obj/item/storage/pill_bottle/penis_enlargement/PopulateContents() for(var/i in 1 to 7) new /obj/item/reagent_containers/pill/penis_enlargement(src) - + /obj/item/storage/pill_bottle/breast_enlargement name = "breast enlargement pills" desc = "Made by Fermichem - They have a woman with breasts larger than she is on them. The warming states not to take more than 10u at a time." @@ -363,7 +363,7 @@ /obj/item/storage/belt/organbox/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 16 STR.max_w_class = WEIGHT_CLASS_BULKY STR.max_combined_w_class = 20 diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm index eeebc6f4c5..1607b19c2f 100644 --- a/code/game/objects/items/storage/lockbox.dm +++ b/code/game/objects/items/storage/lockbox.dm @@ -15,7 +15,7 @@ /obj/item/storage/lockbox/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_w_class = WEIGHT_CLASS_NORMAL STR.max_combined_w_class = 14 STR.max_items = 4 @@ -101,7 +101,7 @@ /obj/item/storage/lockbox/medal/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_w_class = WEIGHT_CLASS_SMALL STR.max_items = 10 STR.max_combined_w_class = 20 diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm index 20dae54a71..8618e4c3ae 100644 --- a/code/game/objects/items/storage/secure.dm +++ b/code/game/objects/items/storage/secure.dm @@ -26,7 +26,7 @@ /obj/item/storage/secure/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_w_class = WEIGHT_CLASS_SMALL STR.max_combined_w_class = 14 @@ -136,7 +136,7 @@ /obj/item/storage/secure/briefcase/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_combined_w_class = 21 STR.max_w_class = WEIGHT_CLASS_NORMAL @@ -146,7 +146,7 @@ /obj/item/storage/secure/briefcase/syndie/PopulateContents() ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) for(var/i = 0, i < STR.max_items - 2, i++) new /obj/item/stack/spacecash/c1000(src) @@ -170,7 +170,7 @@ /obj/item/storage/secure/safe/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.cant_hold = typecacheof(list(/obj/item/storage/secure/briefcase)) STR.max_w_class = 8 //?? diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index 5b99bb85bf..251703f907 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -19,6 +19,7 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) var/latches = "single_latch" var/has_latches = TRUE var/can_rubberify = TRUE + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE //very protecc too /obj/item/storage/toolbox/Initialize(mapload) . = ..() @@ -34,6 +35,8 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) /obj/item/storage/toolbox/update_icon() ..() cut_overlays() + if(blood_DNA && blood_DNA.len) + add_blood_overlay() if(has_latches) var/icon/I = icon('icons/obj/storage.dmi', latches) add_overlay(I) @@ -121,7 +124,7 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) /obj/item/storage/toolbox/syndicate/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.silent = TRUE /obj/item/storage/toolbox/syndicate/PopulateContents() @@ -162,7 +165,7 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) /obj/item/storage/toolbox/brass/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_w_class = WEIGHT_CLASS_NORMAL STR.max_combined_w_class = 28 STR.max_items = 28 @@ -217,7 +220,7 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) /obj/item/storage/toolbox/artistic/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_combined_w_class = 20 STR.max_items = 10 @@ -255,7 +258,7 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) /obj/item/storage/toolbox/gold_real/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_combined_w_class = 40 STR.max_items = 12 diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 6e41527b24..84ebc28afa 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -1,7 +1,7 @@ /obj/item/storage/box/syndicate /obj/item/storage/box/syndicate/PopulateContents() - switch (pickweight(list("bloodyspai" = 3, "stealth" = 2, "bond" = 2, "screwed" = 2, "sabotage" = 3, "guns" = 2, "murder" = 2, "implant" = 1, "hacker" = 3, "darklord" = 1, "sniper" = 1, "metaops" = 1, "ninja" = 1))) + switch (pickweight(list("bloodyspai" = 3, "stealth" = 2, "bond" = 2, "screwed" = 2, "sabotage" = 3, "guns" = 2, "murder" = 2, "baseball" = 1, "implant" = 1, "hacker" = 3, "darklord" = 1, "sniper" = 1, "metaops" = 1, "ninja" = 1))) if("bloodyspai") // 30 tc now this is more right new /obj/item/clothing/under/chameleon(src) // 2 tc since it's not the full set new /obj/item/clothing/mask/chameleon(src) // Goes with above @@ -52,7 +52,7 @@ new /obj/item/clothing/under/suit_jacket/really_black(src) new /obj/item/screwdriver/power(src) //2 tc item - if("murder") // 35 tc now + if("murder") // 35 tc new /obj/item/melee/transforming/energy/sword/saber(src) new /obj/item/clothing/glasses/thermal/syndi(src) new /obj/item/card/emag(src) @@ -62,6 +62,17 @@ new /obj/item/clothing/glasses/phantomthief/syndicate(src) new /obj/item/reagent_containers/syringe/stimulants(src) + if("baseball") // 42~ tc + new /obj/item/melee/baseball_bat/ablative/syndi(src) //Lets say 12 tc, lesser sleeping carp + new /obj/item/clothing/glasses/sunglasses/garb(src) //Lets say 2 tc + new /obj/item/card/emag(src) //6 tc + new /obj/item/clothing/shoes/sneakers/noslip(src) //2tc + new /obj/item/encryptionkey/syndicate(src) //1tc + new /obj/item/autosurgeon/anti_drop(src) //Lets just say 7~ + new /obj/item/clothing/under/syndicate/baseball(src) //3tc + new /obj/item/clothing/head/soft/baseball(src) //Lets say 4 tc + new /obj/item/reagent_containers/hypospray/medipen/stimulants/baseball(src) //lets say 5tc + if("implant") // 67+ tc holy shit what the fuck this is a lottery disguised as fun boxes isn't it? new /obj/item/implanter/freedom(src) new /obj/item/implanter/uplink/precharged(src) @@ -209,7 +220,7 @@ /obj/item/storage/box/syndie_kit/space/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_w_class = WEIGHT_CLASS_NORMAL STR.can_hold = typecacheof(list(/obj/item/clothing/suit/space/syndicate, /obj/item/clothing/head/helmet/space/syndicate)) @@ -233,7 +244,7 @@ /obj/item/storage/box/syndie_kit/chemical/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 14 /obj/item/storage/box/syndie_kit/chemical/PopulateContents() diff --git a/code/game/objects/items/storage/wallets.dm b/code/game/objects/items/storage/wallets.dm index cb5790e45f..7a6899ad15 100644 --- a/code/game/objects/items/storage/wallets.dm +++ b/code/game/objects/items/storage/wallets.dm @@ -11,7 +11,7 @@ /obj/item/storage/wallet/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 4 STR.cant_hold = typecacheof(list(/obj/item/screwdriver/power)) STR.can_hold = typecacheof(list( diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index 8f2b85098d..f3be8cefc8 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -24,7 +24,7 @@ /obj/item/watertank/ui_action_click(mob/user) toggle_mister(user) -/obj/item/watertank/item_action_slot_check(slot, mob/user) +/obj/item/watertank/item_action_slot_check(slot, mob/user, datum/action/A) if(slot == user.getBackSlot()) return 1 @@ -341,7 +341,7 @@ /obj/item/reagent_containers/chemtank/ui_action_click() toggle_injection() -/obj/item/reagent_containers/chemtank/item_action_slot_check(slot, mob/user) +/obj/item/reagent_containers/chemtank/item_action_slot_check(slot, mob/user, datum/action/A) if(slot == SLOT_BACK) return 1 diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm index 1ccc88d892..e16b0dd690 100644 --- a/code/game/objects/items/teleportation.dm +++ b/code/game/objects/items/teleportation.dm @@ -75,15 +75,14 @@ temp += "Implant Signals:
" for (var/obj/item/implant/tracking/W in GLOB.tracked_implants) - if (!W.imp_in || !isliving(W.loc)) + if (!isliving(W.imp_in)) continue - else - var/mob/living/M = W.loc - if (M.stat == DEAD) - if (M.timeofdeath + 6000 < world.time) - continue + var/mob/living/M = W.imp_in + if (M.stat == DEAD) + if (M.timeofdeath + 6000 < world.time) + continue - var/turf/tr = get_turf(W) + var/turf/tr = get_turf(M) if (tr.z == sr.z && tr) var/direct = max(abs(tr.x - sr.x), abs(tr.y - sr.y)) if (direct < 20) @@ -188,8 +187,13 @@ user.show_message("\The [src] is recharging!") return var/atom/T = L[t1] + var/implantcheckmate = FALSE + if(isliving(T)) + var/mob/living/M = T + if(!locate(/obj/item/implant/tracking) in M.implants) //The user was too slow and let the target mob's tracking implant expire or get removed. + implantcheckmate = TRUE var/area/A = get_area(T) - if(A.noteleport) + if(A.noteleport || implantcheckmate) to_chat(user, "\The [src] is malfunctioning.") return current_location = get_turf(user) //Recheck. diff --git a/code/game/objects/items/theft_tools.dm b/code/game/objects/items/theft_tools.dm index 0c74f610df..b99be7e988 100644 --- a/code/game/objects/items/theft_tools.dm +++ b/code/game/objects/items/theft_tools.dm @@ -232,7 +232,7 @@ . = ..() if(!sliver) return - if(ismovableatom(O) && O != sliver) + if(proximity && ismovableatom(O) && O != sliver) Consume(O, user) /obj/item/hemostat/supermatter/throw_impact(atom/hit_atom) // no instakill supermatter javelins diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 46fabea8b0..638dcd3556 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -276,6 +276,106 @@ /obj/item/toy/sword/getweight() return (active ? total_mass_on : total_mass) || w_class *1.25 +/obj/item/toy/sword/cx + name = "\improper DX Non-Euplastic LightSword" + desc = "A deluxe toy replica of an energy sword. Realistic visuals and sounds! Ages 8 and up." + icon = 'icons/obj/items_and_weapons.dmi' + icon_state = "cxsword_hilt" + item_state = "cxsword" + active = FALSE + w_class = WEIGHT_CLASS_SMALL + attack_verb = list("poked", "jabbed", "hit") + light_color = "#37FFF7" + var/light_brightness = 3 + actions_types = list() + +/obj/item/toy/sword/cx/pre_altattackby(atom/A, mob/living/user, params) //checks if it can do right click memes + altafterattack(A, user, TRUE, params) + return TRUE + +/obj/item/toy/sword/cx/altafterattack(atom/target, mob/living/carbon/user, proximity_flag, click_parameters) //does right click memes + if(istype(user)) + user.visible_message("[user] points the tip of [src] at [target].", "You point the tip of [src] at [target].") + return TRUE + +/obj/item/toy/sword/cx/attack_self(mob/user) + active = !( active ) + + if (active) + to_chat(user, "You activate the holographic blade with a press of a button.") + playsound(user, 'sound/weapons/nebon.ogg', 50, 1) + w_class = WEIGHT_CLASS_BULKY + attack_verb = list("slashed", "stabbed", "ravaged") + set_light(light_brightness) + update_icon() + + else + to_chat(user, "You deactivate the holographic blade with a press of a button.") + playsound(user, 'sound/weapons/neboff.ogg', 50, 1) + w_class = WEIGHT_CLASS_SMALL + attack_verb = list("poked", "jabbed", "hit") + set_light(0) + update_icon() + + add_fingerprint(user) + +/obj/item/toy/sword/cx/update_icon() + var/mutable_appearance/blade_overlay = mutable_appearance(icon, "cxsword_blade") + var/mutable_appearance/gem_overlay = mutable_appearance(icon, "cxsword_gem") + + if(light_color) + blade_overlay.color = light_color + gem_overlay.color = light_color + + cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other + + add_overlay(gem_overlay) + + if(active) + add_overlay(blade_overlay) + if(ismob(loc)) + var/mob/M = loc + M.update_inv_hands() + +/obj/item/toy/sword/cx/AltClick(mob/living/user) + if(!in_range(src, user)) //Basic checks to prevent abuse + 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) + light_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1) + update_icon() + update_light() + +/obj/item/toy/sword/cx/worn_overlays(isinhands, icon_file) + . = ..() + if(active) + if(isinhands) + var/mutable_appearance/blade_inhand = mutable_appearance(icon_file, "cxsword_blade") + blade_inhand.color = light_color + . += blade_inhand + +/obj/item/toy/sword/cx/attackby(obj/item/W, mob/living/user, params) + if(istype(W, /obj/item/toy/sword/cx)) + if(HAS_TRAIT(W, TRAIT_NODROP) || HAS_TRAIT(src, TRAIT_NODROP)) + to_chat(user, "\the [HAS_TRAIT(src, TRAIT_NODROP) ? src : W] is stuck to your hand, you can't attach it to \the [HAS_TRAIT(src, TRAIT_NODROP) ? W : src]!") + 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) + qdel(W) + qdel(src) + else + return ..() + +/obj/item/toy/sword/cx/examine(mob/user) + ..() + to_chat(user, "Alt-click to recolor it.") + /* * Foam armblade */ @@ -337,6 +437,30 @@ /obj/item/twohanded/dualsaber/toy/IsReflect()//Stops Toy Dualsabers from reflecting energy projectiles return FALSE +/obj/item/twohanded/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 + +/obj/item/twohanded/dualsaber/hypereutactic/toy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) + return FALSE + +/obj/item/twohanded/dualsaber/hypereutactic/toy/IsReflect()//Stops it from reflecting energy projectiles + return FALSE + +/obj/item/twohanded/dualsaber/hypereutactic/toy/rainbow + name = "\improper Hyper-Euclidean Reciprocating Trigonometric Zweihander" + desc = "A custom-built toy with fancy rainbow lights built-in." + hacked = TRUE + /obj/item/toy/katana name = "replica katana" desc = "Woefully underpowered in D20." diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index 539a60986a..37ab948332 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -44,6 +44,10 @@ icon_state = "plate" resistance_flags = NONE +/obj/item/trash/plate/alt + desc = "Still some dip left. Sadly still just trash..." + icon_state = "plate1" + /obj/item/trash/pistachios name = "pistachios pack" icon_state = "pistachios_pack" diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm index 82bf2c6b5f..9b2ec5c98f 100644 --- a/code/game/objects/items/twohanded.dm +++ b/code/game/objects/items/twohanded.dm @@ -6,6 +6,7 @@ * Spears * CHAINSAWS * Bone Axe and Spear + * And more */ /*################################################################## @@ -35,7 +36,7 @@ if(!wielded || !user) return wielded = 0 - if(force_unwielded) + if(!isnull(force_unwielded)) force = force_unwielded var/sf = findtext(name," (Wielded)") if(sf) @@ -304,7 +305,7 @@ 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.vital = FALSE//this cant possibly be a good idea + 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)) @@ -346,7 +347,8 @@ icon_state = "dualsaber[item_color][wielded]" else icon_state = "dualsaber0" - SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + + clean_blood() /obj/item/twohanded/dualsaber/attack(mob/target, mob/living/carbon/human/user) if(user.has_dna()) @@ -463,6 +465,116 @@ 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/chaplain + name = "\improper 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 + obj_flags = UNIQUE_RENAME + +/obj/item/twohanded/dualsaber/hypereutactic/chaplain/Initialize() + . = ..() + AddComponent(/datum/component/anti_magic, TRUE, TRUE) + +/obj/item/twohanded/dualsaber/hypereutactic/chaplain/IsReflect() + return FALSE + +/obj/item/twohanded/dualsaber/hypereutactic/pre_altattackby(atom/A, mob/living/user, params) //checks if it can do right click memes + altafterattack(A, user, TRUE, params) + return TRUE + +/obj/item/twohanded/dualsaber/hypereutactic/altafterattack(atom/target, mob/living/user, proximity_flag, click_parameters) //does right click memes + if(istype(user)) + user.visible_message("[user] points the tip of [src] at [target].", "You point the tip of [src] at [target].") + return TRUE + +/obj/item/twohanded/dualsaber/hypereutactic/update_icon() + 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 + + cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other + + add_overlay(gem_overlay) + + if(wielded) + add_overlay(blade_overlay) + if(ismob(loc)) + var/mob/M = loc + M.update_inv_hands() + + 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() + +/obj/item/twohanded/dualsaber/hypereutactic/worn_overlays(isinhands, icon_file) + . = ..() + 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) + to_chat(user, "Alt-click to recolor it.") + +/obj/item/twohanded/dualsaber/hypereutactic/rainbow_process() + . = ..() + update_icon() + update_light() + //spears /obj/item/twohanded/spear icon_state = "spearglass0" @@ -599,6 +711,8 @@ 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/Initialize() . = ..() @@ -622,7 +736,7 @@ force = on ? force_on : initial(force) throwforce = on ? force_on : initial(force) icon_state = "chainsaw_[on ? "on" : "off"]" - GET_COMPONENT_FROM(butchering, /datum/component/butchering, src) + var/datum/component/butchering/butchering = src.GetComponent(/datum/component/butchering) butchering.butchering_enabled = on if(on) @@ -845,18 +959,20 @@ righthand_file = 'icons/mob/inhands/items_righthand.dmi' slot_flags = ITEM_SLOT_BELT w_class = WEIGHT_CLASS_SMALL - var/datum/component/mobhook + 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 - if(QDELETED(mobhook)) - mobhook = user.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED = CALLBACK(src, .proc/unwield))) - else - user.TakeComponent(mobhook) + 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() @@ -880,7 +996,8 @@ /obj/item/twohanded/binoculars/unwield(mob/user) . = ..() - mobhook.RemoveComponent() + UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) + listeningTo = null user.visible_message("[user] lowers [src].","You lower [src].") item_state = "binoculars" user.regenerate_icons() @@ -889,4 +1006,4 @@ var/client/C = user.client C.change_view(CONFIG_GET(string/default_view)) user.client.pixel_x = 0 - user.client.pixel_y = 0 + user.client.pixel_y = 0 \ No newline at end of file diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index c6384e7438..4552e846ad 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -436,6 +436,8 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 attack_verb = list("sawed", "torn", "cut", "chopped", "diced") hitsound = 'sound/weapons/chainsawhit.ogg' total_mass = TOTAL_MASS_HAND_REPLACEMENT + tool_behaviour = TOOL_SAW + toolspeed = 1 /obj/item/mounted_chainsaw/Initialize() . = ..() @@ -522,7 +524,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 throwforce = 14 obj_flags = UNIQUE_RENAME var/chaplain_spawnable = TRUE - total_mass = TOTAL_MASS_MEDIEVAL_WEAPON + total_mass = TOTAL_MASS_MEDIEVAL_WEAPON /obj/item/melee/baseball_bat/chaplain/Initialize() . = ..() @@ -578,6 +580,12 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 playsound(turf, 'sound/weapons/effects/batreflect2.ogg', 50, 1) return 1 +/obj/item/melee/baseball_bat/ablative/syndi + name = "syndicate major league bat" + desc = "A metal bat made by the syndicate for the major league team." + force = 18 //Spear damage... + throwforce = 30 + /obj/item/melee/flyswatter name = "flyswatter" desc = "Useful for killing insects of all sizes." diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 5f21862c17..7526807eeb 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -8,6 +8,7 @@ var/climbable = FALSE var/mob/living/structureclimber var/broken = 0 //similar to machinery's stat BROKEN + layer = BELOW_OBJ_LAYER /obj/structure/Initialize() if (!armor) diff --git a/code/game/objects/structures/barsigns.dm b/code/game/objects/structures/barsigns.dm index 2093ae5660..053512a256 100644 --- a/code/game/objects/structures/barsigns.dm +++ b/code/game/objects/structures/barsigns.dm @@ -1,4 +1,4 @@ -/obj/structure/sign/barsign // All Signs are 64 by 32 pixels, they take two tiles +/obj/structure/sign/barsign // All Signs are 64 by 64 pixels, though most of them are made to fit 64 x 32 and only take the two lowermost tiles. name = "Bar Sign" desc = "A bar sign with no writing on it." icon = 'icons/obj/barsigns.dmi' diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 88d141a9ad..dde9bce1bc 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -489,3 +489,19 @@ . = ..() if(has_gravity()) playsound(src, 'sound/machines/clockcult/integration_cog_install.ogg', 50, TRUE) + +/obj/structure/chair/sofa + name = "old ratty sofa" + icon_state = "sofamiddle" + icon = 'icons/obj/sofa.dmi' + buildstackamount = 1 + item_chair = null + +/obj/structure/chair/sofa/left + icon_state = "sofaend_left" + +/obj/structure/chair/sofa/right + icon_state = "sofaend_right" + +/obj/structure/chair/sofa/corner + icon_state = "sofacorner" \ No newline at end of file diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index b493f84240..1f7f0ab391 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -288,17 +288,19 @@ LINEN BINS resistance_flags = FLAMMABLE max_integrity = 70 var/amount = 10 + var/list/sheet_types = list(/obj/item/bedsheet) + var/static/allowed_sheets = list(/obj/item/bedsheet, /obj/item/reagent_containers/rag/towel) var/list/sheets = list() var/obj/item/hidden = null /obj/structure/bedsheetbin/examine(mob/user) ..() if(amount < 1) - to_chat(user, "There are no bed sheets in the bin.") + to_chat(user, "There are no sheets in the bin.") else if(amount == 1) - to_chat(user, "There is one bed sheet in the bin.") + to_chat(user, "There is one sheet in the bin.") else - to_chat(user, "There are [amount] bed sheets in the bin.") + to_chat(user, "There are [amount] sheets in the bin.") /obj/structure/bedsheetbin/update_icon() @@ -317,8 +319,9 @@ LINEN BINS ..() /obj/structure/bedsheetbin/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/bedsheet)) + if(is_type_in_list(I, allowed_sheets)) if(!user.transferItemToLoc(I, src)) + to_chat(user, "\The [I] is stuck to your hand, you cannot place it into the bin!") return sheets.Add(I) amount++ @@ -339,18 +342,19 @@ LINEN BINS . = ..() if(.) return - if(user.lying) + if(user.incapacitated()) return if(amount >= 1) amount-- - var/obj/item/bedsheet/B + var/obj/item/B if(sheets.len > 0) B = sheets[sheets.len] sheets.Remove(B) else - B = new /obj/item/bedsheet(loc) + var/chosen = pick(sheet_types) + B = new chosen B.forceMove(drop_location()) user.put_in_hands(B) @@ -362,19 +366,20 @@ LINEN BINS to_chat(user, "[hidden] falls out of [B]!") hidden = null - add_fingerprint(user) + /obj/structure/bedsheetbin/attack_tk(mob/user) if(amount >= 1) amount-- - var/obj/item/bedsheet/B + var/obj/item/B if(sheets.len > 0) B = sheets[sheets.len] sheets.Remove(B) else - B = new /obj/item/bedsheet(loc) + var/chosen = pick(sheet_types) + B = new chosen B.forceMove(drop_location()) to_chat(user, "You telekinetically remove [B] from [src].") @@ -384,5 +389,11 @@ LINEN BINS hidden.forceMove(drop_location()) hidden = null +/obj/structure/bedsheetbin/towel + desc = "It looks rather cosy. This one is designed to hold towels." + sheet_types = list(/obj/item/reagent_containers/rag/towel) - add_fingerprint(user) +/obj/structure/bedsheetbin/color + sheet_types = list(/obj/item/bedsheet, /obj/item/bedsheet/blue, /obj/item/bedsheet/green, /obj/item/bedsheet/orange, \ + /obj/item/bedsheet/purple, /obj/item/bedsheet/red, /obj/item/bedsheet/yellow, /obj/item/bedsheet/brown, \ + /obj/item/bedsheet/black) \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index edcb4a6181..172120861b 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -4,7 +4,6 @@ icon = 'icons/obj/closet.dmi' icon_state = "generic" density = TRUE - layer = BELOW_OBJ_LAYER var/icon_door = null var/icon_door_override = FALSE //override to have open overlay use icon different to its base's var/secure = FALSE //secure locker or not, also used if overriding a non-secure locker with a secure door overlay to add fancy lights @@ -615,3 +614,6 @@ user.resting = FALSE togglelock(user) T1.visible_message("[user] dives into [src]!") + +/obj/structure/closet/canReachInto(atom/user, atom/target, list/next, view_only, obj/item/tool) + return ..() && opened diff --git a/code/game/objects/structures/crates_lockers/closets/genpop.dm b/code/game/objects/structures/crates_lockers/closets/genpop.dm new file mode 100644 index 0000000000..80b64aaedc --- /dev/null +++ b/code/game/objects/structures/crates_lockers/closets/genpop.dm @@ -0,0 +1,117 @@ +/obj/structure/closet/secure_closet/genpop + desc = "It's a secure locker for inmates's personal belongings." + var/default_desc = "It's a secure locker for the storage inmates's personal belongings during their time in prison." + name = "prisoner closet" + var/default_name = "prisoner closet" + req_access = list(ACCESS_BRIG) + var/obj/item/card/id/prisoner/registered_id = null + icon_state = "prisoner" + locked = FALSE + anchored = TRUE + opened = TRUE + density = FALSE + +/obj/structure/closet/secure_closet/genpop/attackby(obj/item/W, mob/user, params) + if(!broken && locked && W == registered_id) //Prisoner opening + handle_prisoner_id(user) + return + + return ..() + +/obj/structure/closet/secure_closet/genpop/proc/handle_prisoner_id(mob/user) + var/obj/item/card/id/prisoner/prisoner_id = null + for(prisoner_id in user.held_items) + if(prisoner_id != registered_id) + prisoner_id = null + else + break + + if(!prisoner_id) + to_chat(user, "Access Denied.") + return FALSE + + qdel(registered_id) + registered_id = null + locked = FALSE + open(user) + desc = "It's a secure locker for prisoner effects." + to_chat(user, "You insert your prisoner id into \the [src] and it springs open!") + + return TRUE + +/obj/structure/closet/secure_closet/genpop/proc/handle_edit_sentence(mob/user) + var/prisoner_name = input(user, "Please input the name of the prisoner.", "Prisoner Name", registered_id.registered_name) as text|null + if(prisoner_name == null | !user.Adjacent(src)) + return FALSE + var/sentence_length = input(user, "Please input the length of their sentence in minutes (0 for perma).", "Sentence Length", registered_id.sentence) as num|null + if(sentence_length == null | !user.Adjacent(src)) + return FALSE + var/crimes = input(user, "Please input their crimes.", "Crimes", registered_id.crime) as text|null + if(crimes == null | !user.Adjacent(src)) + return FALSE + + registered_id.registered_name = prisoner_name + var/filteredsentlength = text2num(sentence_length) + registered_id.sentence = filteredsentlength ? (filteredsentlength MINUTES) + world.time : 0 + registered_id.crime = crimes + registered_id.update_label(prisoner_name, registered_id.assignment) + if(registered_id.sentence) + START_PROCESSING(SSobj, registered_id) + else + STOP_PROCESSING(SSobj, registered_id) + + name = "[default_name] ([prisoner_name])" + desc = "[default_desc] It contains the personal effects of [prisoner_name]." + + return TRUE + +/obj/structure/closet/secure_closet/genpop/togglelock(mob/living/user) + if(!allowed(user)) + return ..() + + if(!broken && locked && registered_id != null) + var/name = registered_id.registered_name + var/result = alert(user, "This locker currently contains [name]'s personal belongings ","Locker In Use","Reset","Amend ID", "Open") + if(!user.Adjacent(src)) + return + if(result == "Reset") + name = default_name + desc = default_desc + registered_id = null + if(result == "Open" | result == "Reset") + locked = FALSE + open(user) + if(result == "Amend ID") + handle_edit_sentence(user) + else + return ..() + +/obj/structure/closet/secure_closet/genpop/close(mob/living/user) + if(registered_id != null) + locked = TRUE + return ..() + +/obj/structure/closet/secure_closet/genpop/attack_hand(mob/user) + if(user.lying && get_dist(src, user) > 0) + return + + if(!broken && registered_id != null && registered_id in user.held_items) + handle_prisoner_id(user) + return + + if(!broken && opened && !locked && allowed(user) && !registered_id) //Genpop setup + + registered_id = new /obj/item/card/id/prisoner/(src.contents) + if(handle_edit_sentence(user)) + close(user) + locked = TRUE + update_icon() + registered_id.forceMove(src.loc) + new /obj/item/clothing/under/rank/prisoner(src.loc) + else + qdel(registered_id) + registered_id = null + + return + + ..() \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm index 6e841bcd93..9dab3679fa 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm @@ -2,6 +2,24 @@ icon_state = "freezer" var/jones = FALSE +/obj/structure/closet/secure_closet/freezer/Destroy() + recursive_organ_check(src) + ..() + +/obj/structure/closet/secure_closet/freezer/Initialize() + ..() + recursive_organ_check(src) + +/obj/structure/closet/secure_closet/freezer/open(mob/living/user) + if(opened || !can_open(user)) //dupe check just so we don't let the organs decay when someone fails to open the locker + return FALSE + recursive_organ_check(src) + return ..() + +/obj/structure/closet/secure_closet/freezer/close(mob/living/user) + if(..()) //if we actually closed the locker + recursive_organ_check(src) + /obj/structure/closet/secure_closet/freezer/ex_act() if(!jones) jones = TRUE diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 6caa7d834b..23703c7891 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -99,6 +99,25 @@ name = "freezer" icon_state = "freezer" +//Snowflake organ freezer code +//Order is important, since we check source, we need to do the check whenever we have all the organs in the crate + +/obj/structure/closet/crate/freezer/open() + recursive_organ_check(src) + ..() + +/obj/structure/closet/crate/freezer/close() + ..() + recursive_organ_check(src) + +/obj/structure/closet/crate/freezer/Destroy() + recursive_organ_check(src) + ..() + +/obj/structure/closet/crate/freezer/Initialize() + . = ..() + recursive_organ_check(src) + /obj/structure/closet/crate/freezer/blood name = "blood freezer" desc = "A freezer containing packs of blood." diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index 12827a0aba..b820e93c7b 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -45,7 +45,7 @@ death = FALSE anchored = FALSE density = FALSE - flavour_text = "You are an ash walker. Your tribe worships the Necropolis. The wastes are sacred ground, its monsters a blessed bounty. \ + flavour_text = "You are an ash walker. Your tribe worships the Necropolis. The wastes are sacred ground, its monsters a blessed bounty. You would never leave its beautiful expanse. \ You have seen lights in the distance... they foreshadow the arrival of outsiders that seek to tear apart the Necropolis and its domain. Fresh sacrifices for your nest." assignedrole = "Ash Walker" @@ -561,7 +561,7 @@ icon = 'icons/obj/machines/sleeper.dmi' icon_state = "sleeper" mob_name = "a space pirate" - mob_species = /datum/species/skeleton/pirate + mob_species = /datum/species/skeleton/space outfit = /datum/outfit/pirate/space roundstart = FALSE death = FALSE diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index cd87075258..31bf9318ce 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -4,7 +4,6 @@ desc = "A large structural assembly made out of metal; It requires a layer of metal before it can be considered a wall." anchored = TRUE density = TRUE - layer = BELOW_OBJ_LAYER var/state = GIRDER_NORMAL var/girderpasschance = 20 // percentage chance that a projectile passes through the girder. var/can_displace = TRUE //If the girder can be moved around by wrenching it diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 13ca421daa..5733ea123c 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -6,6 +6,7 @@ density = TRUE anchored = TRUE opacity = TRUE + layer = CLOSED_DOOR_LAYER icon = 'icons/obj/doors/mineral_doors.dmi' icon_state = "metal" @@ -90,6 +91,7 @@ flick("[initial_state]opening",src) sleep(10) density = FALSE + layer = OPEN_DOOR_LAYER state = 1 air_update_turf(1) update_icon() @@ -111,6 +113,7 @@ density = TRUE set_opacity(TRUE) state = 0 + layer = initial(layer) air_update_turf(1) update_icon() isSwitchingStates = 0 diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 09e5510d62..e7be30520e 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -31,6 +31,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an /obj/structure/bodycontainer/Initialize() . = ..() GLOB.bodycontainers += src + recursive_organ_check(src) /obj/structure/bodycontainer/Destroy() GLOB.bodycontainers -= src @@ -101,6 +102,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an /obj/structure/bodycontainer/deconstruct(disassembled = TRUE) new /obj/item/stack/sheet/metal (loc, 5) + recursive_organ_check(src) qdel(src) /obj/structure/bodycontainer/container_resist(mob/living/user) @@ -120,6 +122,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an open() /obj/structure/bodycontainer/proc/open() + recursive_organ_check(src) playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) playsound(src, 'sound/effects/roll.ogg', 5, 1) var/turf/T = get_step(src, dir) @@ -130,10 +133,13 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an /obj/structure/bodycontainer/proc/close() playsound(src, 'sound/effects/roll.ogg', 5, 1) - playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/deconstruct.ogg', 50, 1) for(var/atom/movable/AM in connected.loc) if(!AM.anchored || AM == connected) + if(ismob(AM) && !isliving(AM)) + continue AM.forceMove(src) + recursive_organ_check(src) update_icon() /obj/structure/bodycontainer/get_remote_view_fullscreens(mob/user) @@ -301,7 +307,7 @@ GLOBAL_LIST_EMPTY(crematoriums) /obj/structure/tray icon = 'icons/obj/stationobjs.dmi' density = TRUE - layer = BELOW_OBJ_LAYER + layer = TRAY_LAYER var/obj/structure/bodycontainer/connected = null anchored = TRUE pass_flags = LETPASSTHROW diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm index 889cdab388..419502e2b0 100644 --- a/code/game/objects/structures/reflector.dm +++ b/code/game/objects/structures/reflector.dm @@ -5,7 +5,6 @@ desc = "A base for reflector assemblies." anchored = FALSE density = FALSE - layer = BELOW_OBJ_LAYER var/deflector_icon_state var/image/deflector_overlay var/finished = FALSE diff --git a/code/game/objects/structures/table_frames.dm b/code/game/objects/structures/table_frames.dm index 226d279288..f62bed878b 100644 --- a/code/game/objects/structures/table_frames.dm +++ b/code/game/objects/structures/table_frames.dm @@ -22,92 +22,22 @@ var/framestackamount = 2 /obj/structure/table_frame/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/wrench)) + if(I.tool_behaviour == TOOL_WRENCH) to_chat(user, "You start disassembling [src]...") I.play_tool_sound(src) if(I.use_tool(src, user, 30)) - playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) + playsound(src.loc, 'sound/items/deconstruct.ogg', 50, TRUE) deconstruct(TRUE) - else if(istype(I, /obj/item/stack/sheet/plasteel)) - var/obj/item/stack/sheet/plasteel/P = I - if(P.get_amount() < 1) - to_chat(user, "You need one plasteel sheet to do this!") + return + + var/obj/item/stack/material = I + if (istype(I, /obj/item/stack) && material?.tableVariant) + if(material.get_amount() < 1) + to_chat(user, "You need one [material.name] sheet to do this!") return - to_chat(user, "You start adding [P] to [src]...") - if(do_after(user, 50, target = src) && P.use(1)) - make_new_table(/obj/structure/table/reinforced) - else if(istype(I, /obj/item/stack/sheet/metal)) - var/obj/item/stack/sheet/metal/M = I - if(M.get_amount() < 1) - to_chat(user, "You need one metal sheet to do this!") - return - to_chat(user, "You start adding [M] to [src]...") - if(do_after(user, 20, target = src) && M.use(1)) - make_new_table(/obj/structure/table) - else if(istype(I, /obj/item/stack/sheet/glass)) - var/obj/item/stack/sheet/glass/G = I - if(G.get_amount() < 1) - to_chat(user, "You need one glass sheet to do this!") - return - to_chat(user, "You start adding [G] to [src]...") - if(do_after(user, 20, target = src) && G.use(1)) - make_new_table(/obj/structure/table/glass) - else if(istype(I, /obj/item/stack/sheet/mineral/silver)) - var/obj/item/stack/sheet/mineral/silver/S = I - if(S.get_amount() < 1) - to_chat(user, "You need one silver sheet to do this!") - return - to_chat(user, "You start adding [S] to [src]...") - if(do_after(user, 20, target = src) && S.use(1)) - make_new_table(/obj/structure/table/optable) - else if(istype(I, /obj/item/stack/tile/carpet/black)) - var/obj/item/stack/tile/carpet/black/C = I - if(C.get_amount() < 1) - to_chat(user, "You need one black carpet sheet to do this!") - return - to_chat(user, "You start adding [C] to [src]...") - if(do_after(user, 20, target = src) && C.use(1)) - make_new_table(/obj/structure/table/wood/fancy/black) - else if(istype(I, /obj/item/stack/tile/carpet/blackred)) - var/obj/item/stack/tile/carpet/blackred/C = I - if(C.get_amount() < 1) - to_chat(user, "You need one red carpet sheet to do this!") - return - to_chat(user, "You start adding [C] to [src]...") - if(do_after(user, 20, target = src) && C.use(1)) - make_new_table(/obj/structure/table/wood/fancy/blackred) - else if(istype(I, /obj/item/stack/tile/carpet/monochrome)) - var/obj/item/stack/tile/carpet/monochrome/C = I - if(C.get_amount() < 1) - to_chat(user, "You need one monochrome carpet sheet to do this!") - return - to_chat(user, "You start adding [C] to [src]...") - if(do_after(user, 20, target = src) && C.use(1)) - make_new_table(/obj/structure/table/wood/fancy/monochrome) - else if(istype(I, /obj/item/stack/tile/carpet)) - var/obj/item/stack/tile/carpet/C = I - if(C.get_amount() < 1) - to_chat(user, "You need one carpet sheet to do this!") - return - to_chat(user, "You start adding [C] to [src]...") - if(do_after(user, 20, target = src) && C.use(1)) - make_new_table(/obj/structure/table/wood/fancy) - else if(istype(I, /obj/item/stack/tile/bronze)) - var/obj/item/stack/tile/bronze/B = I - if(B.get_amount() < 1) - to_chat(user, "You need one bronze sheet to do this!") - return - to_chat(user, "You start adding [B] to [src]...") - if(do_after(user, 20, target = src) && B.use(1)) - make_new_table(/obj/structure/table/bronze) - else if(istype(I, /obj/item/stack/sheet/plasmaglass)) - var/obj/item/stack/sheet/plasmaglass/G = I - if(G.get_amount() < 1) - to_chat(user, "You need one plasmaglass sheet to do this!") - return - to_chat(user, "You start adding [G] to [src]...") - if(do_after(user, 20, target = src) && G.use(1)) - make_new_table(/obj/structure/table/plasmaglass) + to_chat(user, "You start adding [material] to [src]...") + if(do_after(user, 20, target = src) && material.use(1)) + make_new_table(material.tableVariant) else return ..() @@ -143,23 +73,21 @@ resistance_flags = FLAMMABLE /obj/structure/table_frame/wood/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/stack/sheet/mineral/wood)) - var/obj/item/stack/sheet/mineral/wood/W = I - if(W.get_amount() < 1) - to_chat(user, "You need one wood sheet to do this!") - return - to_chat(user, "You start adding [W] to [src]...") - if(do_after(user, 20, target = src) && W.use(1)) - make_new_table(/obj/structure/table/wood) - return - else if(istype(I, /obj/item/stack/tile/carpet)) - var/obj/item/stack/tile/carpet/C = I - if(C.get_amount() < 1) - to_chat(user, "You need one carpet sheet to do this!") - return - to_chat(user, "You start adding [C] to [src]...") - if(do_after(user, 20, target = src) && C.use(1)) - make_new_table(/obj/structure/table/wood/poker) + if (istype(I, /obj/item/stack)) + var/obj/item/stack/material = I + var/toConstruct // stores the table variant + if(istype(I, /obj/item/stack/sheet/mineral/wood)) + toConstruct = /obj/structure/table/wood + else if(istype(I, /obj/item/stack/tile/carpet)) + toConstruct = /obj/structure/table/wood/poker + + if (toConstruct) + if(material.get_amount() < 1) + to_chat(user, "You need one [material.name] sheet to do this!") + return + to_chat(user, "You start adding [material] to [src]...") + if(do_after(user, 20, target = src) && material.use(1)) + make_new_table(toConstruct) else return ..() diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index fcffafb262..b12a26cd00 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -21,6 +21,7 @@ anchored = TRUE layer = TABLE_LAYER climbable = TRUE + obj_flags = CAN_BE_HIT|SHOVABLE_ONTO pass_flags = LETPASSTHROW //You can throw objects over this, despite it's density.") var/frame = /obj/structure/table_frame var/framestack = /obj/item/stack/rods @@ -115,6 +116,9 @@ log_combat(user, pushed_mob, "placed") /obj/structure/table/proc/tablepush(mob/living/user, mob/living/pushed_mob) + if(HAS_TRAIT(user, TRAIT_PACIFISM)) + to_chat(user, "Throwing [pushed_mob] onto the table might hurt them!") + return var/added_passtable = FALSE if(!pushed_mob.pass_flags & PASSTABLE) added_passtable = TRUE @@ -125,14 +129,23 @@ if(pushed_mob.loc != loc) //Something prevented the tabling return pushed_mob.Knockdown(40) - pushed_mob.visible_message("[user] pushes [pushed_mob] onto [src].", \ - "[user] pushes [pushed_mob] onto [src].") - log_combat(user, pushed_mob, "pushed") + pushed_mob.visible_message("[user] slams [pushed_mob] onto [src]!", \ + "[user] slams you onto [src]!") + log_combat(user, pushed_mob, "tabled", null, "onto [src]") if(!ishuman(pushed_mob)) return var/mob/living/carbon/human/H = pushed_mob SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "table", /datum/mood_event/table) +/obj/structure/table/shove_act(mob/living/target, mob/living/user) + if(!target.resting) + target.Knockdown(SHOVE_KNOCKDOWN_TABLE) + user.visible_message("[user.name] shoves [target.name] onto \the [src]!", + "You shove [target.name] onto \the [src]!", null, COMBAT_MESSAGE_RANGE) + target.forceMove(src.loc) + log_combat(user, target, "shoved", "onto [src] (table)") + return TRUE + /obj/structure/table/attackby(obj/item/I, mob/user, params) if(!(flags_1 & NODECONSTRUCT_1)) if(istype(I, /obj/item/screwdriver) && deconstruction_ready) @@ -345,44 +358,83 @@ frame = /obj/structure/table_frame framestack = /obj/item/stack/rods buildstack = /obj/item/stack/tile/carpet - canSmoothWith = list(/obj/structure/table/wood/fancy, /obj/structure/table/wood/fancy/black, /obj/structure/table/wood/fancy/blackred, /obj/structure/table/wood/fancy/monochrome) + canSmoothWith = list(/obj/structure/table/wood/fancy, + /obj/structure/table/wood/fancy/black, + /obj/structure/table/wood/fancy/blackred, + /obj/structure/table/wood/fancy/monochrome, + /obj/structure/table/wood/fancy/blue, + /obj/structure/table/wood/fancy/cyan, + /obj/structure/table/wood/fancy/green, + /obj/structure/table/wood/fancy/orange, + /obj/structure/table/wood/fancy/purple, + /obj/structure/table/wood/fancy/red, + /obj/structure/table/wood/fancy/royalblack, + /obj/structure/table/wood/fancy/royalblue) + var/smooth_icon = 'icons/obj/smooth_structures/fancy_table.dmi' // see Initialize() -/obj/structure/table/wood/fancy/New() - // New() is used so that the /black subtype can override `icon` easily and - // the correct value will be used by the smoothing subsystem. +/obj/structure/table/wood/fancy/Initialize() . = ..() // Needs to be set dynamically because table smooth sprites are 32x34, // which the editor treats as a two-tile-tall object. The sprites are that // size so that the north/south corners look nice - examine the detail on // the sprites in the editor to see why. - icon = 'icons/obj/smooth_structures/fancy_table.dmi' + icon = smooth_icon /obj/structure/table/wood/fancy/black icon_state = "fancy_table_black" buildstack = /obj/item/stack/tile/carpet/black + smooth_icon = 'icons/obj/smooth_structures/fancy_table_black.dmi' /obj/structure/table/wood/fancy/blackred - icon = 'icons/obj/structures.dmi' - icon_state = "fancy_table_blackred" - buildstack = /obj/item/stack/tile/carpet/blackred - -/obj/structure/table/wood/fancy/blackred/New() - . = ..() - icon = 'icons/obj/smooth_structures/fancy_table_blackred.dmi' + icon_state = "fancy_table_blackred" + buildstack = /obj/item/stack/tile/carpet/blackred + smooth_icon = 'icons/obj/smooth_structures/fancy_table_blackred.dmi' /obj/structure/table/wood/fancy/monochrome - icon = 'icons/obj/structures.dmi' - icon_state = "fancy_table_monochrome" - buildstack = /obj/item/stack/tile/carpet/monochrome + icon_state = "fancy_table_monochrome" + buildstack = /obj/item/stack/tile/carpet/monochrome + smooth_icon = 'icons/obj/smooth_structures/fancy_table_monochrome.dmi' -/obj/structure/table/wood/fancy/monochrome/New() - . = ..() - icon = 'icons/obj/smooth_structures/fancy_table_monochrome.dmi' +/obj/structure/table/wood/fancy/blue + icon_state = "fancy_table_blue" + buildstack = /obj/item/stack/tile/carpet/blue + smooth_icon = 'icons/obj/smooth_structures/fancy_table_blue.dmi' + +/obj/structure/table/wood/fancy/cyan + icon_state = "fancy_table_cyan" + buildstack = /obj/item/stack/tile/carpet/cyan + smooth_icon = 'icons/obj/smooth_structures/fancy_table_cyan.dmi' + +/obj/structure/table/wood/fancy/green + icon_state = "fancy_table_green" + buildstack = /obj/item/stack/tile/carpet/green + smooth_icon = 'icons/obj/smooth_structures/fancy_table_green.dmi' + +/obj/structure/table/wood/fancy/orange + icon_state = "fancy_table_orange" + buildstack = /obj/item/stack/tile/carpet/orange + smooth_icon = 'icons/obj/smooth_structures/fancy_table_orange.dmi' + +/obj/structure/table/wood/fancy/purple + icon_state = "fancy_table_purple" + buildstack = /obj/item/stack/tile/carpet/purple + smooth_icon = 'icons/obj/smooth_structures/fancy_table_purple.dmi' + +/obj/structure/table/wood/fancy/red + icon_state = "fancy_table_red" + buildstack = /obj/item/stack/tile/carpet/red + smooth_icon = 'icons/obj/smooth_structures/fancy_table_red.dmi' + +/obj/structure/table/wood/fancy/royalblack + icon_state = "fancy_table_royalblack" + buildstack = /obj/item/stack/tile/carpet/royalblack + smooth_icon = 'icons/obj/smooth_structures/fancy_table_royalblack.dmi' + +/obj/structure/table/wood/fancy/royalblue + icon_state = "fancy_table_royalblue" + buildstack = /obj/item/stack/tile/carpet/royalblue + smooth_icon = 'icons/obj/smooth_structures/fancy_table_royalblue.dmi' -/obj/structure/table/wood/fancy/black/New() - . = ..() - // Ditto above. - icon = 'icons/obj/smooth_structures/fancy_table_black.dmi' /* * Reinforced tables */ 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 ee46538be1..392c802ed8 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm @@ -4,7 +4,6 @@ animate_movement = FORWARD_STEPS anchored = TRUE density = TRUE - layer = BELOW_OBJ_LAYER var/moving = 0 var/datum/gas_mixture/air_contents = new() diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 46db567b10..76c8f7f11f 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -318,6 +318,7 @@ /obj/machinery/shower/proc/wash_obj(obj/O) . = SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + . = O.clean_blood() O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) if(isitem(O)) var/obj/item/I = O @@ -328,8 +329,9 @@ /obj/machinery/shower/proc/wash_turf() if(isturf(loc)) var/turf/tile = loc - SEND_SIGNAL(tile, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) tile.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) + tile.clean_blood() + SEND_SIGNAL(tile, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) for(var/obj/effect/E in tile) if(is_cleanable(E)) qdel(E) @@ -381,7 +383,8 @@ else if(H.w_uniform && wash_obj(H.w_uniform)) H.update_inv_w_uniform() if(washgloves) - SEND_SIGNAL(H, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + H.clean_blood() + SEND_SIGNAL(H, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) if(H.shoes && washshoes && wash_obj(H.shoes)) H.update_inv_shoes() if(H.wear_mask && washmask && wash_obj(H.wear_mask)) @@ -398,9 +401,11 @@ else if(M.wear_mask && wash_obj(M.wear_mask)) M.update_inv_wear_mask(0) - SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + M.clean_blood() + SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) else - SEND_SIGNAL(L, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + L.clean_blood() + SEND_SIGNAL(L, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) /obj/machinery/shower/proc/contamination_cleanse(atom/movable/thing) var/datum/component/radioactive/healthy_green_glow = thing.GetComponent(/datum/component/radioactive) @@ -498,7 +503,8 @@ H.regenerate_icons() user.drowsyness = max(user.drowsyness - rand(2,3), 0) //Washing your face wakes you up if you're falling asleep else - SEND_SIGNAL(user, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(user, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + user.clean_blood() /obj/structure/sink/attackby(obj/item/O, mob/living/user, params) if(busy) @@ -554,7 +560,8 @@ busy = FALSE return 1 busy = FALSE - SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + O.clean_blood() O.acid_level = 0 create_reagents(5) reagents.add_reagent(dispensedreagent, 5) @@ -675,4 +682,4 @@ else playsound(loc, 'sound/weapons/tap.ogg', 50, 1) if(BURN) - playsound(loc, 'sound/items/welder.ogg', 80, 1) + playsound(loc, 'sound/items/welder.ogg', 80, 1) \ No newline at end of file diff --git a/code/game/sound.dm b/code/game/sound.dm index 5503c6103d..e7562476a8 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -182,6 +182,8 @@ soundin = pick('sound/voice/beepsky/god.ogg', 'sound/voice/beepsky/iamthelaw.ogg', 'sound/voice/beepsky/secureday.ogg', 'sound/voice/beepsky/radio.ogg', 'sound/voice/beepsky/insult.ogg', 'sound/voice/beepsky/creep.ogg') if("honkbot_e") soundin = pick('sound/items/bikehorn.ogg', 'sound/items/AirHorn2.ogg', 'sound/misc/sadtrombone.ogg', 'sound/items/AirHorn.ogg', 'sound/effects/reee.ogg', 'sound/items/WEEOO1.ogg', 'sound/voice/beepsky/iamthelaw.ogg', 'sound/voice/beepsky/creep.ogg','sound/magic/Fireball.ogg' ,'sound/effects/pray.ogg', 'sound/voice/hiss1.ogg','sound/machines/buzz-sigh.ogg', 'sound/machines/ping.ogg', 'sound/weapons/flashbang.ogg', 'sound/weapons/bladeslice.ogg') + if("goose") + soundin = pick('sound/creatures/goose1.ogg', 'sound/creatures/goose2.ogg', 'sound/creatures/goose3.ogg', 'sound/creatures/goose4.ogg') //START OF CIT CHANGES - adds random vore sounds if ("struggle_sound") soundin = pick( 'sound/vore/pred/struggle_01.ogg','sound/vore/pred/struggle_02.ogg','sound/vore/pred/struggle_03.ogg', diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index e441ccd6cc..f1c5080c8f 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -41,7 +41,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( /turf/open/copyTurf(turf/T, copy_air = FALSE) . = ..() if (isopenturf(T)) - GET_COMPONENT(slip, /datum/component/wet_floor) + var/datum/component/wet_floor/slip = GetComponent(/datum/component/wet_floor) if(slip) var/datum/component/wet_floor/WF = T.AddComponent(/datum/component/wet_floor) WF.InheritComponent(slip) diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index f6d234b346..bd24e0ff93 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -251,6 +251,7 @@ M.apply_water() SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + clean_blood() for(var/obj/effect/O in src) if(is_cleanable(O)) qdel(O) diff --git a/code/game/turfs/simulated/chasm.dm b/code/game/turfs/simulated/chasm.dm index 677fba2990..0a7b507488 100644 --- a/code/game/turfs/simulated/chasm.dm +++ b/code/game/turfs/simulated/chasm.dm @@ -15,11 +15,11 @@ AddComponent(/datum/component/chasm, SSmapping.get_turf_below(src)) /turf/open/chasm/proc/set_target(turf/target) - GET_COMPONENT(chasm_component, /datum/component/chasm) + var/datum/component/chasm/chasm_component = GetComponent(/datum/component/chasm) chasm_component.target_turf = target /turf/open/chasm/proc/drop(atom/movable/AM) - GET_COMPONENT(chasm_component, /datum/component/chasm) + var/datum/component/chasm/chasm_component = GetComponent(/datum/component/chasm) chasm_component.drop(AM) /turf/open/chasm/MakeSlippery(wet_setting, min_wet_time, wet_time_to_add, max_wet_time, permanent) diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index 7b45aa1fbb..ed6e279088 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -209,6 +209,46 @@ icon_state = "tile-carpet-monochrome" canSmoothWith = list(/turf/open/floor/carpet/black, /turf/open/floor/carpet/blackred, /turf/open/floor/carpet/monochrome) +/turf/open/floor/carpet/blue + icon = 'icons/turf/floors/carpet_blue.dmi' + floor_tile = /obj/item/stack/tile/carpet/blue + canSmoothWith = list(/turf/open/floor/carpet/blue) + +/turf/open/floor/carpet/cyan + icon = 'icons/turf/floors/carpet_cyan.dmi' + floor_tile = /obj/item/stack/tile/carpet/cyan + canSmoothWith = list(/turf/open/floor/carpet/cyan) + +/turf/open/floor/carpet/green + icon = 'icons/turf/floors/carpet_green.dmi' + floor_tile = /obj/item/stack/tile/carpet/green + canSmoothWith = list(/turf/open/floor/carpet/green) + +/turf/open/floor/carpet/orange + icon = 'icons/turf/floors/carpet_orange.dmi' + floor_tile = /obj/item/stack/tile/carpet/orange + canSmoothWith = list(/turf/open/floor/carpet/orange) + +/turf/open/floor/carpet/purple + icon = 'icons/turf/floors/carpet_purple.dmi' + floor_tile = /obj/item/stack/tile/carpet/purple + canSmoothWith = list(/turf/open/floor/carpet/purple) + +/turf/open/floor/carpet/red + icon = 'icons/turf/floors/carpet_red.dmi' + floor_tile = /obj/item/stack/tile/carpet/red + canSmoothWith = list(/turf/open/floor/carpet/red) + +/turf/open/floor/carpet/royalblack + icon = 'icons/turf/floors/carpet_royalblack.dmi' + floor_tile = /obj/item/stack/tile/carpet/royalblack + canSmoothWith = list(/turf/open/floor/carpet/royalblack) + +/turf/open/floor/carpet/royalblue + icon = 'icons/turf/floors/carpet_royalblue.dmi' + floor_tile = /obj/item/stack/tile/carpet/royalblue + canSmoothWith = list(/turf/open/floor/carpet/royalblue) + /turf/open/floor/carpet/narsie_act(force, ignore_mobs, probability = 20) . = (prob(probability) || force) for(var/I in src) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 7110ff4405..ebf6f6626c 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -382,6 +382,19 @@ if(ismob(A) || .) A.ratvar_act() +//called on /datum/species/proc/altdisarm() +/turf/shove_act(mob/living/target, mob/living/user, pre_act = FALSE) + var/list/possibilities + for(var/obj/O in contents) + if(CHECK_BITFIELD(O.obj_flags, SHOVABLE_ONTO)) + LAZYADD(possibilities, O) + else if(!O.CanPass(target, src)) + return FALSE + if(possibilities) + var/obj/O = pick(possibilities) + return O.shove_act(target, user) + return FALSE + /turf/proc/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) underlay_appearance.icon = icon underlay_appearance.icon_state = icon_state @@ -452,16 +465,21 @@ /turf/AllowDrop() return TRUE -/turf/proc/add_vomit_floor(mob/living/carbon/M, toxvomit = NONE) +/turf/proc/add_vomit_floor(mob/living/M, toxvomit = NONE) + var/obj/effect/decal/cleanable/vomit/V = new /obj/effect/decal/cleanable/vomit(src, M.get_static_viruses()) - // If the vomit combined, apply toxicity and reagents to the old vomit + //if the vomit combined, apply toxicity and reagents to the old vomit if (QDELETED(V)) V = locate() in src // Make toxins and blazaam vomit look different if(toxvomit == VOMIT_PURPLE) V.icon_state = "vomitpurp_[pick(1,4)]" - else if(toxvomit == VOMIT_TOXIC) + else if (toxvomit == VOMIT_TOXIC) V.icon_state = "vomittox_[pick(1,4)]" + if (iscarbon(M)) + var/mob/living/carbon/C = M + if(C.reagents) + clear_reagents_to_vomit_pool(C,V) /proc/clear_reagents_to_vomit_pool(mob/living/carbon/M, obj/effect/decal/cleanable/vomit/V) M.reagents.trans_to(V, M.reagents.total_volume / 10) @@ -474,4 +492,4 @@ //Whatever happens after high temperature fire dies out or thermite reaction works. //Should return new turf /turf/proc/Melt() - return ScrapeAway() \ No newline at end of file + return ScrapeAway() diff --git a/code/game/world.dm b/code/game/world.dm index e9c8433006..25b8c4d9f3 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -100,6 +100,7 @@ GLOBAL_VAR(restart_counter) GLOB.picture_log_directory = "data/picture_logs/[override_dir]" GLOB.world_game_log = "[GLOB.log_directory]/game.log" + GLOB.world_virus_log = "[GLOB.log_directory]/virus.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" diff --git a/code/modules/NTNet/services/_service.dm b/code/modules/NTNet/services/_service.dm index 8611c2d25d..3622dc3881 100644 --- a/code/modules/NTNet/services/_service.dm +++ b/code/modules/NTNet/services/_service.dm @@ -17,7 +17,7 @@ /datum/ntnet_service/proc/connect(datum/ntnet/net) if(!istype(net)) return FALSE - GET_COMPONENT(interface, /datum/component/ntnet_interface) + var/datum/component/ntnet_interface/interface = GetComponent(/datum/component/ntnet_interface) if(!interface.register_connection(net)) return FALSE if(!net.register_service(src)) @@ -29,7 +29,7 @@ /datum/ntnet_service/proc/disconnect(datum/ntnet/net, force = FALSE) if(!istype(net) || (!net.unregister_service(src) && !force)) return FALSE - GET_COMPONENT(interface, /datum/component/ntnet_interface) + var/datum/component/ntnet_interface/interface = GetComponent(/datum/component/ntnet_interface) interface.unregister_connection(net) networks_by_id -= net.network_id return TRUE diff --git a/code/modules/VR/vr_human.dm b/code/modules/VR/vr_human.dm deleted file mode 100644 index 53a4bbe540..0000000000 --- a/code/modules/VR/vr_human.dm +++ /dev/null @@ -1,61 +0,0 @@ -/mob/living/carbon/human/virtual_reality - var/datum/mind/real_mind // where is my mind t. pixies - var/obj/machinery/vr_sleeper/vr_sleeper - var/datum/action/quit_vr/quit_action - -/mob/living/carbon/human/virtual_reality/Initialize() - . = ..() - quit_action = new() - quit_action.Grant(src) - -/mob/living/carbon/human/virtual_reality/death() - revert_to_reality() - ..() - -/mob/living/carbon/human/virtual_reality/Destroy() - revert_to_reality() - return ..() - -/mob/living/carbon/human/virtual_reality/Life() - . = ..() - if(real_mind) - var/mob/living/real_me = real_mind.current - if (real_me && real_me.stat == CONSCIOUS) - return - revert_to_reality(FALSE) - -/mob/living/carbon/human/virtual_reality/ghostize() - stack_trace("Ghostize was called on a virtual reality mob") - -/mob/living/carbon/human/virtual_reality/ghost() - set category = "OOC" - set name = "Ghost" - set desc = "Relinquish your life and enter the land of the dead." - revert_to_reality(FALSE) - -/mob/living/carbon/human/virtual_reality/proc/revert_to_reality(deathchecks = TRUE) - if(real_mind && mind) - real_mind.current.audiovisual_redirect = null - real_mind.current.ckey = ckey - real_mind.current.stop_sound_channel(CHANNEL_HEARTBEAT) - if(deathchecks && vr_sleeper) - if(vr_sleeper.you_die_in_the_game_you_die_for_real) - to_chat(real_mind, "You feel everything fading away...") - real_mind.current.death(0) - if(deathchecks && vr_sleeper) - vr_sleeper.vr_human = null - vr_sleeper = null - real_mind = null - -/datum/action/quit_vr - name = "Quit Virtual Reality" - icon_icon = 'icons/mob/actions/actions_vr.dmi' - button_icon_state = "logout" - -/datum/action/quit_vr/Trigger() - if(..()) - if(istype(owner, /mob/living/carbon/human/virtual_reality)) - var/mob/living/carbon/human/virtual_reality/VR = owner - VR.revert_to_reality(FALSE) - else - Remove(owner) diff --git a/code/modules/VR/vr_mob.dm b/code/modules/VR/vr_mob.dm new file mode 100644 index 0000000000..5c0cea9f60 --- /dev/null +++ b/code/modules/VR/vr_mob.dm @@ -0,0 +1,44 @@ +/mob/proc/build_virtual_character(mob/M) + mind_initialize() + if(!M) + return FALSE + name = M.name + real_name = M.real_name + mind.name = M.real_name + return TRUE + +/mob/living/carbon/build_virtual_character(mob/M) + . = ..() + if(!.) + return + if(iscarbon(M)) + var/mob/living/carbon/C = M + C.dna?.transfer_identity(src) + +/mob/living/carbon/human/build_virtual_character(mob/M, datum/outfit/outfit) + . = ..() + if(!.) + return + var/mob/living/carbon/human/H + if(ishuman(M)) + H = M + socks = H ? H.socks : random_socks() + socks_color = H ? H.socks_color : random_color() + undershirt = H ? H.undershirt : random_undershirt(M.gender) + shirt_color = H ? H.shirt_color : random_color() + underwear = H ? H.underwear : random_underwear(M.gender) + undie_color = H ? H.undie_color : random_color() + give_genitals(TRUE) + if(outfit) + var/datum/outfit/O = new outfit() + O.equip(src) + +/datum/action/quit_vr + name = "Quit Virtual Reality" + icon_icon = 'icons/mob/actions/actions_vr.dmi' + button_icon_state = "logout" + +/datum/action/quit_vr/Trigger() //this merely a trigger for /datum/component/virtual_reality + . = ..() + if(!.) + Remove(owner) diff --git a/code/modules/VR/vr_sleeper.dm b/code/modules/VR/vr_sleeper.dm index 89e9c33ecc..72cbdc1409 100644 --- a/code/modules/VR/vr_sleeper.dm +++ b/code/modules/VR/vr_sleeper.dm @@ -1,5 +1,3 @@ - - //Glorified teleporter that puts you in a new human body. // it's """VR""" /obj/machinery/vr_sleeper @@ -12,9 +10,10 @@ circuit = /obj/item/circuitboard/machine/vr_sleeper var/you_die_in_the_game_you_die_for_real = FALSE var/datum/effect_system/spark_spread/sparks - var/mob/living/carbon/human/virtual_reality/vr_human + var/mob/living/vr_mob + var/virtual_mob_type = /mob/living/carbon/human var/vr_category = "default" //Specific category of spawn points to pick from - var/allow_creating_vr_humans = TRUE //So you can have vr_sleepers that always spawn you as a specific person or 1 life/chance vr games + var/allow_creating_vr_mobs = TRUE //So you can have vr_sleepers that always spawn you as a specific person or 1 life/chance vr games var/only_current_user_can_interact = FALSE /obj/machinery/vr_sleeper/Initialize() @@ -44,7 +43,7 @@ /obj/machinery/vr_sleeper/Destroy() open_machine() - cleanup_vr_human() + cleanup_vr_mob() QDEL_NULL(sparks) return ..() @@ -58,8 +57,9 @@ /obj/machinery/vr_sleeper/emag_act(mob/user) . = ..() - if(you_die_in_the_game_you_die_for_real) + if(!(obj_flags & EMAGGED)) return + obj_flags |= EMAGGED you_die_in_the_game_you_die_for_real = TRUE sparks.start() addtimer(CALLBACK(src, .proc/emagNotify), 150) @@ -69,12 +69,11 @@ icon_state = "[initial(icon_state)][state_open ? "-open" : ""]" /obj/machinery/vr_sleeper/open_machine() - if(!state_open) - if(vr_human) - vr_human.revert_to_reality(FALSE) - if(occupant) - SStgui.close_user_uis(occupant, src) - ..() + 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.stat || user.lying || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !user.IsAdvancedToolUser()) @@ -94,22 +93,20 @@ if("vr_connect") var/mob/living/carbon/human/human_occupant = occupant if(human_occupant && human_occupant.mind && usr == occupant) + to_chat(occupant, "Transferring to virtual reality...") - if(vr_human && vr_human.stat == CONSCIOUS && !vr_human.real_mind) - SStgui.close_user_uis(occupant, src) - human_occupant.audiovisual_redirect = vr_human - vr_human.real_mind = human_occupant.mind - vr_human.ckey = human_occupant.ckey - to_chat(vr_human, "Transfer successful! You are now playing as [vr_human] in VR!") + if(vr_mob && (!istype(vr_mob) || !vr_mob.InCritical()) && !vr_mob.GetComponent(/datum/component/virtual_reality)) + vr_mob.AddComponent(/datum/component/virtual_reality, human_occupant, src, you_die_in_the_game_you_die_for_real) + to_chat(vr_mob, "Transfer successful! You are now playing as [vr_mob] in VR!") else - if(allow_creating_vr_humans) + if(allow_creating_vr_mobs) to_chat(occupant, "Virtual avatar not found, attempting to create one...") var/obj/effect/landmark/vr_spawn/V = get_vr_spawnpoint() var/turf/T = get_turf(V) if(T) SStgui.close_user_uis(occupant, src) - build_virtual_human(occupant, T, V.vr_outfit) - to_chat(vr_human, "Transfer successful! You are now playing as [vr_human] in VR!") + new_player(occupant, T, V.vr_outfit) + to_chat(vr_mob, "Transfer successful! You are now playing as [vr_mob] in VR!") else to_chat(occupant, "Virtual world misconfigured, aborting transfer") else @@ -117,8 +114,8 @@ . = TRUE if("delete_avatar") if(!occupant || usr == occupant) - if(vr_human) - cleanup_vr_human() + if(vr_mob) + cleanup_vr_mob() else to_chat(usr, "The VR Sleeper's safeties prevent you from doing that.") . = TRUE @@ -131,19 +128,22 @@ /obj/machinery/vr_sleeper/ui_data(mob/user) var/list/data = list() - if(vr_human && !QDELETED(vr_human)) + if(vr_mob && !QDELETED(vr_mob)) data["can_delete_avatar"] = TRUE - var/status - switch(vr_human.stat) - if(CONSCIOUS) - status = "Conscious" - if(DEAD) - status = "Dead" - if(UNCONSCIOUS) - status = "Unconscious" - if(SOFT_CRIT) - status = "Barely Conscious" - data["vr_avatar"] = list("name" = vr_human.name, "status" = status, "health" = vr_human.health, "maxhealth" = vr_human.maxHealth) + data["vr_avatar"] = list("name" = vr_mob.name) + data["isliving"] = istype(vr_mob) + if(data["isliving"]) + var/status + switch(vr_mob.stat) + if(CONSCIOUS) + status = "Conscious" + if(DEAD) + status = "Dead" + if(UNCONSCIOUS) + status = "Unconscious" + if(SOFT_CRIT) + status = "Barely Conscious" + data["vr_avatar"] += list("status" = status, "health" = vr_mob.health, "maxhealth" = vr_mob.maxHealth) data["toggle_open"] = state_open data["emagged"] = you_die_in_the_game_you_die_for_real data["isoccupant"] = (user == occupant) @@ -157,40 +157,25 @@ for(var/obj/effect/landmark/vr_spawn/V in GLOB.landmarks_list) GLOB.vr_spawnpoints[V.vr_category] = V -/obj/machinery/vr_sleeper/proc/build_virtual_human(mob/living/carbon/human/H, location, var/datum/outfit/outfit, transfer = TRUE) - if(H) - cleanup_vr_human() - vr_human = new /mob/living/carbon/human/virtual_reality(location) - vr_human.mind_initialize() - vr_human.vr_sleeper = src - vr_human.real_mind = H.mind - H.dna.transfer_identity(vr_human) - vr_human.name = H.name - vr_human.real_name = H.real_name - vr_human.socks = H.socks - vr_human.socks_color = H.socks_color - vr_human.undershirt = H.undershirt - vr_human.shirt_color = H.shirt_color - vr_human.underwear = H.underwear - vr_human.undie_color = H.undie_color - vr_human.updateappearance(TRUE, TRUE, TRUE) - vr_human.give_genitals(TRUE) //CITADEL ADD - if(outfit) - var/datum/outfit/O = new outfit() - O.equip(vr_human) - if(transfer && H.mind) - SStgui.close_user_uis(H, src) - H.audiovisual_redirect = vr_human - vr_human.ckey = H.ckey +/obj/machinery/vr_sleeper/proc/new_player(mob/living/carbon/human/H, location, datum/outfit/outfit, transfer = TRUE) + if(!H) + return + cleanup_vr_mob() + vr_mob = new virtual_mob_type(location) + if(vr_mob.build_virtual_character(H, outfit)) + var/mob/living/carbon/human/vr_H = vr_mob + vr_H.updateappearance(TRUE, TRUE, TRUE) + if(!transfer || !H.mind) + return + vr_mob.AddComponent(/datum/component/virtual_reality, H, src, you_die_in_the_game_you_die_for_real) -/obj/machinery/vr_sleeper/proc/cleanup_vr_human() - if(vr_human) - vr_human.vr_sleeper = null // Prevents race condition where a new human could get created out of order and set to null. - QDEL_NULL(vr_human) +/obj/machinery/vr_sleeper/proc/cleanup_vr_mob() + if(vr_mob) + QDEL_NULL(vr_mob) /obj/machinery/vr_sleeper/proc/emagNotify() - if(vr_human) - vr_human.Dizzy(10) + if(vr_mob) + vr_mob.Dizzy(10) /obj/effect/landmark/vr_spawn //places you can spawn in VR, auto selected by the vr_sleeper during get_vr_spawnpoint() var/vr_category = "default" //So we can have specific sleepers, eg: "Basketball VR Sleeper", etc. @@ -222,6 +207,7 @@ color = "#00FF00" invisibility = INVISIBILITY_ABSTRACT var/area/vr_area + var/list/corpse_party /obj/effect/vr_clean_master/Initialize() . = ..() @@ -234,7 +220,8 @@ qdel(casing) for(var/obj/effect/decal/cleanable/C in vr_area) qdel(C) - for (var/mob/living/carbon/human/virtual_reality/H in vr_area) - if (H.stat == DEAD && !H.vr_sleeper && !H.real_mind) - qdel(H) + for (var/A in corpse_party) + var/mob/M = A + if(get_area(M) == vr_area && M.stat == DEAD) + qdel(M) addtimer(CALLBACK(src, .proc/clean_up), 3 MINUTES) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index ac1ae51f69..626fa7f66f 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -169,6 +169,7 @@ GLOBAL_LIST_INIT(admin_verbs_debug, world.AVerbsDebug()) /client/proc/cmd_display_overlay_log, /client/proc/reload_configuration, /datum/admins/proc/create_or_modify_area, + /client/proc/generate_wikichem_list //DO NOT PRESS UNLESS YOU WANT SUPERLAG ) GLOBAL_PROTECT(admin_verbs_possess) GLOBAL_LIST_INIT(admin_verbs_possess, list(/proc/possess, /proc/release)) diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm index 8b6f471e7d..cff7faadd8 100644 --- a/code/modules/admin/create_mob.dm +++ b/code/modules/admin/create_mob.dm @@ -35,8 +35,9 @@ H.dna.features["spines"] = pick(GLOB.spines_list) H.dna.features["body_markings"] = pick(GLOB.body_markings_list) H.dna.features["insect_wings"] = pick(GLOB.insect_wings_list) + H.dna.features["deco_wings"] = pick(GLOB.deco_wings_list) H.dna.features["insect_fluff"] = pick(GLOB.insect_fluffs_list) H.update_body() H.update_hair() - H.update_body_parts() \ No newline at end of file + H.update_body_parts() diff --git a/code/modules/admin/fun_balloon.dm b/code/modules/admin/fun_balloon.dm index da811a1974..81050e6eae 100644 --- a/code/modules/admin/fun_balloon.dm +++ b/code/modules/admin/fun_balloon.dm @@ -61,7 +61,7 @@ to_chat(body, "Your mob has been taken over by a ghost!") message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(body)])") body.ghostize(0) - body.key = C.key + C.transfer_ckey(body) new /obj/effect/temp_visual/gravpush(get_turf(body)) /obj/effect/fun_balloon/sentience/emergency_shuttle diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm index 7d74387c43..58fd627c74 100644 --- a/code/modules/admin/secrets.dm +++ b/code/modules/admin/secrets.dm @@ -458,7 +458,7 @@ SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Mass Braindamage")) for(var/mob/living/carbon/human/H in GLOB.player_list) to_chat(H, "You suddenly feel stupid.") - H.adjustBrainLoss(60, 80) + H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 60, 80) message_admins("[key_name_admin(usr)] made everybody retarded") if("eagles")//SCRAW @@ -744,7 +744,7 @@ var/mob/chosen = players[1] if (chosen.client) chosen.client.prefs.copy_to(spawnedMob) - spawnedMob.key = chosen.key + chosen.transfer_ckey(spawnedMob) players -= chosen if (ishuman(spawnedMob) && ispath(humanoutfit, /datum/outfit)) var/mob/living/carbon/human/H = spawnedMob diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 91df9ef85c..b0b9190556 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -2042,7 +2042,7 @@ if(DEAD) status = "Dead" health_description = "Status = [status]" - health_description += "
Oxy: [L.getOxyLoss()] - Tox: [L.getToxLoss()] - Fire: [L.getFireLoss()] - Brute: [L.getBruteLoss()] - Clone: [L.getCloneLoss()] - Brain: [L.getBrainLoss()] - Stamina: [L.getStaminaLoss()]" + health_description += "
Oxy: [L.getOxyLoss()] - Tox: [L.getToxLoss()] - Fire: [L.getFireLoss()] - Brute: [L.getBruteLoss()] - Clone: [L.getCloneLoss()] - Brain: [L.getOrganLoss(ORGAN_SLOT_BRAIN)] - Stamina: [L.getStaminaLoss()]" else health_description = "This mob type has no health to speak of." diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 91fdc78d20..ce4b8f7e39 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -318,6 +318,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) RemoveActive() state = AHELP_CLOSED GLOB.ahelp_tickets.ListInsert(src) + to_chat(initiator, "Ticket closed by [usr?.client?.holder?.fakekey? usr.client.holder.fakekey : "an administrator"].") AddInteraction("Closed by [key_name].") if(!silent) SSblackbox.record_feedback("tally", "ahelp_stats", 1, "closed") @@ -336,7 +337,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) addtimer(CALLBACK(initiator, /client/proc/giveadminhelpverb), 50) AddInteraction("Resolved by [key_name].") - to_chat(initiator, "Your ticket has been resolved by an admin. The Adminhelp verb will be returned to you shortly.") + to_chat(initiator, "Your ticket has been resolved by [usr?.client?.holder?.fakekey? usr.client.holder.fakekey : "an administrator"]. The Adminhelp verb will be returned to you shortly.") if(!silent) SSblackbox.record_feedback("tally", "ahelp_stats", 1, "resolved") var/msg = "Ticket [TicketHref("#[id]")] resolved by [key_name]" @@ -353,7 +354,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) SEND_SOUND(initiator, sound('sound/effects/adminhelp.ogg')) - to_chat(initiator, "- AdminHelp Rejected! -") + to_chat(initiator, "- AdminHelp Rejected by [usr?.client?.holder?.fakekey? usr.client.holder.fakekey : "an administrator"]! -") to_chat(initiator, "Your admin help was rejected. The adminhelp verb has been returned to you so that you may try again.") to_chat(initiator, "Please try to be calm, clear, and descriptive in admin helps, do not assume the admin has seen any related events, and clearly state the names of anybody you are reporting.") @@ -369,7 +370,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) if(state != AHELP_ACTIVE) return - var/msg = "- AdminHelp marked as IC issue! -
" + var/msg = "- AdminHelp marked as IC issue by [usr?.client?.holder?.fakekey? usr.client.holder.fakekey : "an administrator"]! -
" msg += "Losing is part of the game!
" msg += "It is also possible that your ahelp is unable to be answered properly, due to events occurring in the round." if(initiator) @@ -413,9 +414,9 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) dat += "CLOSED" else dat += "UNKNOWN" - dat += "
[GLOB.TAB][TicketHref("Refresh", ref_src)][GLOB.TAB][TicketHref("Re-Title", ref_src, "retitle")]" + dat += "[FOURSPACES][TicketHref("Refresh", ref_src)][FOURSPACES][TicketHref("Re-Title", ref_src, "retitle")]" if(state != AHELP_ACTIVE) - dat += "[GLOB.TAB][TicketHref("Reopen", ref_src, "reopen")]" + dat += "[FOURSPACES][TicketHref("Reopen", ref_src, "reopen")]" dat += "

Opened at: [GAMETIMESTAMP("hh:mm:ss", closed_at)] (Approx [DisplayTimeText(world.time - opened_at)] ago)" if(closed_at) dat += "
Closed at: [GAMETIMESTAMP("hh:mm:ss", closed_at)] (Approx [DisplayTimeText(world.time - closed_at)] ago)" @@ -423,7 +424,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) if(initiator) dat += "Actions: [FullMonty(ref_src)]
" else - dat += "DISCONNECTED[GLOB.TAB][ClosureLinks(ref_src)]
" + dat += "DISCONNECTED[FOURSPACES][ClosureLinks(ref_src)]
" dat += "
Log:

" for(var/I in _interactions) dat += "[I]
" diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index e15613c43d..53fdb315b5 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -306,7 +306,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention) var/mob/living/silicon/pai/pai = new(card) pai.name = input(choice, "Enter your pAI name:", "pAI Name", "Personal AI") as text pai.real_name = pai.name - pai.key = choice.key + choice.transfer_ckey(pai) card.setPersonality(pai) for(var/datum/paiCandidate/candidate in SSpai.candidates) if(candidate.key == choice.key) diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm index 5b74ae7c5b..e70ea1c1b3 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/verbs/modifyvariables.dm @@ -534,7 +534,7 @@ GLOBAL_PROTECT(VVpixelmovement) if (prompt != "Continue") return FALSE return TRUE - + /client/proc/modify_variables(atom/O, param_var_name = null, autodetect_class = 0) if(!check_rights(R_VAREDIT)) @@ -545,7 +545,7 @@ GLOBAL_PROTECT(VVpixelmovement) var/var_value if(param_var_name) - if(!param_var_name in O.vars) + if(!(param_var_name in O.vars)) to_chat(src, "A variable with this name ([param_var_name]) doesn't exist in this datum ([O])") return variable = param_var_name diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index d9732818bd..09a8f692d8 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -412,7 +412,7 @@ //Spawn the body var/mob/living/carbon/human/ERTOperative = new ertemplate.mobtype(spawnloc) chosen_candidate.client.prefs.copy_to(ERTOperative) - ERTOperative.key = chosen_candidate.key + chosen_candidate.transfer_ckey(ERTOperative) if(ertemplate.enforce_human || ERTOperative.dna.species.dangerous_existence) // Don't want any exploding plasmemes ERTOperative.set_species(/datum/species/human) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index a725399b0f..246ccb1d07 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -384,7 +384,7 @@ Traitors and the like can also be revived with the previous role mostly intact. //Now to give them their mind back. G_found.mind.transfer_to(new_xeno) //be careful when doing stuff like this! I've already checked the mind isn't in use - new_xeno.key = G_found.key + G_found.transfer_ckey(new_xeno, FALSE) to_chat(new_xeno, "You have been fully respawned. Enjoy the game.") var/msg = "[key_name_admin(usr)] has respawned [new_xeno.key] as a filthy xeno." message_admins(msg) @@ -397,7 +397,7 @@ Traitors and the like can also be revived with the previous role mostly intact. var/mob/living/carbon/monkey/new_monkey = new SSjob.SendToLateJoin(new_monkey) G_found.mind.transfer_to(new_monkey) //be careful when doing stuff like this! I've already checked the mind isn't in use - new_monkey.key = G_found.key + G_found.transfer_ckey(new_monkey, FALSE) to_chat(new_monkey, "You have been fully respawned. Enjoy the game.") var/msg = "[key_name_admin(usr)] has respawned [new_monkey.key] as a filthy xeno." message_admins(msg) @@ -437,7 +437,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if(!new_character.mind.assigned_role) new_character.mind.assigned_role = "Assistant"//If they somehow got a null assigned role. - new_character.key = G_found.key + G_found.transfer_ckey(new_character, FALSE) /* The code below functions with the assumption that the mob is already a traitor if they have a special role. @@ -1264,7 +1264,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits target.electrocution_animation(40) to_chat(target, "The gods have punished you for your sins!") if(ADMIN_PUNISHMENT_BRAINDAMAGE) - target.adjustBrainLoss(199, 199) + target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 199, 199) if(ADMIN_PUNISHMENT_GIB) target.gib(FALSE) if(ADMIN_PUNISHMENT_BSA) diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index aa91af1dd8..42719e28bd 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -15,7 +15,7 @@ GLOBAL_LIST_EMPTY(antagonists) var/antag_memory = ""//These will be removed with antag datum var/antag_moodlet //typepath of moodlet that the mob will gain with their status var/can_hijack = HIJACK_NEUTRAL //If these antags are alone on shuttle hijack happens. - + //Antag panel properties var/show_in_antagpanel = TRUE //This will hide adding this antag type in antag panel, use only for internal subtypes that shouldn't be added directly but still show if possessed by mind var/antagpanel_category = "Uncategorized" //Antagpanel will display these together, REQUIRED @@ -87,7 +87,7 @@ GLOBAL_LIST_EMPTY(antagonists) to_chat(owner, "Your mob has been taken over by a ghost! Appeal your job ban if you want to avoid this in the future!") message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(owner.current)]) to replace a jobbaned player.") owner.current.ghostize(0) - owner.current.key = C.key + C.transfer_ckey(owner.current, FALSE) /datum/antagonist/proc/on_removal() remove_innate_effects() diff --git a/code/modules/antagonists/abductor/abductor.dm b/code/modules/antagonists/abductor/abductor.dm index 0fca957ffe..e8d30e8dbe 100644 --- a/code/modules/antagonists/abductor/abductor.dm +++ b/code/modules/antagonists/abductor/abductor.dm @@ -26,7 +26,7 @@ sub_role = "Scientist" outfit = /datum/outfit/abductor/scientist landmark_type = /obj/effect/landmark/abductor/scientist - greet_text = "Use your stealth technology and equipment to incapacitate humans for your scientist to retrieve." + greet_text = "Use your experimental console and surgical equipment to monitor your agent and experiment upon abducted humans." show_in_antagpanel = TRUE /datum/antagonist/abductor/create_team(datum/team/abductor_team/new_team) @@ -40,17 +40,18 @@ return team /datum/antagonist/abductor/on_gain() - owner.special_role = "[name] [sub_role]" - owner.assigned_role = "[name] [sub_role]" - owner.objectives += team.objectives + owner.special_role = "[name]" + owner.assigned_role = "[name]" + objectives += team.objectives finalize_abductor() + ADD_TRAIT(owner, TRAIT_ABDUCTOR_TRAINING, ABDUCTOR_ANTAGONIST) return ..() /datum/antagonist/abductor/on_removal() - owner.objectives -= team.objectives if(owner.current) to_chat(owner.current,"You are no longer the [owner.special_role]!") owner.special_role = null + REMOVE_TRAIT(owner, TRAIT_ABDUCTOR_TRAINING, ABDUCTOR_ANTAGONIST) return ..() /datum/antagonist/abductor/greet() @@ -64,6 +65,7 @@ //Equip var/mob/living/carbon/human/H = owner.current H.set_species(/datum/species/abductor) + H.real_name = "[team.name] [sub_role]" H.equipOutfit(outfit) @@ -75,11 +77,15 @@ update_abductor_icons_added(owner,"abductor") -/datum/antagonist/abductor/scientist/finalize_abductor() - ..() - var/mob/living/carbon/human/H = owner.current - var/datum/species/abductor/A = H.dna.species - A.scientist = TRUE +/datum/antagonist/abductor/scientist/on_gain() + ADD_TRAIT(owner, TRAIT_ABDUCTOR_SCIENTIST_TRAINING, ABDUCTOR_ANTAGONIST) + ADD_TRAIT(owner, TRAIT_SURGEON, ABDUCTOR_ANTAGONIST) + . = ..() + +/datum/antagonist/abductor/scientist/on_removal() + REMOVE_TRAIT(owner, TRAIT_ABDUCTOR_SCIENTIST_TRAINING, ABDUCTOR_ANTAGONIST) + REMOVE_TRAIT(owner, TRAIT_SURGEON, ABDUCTOR_ANTAGONIST) + . = ..() /datum/antagonist/abductor/admin_add(datum/mind/new_owner,mob/admin) var/list/current_teams = list() @@ -93,8 +99,8 @@ else return new_owner.add_antag_datum(src) - log_admin("[key_name(usr)] made [key_name(new_owner.current)] [name] on [choice]!") - message_admins("[key_name_admin(usr)] made [key_name_admin(new_owner.current)] [name] on [choice] !") + log_admin("[key_name(usr)] made [key_name(new_owner)] [name] on [choice]!") + message_admins("[key_name_admin(usr)] made [key_name_admin(new_owner)] [name] on [choice] !") /datum/antagonist/abductor/get_admin_commands() . = ..() @@ -147,7 +153,7 @@ result += "The abductors of [name] were:" for(var/datum/mind/abductor_mind in members) result += printplayer(abductor_mind) - result += printobjectives(abductor_mind) + result += printobjectives(objectives) return "
[result.Join("
")]
" @@ -172,7 +178,6 @@ var/objtype = (prob(75) ? /datum/objective/abductee/random : pick(subtypesof(/datum/objective/abductee/) - /datum/objective/abductee/random)) var/datum/objective/abductee/O = new objtype() objectives += O - owner.objectives += objectives /datum/antagonist/abductee/apply_innate_effects(mob/living/mob_override) update_abductor_icons_added(mob_override ? mob_override.mind : owner,"abductee") @@ -214,4 +219,4 @@ /datum/antagonist/proc/update_abductor_icons_removed(datum/mind/alien_mind) var/datum/atom_hud/antag/hud = GLOB.huds[ANTAG_HUD_ABDUCTOR] hud.leave_hud(alien_mind.current) - set_antag_hud(alien_mind.current, null) \ No newline at end of file + set_antag_hud(alien_mind.current, null) diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index 1573204d88..3d874aac58 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -55,7 +55,7 @@ var/datum/action/A = X A.UpdateButtonIcon() -/obj/item/clothing/suit/armor/abductor/vest/item_action_slot_check(slot, mob/user) +/obj/item/clothing/suit/armor/abductor/vest/item_action_slot_check(slot, mob/user, datum/action/A) if(slot == SLOT_WEAR_SUIT) //we only give the mob the ability to activate the vest if he's actually wearing it. return 1 @@ -132,22 +132,26 @@ /obj/item/abductor icon = 'icons/obj/abductor.dmi' -/obj/item/abductor/proc/AbductorCheck(user) - if(isabductor(user)) +/obj/item/abductor/proc/AbductorCheck(mob/user) + if(HAS_TRAIT(user, TRAIT_ABDUCTOR_TRAINING)) + return TRUE + if (istype(user) && user.mind && HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_TRAINING)) return TRUE to_chat(user, "You can't figure how this works!") return FALSE -/obj/item/abductor/proc/ScientistCheck(user) - if(!AbductorCheck(user)) - return FALSE +/obj/item/abductor/proc/ScientistCheck(mob/user) + var/training = HAS_TRAIT(user, TRAIT_ABDUCTOR_TRAINING) || (user.mind && HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_TRAINING)) + var/sci_training = HAS_TRAIT(user, TRAIT_ABDUCTOR_SCIENTIST_TRAINING) || (user.mind && HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_SCIENTIST_TRAINING)) - var/mob/living/carbon/human/H = user - var/datum/species/abductor/S = H.dna.species - if(S.scientist) - return TRUE - to_chat(user, "You're not trained to use this!") - return FALSE + if(training && !sci_training) + to_chat(user, "You're not trained to use this!") + . = FALSE + else if(!training && !sci_training) + to_chat(user, "You can't figure how this works!") + . = FALSE + else + . = TRUE /obj/item/abductor/gizmo name = "science tool" @@ -683,7 +687,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} desc = "Abduct with style - spiky style. Prevents digital tracking." icon_state = "alienhelmet" item_state = "alienhelmet" - blockTracking = 1 + blockTracking = TRUE flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR // Operating Table / Beds / Lockers diff --git a/code/modules/antagonists/abductor/equipment/abduction_outfits.dm b/code/modules/antagonists/abductor/equipment/abduction_outfits.dm index a69c8fdeff..7e03bbf57a 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_outfits.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_outfits.dm @@ -52,5 +52,5 @@ /datum/outfit/abductor/scientist/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) ..() if(!visualsOnly) - var/obj/item/implant/abductor/beamplant = new /obj/item/implant/abductor(H) + var/obj/item/implant/abductor/beamplant = new beamplant.implant(H) diff --git a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm b/code/modules/antagonists/abductor/equipment/abduction_surgery.dm index 819dbafd6a..98164de099 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_surgery.dm @@ -1,5 +1,5 @@ /datum/surgery/organ_extraction - name = "experimental dissection" + name = "experimental organ replacement" steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/incise, /datum/surgery_step/extract_organ, /datum/surgery_step/gland_insert) possible_locs = list(BODY_ZONE_CHEST) ignore_clothes = 1 diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm index 72edb18020..a35cbbf0e4 100644 --- a/code/modules/antagonists/abductor/equipment/gland.dm +++ b/code/modules/antagonists/abductor/equipment/gland.dm @@ -5,6 +5,7 @@ icon_state = "gland" status = ORGAN_ROBOTIC beating = TRUE + var/true_name = "baseline placebo referencer" var/cooldown_low = 300 var/cooldown_high = 300 var/next_activation = 0 @@ -16,6 +17,11 @@ var/mind_control_duration = 1800 var/active_mind_control = FALSE +/obj/item/organ/heart/gland/examine(mob/user) + . = ..() + if((user.mind && HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_SCIENTIST_TRAINING)) || isobserver(user)) + to_chat(user, "It is \a [true_name].") + /obj/item/organ/heart/gland/proc/ownerCheck() if(ishuman(owner)) return TRUE @@ -42,19 +48,19 @@ /obj/item/organ/heart/gland/proc/mind_control(command, mob/living/user) if(!ownerCheck() || !mind_control_uses || active_mind_control) - return + return FALSE mind_control_uses-- to_chat(owner, "You suddenly feel an irresistible compulsion to follow an order...") to_chat(owner, "[command]") active_mind_control = TRUE - log_admin("[key_name(user)] sent an abductor mind control message to [key_name(owner)]: [command]") + message_admins("[key_name(user)] sent an abductor mind control message to [key_name(owner)]: [command]") update_gland_hud() addtimer(CALLBACK(src, .proc/clear_mind_control), mind_control_duration) /obj/item/organ/heart/gland/proc/clear_mind_control() if(!ownerCheck() || !active_mind_control) - return + return FALSE to_chat(owner, "You feel the compulsion fade, and you completely forget about your previous orders.") active_mind_control = FALSE @@ -95,6 +101,7 @@ return /obj/item/organ/heart/gland/heals + true_name = "coherency harmonizer" cooldown_low = 200 cooldown_high = 400 uses = -1 @@ -109,6 +116,7 @@ owner.adjustOxyLoss(-20) /obj/item/organ/heart/gland/slime + true_name = "gastric animation galvanizer" cooldown_low = 600 cooldown_high = 1200 uses = -1 @@ -130,6 +138,7 @@ Slime.Leader = owner /obj/item/organ/heart/gland/mindshock + true_name = "neural crosstalk uninhibitor" cooldown_low = 400 cooldown_high = 700 uses = -1 @@ -151,11 +160,12 @@ if(2) to_chat(H, "You hear an annoying buzz in your head.") H.confused += 15 - H.adjustBrainLoss(10, 160) + H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 160) if(3) H.hallucination += 60 /obj/item/organ/heart/gland/pop + true_name = "anthropmorphic translocator" cooldown_low = 900 cooldown_high = 1800 uses = -1 @@ -171,6 +181,7 @@ owner.set_species(species) /obj/item/organ/heart/gland/ventcrawling + true_name = "pliant cartilage enabler" cooldown_low = 1800 cooldown_high = 2400 uses = 1 @@ -183,6 +194,7 @@ owner.ventcrawler = VENTCRAWLER_ALWAYS /obj/item/organ/heart/gland/viral + true_name = "contamination incubator" cooldown_low = 1800 cooldown_high = 2400 uses = 1 @@ -217,6 +229,7 @@ return A /obj/item/organ/heart/gland/trauma + true_name = "white matter randomiser" cooldown_low = 800 cooldown_high = 1200 uses = 5 @@ -235,6 +248,7 @@ owner.gain_trauma_type(BRAIN_TRAUMA_MILD, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY)) /obj/item/organ/heart/gland/spiderman + true_name = "araneae cloister accelerator" cooldown_low = 450 cooldown_high = 900 uses = -1 @@ -249,6 +263,7 @@ S.directive = "Protect your nest inside [owner.real_name]." /obj/item/organ/heart/gland/egg + true_name = "roe/enzymatic synthesizer" cooldown_low = 300 cooldown_high = 400 uses = -1 @@ -264,6 +279,7 @@ new /obj/item/reagent_containers/food/snacks/egg/gland(T) /obj/item/organ/heart/gland/electric + true_name = "electron accumulator/discharger" cooldown_low = 800 cooldown_high = 1200 uses = -1 @@ -289,6 +305,7 @@ playsound(get_turf(owner), 'sound/magic/lightningshock.ogg', 50, 1) /obj/item/organ/heart/gland/chem + true_name = "intrinsic pharma-provider" cooldown_low = 50 cooldown_high = 50 uses = -1 @@ -315,6 +332,7 @@ ..() /obj/item/organ/heart/gland/plasma + true_name = "effluvium sanguine-synonym emitter" cooldown_low = 1200 cooldown_high = 1800 uses = -1 diff --git a/code/modules/antagonists/abductor/machinery/camera.dm b/code/modules/antagonists/abductor/machinery/camera.dm index 41cfa6a954..00e48cb1c7 100644 --- a/code/modules/antagonists/abductor/machinery/camera.dm +++ b/code/modules/antagonists/abductor/machinery/camera.dm @@ -55,8 +55,7 @@ actions += set_droppoint_action /obj/machinery/computer/camera_advanced/abductor/proc/IsScientist(mob/living/carbon/human/H) - var/datum/species/abductor/S = H.dna.species - return S.scientist + return HAS_TRAIT(H, TRAIT_ABDUCTOR_SCIENTIST_TRAINING) /datum/action/innate/teleport_in name = "Send To" diff --git a/code/modules/antagonists/abductor/machinery/console.dm b/code/modules/antagonists/abductor/machinery/console.dm index 46d69ba9bb..9a9b1a6ba0 100644 --- a/code/modules/antagonists/abductor/machinery/console.dm +++ b/code/modules/antagonists/abductor/machinery/console.dm @@ -28,7 +28,7 @@ . = ..() if(.) return - if(!isabductor(user)) + 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)) TeleporterSend() diff --git a/code/modules/antagonists/abductor/machinery/pad.dm b/code/modules/antagonists/abductor/machinery/pad.dm index 1cb95fbf05..ab636f7d0e 100644 --- a/code/modules/antagonists/abductor/machinery/pad.dm +++ b/code/modules/antagonists/abductor/machinery/pad.dm @@ -53,4 +53,4 @@ . = ..() var/datum/effect_system/spark_spread/S = new S.set_up(10,0,loc) - S.start() \ No newline at end of file + S.start() diff --git a/code/modules/antagonists/blob/blob/powers.dm b/code/modules/antagonists/blob/blob/powers.dm index 9e915ee0fa..e49d186362 100644 --- a/code/modules/antagonists/blob/blob/powers.dm +++ b/code/modules/antagonists/blob/blob/powers.dm @@ -172,7 +172,7 @@ blobber.adjustHealth(blobber.maxHealth * 0.5) blob_mobs += blobber var/mob/dead/observer/C = pick(candidates) - blobber.key = C.key + C.transfer_ckey(blobber) SEND_SOUND(blobber, sound('sound/effects/blobattack.ogg')) SEND_SOUND(blobber, sound('sound/effects/attackblob.ogg')) to_chat(blobber, "You are a blobbernaut!") diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index 252e2b5cbe..b6e3d66c35 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -83,7 +83,7 @@ if(istype(C)) var/obj/item/organ/brain/B = C.getorganslot(ORGAN_SLOT_BRAIN) if(B && (B.decoy_override != initial(B.decoy_override))) - B.vital = TRUE + B.organ_flags |= ORGAN_VITAL B.decoy_override = FALSE remove_changeling_powers() . = ..() @@ -340,7 +340,7 @@ if(istype(C)) var/obj/item/organ/brain/B = C.getorganslot(ORGAN_SLOT_BRAIN) if(B) - B.vital = FALSE + B.organ_flags &= ~ORGAN_VITAL B.decoy_override = TRUE update_changeling_icons_added() return diff --git a/code/modules/antagonists/changeling/powers/regenerate.dm b/code/modules/antagonists/changeling/powers/regenerate.dm index a1f8e1ef9b..1b27fa9694 100644 --- a/code/modules/antagonists/changeling/powers/regenerate.dm +++ b/code/modules/antagonists/changeling/powers/regenerate.dm @@ -35,7 +35,7 @@ B = new C.dna.species.mutant_brain() else B = new() - B.vital = FALSE + B.organ_flags &= ~ORGAN_VITAL B.decoy_override = TRUE B.Insert(C) if(ishuman(user)) diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm index 97d7f0c128..8000be87e6 100644 --- a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm +++ b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm @@ -349,7 +349,7 @@ to_chat(L, "Your physical form has been taken over by another soul due to your inactivity! Ahelp if you wish to regain your form!") message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(L)]) to replace an inactive clock cultist.") L.ghostize(0) - L.key = C.key + C.transfer_ckey(L, FALSE) var/obj/effect/temp_visual/ratvar/sigil/vitality/V = new /obj/effect/temp_visual/ratvar/sigil/vitality(get_turf(src)) animate(V, alpha = 0, transform = matrix()*2, time = 8) playsound(L, 'sound/magic/staff_healing.ogg', 50, 1) @@ -366,6 +366,8 @@ break if(!GLOB.ratvar_awakens) + if(GLOB.clockwork_vitality <= 0) + break GLOB.clockwork_vitality -= vitality_used sleep(2) diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm index 0ac96c47f9..88cf420420 100644 --- a/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm +++ b/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm @@ -50,7 +50,7 @@ to_chat(user, "The helmet tries to drive a spike through your head as you scramble to remove it!") user.emote("scream") user.apply_damage(30, BRUTE, BODY_ZONE_HEAD) - user.adjustBrainLoss(30) + user.adjustOrganLoss(ORGAN_SLOT_BRAIN, 30) addtimer(CALLBACK(user, /mob/living.proc/dropItemToGround, src, TRUE), 1) //equipped happens before putting stuff on(but not before picking items up), 1). thus, we need to wait for it to be on before forcing it off. /obj/item/clothing/head/helmet/clockwork/mob_can_equip(mob/M, mob/equipper, slot, disable_warning = 0) diff --git a/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm b/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm index 12af249bee..2be0fdde11 100644 --- a/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm +++ b/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm @@ -55,7 +55,7 @@ pre_spawn() visible_message(creation_message) var/mob/living/construct = new construct_type(get_turf(src)) - construct.key = user.key + user.transfer_ckey(construct, FALSE) post_spawn(construct) qdel(user) qdel(src) diff --git a/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm b/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm index f44f67e9cb..28deba679b 100644 --- a/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm +++ b/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm @@ -27,7 +27,7 @@ qdel(blaster) return ..() -/obj/item/clothing/glasses/judicial_visor/item_action_slot_check(slot, mob/user) +/obj/item/clothing/glasses/judicial_visor/item_action_slot_check(slot, mob/user, datum/action/A) if(slot != SLOT_GLASSES) return 0 return ..() diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_applications.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_applications.dm index da499065d7..3d467350ff 100644 --- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_applications.dm +++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_applications.dm @@ -119,3 +119,33 @@ var/datum/clockwork_scripture/create_object/construct/clockwork_marauder/CM = new() CM.recent_marauders-- qdel(CM) + +//Summon Neovgre: Summon a very powerful combat mech that explodes when destroyed for massive damage. +/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 \ + 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." + 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 + usage_tip = "Neovgre is a powerful mech that will crush your enemies!" + invokers_required = 5 + multiple_invokers_used = TRUE + object_path = /obj/mecha/combat/neovgre + tier = SCRIPTURE_APPLICATION + primary_component = BELLIGERENT_EYE + sort_priority = 2 + creator_message = "Neovgre, the Anima Bulwark towers over you... your enemies reckoning has come." + +/datum/clockwork_scripture/create_object/summon_arbiter/check_special_requirements() + if(GLOB.neovgre_exists) + to_chat(invoker, "\"You've already got one...\"") + return FALSE + return ..() diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm index 6d6b1fa9d0..82c1291433 100644 --- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm +++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm @@ -216,6 +216,9 @@ if(is_reebe(invoker.z)) to_chat(invoker, "You're already at Reebe.") return + if(!isturf(invoker.loc)) + to_chat(invoker, "You must be visible to return!") + return return TRUE /datum/clockwork_scripture/abscond/recital() diff --git a/code/modules/antagonists/clockcult/clock_structures/eminence_spire.dm b/code/modules/antagonists/clockcult/clock_structures/eminence_spire.dm index 05f3ca5917..c01c7f0f57 100644 --- a/code/modules/antagonists/clockcult/clock_structures/eminence_spire.dm +++ b/code/modules/antagonists/clockcult/clock_structures/eminence_spire.dm @@ -64,7 +64,7 @@ message_admins("Admin [key_name_admin(user)] directly became the Eminence of the cult!") log_admin("Admin [key_name(user)] made themselves the Eminence.") var/mob/camera/eminence/eminence = new(get_turf(src)) - eminence.key = user.key + user.transfer_ckey(eminence, FALSE) hierophant_message("Ratvar has directly assigned the Eminence!") for(var/mob/M in servants_and_ghosts()) M.playsound_local(M, 'sound/machines/clockcult/eminence_selected.ogg', 50, FALSE) @@ -138,7 +138,7 @@ playsound(src, 'sound/machines/clockcult/ark_damage.ogg', 50, FALSE) var/mob/camera/eminence/eminence = new(get_turf(src)) eminence_nominee = pick(candidates) - eminence.key = eminence_nominee.key + eminence_nominee.transfer_ckey(eminence) hierophant_message("A ghost has ascended into the Eminence!") for(var/mob/M in servants_and_ghosts()) M.playsound_local(M, 'sound/machines/clockcult/eminence_selected.ogg', 50, FALSE) diff --git a/code/modules/antagonists/clockcult/clock_structures/heralds_beacon.dm b/code/modules/antagonists/clockcult/clock_structures/heralds_beacon.dm index 7654c0203b..3a461b7745 100644 --- a/code/modules/antagonists/clockcult/clock_structures/heralds_beacon.dm +++ b/code/modules/antagonists/clockcult/clock_structures/heralds_beacon.dm @@ -78,7 +78,7 @@ return voters += user.key else - if(!user.key in voters) + if(!(user.key in voters)) return voters -= user.key var/votes_left = votes_needed - voters.len 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 9341a7ee6a..c17885315f 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 @@ -45,7 +45,7 @@ return FALSE var/mob/living/simple_animal/drone/cogscarab/ratvar/R = new/mob/living/simple_animal/drone/cogscarab/ratvar(get_turf(src)) R.visible_message("[R] forms, and its eyes blink open, glowing bright red!") - R.key = O.key + O.transfer_ckey(R, FALSE) /obj/structure/destructible/clockwork/massive/ratvar/Bump(atom/A) var/turf/T = get_turf(A) diff --git a/code/modules/antagonists/clockcult/clock_structures/traps/steam_vent.dm b/code/modules/antagonists/clockcult/clock_structures/traps/steam_vent.dm index 8d65574987..6aede1592e 100644 --- a/code/modules/antagonists/clockcult/clock_structures/traps/steam_vent.dm +++ b/code/modules/antagonists/clockcult/clock_structures/traps/steam_vent.dm @@ -7,7 +7,6 @@ break_message = "The vent snaps and collapses!" max_integrity = 100 density = FALSE - layer = BELOW_OBJ_LAYER /obj/structure/destructible/clockwork/trap/steam_vent/activate() opacity = !opacity diff --git a/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm b/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm index fb8397eed7..32b1b61dd1 100644 --- a/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm +++ b/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm @@ -5,7 +5,6 @@ unanchored_icon = "wall_gear" climbable = TRUE max_integrity = 100 - layer = BELOW_OBJ_LAYER construction_value = 3 desc = "A massive brass gear. You could probably secure or unsecure it with a wrench, or just climb over it." break_message = "The gear breaks apart into shards of alloy!" diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 1dbae4ca98..fc4d945d51 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -4,6 +4,7 @@ desc = "Prepare blood magic by carving runes into your flesh. This rite is most effective with an empowering rune" var/list/spells = list() var/channeling = FALSE + var/holy_dispel = FALSE /datum/action/innate/cult/blood_magic/Grant() ..() @@ -33,6 +34,9 @@ B.button.moved = B.button.screen_loc /datum/action/innate/cult/blood_magic/Activate() + if(holy_dispel) + to_chat(owner, "Holy water currently scours your body, nullifying the power of the rites!") + return var/rune = FALSE var/limit = RUNELESS_MAX_BLOODCHARGE for(var/obj/effect/rune/empower/R in range(1, owner)) @@ -64,7 +68,7 @@ qdel(nullify_spell) return BS = possible_spells[entered_spell_name] - if(QDELETED(src) || owner.incapacitated() || !BS || (rune && !(locate(/obj/effect/rune/empower) in range(1, owner))) || (spells.len >= limit)) + if(QDELETED(src) || owner.incapacitated() || !BS || holy_dispel || (rune && !(locate(/obj/effect/rune/empower) in range(1, owner))) || (spells.len >= limit)) return to_chat(owner,"You begin to carve unnatural symbols into your flesh!") SEND_SOUND(owner, sound('sound/weapons/slice.ogg',0,1,10)) @@ -73,7 +77,7 @@ else to_chat(owner, "You are already invoking blood magic!") return - if(do_after(owner, 100 - rune*60, target = owner)) + if(do_after(owner, 100 - rune*60, target = owner) && !holy_dispel) if(ishuman(owner)) var/mob/living/carbon/human/H = owner H.bleed(40 - rune*32) @@ -644,6 +648,11 @@ desc = "A spell that will absorb blood from anything you touch.
Touching cultists and constructs can heal them.
Clicking the hand will potentially let you focus the spell into something stronger." color = "#7D1717" +/obj/item/melee/blood_magic/manipulator/examine(mob/user) + . = ..() + if(iscultist(user)) + to_chat(user, "The [name] currently has [uses] blood charges left.") + /obj/item/melee/blood_magic/manipulator/afterattack(atom/target, mob/living/carbon/human/user, proximity) if(proximity) if(ishuman(target)) @@ -678,9 +687,9 @@ if(ratio>1) ratio = 1 uses -= round(overall_damage) - H.visible_message("[H] is fully healed by [H==user ? "[H.p_their()]":"[H]'s"]'s blood magic!") + H.visible_message("[H] is fully healed by [H==user ? "[H.p_their()]":"[user]'s"] blood magic!") else - H.visible_message("[H] is partially healed by [H==user ? "[H.p_their()]":"[H]'s"] blood magic.") + H.visible_message("[H] is partially healed by [H==user ? "[H.p_their()]":"[user]'s"] blood magic.") uses = 0 ratio *= -1 H.adjustOxyLoss((overall_damage*ratio) * (H.getOxyLoss() / overall_damage), 0) @@ -762,7 +771,7 @@ switch(choice) if("Blood Spear (150)") if(uses < 150) - to_chat(user, "You need 200 charges to perform this rite.") + to_chat(user, "You need 150 charges to perform this rite.") else uses -= 150 var/turf/T = get_turf(user) @@ -778,7 +787,7 @@ "A [rite.name] materializes at your feet.") if("Blood Bolt Barrage (300)") if(uses < 300) - to_chat(user, "You need 400 charges to perform this rite.") + to_chat(user, "You need 300 charges to perform this rite.") else var/obj/rite = new /obj/item/gun/ballistic/shotgun/boltaction/enchanted/arcane_barrage/blood() uses -= 300 @@ -790,7 +799,7 @@ qdel(rite) if("Blood Beam (500)") if(uses < 500) - to_chat(user, "You need 600 charges to perform this rite.") + to_chat(user, "You need 500 charges to perform this rite.") else var/obj/rite = new /obj/item/blood_beam() uses -= 500 diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 25e3663c0b..10759afcd0 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -666,6 +666,7 @@ 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 diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm index 499d7a861e..0dd6b08c4d 100644 --- a/code/modules/antagonists/cult/cult_structures.dm +++ b/code/modules/antagonists/cult/cult_structures.dm @@ -73,6 +73,10 @@ animate(src, color = previouscolor, time = 8) addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 8) +/obj/structure/destructible/cult/proc/check_menu(mob/living/user) + if(!user || user.incapacitated() || !iscultist(user) || !anchored || cooldowntime > world.time) + return FALSE + return TRUE /obj/structure/destructible/cult/talisman name = "altar" @@ -80,9 +84,18 @@ icon_state = "talismanaltar" break_message = "The altar shatters, leaving only the wailing of the damned!" -/obj/structure/destructible/cult/talisman/attack_hand(mob/living/user) + var/static/image/radial_whetstone = image(icon = 'icons/obj/kitchen.dmi', icon_state = "cult_sharpener") + var/static/image/radial_shell = image(icon = 'icons/obj/wizard.dmi', icon_state = "construct-cult") + var/static/image/radial_unholy_water = image(icon = 'icons/obj/drinks.dmi', icon_state = "holyflask") + +/obj/structure/destructible/cult/talisman/Initialize() . = ..() - if(.) + radial_unholy_water.color = "#333333" + +/obj/structure/destructible/cult/talisman/ui_interact(mob/user) + . = ..() + + if(!user.canUseTopic(src, TRUE)) return if(!iscultist(user)) to_chat(user, "You're pretty sure you know exactly what this is used for and you can't seem to touch it.") @@ -91,22 +104,27 @@ to_chat(user, "You need to anchor [src] to the floor with your dagger first.") return if(cooldowntime > world.time) - to_chat(user, "The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].") + to_chat(user, "The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].") return - var/choice = alert(user,"You study the schematics etched into the altar...",,"Eldritch Whetstone","Construct Shell","Flask of Unholy Water") - var/list/pickedtype = list() + + to_chat(user, "You study the schematics etched into the altar...") + + var/list/options = list("Eldritch Whetstone" = radial_whetstone, "Construct Shell" = radial_shell, "Flask of Unholy Water" = radial_unholy_water) + var/choice = show_radial_menu(user, src, options, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE) + + var/reward switch(choice) if("Eldritch Whetstone") - pickedtype += /obj/item/sharpener/cult + reward = /obj/item/sharpener/cult if("Construct Shell") - pickedtype += /obj/structure/constructshell + reward = /obj/structure/constructshell if("Flask of Unholy Water") - pickedtype += /obj/item/reagent_containers/glass/beaker/unholywater - if(src && !QDELETED(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time) + reward = /obj/item/reagent_containers/glass/beaker/unholywater + + if(!QDELETED(src) && reward && check_menu(user)) cooldowntime = world.time + 2400 - for(var/N in pickedtype) - new N(get_turf(src)) - to_chat(user, "You kneel before the altar and your faith is rewarded with the [choice]!") + new reward(get_turf(src)) + to_chat(user, "You kneel before the altar and your faith is rewarded with the [choice]!") /obj/structure/destructible/cult/forge name = "daemon forge" @@ -116,9 +134,14 @@ light_color = LIGHT_COLOR_LAVA break_message = "The force breaks apart into shards with a howling scream!" -/obj/structure/destructible/cult/forge/attack_hand(mob/living/user) + var/static/image/radial_flagellant = image(icon = 'icons/obj/clothing/suits.dmi', icon_state = "cultrobes") + var/static/image/radial_shielded = image(icon = 'icons/obj/clothing/suits.dmi', icon_state = "cult_armor") + var/static/image/radial_mirror = image(icon = 'icons/obj/items_and_weapons.dmi', icon_state = "mirror_shield") + +/obj/structure/destructible/cult/forge/ui_interact(mob/user) . = ..() - if(.) + + if(!user.canUseTopic(src, TRUE)) return if(!iscultist(user)) to_chat(user, "The heat radiating from [src] pushes you back.") @@ -129,24 +152,26 @@ if(cooldowntime > world.time) to_chat(user, "The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].") return - var/choice - if(user.mind.has_antag_datum(/datum/antagonist/cult/master)) - choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe","Flagellant's Robe","Mirror Shield") - else - choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe","Flagellant's Robe","Mirror Shield") - var/list/pickedtype = list() + + to_chat(user, "You study the schematics etched into the forge...") + + + var/list/options = list("Shielded Robe" = radial_shielded, "Flagellant's Robe" = radial_flagellant, "Mirror Shield" = radial_mirror) + var/choice = show_radial_menu(user, src, options, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE) + + var/reward switch(choice) if("Shielded Robe") - pickedtype += /obj/item/clothing/suit/hooded/cultrobes/cult_shield + reward = /obj/item/clothing/suit/hooded/cultrobes/cult_shield if("Flagellant's Robe") - pickedtype += /obj/item/clothing/suit/hooded/cultrobes/berserker + reward = /obj/item/clothing/suit/hooded/cultrobes/berserker if("Mirror Shield") - pickedtype += /obj/item/shield/mirror - if(src && !QDELETED(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time) + reward = /obj/item/shield/mirror + + if(!QDELETED(src) && reward && check_menu(user)) cooldowntime = world.time + 2400 - for(var/N in pickedtype) - new N(get_turf(src)) - to_chat(user, "You work the forge as dark knowledge guides your hands, creating the [choice]!") + new reward(get_turf(src)) + to_chat(user, "You work the forge as dark knowledge guides your hands, creating the [choice]!") @@ -234,9 +259,14 @@ light_color = LIGHT_COLOR_FIRE break_message = "The books and tomes of the archives burn into ash as the desk shatters!" -/obj/structure/destructible/cult/tome/attack_hand(mob/living/user) + var/static/image/radial_blindfold = image(icon = 'icons/obj/clothing/glasses.dmi', icon_state = "blindfold") + var/static/image/radial_curse = image(icon = 'icons/obj/cult.dmi', icon_state ="shuttlecurse") + var/static/image/radial_veilwalker = image(icon = 'icons/obj/cult.dmi', icon_state ="shifter") + +/obj/structure/destructible/cult/tome/ui_interact(mob/user) . = ..() - if(.) + + if(!user.canUseTopic(src, TRUE)) return if(!iscultist(user)) to_chat(user, "These books won't open and it hurts to even try and read the covers.") @@ -247,21 +277,27 @@ if(cooldowntime > world.time) to_chat(user, "The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].") return - var/choice = alert(user,"You flip through the black pages of the archives...",,"Zealot's Blindfold","Shuttle Curse","Veil Walker Set") - var/list/pickedtype = list() + + to_chat(user, "You flip through the black pages of the archives...") + + var/list/options = list("Zealot's Blindfold" = radial_blindfold, "Shuttle Curse" = radial_curse, "Veil Walker Set" = radial_veilwalker) + var/choice = show_radial_menu(user, src, options, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE) + + var/reward switch(choice) if("Zealot's Blindfold") - pickedtype += /obj/item/clothing/glasses/hud/health/night/cultblind + reward = /obj/item/clothing/glasses/hud/health/night/cultblind if("Shuttle Curse") - pickedtype += /obj/item/shuttle_curse + reward = /obj/item/shuttle_curse if("Veil Walker Set") - pickedtype += /obj/item/cult_shift - pickedtype += /obj/item/flashlight/flare/culttorch - if(src && !QDELETED(src) && anchored && pickedtype.len && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time) + reward = /obj/effect/spawner/bundle/veil_walker + if(!QDELETED(src) && reward && check_menu(user)) cooldowntime = world.time + 2400 - for(var/N in pickedtype) - new N(get_turf(src)) - to_chat(user, "You summon the [choice] from the archives!") + new reward(get_turf(src)) + to_chat(user, "You summon the [choice] from the archives!") + +/obj/effect/spawner/bundle/veil_walker + items = list(/obj/item/cult_shift, /obj/item/flashlight/flare/culttorch) /obj/effect/gateway name = "gateway" diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 29b4e4539c..2e233d26e4 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -185,9 +185,6 @@ structure_check() searches for nearby cultist structures required for the invoca color = RUNE_COLOR_OFFER req_cultists = 1 rune_in_use = FALSE - var/mob/living/currentconversionman - var/conversiontimeout - var/conversionresult /obj/effect/rune/convert/do_invoke_glow() return @@ -233,37 +230,18 @@ structure_check() searches for nearby cultist structures required for the invoca addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 5) Cult_team.check_size() // Triggers the eye glow or aura effects if the cult has grown large enough relative to the crew rune_in_use = FALSE + /obj/effect/rune/convert/proc/do_convert(mob/living/convertee, list/invokers) if(invokers.len < 2) for(var/M in invokers) - to_chat(M, "You need at least two invokers to convert [convertee]!") + to_chat(M, "You need at least two invokers to convert [convertee]!") log_game("Offer rune failed - tried conversion with one invoker") return 0 - if(convertee.anti_magic_check(TRUE, TRUE)) + if(convertee.anti_magic_check(TRUE, TRUE, FALSE, 0)) //Not chargecost because it can be spammed for(var/M in invokers) to_chat(M, "Something is shielding [convertee]'s mind!") log_game("Offer rune failed - convertee had anti-magic") return 0 - to_chat(convertee, "The world goes red. All at once you are aware of an evil, eldritch truth taking roots into your mind.\n\ - Click here to become a follower of Nar'sie, or suffer a fate worse than death.") - INVOKE_ASYNC(src, .proc/optinalert, convertee) - currentconversionman = convertee - conversiontimeout = world.time + (14 SECONDS) - convertee.Stun(140) - ADD_TRAIT(convertee, TRAIT_MUTE, "conversionrune") - flash_color(convertee, list("#960000", "#960000", "#960000", rgb(0,0,0)), 50) - conversionresult = FALSE - while(world.time < conversiontimeout && convertee && !conversionresult) - stoplag(1) - currentconversionman = null - if(!convertee) - return FALSE - REMOVE_TRAIT(convertee, TRAIT_MUTE, "conversionrune") - if(get_turf(convertee) != get_turf(src)) - return FALSE - if(!conversionresult) - do_sacrifice(convertee, invokers, TRUE) - return FALSE var/brutedamage = convertee.getBruteLoss() var/burndamage = convertee.getFireLoss() if(brutedamage || burndamage) @@ -275,6 +253,8 @@ structure_check() searches for nearby cultist structures required for the invoca SSticker.mode.add_cultist(convertee.mind, 1) new /obj/item/melee/cultblade/dagger(get_turf(src)) convertee.mind.special_role = ROLE_CULTIST + to_chat(convertee, "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible, truth. The veil of reality has been ripped away \ + and something evil takes root.") to_chat(convertee, "Assist your new compatriots in their dark dealings. Your goal is theirs, and theirs is yours. You serve the Geometer above all else. Bring it back.\ ") if(ishuman(convertee)) @@ -284,18 +264,7 @@ structure_check() searches for nearby cultist structures required for the invoca H.cultslurring = 0 return 1 -/obj/effect/rune/convert/proc/optinalert(mob/living/convertee) - var/alert = alert(convertee, "Will you embrace the Geometer of Blood or perish in futile resistance?", "Choose your own fate", "Join the Blood Cult", "Suffer a horrible demise") - if(src && alert == "Join the Blood Cult") - signmeup(convertee) - -/obj/effect/rune/convert/proc/signmeup(mob/living/convertee) - if(currentconversionman == convertee) - conversionresult = TRUE - else - to_chat(convertee, "Your fate has already been set in stone.") - -/obj/effect/rune/convert/proc/do_sacrifice(mob/living/sacrificial, list/invokers, force_a_sac) +/obj/effect/rune/convert/proc/do_sacrifice(mob/living/sacrificial, list/invokers) var/mob/living/first_invoker = invokers[1] if(!first_invoker) return FALSE @@ -305,7 +274,7 @@ structure_check() searches for nearby cultist structures required for the invoca var/big_sac = FALSE - if(!force_a_sac && (((ishuman(sacrificial) || iscyborg(sacrificial)) && sacrificial.stat != DEAD) || C.cult_team.is_sacrifice_target(sacrificial.mind)) && invokers.len < 3) + if((((ishuman(sacrificial) || iscyborg(sacrificial)) && sacrificial.stat != DEAD) || C.cult_team.is_sacrifice_target(sacrificial.mind)) && invokers.len < 3) for(var/M in invokers) to_chat(M, "[sacrificial] is too greatly linked to the world! You need three acolytes!") log_game("Offer rune failed - not enough acolytes and target is living or sac target") @@ -345,10 +314,6 @@ structure_check() searches for nearby cultist structures required for the invoca sacrificial.gib() return TRUE -/obj/effect/rune/convert/Topic(href, href_list) - if(href_list["signmeup"]) - signmeup(usr) - /obj/effect/rune/empower cultist_name = "Empower" cultist_desc = "allows cultists to prepare greater amounts of blood magic at far less of a cost." @@ -610,7 +575,7 @@ structure_check() searches for nearby cultist structures required for the invoca to_chat(mob_to_revive.mind, "Your physical form has been taken over by another soul due to your inactivity! Ahelp if you wish to regain your form.") message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(mob_to_revive)]) to replace an AFK player.") mob_to_revive.ghostize(0) - mob_to_revive.key = C.key + C.transfer_ckey(mob_to_revive, FALSE) else fail_invoke() return @@ -905,7 +870,7 @@ structure_check() searches for nearby cultist structures required for the invoca visible_message("A cloud of red mist forms above [src], and from within steps... a [new_human.gender == FEMALE ? "wo":""]man.") to_chat(user, "Your blood begins flowing into [src]. You must remain in place and conscious to maintain the forms of those summoned. This will hurt you slowly but surely...") var/obj/structure/emergency_shield/invoker/N = new(T) - new_human.key = ghost_to_spawn.key + ghost_to_spawn.transfer_ckey(new_human, FALSE) SSticker.mode.add_cultist(new_human.mind, 0) to_chat(new_human, "You are a servant of the Geometer. You have been made semi-corporeal by the cult of Nar'Sie, and you are to serve them at all costs.") diff --git a/code/modules/antagonists/devil/devil.dm b/code/modules/antagonists/devil/devil.dm index 3f2bd003a3..dc649025d2 100644 --- a/code/modules/antagonists/devil/devil.dm +++ b/code/modules/antagonists/devil/devil.dm @@ -539,10 +539,10 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", var/list/parts = list() parts += "The devil's true name is: [truename]" parts += "The devil's bans were:" - parts += "[GLOB.TAB][GLOB.lawlorify[LORE][ban]]" - parts += "[GLOB.TAB][GLOB.lawlorify[LORE][bane]]" - parts += "[GLOB.TAB][GLOB.lawlorify[LORE][obligation]]" - parts += "[GLOB.TAB][GLOB.lawlorify[LORE][banish]]" + parts += "[FOURSPACES][GLOB.lawlorify[LORE][ban]]" + parts += "[FOURSPACES][GLOB.lawlorify[LORE][bane]]" + parts += "[FOURSPACES][GLOB.lawlorify[LORE][obligation]]" + parts += "[FOURSPACES][GLOB.lawlorify[LORE][banish]]" return parts.Join("
") /datum/antagonist/devil/roundend_report() diff --git a/code/modules/antagonists/devil/true_devil/_true_devil.dm b/code/modules/antagonists/devil/true_devil/_true_devil.dm index 1df81a797b..afe439f02c 100644 --- a/code/modules/antagonists/devil/true_devil/_true_devil.dm +++ b/code/modules/antagonists/devil/true_devil/_true_devil.dm @@ -146,7 +146,7 @@ /mob/living/carbon/true_devil/attack_ghost(mob/dead/observer/user as mob) if(ascended || user.mind.soulOwner == src.mind) var/mob/living/simple_animal/imp/S = new(get_turf(loc)) - S.key = user.key + user.transfer_ckey(S, FALSE) S.mind.assigned_role = "Imp" S.mind.special_role = "Imp" var/datum/objective/newobjective = new diff --git a/code/modules/antagonists/disease/disease_abilities.dm b/code/modules/antagonists/disease/disease_abilities.dm index 07cd3030b1..dc2249006c 100644 --- a/code/modules/antagonists/disease/disease_abilities.dm +++ b/code/modules/antagonists/disease/disease_abilities.dm @@ -5,25 +5,48 @@ is currently following. */ GLOBAL_LIST_INIT(disease_ability_singletons, list( - new /datum/disease_ability/action/cough(), - new /datum/disease_ability/action/sneeze(), - new /datum/disease_ability/action/infect(), - new /datum/disease_ability/symptom/cough(), - new /datum/disease_ability/symptom/sneeze(),\ - new /datum/disease_ability/symptom/hallucigen(), - new /datum/disease_ability/symptom/choking(), - new /datum/disease_ability/symptom/confusion(), - new /datum/disease_ability/symptom/youth(), - new /datum/disease_ability/symptom/vomit(), - new /datum/disease_ability/symptom/voice_change(), - new /datum/disease_ability/symptom/visionloss(), - new /datum/disease_ability/symptom/viraladaptation(), - new /datum/disease_ability/symptom/vitiligo(), - new /datum/disease_ability/symptom/sensory_restoration(), - new /datum/disease_ability/symptom/itching(), - new /datum/disease_ability/symptom/weight_loss(), - new /datum/disease_ability/symptom/metabolism_heal(), - new /datum/disease_ability/symptom/coma_heal() + new /datum/disease_ability/action/cough, + new /datum/disease_ability/action/sneeze, + new /datum/disease_ability/action/infect, + new /datum/disease_ability/symptom/mild/cough, + new /datum/disease_ability/symptom/mild/sneeze, + new /datum/disease_ability/symptom/medium/shedding, + new /datum/disease_ability/symptom/medium/beard, + new /datum/disease_ability/symptom/medium/hallucigen, + new /datum/disease_ability/symptom/medium/choking, + new /datum/disease_ability/symptom/medium/confusion, + new /datum/disease_ability/symptom/medium/vomit, + new /datum/disease_ability/symptom/medium/voice_change, + new /datum/disease_ability/symptom/medium/visionloss, + new /datum/disease_ability/symptom/medium/deafness, + new /datum/disease_ability/symptom/powerful/narcolepsy, + new /datum/disease_ability/symptom/medium/fever, + new /datum/disease_ability/symptom/medium/shivering, + new /datum/disease_ability/symptom/medium/headache, + new /datum/disease_ability/symptom/medium/nano_boost, + new /datum/disease_ability/symptom/medium/nano_destroy, + new /datum/disease_ability/symptom/medium/viraladaptation, + new /datum/disease_ability/symptom/medium/viralevolution, + new /datum/disease_ability/symptom/medium/vitiligo, + new /datum/disease_ability/symptom/medium/revitiligo, + new /datum/disease_ability/symptom/medium/itching, + new /datum/disease_ability/symptom/medium/heal/weight_loss, + new /datum/disease_ability/symptom/medium/heal/sensory_restoration, + new /datum/disease_ability/symptom/medium/heal/mind_restoration, + new /datum/disease_ability/symptom/powerful/fire, + new /datum/disease_ability/symptom/powerful/flesh_eating, +// new /datum/disease_ability/symptom/powerful/genetic_mutation, + new /datum/disease_ability/symptom/powerful/inorganic_adaptation, + new /datum/disease_ability/symptom/powerful/heal/starlight, + new /datum/disease_ability/symptom/powerful/heal/oxygen, + new /datum/disease_ability/symptom/powerful/heal/chem, + new /datum/disease_ability/symptom/powerful/heal/metabolism, + new /datum/disease_ability/symptom/powerful/heal/dark, + new /datum/disease_ability/symptom/powerful/heal/water, + new /datum/disease_ability/symptom/powerful/heal/plasma, + new /datum/disease_ability/symptom/powerful/heal/radiation, + new /datum/disease_ability/symptom/powerful/heal/coma, + new /datum/disease_ability/symptom/powerful/youth )) /datum/disease_ability @@ -54,7 +77,13 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list( stage_speed += initial(S.stage_speed) transmittable += initial(S.transmittable) threshold_block += "

[initial(S.threshold_desc)]" - stat_block = "Resistance: [resistance]
Stealth: [stealth]
Stage Speed: [stage_speed]
Transmissibility: [transmittable]

" + stat_block = "Resistance: [resistance]
Stealth: [stealth]
Stage Speed: [stage_speed]
Transmissibility: [transmittable]

" + if(symptoms.len == 1) //lazy boy's dream + name = initial(S.name) + if(short_desc == "") + short_desc = initial(S.desc) + if(long_desc == "") + long_desc = initial(S.desc) /datum/disease_ability/proc/CanBuy(mob/camera/disease/D) if(world.time < D.next_adaptation_time) @@ -77,8 +106,10 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list( for(var/T in symptoms) var/datum/symptom/S = new T() SD.symptoms += S + S.OnAdd(SD) if(SD.processing) - S.Start(SD) + if(S.Start(SD)) + S.next_activation = world.time + rand(S.symptom_delay_min * 10, S.symptom_delay_max * 10) SD.Refresh() for(var/T in actions) var/datum/action/A = new T() @@ -105,6 +136,7 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list( var/datum/symptom/S = locate(T) in SD.symptoms if(S) SD.symptoms -= S + S.OnRemove(SD) if(SD.processing) S.End(SD) qdel(S) @@ -152,8 +184,9 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list( return FALSE to_chat(D, "You force [L.real_name] to cough.") L.emote("cough") - var/datum/disease/advance/sentient_disease/SD = D.hosts[L] - SD.spread(2) + if(L.CanSpreadAirborneDisease()) //don't spread germs if they covered their mouth + var/datum/disease/advance/sentient_disease/SD = D.hosts[L] + SD.spread(2) StartCooldown() return TRUE @@ -185,11 +218,12 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list( return FALSE to_chat(D, "You force [L.real_name] to sneeze.") L.emote("sneeze") - var/datum/disease/advance/sentient_disease/SD = D.hosts[L] + if(L.CanSpreadAirborneDisease()) //don't spread germs if they covered their mouth + var/datum/disease/advance/sentient_disease/SD = D.hosts[L] - for(var/mob/living/M in oview(4, SD.affected_mob)) - if(is_A_facing_B(SD.affected_mob, M) && disease_air_spread_walk(get_turf(SD.affected_mob), get_turf(M))) - M.AirborneContractDisease(SD, TRUE) + for(var/mob/living/M in oview(4, SD.affected_mob)) + if(is_A_facing_B(SD.affected_mob, M) && disease_air_spread_walk(get_turf(SD.affected_mob), get_turf(M))) + M.AirborneContractDisease(SD, TRUE) StartCooldown() return TRUE @@ -235,154 +269,192 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list( StartCooldown() return TRUE -//passive symptom abilities +/*******************BASE SYMPTOM TYPES*******************/ +// cost is for convenience and can be changed. If you're changing req_tot_points then don't use the subtype... +//healing costs more so you have to techswitch from naughty disease otherwise we'd have friendly disease for easy greentext (no fun!) -/datum/disease_ability/symptom/cough - name = "Involuntary Coughing" - symptoms = list(/datum/symptom/cough) +/datum/disease_ability/symptom/mild cost = 2 required_total_points = 4 + category = "Symptom (Weak)" + +/datum/disease_ability/symptom/medium + cost = 4 + required_total_points = 8 + category = "Symptom" + +/datum/disease_ability/symptom/medium/heal + cost = 5 + category = "Symptom (+)" + +/datum/disease_ability/symptom/powerful + cost = 4 + required_total_points = 16 + category = "Symptom (Strong)" + +/datum/disease_ability/symptom/powerful/heal + cost = 8 + category = "Symptom (Strong+)" + + +/******MILD******/ + +/datum/disease_ability/symptom/mild/cough + name = "Involuntary Coughing" + symptoms = list(/datum/symptom/cough) short_desc = "Cause victims to cough intermittently." long_desc = "Cause victims to cough intermittently, spreading your infection if your transmissibility is high." -/datum/disease_ability/symptom/sneeze +/datum/disease_ability/symptom/mild/sneeze name = "Involuntary Sneezing" symptoms = list(/datum/symptom/sneeze) - cost = 2 - required_total_points = 4 short_desc = "Cause victims to sneeze intermittently." long_desc = "Cause victims to sneeze intermittently, spreading your infection and also increasing transmissibility and resistance, at the cost of stealth." -/datum/disease_ability/symptom/beard - //I don't think I need to justify the fact that this is the best symptom - name = "Beard Growth" - symptoms = list(/datum/symptom/beard) - cost = 1 - required_total_points = 8 - short_desc = "Cause all victims to grow a luscious beard." - long_desc = "Cause all victims to grow a luscious beard. Decreases stats slightly. Ineffective against Santa Claus." +/******MEDIUM******/ -/datum/disease_ability/symptom/hallucigen - name = "Hallucinations" +/datum/disease_ability/symptom/medium/shedding + symptoms = list(/datum/symptom/shedding) + +/datum/disease_ability/symptom/medium/beard + symptoms = list(/datum/symptom/beard) + short_desc = "Cause all victims to grow a luscious beard." + long_desc = "Cause all victims to grow a luscious beard. Ineffective against Santa Claus." + +/datum/disease_ability/symptom/medium/hallucigen symptoms = list(/datum/symptom/hallucigen) - cost = 4 - required_total_points = 8 short_desc = "Cause victims to hallucinate." long_desc = "Cause victims to hallucinate. Decreases stats, especially resistance." - -/datum/disease_ability/symptom/choking - name = "Choking" +/datum/disease_ability/symptom/medium/choking symptoms = list(/datum/symptom/choking) - cost = 4 - required_total_points = 8 short_desc = "Cause victims to choke." long_desc = "Cause victims to choke, threatening asphyxiation. Decreases stats, especially transmissibility." - -/datum/disease_ability/symptom/confusion - name = "Confusion" +/datum/disease_ability/symptom/medium/confusion symptoms = list(/datum/symptom/confusion) - cost = 4 - required_total_points = 8 short_desc = "Cause victims to become confused." long_desc = "Cause victims to become confused intermittently." - -/datum/disease_ability/symptom/youth - name = "Eternal Youth" - symptoms = list(/datum/symptom/youth) - cost = 4 - required_total_points = 8 - short_desc = "Cause victims to become eternally young." - long_desc = "Cause victims to become eternally young. Provides boosts to all stats except transmissibility." - - -/datum/disease_ability/symptom/vomit - name = "Vomiting" +/datum/disease_ability/symptom/medium/vomit symptoms = list(/datum/symptom/vomit) - cost = 4 - required_total_points = 8 short_desc = "Cause victims to vomit." long_desc = "Cause victims to vomit. Slightly increases transmissibility. Vomiting also also causes the victims to lose nutrition and removes some toxin damage." - -/datum/disease_ability/symptom/voice_change - name = "Voice Changing" +/datum/disease_ability/symptom/medium/voice_change symptoms = list(/datum/symptom/voice_change) - cost = 4 - required_total_points = 8 short_desc = "Change the voice of victims." long_desc = "Change the voice of victims, causing confusion in communications." - -/datum/disease_ability/symptom/visionloss - name = "Vision Loss" +/datum/disease_ability/symptom/medium/visionloss symptoms = list(/datum/symptom/visionloss) - cost = 4 - required_total_points = 8 short_desc = "Damage the eyes of victims, eventually causing blindness." long_desc = "Damage the eyes of victims, eventually causing blindness. Decreases all stats." +/datum/disease_ability/symptom/medium/deafness + symptoms = list(/datum/symptom/deafness) -/datum/disease_ability/symptom/viraladaptation - name = "Self-Adaptation" +/datum/disease_ability/symptom/medium/fever + symptoms = list(/datum/symptom/fever) + +/datum/disease_ability/symptom/medium/shivering + symptoms = list(/datum/symptom/shivering) + +/datum/disease_ability/symptom/medium/headache + symptoms = list(/datum/symptom/headache) + +/datum/disease_ability/symptom/medium/nano_boost + symptoms = list(/datum/symptom/nano_boost) + +/datum/disease_ability/symptom/medium/nano_destroy + symptoms = list(/datum/symptom/nano_destroy) + +/datum/disease_ability/symptom/medium/viraladaptation symptoms = list(/datum/symptom/viraladaptation) - cost = 4 - required_total_points = 8 short_desc = "Cause your infection to become more resistant to detection and eradication." long_desc = "Cause your infection to mimic the function of normal body cells, becoming much harder to spot and to eradicate, but reducing its speed." +/datum/disease_ability/symptom/medium/viralevolution + symptoms = list(/datum/symptom/viralevolution) -/datum/disease_ability/symptom/vitiligo - name = "Skin Paleness" +/datum/disease_ability/symptom/medium/vitiligo symptoms = list(/datum/symptom/vitiligo) - cost = 1 - required_total_points = 8 - short_desc = "Cause victims to become pale." - long_desc = "Cause victims to become pale. Decreases all stats." +/datum/disease_ability/symptom/medium/revitiligo + symptoms = list(/datum/symptom/revitiligo) -/datum/disease_ability/symptom/sensory_restoration - name = "Sensory Restoration" - symptoms = list(/datum/symptom/sensory_restoration) - cost = 4 - required_total_points = 8 - short_desc = "Regenerate eye and ear damage of victims." - long_desc = "Regenerate eye and ear damage of victims." - - -/datum/disease_ability/symptom/itching - name = "Itching" +/datum/disease_ability/symptom/medium/itching symptoms = list(/datum/symptom/itching) - cost = 4 - required_total_points = 8 short_desc = "Cause victims to itch." long_desc = "Cause victims to itch, increasing all stats except stealth." - -/datum/disease_ability/symptom/weight_loss - name = "Weight Loss" +/datum/disease_ability/symptom/medium/heal/weight_loss symptoms = list(/datum/symptom/weight_loss) - cost = 4 - required_total_points = 8 short_desc = "Cause victims to lose weight." long_desc = "Cause victims to lose weight, and make it almost impossible for them to gain nutrition from food. Reduced nutrition allows your infection to spread more easily from hosts, especially by sneezing." +/datum/disease_ability/symptom/medium/heal/sensory_restoration + symptoms = list(/datum/symptom/sensory_restoration) + short_desc = "Regenerate eye and ear damage of victims." + long_desc = "Regenerate eye and ear damage of victims." -/datum/disease_ability/symptom/metabolism_heal - name = "Metabolic Boost" +/datum/disease_ability/symptom/medium/heal/mind_restoration + symptoms = list(/datum/symptom/mind_restoration) + +/******POWERFUL******/ + +/datum/disease_ability/symptom/powerful/fire + symptoms = list(/datum/symptom/fire) + +/datum/disease_ability/symptom/powerful/flesh_eating + symptoms = list(/datum/symptom/flesh_eating) + +/* +/datum/disease_ability/symptom/powerful/genetic_mutation + symptoms = list(/datum/symptom/genetic_mutation) + cost = 8 +*/ + +/datum/disease_ability/symptom/powerful/inorganic_adaptation + symptoms = list(/datum/symptom/inorganic_adaptation) + +/datum/disease_ability/symptom/powerful/narcolepsy + symptoms = list(/datum/symptom/narcolepsy) + +/datum/disease_ability/symptom/powerful/youth + symptoms = list(/datum/symptom/youth) + short_desc = "Cause victims to become eternally young." + long_desc = "Cause victims to become eternally young. Provides boosts to all stats except transmissibility." + +/****HEALING SUBTYPE****/ + +/datum/disease_ability/symptom/powerful/heal/starlight + symptoms = list(/datum/symptom/heal/starlight) + +/datum/disease_ability/symptom/powerful/heal/oxygen + symptoms = list(/datum/symptom/oxygen) + +/datum/disease_ability/symptom/powerful/heal/chem + symptoms = list(/datum/symptom/heal/chem) + +/datum/disease_ability/symptom/powerful/heal/metabolism symptoms = list(/datum/symptom/heal/metabolism) - cost = 4 - required_total_points = 16 short_desc = "Increase the metabolism of victims, causing them to process chemicals and grow hungry faster." long_desc = "Increase the metabolism of victims, causing them to process chemicals twice as fast and grow hungry more quickly." +/datum/disease_ability/symptom/powerful/heal/dark + symptoms = list(/datum/symptom/heal/darkness) -/datum/disease_ability/symptom/coma_heal - name = "Regenerative Coma" +/datum/disease_ability/symptom/powerful/heal/water + symptoms = list(/datum/symptom/heal/water) + +/datum/disease_ability/symptom/powerful/heal/plasma + symptoms = list(/datum/symptom/heal/plasma) + +/datum/disease_ability/symptom/powerful/heal/radiation + symptoms = list(/datum/symptom/heal/radiation) + +/datum/disease_ability/symptom/powerful/heal/coma symptoms = list(/datum/symptom/heal/coma) - cost = 8 - required_total_points = 16 short_desc = "Cause victims to fall into a healing coma when hurt." long_desc = "Cause victims to fall into a healing coma when hurt." diff --git a/code/modules/antagonists/disease/disease_disease.dm b/code/modules/antagonists/disease/disease_disease.dm index b4b8ac0956..c37abefab0 100644 --- a/code/modules/antagonists/disease/disease_disease.dm +++ b/code/modules/antagonists/disease/disease_disease.dm @@ -51,6 +51,7 @@ if(cures.len) return var/list/not_used = advance_cures.Copy() + not_used.Cut(1, 6) // Removes the first five tiers of cures. cures = list(pick(pick_n_take(not_used)), pick(pick_n_take(not_used))) // Get the cure name from the cure_id diff --git a/code/modules/antagonists/disease/disease_event.dm b/code/modules/antagonists/disease/disease_event.dm index 7183ed5455..385cee998b 100644 --- a/code/modules/antagonists/disease/disease_event.dm +++ b/code/modules/antagonists/disease/disease_event.dm @@ -18,7 +18,7 @@ var/mob/dead/observer/selected = pick_n_take(candidates) var/mob/camera/disease/virus = new /mob/camera/disease(SSmapping.get_station_center()) - virus.key = selected.key + selected.transfer_ckey(virus, FALSE) INVOKE_ASYNC(virus, /mob/camera/disease/proc/pick_name) message_admins("[ADMIN_LOOKUPFLW(virus)] has been made into a sentient disease by an event.") log_game("[key_name(virus)] was spawned as a sentient disease by an event.") diff --git a/code/modules/antagonists/disease/disease_mob.dm b/code/modules/antagonists/disease/disease_mob.dm index 4d378af724..faea113ac5 100644 --- a/code/modules/antagonists/disease/disease_mob.dm +++ b/code/modules/antagonists/disease/disease_mob.dm @@ -18,7 +18,7 @@ the new instance inside the host to be updated to the template's stats. layer = BELOW_MOB_LAYER lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE sight = SEE_SELF|SEE_THRU - initial_language_holder = /datum/language_holder/empty + initial_language_holder = /datum/language_holder/universal var/freemove = TRUE var/freemove_end = 0 @@ -31,7 +31,6 @@ the new instance inside the host to be updated to the template's stats. var/browser_open = FALSE var/mob/living/following_host - var/datum/component/redirect/move_listener var/list/disease_instances var/list/hosts //this list is associative, affected_mob -> disease_instance var/datum/disease/advance/sentient_disease/disease_template @@ -43,7 +42,7 @@ the new instance inside the host to be updated to the template's stats. var/move_delay = 1 var/next_adaptation_time = 0 - var/adaptation_cooldown = 1200 + var/adaptation_cooldown = 600 var/list/purchased_abilities var/list/unpurchased_abilities @@ -118,10 +117,28 @@ the new instance inside the host to be updated to the template's stats. follow_next(Dir & NORTHWEST) last_move_tick = world.time +/mob/camera/disease/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) + . = ..() + var/atom/movable/to_follow = speaker + if(radio_freq) + var/atom/movable/virtualspeaker/V = speaker + to_follow = V.source + var/link + if(to_follow in hosts) + link = FOLLOW_LINK(src, to_follow) + else + link = "" + // Recompose the message, because it's scrambled by default + message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode) + to_chat(src, "[link] [message]") + + /mob/camera/disease/mind_initialize() . = ..() if(!mind.has_antag_datum(/datum/antagonist/disease)) mind.add_antag_datum(/datum/antagonist/disease) + var/datum/atom_hud/medsensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] + medsensor.add_hud_to(src) /mob/camera/disease/proc/pick_name() var/static/list/taken_names @@ -243,13 +260,10 @@ the new instance inside the host to be updated to the template's stats. refresh_adaptation_menu() /mob/camera/disease/proc/set_following(mob/living/L) + if(following_host) + UnregisterSignal(following_host, COMSIG_MOVABLE_MOVED) + RegisterSignal(L, COMSIG_MOVABLE_MOVED, .proc/follow_mob) following_host = L - if(!move_listener) - move_listener = L.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED = CALLBACK(src, .proc/follow_mob))) - else - L.TakeComponent(move_listener) - if(QDELING(move_listener)) - move_listener = null follow_mob() /mob/camera/disease/proc/follow_next(reverse = FALSE) diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm index edae8a4240..779dfb43a7 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm @@ -1,7 +1,8 @@ #define CHALLENGE_TELECRYSTALS 280 #define PLAYER_SCALING 1.5 #define CHALLENGE_TIME_LIMIT 3000 -#define CHALLENGE_MIN_PLAYERS 50 +#define CHALLENGE_PLAYERS_TARGET 50 //target players population. anything below is a malus to the challenge tc bonus. +#define TELECRYSTALS_MALUS_SCALING 1 //the higher the value, the bigger the malus. #define CHALLENGE_SHUTTLE_DELAY 15000 // 25 minutes, so the ops have at least 5 minutes before the shuttle is callable. GLOBAL_LIST_EMPTY(jam_on_wardec) @@ -62,12 +63,15 @@ GLOBAL_VAR_INIT(war_declared, FALSE) for(var/obj/machinery/computer/camera_advanced/shuttle_docker/D in GLOB.jam_on_wardec) D.jammed = TRUE - + GLOB.war_declared = TRUE var/list/nukeops = get_antag_minds(/datum/antagonist/nukeop) var/actual_players = GLOB.joined_player_list.len - nukeops.len + var/tc_malus = 0 + if(actual_players < CHALLENGE_PLAYERS_TARGET) + tc_malus = FLOOR(((CHALLENGE_TELECRYSTALS / CHALLENGE_PLAYERS_TARGET) * (CHALLENGE_PLAYERS_TARGET - actual_players)) * TELECRYSTALS_MALUS_SCALING, 1) - new uplink_type(get_turf(user), user.key, CHALLENGE_TELECRYSTALS + CEILING(PLAYER_SCALING * actual_players, 1)) + new uplink_type(get_turf(user), user.key, CHALLENGE_TELECRYSTALS - tc_malus + CEILING(PLAYER_SCALING * actual_players, 1)) CONFIG_SET(number/shuttle_refuel_delay, max(CONFIG_GET(number/shuttle_refuel_delay), CHALLENGE_SHUTTLE_DELAY)) SSblackbox.record_feedback("amount", "nuclear_challenge_mode", 1) @@ -79,11 +83,6 @@ GLOBAL_VAR_INIT(war_declared, FALSE) to_chat(user, "You are already in the process of declaring war! Make your mind up.") return FALSE - var/list/nukeops = get_antag_minds(/datum/antagonist/nukeop) - var/actual_players = GLOB.joined_player_list.len - nukeops.len - if(actual_players < CHALLENGE_MIN_PLAYERS) - to_chat(user, "The enemy crew is too small to be worth declaring war on.") - return FALSE if(!user.onSyndieBase()) to_chat(user, "You have to be at your base to use this.") return FALSE @@ -102,5 +101,6 @@ GLOBAL_VAR_INIT(war_declared, FALSE) #undef CHALLENGE_TELECRYSTALS #undef CHALLENGE_TIME_LIMIT -#undef CHALLENGE_MIN_PLAYERS +#undef CHALLENGE_PLAYERS_TARGET +#undef TELECRYSTALS_MALUS_SCALING #undef CHALLENGE_SHUTTLE_DELAY diff --git a/code/modules/antagonists/overthrow/overthrow.dm b/code/modules/antagonists/overthrow/overthrow.dm index 2f08824c0b..075b9f13bc 100644 --- a/code/modules/antagonists/overthrow/overthrow.dm +++ b/code/modules/antagonists/overthrow/overthrow.dm @@ -107,9 +107,9 @@ /datum/antagonist/overthrow/proc/equip_overthrow() if(!owner || !owner.current || !ishuman(owner.current)) // only equip existing human overthrow members. This excludes the AI, in particular. return - var/obj/item/implant/storage/S = locate(/obj/item/implant/storage) in owner.current + var/obj/item/implant/storage/S = locate(/obj/item/implant/storage) in owner.current.implants if(!S) - S = new(owner.current) + S = new S.implant(owner.current) var/I = pick(possible_useful_items) if(ispath(I)) // in case some admin decides to fuck the list up for fun diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm index 87794993a7..f380fa68e9 100644 --- a/code/modules/antagonists/revenant/revenant.dm +++ b/code/modules/antagonists/revenant/revenant.dm @@ -377,14 +377,15 @@ /obj/item/ectoplasm/revenant/proc/reform() if(QDELETED(src) || QDELETED(revenant) || inert) return - var/key_of_revenant + var/key_of_revenant = FALSE message_admins("Revenant ectoplasm was left undestroyed for 1 minute and is reforming into a new revenant.") forceMove(drop_location()) //In case it's in a backpack or someone's hand revenant.forceMove(loc) if(old_key) for(var/mob/M in GLOB.dead_mob_list) if(M.client && M.client.key == old_key) //Only recreates the mob if the mob the client is in is dead - key_of_revenant = old_key + M.transfer_ckey(revenant.key, FALSE) + key_of_revenant = TRUE break if(!key_of_revenant) message_admins("The new revenant's old client either could not be found or is in a new, living mob - grabbing a random candidate instead...") @@ -396,22 +397,21 @@ visible_message("[src] settles down and seems lifeless.") return var/mob/dead/observer/C = pick(candidates) - key_of_revenant = C.key - if(!key_of_revenant) + C.transfer_ckey(revenant.key, FALSE) + if(!revenant.key) qdel(revenant) message_admins("No ckey was found for the new revenant. Oh well!") inert = TRUE visible_message("[src] settles down and seems lifeless.") return - message_admins("[key_of_revenant] has been [old_key == key_of_revenant ? "re":""]made into a revenant by reforming ectoplasm.") - log_game("[key_of_revenant] was [old_key == key_of_revenant ? "re":""]made as a revenant by reforming ectoplasm.") + message_admins("[key_of_revenant] has been [old_key == revenant.key ? "re":""]made into a revenant by reforming ectoplasm.") + log_game("[key_of_revenant] was [old_key == revenant.key ? "re":""]made as a revenant by reforming ectoplasm.") visible_message("[src] suddenly rises into the air before fading away.") revenant.essence = essence revenant.essence_regen_cap = essence revenant.death_reset() - revenant.key = key_of_revenant revenant = null qdel(src) diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm index 112a31f44d..a03151e2d7 100644 --- a/code/modules/antagonists/revenant/revenant_abilities.dm +++ b/code/modules/antagonists/revenant/revenant_abilities.dm @@ -27,6 +27,7 @@ if(prob(10)) to_chat(target, "You feel as if you are being watched.") return + face_atom(target) draining = TRUE essence_drained += rand(15, 20) to_chat(src, "You search for the soul of [target].") diff --git a/code/modules/antagonists/revenant/revenant_blight.dm b/code/modules/antagonists/revenant/revenant_blight.dm index 7037ecae86..3e05b8d945 100644 --- a/code/modules/antagonists/revenant/revenant_blight.dm +++ b/code/modules/antagonists/revenant/revenant_blight.dm @@ -11,9 +11,9 @@ viable_mobtypes = list(/mob/living/carbon/human) disease_flags = CURABLE permeability_mod = 1 - severity = DISEASE_SEVERITY_HARMFUL - var/stagedamage = 0 //Highest stage reached. - var/finalstage = 0 //Because we're spawning off the cure in the final stage, we need to check if we've done the final stage's effects. + severity = DISEASE_SEVERITY_DANGEROUS + var/finalstage = FALSE //Because we're spawning off the cure in the final stage, we need to check if we've done the final stage's effects. + var/depression = FALSE /datum/disease/revblight/cure() if(affected_mob) @@ -21,12 +21,13 @@ if(affected_mob.dna && affected_mob.dna.species) affected_mob.dna.species.handle_mutant_bodyparts(affected_mob) affected_mob.dna.species.handle_hair(affected_mob) - to_chat(affected_mob, "You feel better.") + SEND_SIGNAL(affected_mob, COMSIG_CLEAR_MOOD_EVENT, "rev_blight") ..() /datum/disease/revblight/stage_act() if(!finalstage) - if(affected_mob.lying && prob(stage*6)) + if(affected_mob.lying && prob(stage*4)) + to_chat(affected_mob, "You feel better.") cure() return if(prob(stage*3)) @@ -34,10 +35,6 @@ affected_mob.confused += 8 affected_mob.adjustStaminaLoss(8) new /obj/effect/temp_visual/revenant(affected_mob.loc) - if(stagedamage < stage) - stagedamage++ - affected_mob.adjustToxLoss(stage*2) //should, normally, do about 30 toxin damage. - new /obj/effect/temp_visual/revenant(affected_mob.loc) if(prob(45)) affected_mob.adjustStaminaLoss(stage) ..() //So we don't increase a stage before applying the stage damage. @@ -46,9 +43,14 @@ if(prob(5)) affected_mob.emote("pale") if(3) + if(!depression) + SEND_SIGNAL(affected_mob, COMSIG_ADD_MOOD_EVENT, "rev_blight", /datum/mood_event/revenant_blight) + depression = TRUE + SEND_SIGNAL(affected_mob, COMSIG_DECREASE_SANITY, 0.12, SANITY_CRAZY) if(prob(10)) affected_mob.emote(pick("pale","shiver")) if(4) + SEND_SIGNAL(affected_mob, COMSIG_DECREASE_SANITY, 0.18, SANITY_CRAZY) if(prob(15)) affected_mob.emote(pick("pale","shiver","cries")) if(5) @@ -56,12 +58,18 @@ finalstage = TRUE to_chat(affected_mob, "You feel like [pick("nothing's worth it anymore", "nobody ever needed your help", "nothing you did mattered", "everything you tried to do was worthless")].") affected_mob.adjustStaminaLoss(45) - new /obj/effect/temp_visual/revenant(affected_mob.loc) - if(affected_mob.dna && affected_mob.dna.species) + if(affected_mob.dna?.species) affected_mob.dna.species.handle_mutant_bodyparts(affected_mob,"#1d2953") affected_mob.dna.species.handle_hair(affected_mob,"#1d2953") affected_mob.visible_message("[affected_mob] looks terrifyingly gaunt...", "You suddenly feel like your skin is wrong...") affected_mob.add_atom_colour("#1d2953", TEMPORARY_COLOUR_PRIORITY) - addtimer(CALLBACK(src, .proc/cure), 100) - else - return + new /obj/effect/temp_visual/revenant(affected_mob.loc) + addtimer(CALLBACK(src, .proc/curses), 150) + +/datum/disease/revblight/proc/curses() + if(QDELETED(affected_mob)) + return + affected_mob.playsound_local(affected_mob, 'sound/effects/curse5.ogg', 40, 1, -1) + to_chat(affected_mob, "You sense the terrific curse of a vengeful ghost befall upon you...") + affected_mob.apply_necropolis_curse(null, 7 MINUTES) //Once the blight has done its course without being cured beforehand, it will cast a necrocurse to compensate how underpowered it's. + cure() diff --git a/code/modules/antagonists/revenant/revenant_spawn_event.dm b/code/modules/antagonists/revenant/revenant_spawn_event.dm index c9a892cd64..cb534b6613 100644 --- a/code/modules/antagonists/revenant/revenant_spawn_event.dm +++ b/code/modules/antagonists/revenant/revenant_spawn_event.dm @@ -52,7 +52,7 @@ return MAP_ERROR var/mob/living/simple_animal/revenant/revvie = new(pick(spawn_locs)) - revvie.key = selected.key + selected.transfer_ckey(revvie, FALSE) message_admins("[ADMIN_LOOKUPFLW(revvie)] has been made into a revenant by an event.") log_game("[key_name(revvie)] was spawned as a revenant by an event.") spawned_mobs += revvie diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm index 4f31346136..03a176b054 100644 --- a/code/modules/antagonists/slaughter/slaughter.dm +++ b/code/modules/antagonists/slaughter/slaughter.dm @@ -80,6 +80,7 @@ desc = "Still it beats furiously, emanating an aura of utter hate." icon = 'icons/obj/surgery.dmi' icon_state = "demon_heart-on" + decay_factor = 0 /obj/item/organ/heart/demon/update_icon() return //always beating visually diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index 8642484895..576fc6b9bf 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -113,7 +113,7 @@ /obj/singularity/wizard/attack_tk(mob/user) if(iscarbon(user)) var/mob/living/carbon/C = user - GET_COMPONENT_FROM(insaneinthemembrane, /datum/component/mood, C) + var/datum/component/mood/insaneinthemembrane = C.GetComponent(/datum/component/mood) if(insaneinthemembrane.sanity < 15) return //they've already seen it and are about to die, or are just too insane to care to_chat(C, "OH GOD! NONE OF IT IS REAL! NONE OF IT IS REEEEEEEEEEEEEEEEEEEEEEEEAL!") @@ -198,7 +198,7 @@ to_chat(user, "This artifact can only affect three undead at a time!") return - M.set_species(/datum/species/skeleton, icon_update=0) + M.set_species(/datum/species/skeleton/space, icon_update=0) M.revive(full_heal = 1, admin_revive = 1) spooky_scaries |= M to_chat(M, "You have been revived by [user.real_name]!") @@ -324,14 +324,11 @@ cooldown = world.time + cooldown_time /obj/item/voodoo/proc/update_targets() - possible = list() + LAZYINITLIST(possible) if(!voodoo_link) return - var/list/prints = voodoo_link.return_fingerprints() - if(!length(prints)) - return FALSE for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) - if(prints[md5(H.dna.uni_identity)]) + if(md5(H.dna.uni_identity) in voodoo_link.fingerprints) possible |= H /obj/item/voodoo/proc/GiveHint(mob/victim,force=0) diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm index 40551ae2fc..6f4c3fca10 100644 --- a/code/modules/antagonists/wizard/equipment/soulstone.dm +++ b/code/modules/antagonists/wizard/equipment/soulstone.dm @@ -218,7 +218,7 @@ newstruct.master = stoner var/datum/action/innate/seek_master/SM = new() SM.Grant(newstruct) - newstruct.key = target.key + target.transfer_ckey(newstruct) var/obj/screen/alert/bloodsense/BS if(newstruct.mind && ((stoner && iscultist(stoner)) || cultoverride) && SSticker && SSticker.mode) SSticker.mode.add_cultist(newstruct.mind, 0) @@ -238,12 +238,13 @@ T.stop_sound_channel(CHANNEL_HEARTBEAT) T.invisibility = INVISIBILITY_ABSTRACT T.dust_animation() + QDEL_IN(T, 5) var/mob/living/simple_animal/shade/S = new /mob/living/simple_animal/shade(src) S.status_flags |= GODMODE //So they won't die inside the stone somehow S.canmove = FALSE//Can't move out of the soul stone S.name = "Shade of [T.real_name]" S.real_name = "Shade of [T.real_name]" - S.key = T.key + T.transfer_ckey(S) S.language_holder = U.language_holder.copy(S) if(U) S.faction |= "[REF(U)]" //Add the master as a faction, allowing inter-mob cooperation diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index e6cae518b6..8a20a81555 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -245,7 +245,7 @@ if(!istype(M)) return - var/obj/item/implant/exile/Implant = new/obj/item/implant/exile(M) + var/obj/item/implant/exile/Implant = new Implant.implant(M) /datum/antagonist/wizard/academy/create_objectives() diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 07f31a6678..7405549b3d 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -10,7 +10,7 @@ var/maxlength = 8 var/list/obj/effect/beam/i_beam/beams var/olddir = 0 - var/datum/component/redirect/listener + var/turf/listeningTo var/hearing_range = 3 /obj/item/assembly/infra/Initialize() @@ -33,7 +33,7 @@ /obj/item/assembly/infra/Destroy() STOP_PROCESSING(SSobj, src) - QDEL_NULL(listener) + listeningTo = null QDEL_LIST(beams) . = ..() @@ -163,8 +163,12 @@ next_activate = world.time + 30 /obj/item/assembly/infra/proc/switchListener(turf/newloc) - QDEL_NULL(listener) - listener = newloc.AddComponent(/datum/component/redirect, list(COMSIG_ATOM_EXITED = CALLBACK(src, .proc/check_exit))) + if(listeningTo == newloc) + return + if(listeningTo) + UnregisterSignal(listeningTo, COMSIG_ATOM_EXITED) + RegisterSignal(newloc, COMSIG_ATOM_EXITED, .proc/check_exit) + listeningTo = newloc /obj/item/assembly/infra/proc/check_exit(datum/source, atom/movable/offender) if(QDELETED(src)) diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index 8e320b2f3e..f9c831a65a 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -210,9 +210,9 @@ return cached_results["fire"] ? REACTING : NO_REACTION -//fusion: a terrible idea that was fun but broken. Now reworked to be less broken and more interesting. Again (and again, and again) +//fusion: a terrible idea that was fun but broken. Now reworked to be less broken and more interesting. Again (and again, and again). Again! //Fusion Rework Counter: Please increment this if you make a major overhaul to this system again. -//5 reworks +//6 reworks /datum/gas_reaction/fusion exclude = FALSE @@ -220,100 +220,79 @@ name = "Plasmic Fusion" id = "fusion" -//Since fusion isn't really intended to happen in successive chains, the requirements are very high /datum/gas_reaction/fusion/init_reqs() min_requirements = list( "TEMP" = FUSION_TEMPERATURE_THRESHOLD, - "ENER" = FUSION_ENERGY_THRESHOLD, + /datum/gas/tritium = FUSION_TRITIUM_MOLES_USED, /datum/gas/plasma = FUSION_MOLE_THRESHOLD, - /datum/gas/tritium = FUSION_MOLE_THRESHOLD - ) + /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/temperature = air.temperature - if(!air.analyzer_results) - air.analyzer_results = new - var/list/cached_scan_results = air.analyzer_results 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 location = get_turf(pick(fusion_pipenet.members)) else location = get_turf(holder) - + if(!air.analyzer_results) + air.analyzer_results = new + var/list/cached_scan_results = air.analyzer_results var/old_heat_capacity = air.heat_capacity() - var/reaction_energy = 0 - - var/mediation = FUSION_MEDIATION_FACTOR*(air.heat_capacity()-(cached_gases[/datum/gas/plasma]*GLOB.meta_gas_specific_heats[/datum/gas/plasma]))/(air.total_moles()-cached_gases[/datum/gas/plasma]) //This is the average specific heat of the mixture,not including plasma. - - var/gases_fused = air.total_moles() - cached_gases[/datum/gas/plasma] - var/plasma_differential = (cached_gases[/datum/gas/plasma] - gases_fused) / air.total_moles() - var/reaction_efficiency = FUSION_EFFICIENCY_BASE ** -((plasma_differential ** 2) / FUSION_EFFICIENCY_DIVISOR) //https://www.desmos.com/calculator/6jjx3vdrvx - + 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/gas_power = 0 + var/list/gas_fusion_powers = GLOB.meta_gas_fusions for (var/gas_id in cached_gases) - gas_power += reaction_efficiency * (GLOB.meta_gas_fusions[gas_id]*cached_gases[gas_id]) + gas_power += (gas_fusion_powers[gas_id]*cached_gases[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 - var/power_ratio = gas_power/mediation - cached_scan_results[id] = power_ratio //used for analyzer feedback + var/plasma = (initial_plasma-FUSION_MOLE_THRESHOLD)/(scale_factor) //We have to scale the amounts of carbon and plasma down a significant amount in order to show the chaotic dynamics we want + var/carbon = (initial_carbon-FUSION_MOLE_THRESHOLD)/(scale_factor) //We also subtract out the threshold amount to make it harder for fusion to burn itself out. - for (var/gas_id in cached_gases) //and now we fuse - cached_gases[gas_id] = 0 + //The reaction is a specific form of the Kicked Rotator system, which displays chaotic behavior and can be used to model particle interactions. + plasma = MODULUS(plasma - (instability*sin(TODEGREES(carbon))), toroidal_size) + carbon = MODULUS(carbon - plasma, toroidal_size) - var/radiation_power = (FUSION_RADIATION_FACTOR * power_ratio) / (power_ratio + FUSION_RADIATION_CONSTANT) //https://www.desmos.com/calculator/4i1f296phl - var/zap_power = ((FUSION_ZAP_POWER_ASYMPTOTE * power_ratio) / (power_ratio + FUSION_ZAP_POWER_CONSTANT)) + FUSION_ZAP_POWER_BASE //https://www.desmos.com/calculator/n0zkdpxnrr - var/do_explosion = FALSE - var/zap_range //these ones are set later - var/fusion_prepare_to_die_edition_rng - if (power_ratio > FUSION_SUPER_TIER_THRESHOLD) //power ratio 50+: SUPER TIER. The gases become so energized that they fuse into a ton of tritium, which is pretty nice! Until you consider the fact that everything just exploded, the canister is probably going to break and you're irradiated. - reaction_energy += gases_fused * FUSION_RELEASE_ENERGY_SUPER * (power_ratio / FUSION_ENERGY_DIVISOR_SUPER) - cached_gases[/datum/gas/tritium] += gases_fused * FUSION_GAS_CREATION_FACTOR_TRITIUM //60% of the gas is converted to energy, 40% to trit - fusion_prepare_to_die_edition_rng = 100 //Wait a minute.. - do_explosion = TRUE - zap_range = FUSION_ZAP_RANGE_SUPER + 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] - else if (power_ratio > FUSION_HIGH_TIER_THRESHOLD) //power ratio 20-50; High tier. The reaction is so energized that it fuses into a small amount of stimulum, and some pluoxium. Very dangerous, but super cool and super useful. - reaction_energy += gases_fused * FUSION_RELEASE_ENERGY_HIGH * (power_ratio / FUSION_ENERGY_DIVISOR_HIGH) - cached_gases[/datum/gas/stimulum] += gases_fused * FUSION_GAS_CREATION_FACTOR_STIM //40% of the gas is converted to energy, 60% to stim and pluox - cached_gases[/datum/gas/pluoxium] += gases_fused * FUSION_GAS_CREATION_FACTOR_PLUOX - fusion_prepare_to_die_edition_rng = power_ratio //Now we're getting into dangerous territory - do_explosion = TRUE - zap_range = FUSION_ZAP_RANGE_HIGH - - else if (power_ratio > FUSION_MID_TIER_THRESHOLD) //power_ratio 5 to 20; Mediation is overpowered, fusion reaction starts to break down. - reaction_energy += gases_fused * FUSION_RELEASE_ENERGY_MID * (power_ratio / FUSION_ENERGY_DIVISOR_MID) - cached_gases[/datum/gas/nitryl] += gases_fused * FUSION_GAS_CREATION_FACTOR_NITRYL //20% of the gas is converted to energy, 80% to nitryl and N2O - cached_gases[/datum/gas/nitrous_oxide] += gases_fused * FUSION_GAS_CREATION_FACTOR_N2O - fusion_prepare_to_die_edition_rng = power_ratio * FUSION_MID_TIER_RAD_PROB_FACTOR //Still unlikely, but don't stand next to the reaction unprotected - zap_range = FUSION_ZAP_RANGE_MID - - else //power ratio 0 to 5; Gas power is overpowered. Fusion isn't nearly as powerful. - reaction_energy += gases_fused * FUSION_RELEASE_ENERGY_LOW * (power_ratio / FUSION_ENERGY_DIVISOR_LOW) - cached_gases[/datum/gas/bz] += gases_fused * FUSION_GAS_CREATION_FACTOR_BZ //10% of the gas is converted to energy, 90% to BZ and CO2 - cached_gases[/datum/gas/carbon_dioxide] += gases_fused * FUSION_GAS_CREATION_FACTOR_CO2 - fusion_prepare_to_die_edition_rng = power_ratio * FUSION_LOW_TIER_RAD_PROB_FACTOR //Low, but still something to look out for - zap_range = FUSION_ZAP_RANGE_LOW - - //All the deadly consequences of fusion, consolidated for your viewing pleasure - if (location) - if(prob(fusion_prepare_to_die_edition_rng)) //Some.. permanent effects - if(do_explosion) - explosion(location, 0, 0, 5, power_ratio, TRUE, TRUE) //large shockwave, the actual radius is quite small - people will recognize that you're doing fusion - radiation_pulse(location, radiation_power) //You mean causing a super-tier fusion reaction in the halls is a bad idea? - SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, 30000)//The science is cool though. - playsound(location, 'sound/effects/supermatter.ogg', 100, 0) - else - playsound(location, 'sound/effects/phasein.ogg', 75, 0) - //These will always happen, so be prepared - tesla_zap(location, zap_range, zap_power, TESLA_FUSION_FLAGS) //larpers beware - location.fire_nuclear_particles(power_ratio) //see code/modules/projectile/energy/nuclear_particle.dm + 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) + reaction_energy = max(reaction_energy,0) //Stable reactions don't end up endothermic. + else if (reaction_energy < 0) + 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 + return NO_REACTION + cached_gases[/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) + 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) + + if(reaction_energy) + if(location) + var/particle_chance = ((PARTICLE_CHANCE_CONSTANT)/(reaction_energy-PARTICLE_CHANCE_CONSTANT)) + 1//Asymptopically approaches 100% as the energy of the reaction goes up. + if(prob(PERCENT(particle_chance))) + location.fire_nuclear_particle() + var/rad_power = max((FUSION_RAD_COEFFICIENT/instability) + FUSION_RAD_MAX,0) + radiation_pulse(location,rad_power) + var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.temperature = max(((temperature*old_heat_capacity + reaction_energy)/new_heat_capacity),TCMB) + air.temperature = CLAMP(((air.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. diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 35b30107d8..ccd13d8d4a 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -394,6 +394,21 @@ . = TRUE update_icon() +/obj/machinery/atmospherics/components/unary/cryo_cell/CtrlClick(mob/user) + if(user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK) && !state_open) + on = !on + update_icon() + return ..() + +/obj/machinery/atmospherics/components/unary/cryo_cell/AltClick(mob/user) + if(user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(state_open) + close_machine() + else + open_machine() + update_icon() + return ..() + /obj/machinery/atmospherics/components/unary/cryo_cell/update_remote_sight(mob/living/user) return // we don't see the pipe network while inside cryo. diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 74f81ec9a0..2631491350 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -587,3 +587,57 @@ shoes = /obj/item/clothing/shoes/sneakers/black suit = /obj/item/clothing/suit/armor/vest glasses = /obj/item/clothing/glasses/sunglasses/reagent + +/obj/effect/mob_spawn/human/lavaknight + name = "odd cryogenics pod" + desc = "A humming cryo pod. You can barely recognise a faint glow underneath the built up ice. The machine is attempting to wake up its occupant." + mob_name = "a displaced knight from another dimension" + icon = 'icons/obj/machines/sleeper.dmi' + icon_state = "sleeper" + roundstart = FALSE + id_job = "Knight" + job_description = "Cydonian Knight" + death = FALSE + random = TRUE + outfit = /datum/outfit/lavaknight + mob_species = /datum/species/human + flavour_text = "You are a knight who conveniently has some form of retrograde amnesia. \ + You cannot remember where you came from. However, a few things remain burnt into your mind, most prominently a vow to never harm another sapient being under any circumstances unless it is hellbent on ending your life. \ + Remember: hostile creatures and such are fair game for attacking, but under no circumstances are you to attack anything capable of thought and/or speech unless it has made it its life's calling to chase you to the ends of the earth." + assignedrole = "Cydonian Knight" + +/obj/effect/mob_spawn/human/lavaknight/special(mob/living/new_spawn) + if(ishuman(new_spawn)) + var/mob/living/carbon/human/H = new_spawn + H.dna.features["mam_ears"] = "Cat, Big" //cat people + H.dna.features["mcolor"] = H.hair_color + H.update_body() + +/obj/effect/mob_spawn/human/lavaknight/Destroy() + new/obj/structure/showcase/machinery/oldpod/used(drop_location()) + return ..() + +/datum/outfit/lavaknight + name = "Cydonian Knight" + uniform = /obj/item/clothing/under/assistantformal + mask = /obj/item/clothing/mask/breath + shoes = /obj/item/clothing/shoes/sneakers/black + r_pocket = /obj/item/melee/transforming/energy/sword/cx + suit = /obj/item/clothing/suit/space/hardsuit/lavaknight + suit_store = /obj/item/tank/internals/oxygen + id = /obj/item/card/id/knight/blue + +/obj/effect/mob_spawn/human/lavaknight/captain + name = "odd gilded cryogenics pod" + desc = "A humming cryo pod that appears to be gilded. You can barely recognise a faint glow underneath the built up ice. The machine is attempting to wake up its occupant." + flavour_text = "You are a knight who conveniently has some form of retrograde amnesia. \ + You cannot remember where you came from. However, a few things remain burnt into your mind, most prominently a vow to never harm another sapient being under any circumstances unless it is hellbent on ending your life. \ + Remember: hostile creatures and such are fair game for attacking, but under no circumstances are you to attack anything capable of thought and/or speech unless it has made it its life's calling to chase you to the ends of the earth. \ + You feel a natural instict to lead, and as such, you should strive to lead your comrades to safety, and hopefully home. You also feel a burning determination to uphold your vow, as well as your fellow comrade's." + outfit = /datum/outfit/lavaknight/captain + id_job = "Knight Captain" + +/datum/outfit/lavaknight/captain + name ="Cydonian Knight Captain" + l_pocket = /obj/item/twohanded/dualsaber/hypereutactic + id = /obj/item/card/id/knight/captain diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm index 57d8420fa8..b7b21bbb9b 100644 --- a/code/modules/awaymissions/mission_code/Academy.dm +++ b/code/modules/awaymissions/mission_code/Academy.dm @@ -133,7 +133,7 @@ var/mob/dead/observer/C = pick(candidates) message_admins("[ADMIN_LOOKUPFLW(C)] was spawned as Wizard Academy Defender") current_wizard.ghostize() // on the off chance braindead defender gets back in - current_wizard.key = C.key + C.transfer_ckey(current_wizard, FALSE) /obj/structure/academy_wizard_spawner/proc/summon_wizard() var/turf/T = src.loc @@ -210,8 +210,6 @@ if(4) //Destroy Equipment for (var/obj/item/I in user) - if (istype(I, /obj/item/implant)) - continue qdel(I) if(5) //Monkeying @@ -274,7 +272,7 @@ if(LAZYLEN(candidates)) var/mob/dead/observer/C = pick(candidates) message_admins("[ADMIN_LOOKUPFLW(C)] was spawned as Dice Servant") - H.key = C.key + C.transfer_ckey(H, FALSE) var/obj/effect/proc_holder/spell/targeted/summonmob/S = new S.target_mob = H diff --git a/code/modules/cargo/bounties/assistant.dm b/code/modules/cargo/bounties/assistant.dm index cf4efaa8c6..4edcb04e8f 100644 --- a/code/modules/cargo/bounties/assistant.dm +++ b/code/modules/cargo/bounties/assistant.dm @@ -1,46 +1,46 @@ /datum/bounty/item/assistant/strange_object name = "Strange Object" description = "Nanotrasen has taken an interest in strange objects. Find one in maint, and ship it off to CentCom right away." - reward = 1200 + reward = 600 wanted_types = list(/obj/item/relic) /datum/bounty/item/assistant/scooter name = "Scooter" description = "Nanotrasen has determined walking to be wasteful. Ship a scooter to CentCom to speed operations up." - reward = 1080 // the mat hoffman + reward = 850 // the mat hoffman wanted_types = list(/obj/vehicle/ridden/scooter) include_subtypes = FALSE /datum/bounty/item/assistant/skateboard name = "Skateboard" description = "Nanotrasen has determined walking to be wasteful. Ship a skateboard to CentCom to speed operations up." - reward = 900 // the tony hawk + reward = 700 // the tony hawk wanted_types = list(/obj/vehicle/ridden/scooter/skateboard) /datum/bounty/item/assistant/stunprod name = "Stunprod" description = "CentCom demands a stunprod to use against dissidents. Craft one, then ship it." - reward = 1300 + reward = 800 wanted_types = list(/obj/item/melee/baton/cattleprod) /datum/bounty/item/assistant/soap name = "Soap" description = "Soap has gone missing from CentCom's bathrooms and nobody knows who took it. Replace it and be the hero CentCom needs." - reward = 2000 + reward = 1000 required_count = 3 wanted_types = list(/obj/item/soap) /datum/bounty/item/assistant/spear name = "Spears" description = "CentCom's security forces are going through budget cuts. You will be paid if you ship a set of spears." - reward = 2000 + reward = 1000 required_count = 5 wanted_types = list(/obj/item/twohanded/spear) /datum/bounty/item/assistant/toolbox name = "Toolboxes" description = "There's an absence of robustness at Central Command. Hurry up and ship some toolboxes as a solution." - reward = 2000 + reward = 1000 required_count = 6 wanted_types = list(/obj/item/storage/toolbox) @@ -53,81 +53,81 @@ /datum/bounty/item/assistant/clown_box name = "Clown Box" description = "The universe needs laughter. Stamp cardboard with a clown stamp and ship it out." - reward = 1500 + reward = 750 wanted_types = list(/obj/item/storage/box/clown) /datum/bounty/item/assistant/cheesiehonkers name = "Cheesie Honkers" description = "Apparently the company that makes Cheesie Honkers is going out of business soon. CentCom wants to stock up before it happens!" - reward = 1200 + reward = 1000 required_count = 3 wanted_types = list(/obj/item/reagent_containers/food/snacks/cheesiehonkers) /datum/bounty/item/assistant/baseball_bat name = "Baseball Bat" description = "Baseball fever is going on at CentCom! Be a dear and ship them some baseball bats, so that management can live out their childhood dream." - reward = 2000 + reward = 1000 required_count = 5 wanted_types = list(/obj/item/melee/baseball_bat) /datum/bounty/item/assistant/extendohand name = "Extendo-Hand" description = "Commander Betsy is getting old, and can't bend over to get the telescreen remote anymore. Management has requested an extendo-hand to help her out." - reward = 2500 + reward = 1250 wanted_types = list(/obj/item/extendohand) /datum/bounty/item/assistant/donut name = "Donuts" description = "CentCom's security forces are facing heavy losses against the Syndicate. Ship donuts to raise morale." - reward = 3000 + reward = 2000 required_count = 10 wanted_types = list(/obj/item/reagent_containers/food/snacks/donut) /datum/bounty/item/assistant/donkpocket name = "Donk-Pockets" description = "Consumer safety recall: Warning. Donk-Pockets manufactured in the past year contain hazardous lizard biomatter. Return units to CentCom immediately." - reward = 3000 + reward = 1000 required_count = 10 wanted_types = list(/obj/item/reagent_containers/food/snacks/donkpocket) /datum/bounty/item/assistant/briefcase name = "Briefcase" description = "Central Command will be holding a business convention this year. Ship a few briefcases in support." - reward = 2500 + reward = 1500 required_count = 5 wanted_types = list(/obj/item/storage/briefcase, /obj/item/storage/secure/briefcase) /datum/bounty/item/assistant/sunglasses name = "Sunglasses" description = "A famous blues duo is passing through the sector, but they've lost their shades and they can't perform. Ship new sunglasses to CentCom to rectify this." - reward = 3000 + reward = 1000 required_count = 2 wanted_types = list(/obj/item/clothing/glasses/sunglasses) /datum/bounty/item/assistant/monkey_hide name = "Monkey Hide" description = "One of the scientists at CentCom is interested in testing products on monkey skin. Your mission is to acquire monkey's hide and ship it." - reward = 1500 + reward = 500 wanted_types = list(/obj/item/stack/sheet/animalhide/monkey) /datum/bounty/item/assistant/shard name = "Shards" description = "A killer clown has been stalking CentCom, and staff have been unable to catch her because she's not wearing shoes. Please ship some shards so that a booby trap can be constructed." - reward = 1500 + reward = 500 required_count = 15 wanted_types = list(/obj/item/shard) /datum/bounty/item/assistant/comfy_chair name = "Comfy Chairs" description = "Commander Pat is unhappy with his chair. He claims it hurts his back. Ship some alternatives out to humor him." - reward = 1500 + reward = 900 required_count = 5 wanted_types = list(/obj/structure/chair/comfy) /datum/bounty/item/assistant/geranium name = "Geraniums" description = "Commander Zot has the hots for Commander Zena. Send a shipment of geraniums - her favorite flower - and he'll happily reward you." - reward = 4000 + reward = 1000 required_count = 3 wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy/geranium) @@ -142,7 +142,7 @@ /datum/bounty/item/assistant/shadyjims name = "Shady Jim's" description = "There's an irate officer at CentCom demanding that he receive a box of Shady Jim's cigarettes. Please ship one. He's starting to make threats." - reward = 500 + reward = 750 wanted_types = list(/obj/item/storage/fancy/cigarettes/cigpack_shadyjims) /datum/bounty/item/assistant/potted_plants diff --git a/code/modules/cargo/bounties/botany.dm b/code/modules/cargo/bounties/botany.dm index 34906b321a..754de480cd 100644 --- a/code/modules/cargo/bounties/botany.dm +++ b/code/modules/cargo/bounties/botany.dm @@ -1,5 +1,5 @@ /datum/bounty/item/botany - reward = 5000 + reward = 1200 var/datum/bounty/item/botany/multiplier = 0 //adds bonus reward money; increased for higher tier or rare mutations var/datum/bounty/item/botany/bonus_desc //for adding extra flavor text to bounty descriptions var/datum/bounty/item/botany/foodtype = "meal" //same here @@ -64,7 +64,7 @@ multiplier = 4 //hush money bonus_desc = "Do not mention this shipment to security." foodtype = "\"meal\"" - + /datum/bounty/item/botany/cannabis_white name = "Lifeweed Leaves" wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/cannabis/white) diff --git a/code/modules/cargo/bounties/chef.dm b/code/modules/cargo/bounties/chef.dm index b9d9ebc184..719a2d10a5 100644 --- a/code/modules/cargo/bounties/chef.dm +++ b/code/modules/cargo/bounties/chef.dm @@ -1,34 +1,34 @@ /datum/bounty/item/chef/birthday_cake name = "Birthday Cake" description = "Nanotrasen's birthday is coming up! Ship them a birthday cake to celebrate!" - reward = 4000 + reward = 1000 wanted_types = list(/obj/item/reagent_containers/food/snacks/store/cake/birthday, /obj/item/reagent_containers/food/snacks/cakeslice/birthday) /datum/bounty/item/chef/soup name = "Soup" description = "To quell the homeless uprising, Nanotrasen will be serving soup to all underpaid workers. Ship any type of soup." - reward = 3000 + reward = 700 required_count = 3 wanted_types = list(/obj/item/reagent_containers/food/snacks/soup) /datum/bounty/item/chef/popcorn name = "Popcorn Bags" description = "Upper management wants to host a movie night. Ship bags of popcorn for the occasion." - reward = 3000 + reward = 800 required_count = 3 wanted_types = list(/obj/item/reagent_containers/food/snacks/popcorn) /datum/bounty/item/chef/onionrings name = "Onion Rings" description = "Nanotrasen is remembering Saturn day. Ship onion rings to show the station's support." - reward = 3000 + reward = 800 required_count = 3 wanted_types = list(/obj/item/reagent_containers/food/snacks/onionrings) /datum/bounty/item/chef/icecreamsandwich name = "Ice Cream Sandwiches" description = "Upper management has been screaming non-stop for ice cream. Please send some." - reward = 4000 + reward = 800 required_count = 3 wanted_types = list(/obj/item/reagent_containers/food/snacks/icecreamsandwich) @@ -36,7 +36,7 @@ name = "Bread" description = "Problems with central planning have led to bread prices skyrocketing. Ship some bread to ease tensions." reward = 1000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/store/bread, /obj/item/reagent_containers/food/snacks/breadslice, /obj/item/reagent_containers/food/snacks/bun, /obj/item/reagent_containers/food/snacks/pizzabread, /obj/item/reagent_containers/food/snacks/rawpastrybase) + wanted_types = list(/obj/item/reagent_containers/food/snacks/store/bread, /obj/item/reagent_containers/food/snacks/breadslice, /obj/item/reagent_containers/food/snacks/bun, /obj/item/reagent_containers/food/snacks/pizzabread, /obj/item/reagent_containers/food/snacks/rawpastrybase) /datum/bounty/item/chef/pie name = "Pie" @@ -47,21 +47,21 @@ /datum/bounty/item/chef/salad name = "Salad or Rice Bowls" description = "CentCom management is going on a health binge. Your order is to ship salad or rice bowls." - reward = 3000 + reward = 1200 required_count = 3 wanted_types = list(/obj/item/reagent_containers/food/snacks/salad) /datum/bounty/item/chef/carrotfries name = "Carrot Fries" description = "Night sight can mean life or death! A shipment of carrot fries is the order." - reward = 3500 + reward = 1300 required_count = 3 wanted_types = list(/obj/item/reagent_containers/food/snacks/carrotfries) /datum/bounty/item/chef/superbite name = "Super Bite Burger" description = "Commander Tubbs thinks he can set a competitive eating world record. All he needs is a super bite burger shipped to him." - reward = 12000 + reward = 1800 wanted_types = list(/obj/item/reagent_containers/food/snacks/burger/superbite) /datum/bounty/item/chef/poppypretzel @@ -73,19 +73,19 @@ /datum/bounty/item/chef/cubancarp name = "Cuban Carp" description = "To celebrate the birth of Castro XXVII, ship one cuban carp to CentCom." - reward = 8000 + reward = 3000 wanted_types = list(/obj/item/reagent_containers/food/snacks/cubancarp) /datum/bounty/item/chef/hotdog name = "Hot Dog" description = "Nanotrasen is conducting taste tests to determine the best hot dog recipe. Ship your station's version to participate." - reward = 8000 + reward = 4000 wanted_types = list(/obj/item/reagent_containers/food/snacks/hotdog) /datum/bounty/item/chef/eggplantparm name = "Eggplant Parmigianas" description = "A famous singer will be arriving at CentCom, and their contract demands that they only be served Eggplant Parmigiana. Ship some, please!" - reward = 3500 + reward = 2500 required_count = 3 wanted_types = list(/obj/item/reagent_containers/food/snacks/eggplantparm) @@ -99,33 +99,33 @@ /datum/bounty/item/chef/chawanmushi name = "Chawanmushi" description = "Nanotrasen wants to improve relations with its sister company, Japanotrasen. Ship Chawanmushi immediately." - reward = 8000 + reward = 5000 wanted_types = list(/obj/item/reagent_containers/food/snacks/chawanmushi) /datum/bounty/item/chef/kebab name = "Kebabs" description = "Remove all kebab from station you are best food. Ship to CentCom to remove from the premises." - reward = 3500 + reward = 1500 required_count = 3 wanted_types = list(/obj/item/reagent_containers/food/snacks/kebab) /datum/bounty/item/chef/soylentgreen name = "Soylent Green" description = "CentCom has heard wonderful things about the product 'Soylent Green', and would love to try some. If you endulge them, expect a pleasant bonus." - reward = 5000 + reward = 4000 wanted_types = list(/obj/item/reagent_containers/food/snacks/soylentgreen) /datum/bounty/item/chef/pancakes name = "Pancakes" description = "Here at Nanotrasen we consider employees to be family. And you know what families love? Pancakes. Ship a baker's dozen." - reward = 5000 + reward = 4000 required_count = 13 wanted_types = list(/datum/crafting_recipe/food/pancakes) /datum/bounty/item/chef/nuggies name = "Chicken Nuggets" description = "The vice president's son won't shut up about chicken nuggies. Would you mind shipping some?" - reward = 4000 + reward = 2500 required_count = 6 wanted_types = list(/obj/item/reagent_containers/food/snacks/nugget) diff --git a/code/modules/cargo/bounties/engineering.dm b/code/modules/cargo/bounties/engineering.dm index cf2cd7d93c..1f16788c4d 100644 --- a/code/modules/cargo/bounties/engineering.dm +++ b/code/modules/cargo/bounties/engineering.dm @@ -27,41 +27,41 @@ /datum/bounty/item/engineering/pacman name = "P.A.C.M.A.N.-type portable generator" description = "A neighboring station had a problem with their SMES, and now need something to power their communications console. Can you send them a P.AC.M.A.N.?" - reward = 3500 //2500 for the cargo one + reward = 1500 //2500 for the cargo one wanted_types = list(/obj/machinery/power/port_gen/pacman) /datum/bounty/item/engineering/canisters name = "Gas Canisters" description = "After a recent debacle in a nearby sector, 10 gas canisters are needed for containing an experimental aerosol before it kills all the local fauna." - reward = 5000 + reward = 3000 required_count = 10 //easy to make wanted_types = list(/obj/machinery/portable_atmospherics/canister) /datum/bounty/item/engineering/microwave name = "Microwaves" description = "Due to a shortage of microwaves, our chefs are incapable of keeping up with our sheer volume of orders. We need at least three microwaves to keep up with our crew's dietary habits." - reward = 2000 + reward = 1000 required_count = 3 wanted_types = list(/obj/machinery/microwave) /datum/bounty/item/engineering/hydroponicstrays name = "Hydroponics Tray" description = "The garden has become a hot spot of late, they need a few more hydroponics tray to grow more flowers." - reward = 2500 + reward = 1500 required_count = 5 wanted_types = list(/obj/machinery/hydroponics) /datum/bounty/item/engineering/rcd name = "Spare RCD" description = "Construction and repairs to are shuttles are going slowly. As it turns out, we're a little short on RCDs, can you send us a few?" - reward = 2500 + reward = 1500 required_count = 3 wanted_types = list(/obj/item/construction/rcd) /datum/bounty/item/engineering/rpd name = "Spare RPD" description = "Our Atmospheric Technicians are still living in the past, relying on stationary pipe dispensers to produce the pipes necessary to accomplish their strenuous tasks. They could use an upgrade. Could you send us some Rapid Pipe Dispensers?" - reward = 3000 + reward = 2500 required_count = 3 wanted_types = list(/obj/item/pipe_dispenser) @@ -75,19 +75,19 @@ /datum/bounty/item/engineering/arcadetrail name = "Orion Trail Arcade Games" description = "The staff have nothing to do when off-work. Can you send us some Orion Trail games to play?" - reward = 3000 + reward = 1500 required_count = 5 wanted_types = list(/obj/machinery/computer/arcade/orion_trail) /datum/bounty/item/engineering/arcadebattle name = "Battle Arcade Games" description = "The staff have nothing to do when off-work. Can you send us some Battle Arcade games to play?" - reward = 3000 + reward = 1500 required_count = 5 wanted_types = list(/obj/machinery/computer/arcade/battle) /datum/bounty/item/engineering/energy_ball name = "Contained Tesla Ball" description = "Station 24 is being overrun by hordes of angry Mothpeople. They are requesting the ultimate bug zapper." - reward = 75000 //requires 14k credits of purchases, not to mention cooperation with engineering/heads of staff to set up inside the cramped shuttle + reward = 50000 //requires 14k credits of purchases, not to mention cooperation with engineering/heads of staff to set up inside the cramped shuttle wanted_types = list(/obj/singularity/energy_ball) diff --git a/code/modules/cargo/bounties/medical.dm b/code/modules/cargo/bounties/medical.dm index 3129051754..22964e1fb7 100644 --- a/code/modules/cargo/bounties/medical.dm +++ b/code/modules/cargo/bounties/medical.dm @@ -7,34 +7,34 @@ /datum/bounty/item/medical/lung name = "Lungs" description = "A recent explosion at Central Command has left multiple staff with punctured lungs. Ship spare lungs to be rewarded." - reward = 10000 + reward = 3000 required_count = 3 wanted_types = list(/obj/item/organ/lungs) /datum/bounty/item/medical/appendix name = "Appendix" description = "Chef Gibb of Central Command wants to prepare a meal using a very special delicacy: an appendix. If you ship one, he'll pay." - reward = 5000 //there are no synthetic appendixes + reward = 3500 //there are no synthetic appendixes wanted_types = list(/obj/item/organ/appendix) /datum/bounty/item/medical/ears name = "Ears" description = "Multiple staff at Station 12 have been left deaf due to unauthorized clowning. Ship them new ears." - reward = 10000 + reward = 5000 required_count = 3 wanted_types = list(/obj/item/organ/ears) /datum/bounty/item/medical/liver name = "Livers" description = "Multiple high-ranking CentCom diplomats have been hospitalized with liver failure after a recent meeting with Third Soviet Union ambassadors. Help us out, will you?" - reward = 10000 + reward = 5500 required_count = 3 wanted_types = list(/obj/item/organ/liver) /datum/bounty/item/medical/eye name = "Organic Eyes" description = "Station 5's Research Director Willem is requesting a few pairs of non-robotic eyes. Don't ask questions, just ship them." - reward = 10000 + reward = 3000 required_count = 3 wanted_types = list(/obj/item/organ/eyes) exclude_types = list(/obj/item/organ/eyes/robotic) @@ -42,7 +42,7 @@ /datum/bounty/item/medical/tongue name = "Tongues" description = "A recent attack by Mime extremists has left staff at Station 23 speechless. Ship some spare tongues." - reward = 10000 + reward = 4500 required_count = 3 wanted_types = list(/obj/item/organ/tongue) @@ -79,7 +79,7 @@ required_count = 200 wanted_types = (L,/datum/reagent/blood) if(istype(L,/datum/reagent/blood)) - wanted_types += L + wanted_types += L /datum/bounty/item/medical/bloodu //Dosnt work do to how blood is yet* name = "U-Type Blood" @@ -88,40 +88,40 @@ required_count = 200 wanted_types = (U,/datum/reagent/blood) if(istype(U,/datum/reagent/blood)) - wanted_types += U + wanted_types += U */ /datum/bounty/item/medical/surgery name = "Surgery tool implants" description = "Our medical interns keep dropping their Shambler's Juice while they're performing open heart surgery. One of them even had the audacity to say he only had two hands!" - reward = 10000 + reward = 7000 required_count = 3 wanted_types = list(/obj/item/organ/cyberimp/arm/surgery) /datum/bounty/item/medical/chemmaker name = "Portable Chem Dispenser" description = "After a new chemist mixed up some water and a banana, we lost our only chem dispenser. Please send us a replacement and you will be compensated." - reward = 7000 + reward = 5000 wanted_types = list(/obj/machinery/chem_dispenser) /datum/bounty/item/medical/advhealthscaner name = "Advanced Health Analyzer" description = "A ERT Medical unit needs the new 'advanced health analyzer', for a mission at a Station 4. Can you send some?." - reward = 4000 + reward = 3000 required_count = 5 wanted_types = list(/obj/item/healthanalyzer/advanced) /datum/bounty/item/medical/wallmounts name = "Defibrillator wall mounts" description = "New Space OSHA regulation state that are new cloning medical wing needs a few 'Easy to access defibrillartors'. Can you send a few before we get a lawsuit?" - reward = 5000 + reward = 2000 required_count = 3 wanted_types = list(/obj/machinery/defibrillator_mount) /datum/bounty/item/medical/defibrillator name = "New defibillators" description = "After years of storge are defibrillator units have become more liabilities then we want. Please send us some new ones to replace these old ones." - reward = 5000 + reward = 2250 required_count = 5 wanted_types = list(/obj/item/defibrillator) diff --git a/code/modules/cargo/bounties/mining.dm b/code/modules/cargo/bounties/mining.dm index 51d93f83b5..1f3266af62 100644 --- a/code/modules/cargo/bounties/mining.dm +++ b/code/modules/cargo/bounties/mining.dm @@ -8,58 +8,58 @@ /datum/bounty/item/mining/goliath_boat name = "Goliath Hide Boat" description = "Commander Menkov wants to participate in the annual Lavaland Regatta. He is asking your shipwrights to build the swiftest boat known to man." - reward = 10000 + reward = 5500 wanted_types = list(/obj/vehicle/ridden/lavaboat) /datum/bounty/item/mining/bone_oar name = "Bone Oars" description = "Commander Menkov requires oars to participate in the annual Lavaland Regatta. Ship a pair over." - reward = 4000 + reward = 2000 required_count = 2 wanted_types = list(/obj/item/oar) /datum/bounty/item/mining/bone_axe name = "Bone Axe" description = "Station 12 has had their fire axes stolen by marauding clowns. Ship them a bone axe as a replacement." - reward = 7500 + reward = 3500 wanted_types = list(/obj/item/twohanded/fireaxe/boneaxe) /datum/bounty/item/mining/bone_armor name = "Bone Armor" description = "Station 14 has volunteered their lizard crew for ballistic armor testing. Ship over some bone armor." - reward = 5000 + reward = 2000 wanted_types = list(/obj/item/clothing/suit/armor/bone) /datum/bounty/item/mining/skull_helmet name = "Skull Helmet" description = "Station 42's Head of Security has her birthday tomorrow! We want to suprise her with a fashionable skull helmet." - reward = 4000 + reward = 2000 wanted_types = list(/obj/item/clothing/head/helmet/skull) /datum/bounty/item/mining/bone_talisman name = "Bone Talismans" description = "Station 14's Research Director claims that pagan bone talismans protect their wearer. Ship them a few so they can start testing." - reward = 7500 + reward = 3500 required_count = 3 wanted_types = list(/obj/item/clothing/accessory/talisman) /datum/bounty/item/mining/bone_dagger name = "Bone Daggers" description = "Central Command's canteen is undergoing budget cuts. Ship over some bone daggers so our Chef can keep working." - reward = 5000 + reward = 1000 required_count = 3 wanted_types = list(/obj/item/kitchen/knife/combat/bone) /datum/bounty/item/mining/basalt name = "Artificial Basalt Tiles" description = "Central Command's Ash Walker exhibit needs to be expanded again, we just need some more basalt flooring." - reward = 5000 + reward = 2200 required_count = 60 wanted_types = list(/obj/item/stack/tile/basalt) /datum/bounty/item/mining/fruit name = "Cactus Fruit" description = "Central Command's Ash Walker habitat needs more fauna, send us some local fruit seeds!" - reward = 2000 + reward = 1000 required_count = 1 wanted_types = list(/obj/item/seeds/lavaland/cactus) diff --git a/code/modules/cargo/bounties/reagent.dm b/code/modules/cargo/bounties/reagent.dm index 3f458e2b12..5137d0a6f3 100644 --- a/code/modules/cargo/bounties/reagent.dm +++ b/code/modules/cargo/bounties/reagent.dm @@ -109,19 +109,18 @@ datum/bounty/reagent/complex_drink/New() /datum/reagent/consumable/ethanol/patron,\ /datum/reagent/consumable/ethanol/quadruple_sec,\ /datum/reagent/consumable/ethanol/quintuple_sec,\ - /datum/reagent/consumable/bluecherryshake,\ /datum/reagent/consumable/doctor_delight,\ /datum/reagent/consumable/ethanol/silencer) - + var/reagent_type = pick(possible_reagents) wanted_reagent = new reagent_type name = wanted_reagent.name description = "CentCom is offering a reward for talented mixologists. Ship a container of [name] to claim the prize." - reward += rand(0, 4) * 500 + reward += rand(0, 4) * 300 /datum/bounty/reagent/chemical name = "Chemical" - reward = 4000 + reward = 2750 required_volume = 30 datum/bounty/reagent/chemical/New() diff --git a/code/modules/cargo/bounties/science.dm b/code/modules/cargo/bounties/science.dm index 2ac79f6ee8..6102d8d685 100644 --- a/code/modules/cargo/bounties/science.dm +++ b/code/modules/cargo/bounties/science.dm @@ -1,116 +1,116 @@ /datum/bounty/item/science/boh name = "Bag of Holding" description = "Nanotrasen would make good use of high-capacity backpacks. If you have any, please ship them." - reward = 10000 + reward = 5000 wanted_types = list(/obj/item/storage/backpack/holding) /datum/bounty/item/science/tboh name = "Trash Bag of Holding" description = "Nanotrasen would make good use of high-capacity trash bags. If you have any, please ship them." - reward = 10000 + reward = 3000 wanted_types = list(/obj/item/storage/backpack/holding) /datum/bounty/item/science/bluespace_syringe name = "Bluespace Syringe" description = "Nanotrasen would make good use of high-capacity syringes. If you have any, please ship them." - reward = 10000 + reward = 1500 wanted_types = list(/obj/item/reagent_containers/syringe/bluespace) /datum/bounty/item/science/bluespace_body_bag name = "Bluespace Body Bag" description = "Nanotrasen would make good use of high-capacity body bags. If you have any, please ship them." - reward = 10000 + reward = 5000 wanted_types = list(/obj/item/bodybag/bluespace) /datum/bounty/item/science/nightvision_goggles name = "Night Vision Goggles" description = "An electrical storm has busted all the lights at CentCom. While management is waiting for replacements, perhaps some night vision goggles can be shipped?" - reward = 10000 + reward = 1000 wanted_types = list(/obj/item/clothing/glasses/night, /obj/item/clothing/glasses/meson/night, /obj/item/clothing/glasses/hud/health/night, /obj/item/clothing/glasses/hud/security/night, /obj/item/clothing/glasses/hud/diagnostic/night) /datum/bounty/item/science/experimental_welding_tool name = "Experimental Welding Tool" description = "A recent accident has left most of CentCom's welding tools exploded. Ship replacements to be rewarded." - reward = 10000 + reward = 5000 required_count = 3 wanted_types = list(/obj/item/weldingtool/experimental) /datum/bounty/item/science/cryostasis_beaker name = "Cryostasis Beaker" description = "Chemists at Central Command have discovered a new chemical that can only be held in cryostasis beakers. The only problem is they don't have any! Rectify this to receive payment." - reward = 10000 + reward = 2000 wanted_types = list(/obj/item/reagent_containers/glass/beaker/noreact) /datum/bounty/item/science/diamond_drill name = "Diamond Mining Drill" description = "Central Command is willing to pay three months salary in exchange for one diamond mining drill." - reward = 15000 + reward = 5500 wanted_types = list(/obj/item/pickaxe/drill/diamonddrill, /obj/item/mecha_parts/mecha_equipment/drill/diamonddrill) /datum/bounty/item/science/floor_buffer name = "Floor Buffer Upgrade" description = "One of CentCom's janitors made a small fortune betting on carp races. Now they'd like to commission an upgrade to their floor buffer." - reward = 10000 + reward = 3000 wanted_types = list(/obj/item/janiupgrade) /datum/bounty/item/science/advanced_mop name = "Advanced Mop" description = "Excuse me. I'd like to request $17 for a push broom rebristling. Either that, or an advanced mop." - reward = 10000 + reward = 3000 wanted_types = list(/obj/item/mop/advanced) /datum/bounty/item/science/advanced_egun name = "Advanced Energy Gun" description = "With the price of rechargers on the rise, upper management is interested in purchasing guns that are self-powered. If you ship one, they'll pay." - reward = 10000 + reward = 1800 wanted_types = list(/obj/item/gun/energy/e_gun/nuclear) /datum/bounty/item/science/bscells name = "Bluespace Power Cells" description = "Someone in upper management keeps using the excuse that his tablet battery dies when he's in the middle of work. This will be the last time he doesn't have his presentation, I swear to -" - reward = 7000 + reward = 3000 required_count = 10 //Easy to make wanted_types = list(/obj/item/stock_parts/cell/bluespace) /datum/bounty/item/science/t4manip name = "Femto-Manipulators" description = "One of our Chief Engineers has OCD. Can you send us some femto-manipulators so he stops complaining that his ID doesn't fit perfectly in the PDA slot?" - reward = 7000 + reward = 2000 required_count = 20 //Easy to make wanted_types = list(/obj/item/stock_parts/manipulator/femto) /datum/bounty/item/science/t4bins name = "Bluespace Matter Bins" description = "The local Janitorial union has gone on strike. Can you send us some bluespace bins so we don't have to take out our own trash?" - reward = 7000 + reward = 2000 required_count = 20 //Easy to make wanted_types = list(/obj/item/stock_parts/matter_bin/bluespace) /datum/bounty/item/science/t4capacitor name = "Quadratic Capacitor" description = "One of our linguists doesn't understand why they're called Quadratic capacitors. Can you give him a few so he leaves us alone about it?" - reward = 7000 + reward = 2000 required_count = 20 //Easy to make wanted_types = list(/obj/item/stock_parts/capacitor/quadratic) /datum/bounty/item/science/t4triphasic name = "Triphasic Scanning Module" description = "One of our scientists got into the liberty caps and is demanding new scanning modules so he can talk to ghosts. At this point we just want him out of our office." - reward = 7000 + reward = 2000 required_count = 20 //Easy to make wanted_types = list(/obj/item/stock_parts/scanning_module/triphasic) /datum/bounty/item/science/t4microlaser name = "Quad-Ultra Micro-Laser" description = "The cats on Vega 9 are breeding out of control. We need something to corral them into one area so we can saturation bomb it." - reward = 7000 + reward = 2000 required_count = 20 //Easy to make wanted_types = list(/obj/item/stock_parts/micro_laser/quadultra) /datum/bounty/item/science/fakecrystals name = "synthetic bluespace crystals" description = "Don't, uh, tell anyone, but one of our BSA arrays might have had a little... accident. Send us some bluespace crystals so we can recalibrate it before anyone realizes. The whole set uses artificial bluespace crystals, so we need and not any other type of bluespace crystals..." - reward = 10000 + reward = 8000 required_count = 5 wanted_types = list(/obj/item/stack/ore/bluespace_crystal/artificial) exclude_types = list(/obj/item/stack/ore/bluespace_crystal, diff --git a/code/modules/cargo/bounties/security.dm b/code/modules/cargo/bounties/security.dm index cae8d10c61..6ed86cd4b7 100644 --- a/code/modules/cargo/bounties/security.dm +++ b/code/modules/cargo/bounties/security.dm @@ -1,54 +1,54 @@ /datum/bounty/item/security/riotshotgun name = "Riot Shotguns" description = "Hooligans have boarded CentCom! Ship riot shotguns quick, or things are going to get dirty." - reward = 5000 + reward = 2500 required_count = 2 wanted_types = list(/obj/item/gun/ballistic/shotgun/riot) /datum/bounty/item/security/recharger name = "Rechargers" description = "Nanotrasen military academy is conducting marksmanship exercises. They request that rechargers be shipped." - reward = 2000 + reward = 1700 required_count = 3 wanted_types = list(/obj/machinery/recharger) /datum/bounty/item/security/practice name = "Practice Laser Gun" description = "Nanotrasen Military Academy is conducting routine marksmanship exercises. The clown hid all the practice lasers, and we're not using live weapons after last time." - reward = 3000 + reward = 1500 required_count = 3 wanted_types = list(/obj/item/gun/energy/laser/practice) /datum/bounty/item/security/flashshield name = "Strobe Shield" description = "One of our Emergency Response Agents thinks there's vampires in a local station. Send him something to help with his fear of the dark and protect him, too." - reward = 5000 + reward = 3000 wanted_types = list(/obj/item/assembly/flash/shield) /datum/bounty/item/security/sechuds name = "Sec HUDs" description = "Nanotrasen military academy has started to train officers how to use Sec HUDs to the fullest affect. Please send spare Sec HUDs so we can teach the men." - reward = 3000 + reward = 1250 required_count = 5 wanted_types = list(/obj/item/clothing/glasses/hud/security) /datum/bounty/item/security/techslugs name = "Tech Slugs" description = "Nanotrasen Military Academy is conducting an ammo loading and use lessons, on the new 'Tech Slugs'. Problem is we don't have any, please fix this..." - reward = 7500 + reward = 3500 required_count = 15 wanted_types = list(/obj/item/ammo_casing/shotgun/techshell) -/datum/bounty/item/security/WT550 +/datum/bounty/item/security/wt550 name = "Spare WT-550 clips" description = "Nanotrasen Military Academy's ammunition is running low, please send in spare ammo for practice." - reward = 7500 + reward = 1500 required_count = 5 wanted_types = list(/obj/item/ammo_box/magazine/wt550m9) /datum/bounty/item/security/pins name = "Test range firing pins" description = "Nanotrasen Military Academy just got a new set of guns, sadly they didn't come with any pins. Can you send us some Test range locked firing pins?" - reward = 5000 + reward = 2750 required_count = 3 wanted_types = list(/obj/item/firing_pin/test_range) diff --git a/code/modules/cargo/bounties/slime.dm b/code/modules/cargo/bounties/slime.dm index 4aa0797c70..f52f995a27 100644 --- a/code/modules/cargo/bounties/slime.dm +++ b/code/modules/cargo/bounties/slime.dm @@ -1,10 +1,10 @@ /datum/bounty/item/slime - reward = 3000 + reward = 1950 /datum/bounty/item/slime/New() ..() description = "Nanotrasen's science lead is hunting for the rare and exotic [name]. A bounty has been offered for finding it." - reward += rand(0, 4) * 500 + reward += rand(0, 4) * 250 /datum/bounty/item/slime/green name = "Green Slime Extract" diff --git a/code/modules/cargo/bounties/special.dm b/code/modules/cargo/bounties/special.dm index adffaf999a..be91b1d8aa 100644 --- a/code/modules/cargo/bounties/special.dm +++ b/code/modules/cargo/bounties/special.dm @@ -1,14 +1,14 @@ /datum/bounty/item/alien_organs name = "Alien Organs" description = "Nanotrasen is interested in studying Xenomorph biology. Ship a set of organs to be thoroughly compensated." - reward = 25000 + reward = 13500 required_count = 3 wanted_types = list(/obj/item/organ/brain/alien, /obj/item/organ/alien, /obj/item/organ/body_egg/alien_embryo) /datum/bounty/item/syndicate_documents name = "Syndicate Documents" description = "Intel regarding the syndicate is highly prized at CentCom. If you find syndicate documents, ship them. You could save lives." - reward = 15000 + reward = 10000 wanted_types = list(/obj/item/documents/syndicate, /obj/item/documents/photocopy) /datum/bounty/item/syndicate_documents/applies_to(obj/O) @@ -22,15 +22,15 @@ /datum/bounty/item/adamantine name = "Adamantine" description = "Nanotrasen's anomalous materials division is in desparate need for Adamantine. Send them a large shipment and we'll make it worth your while." - reward = 35000 + reward = 15000 required_count = 10 wanted_types = list(/obj/item/stack/sheet/mineral/adamantine) /datum/bounty/more_bounties name = "More Bounties" description = "Complete enough bounties and CentCom will issue new ones!" - reward = 3 // number of bounties - var/required_bounties = 5 + reward = 8 // number of bounties + var/required_bounties = 3 /datum/bounty/more_bounties/can_claim() return ..() && completed_bounty_count() >= required_bounties diff --git a/code/modules/cargo/bounties/virus.dm b/code/modules/cargo/bounties/virus.dm index 8f078a2668..938ac7708d 100644 --- a/code/modules/cargo/bounties/virus.dm +++ b/code/modules/cargo/bounties/virus.dm @@ -1,5 +1,5 @@ /datum/bounty/virus - reward = 5000 + reward = 3000 var/shipped = FALSE var/stat_value = 0 var/stat_name = "" @@ -11,7 +11,7 @@ stat_value *= -1 name = "Virus ([stat_name] of [stat_value])" description = "Nanotrasen is interested in a virus with a [stat_name] stat of exactly [stat_value]. Central Command will pay handsomely for such a virus." - reward += rand(0, 4) * 500 + reward += rand(0, 4) * 400 /datum/bounty/virus/completion_string() return shipped ? "Shipped" : "Not Shipped" diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm index b7550465d9..9a99f201b3 100644 --- a/code/modules/cargo/exports.dm +++ b/code/modules/cargo/exports.dm @@ -1,6 +1,6 @@ /* How it works: The shuttle arrives at CentCom dock and calls sell(), which recursively loops through all the shuttle contents that are unanchored. - + Each object in the loop is checked for applies_to() of various export datums, except the invalid ones. */ @@ -31,7 +31,7 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they setupExports() var/list/contents = AM.GetAllContents() - + var/datum/export_report/report = external_report if(!report) //If we don't have any longer transaction going on report = new @@ -58,7 +58,7 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they var/unit_name = "" // Unit name. Only used in "Received [total_amount] [name]s [message]." message var/message = "" var/cost = 100 // Cost of item, in cargo credits. Must not alow for infinite price dupes, see above. - var/k_elasticity = 1/30 //coefficient used in marginal price calculation that roughly corresponds to the inverse of price elasticity, or "quantity elasticity" + var/k_elasticity = 1/20 //coefficient used in marginal price calculation that roughly corresponds to the inverse of price elasticity, or "quantity elasticity" - CIT EDIT 30 - > 20 var/list/export_types = list() // Type of the exported object. If none, the export datum is considered base type. var/include_subtypes = TRUE // Set to FALSE to make the datum apply only to a strict type. var/list/exclude_types = list() // Types excluded from export @@ -125,9 +125,9 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they if(amount <=0 || the_cost <=0) return FALSE - + report.total_value[src] += the_cost - + if(istype(O, /datum/export/material)) report.total_amount[src] += amount*MINERAL_MATERIAL_AMOUNT else @@ -148,7 +148,7 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they var/total_value = ex.total_value[src] var/total_amount = ex.total_amount[src] - + var/msg = "[total_value] credits: Received [total_amount] " if(total_value > 0) msg = "+" + msg diff --git a/code/modules/cargo/exports/gear.dm b/code/modules/cargo/exports/gear.dm index 125e0f708b..7ff14df04c 100644 --- a/code/modules/cargo/exports/gear.dm +++ b/code/modules/cargo/exports/gear.dm @@ -1,83 +1,800 @@ /datum/export/gear + include_subtypes = FALSE + +//blanket +/datum/export/gear/hat + cost = 3 + unit_name = "clothing" + export_types = list(/obj/item/clothing) + include_subtypes = TRUE + +//Hats + +//Blanket +/datum/export/gear/hat + cost = 5 + unit_name = "hat" + export_types = list(/obj/item/clothing/head) + include_subtypes = TRUE /datum/export/gear/sec_helmet - cost = 100 + cost = 70 unit_name = "helmet" export_types = list(/obj/item/clothing/head/helmet/sec) -/datum/export/gear/sec_armor - cost = 100 - unit_name = "armor vest" - export_types = list(/obj/item/clothing/suit/armor/vest) +/datum/export/gear/sec_soft + cost = 50 + unit_name = "soft sec cap" + export_types = list(/obj/item/clothing/head/soft/sec) -/datum/export/gear/riot_shield - cost = 100 - unit_name = "riot shield" - export_types = list(/obj/item/shield/riot) +/datum/export/gear/sec_helmetalt + cost = 50 + unit_name = "bullet proof helmet" + export_types = list(/obj/item/clothing/head/helmet/alt) +/datum/export/gear/sec_helmetold + cost = 10 + unit_name = "old helmet" + export_types = list(/obj/item/clothing/head/helmet/old) + +/datum/export/gear/sec_helmetblue + cost = 75 + unit_name = "blue helmet" + export_types = list(/obj/item/clothing/head/helmet/blueshirt) + +/datum/export/gear/sec_helmetriot + cost = 100 + unit_name = "riot helmet" + export_types = list(/obj/item/clothing/head/helmet/riot) + +/datum/export/gear/sec_helmet_light + cost = 20 + unit_name = "justice helmet" + export_types = list(/obj/item/clothing/head/helmet/justice/escape) + include_subtypes = TRUE + +/datum/export/gear/syndicate_helmetswat + cost = 250 + unit_name = "syndicate helmet" + export_types = list(/obj/item/clothing/head/helmet/swat) + +/datum/export/gear/sec_helmetswat + cost = 150 + unit_name = "swat helmet" + export_types = list(/obj/item/clothing/head/helmet/swat/nanotrasen) + +/datum/export/gear/thunder_helmet + cost = 120 + unit_name = "thunder dome helmet" + export_types = list(/obj/item/clothing/head/helmet/thunderdome) + +/datum/export/gear/roman_real + cost = 30 + unit_name = "roman helmet" + export_types = list(/obj/item/clothing/head/helmet/roman) + +/datum/export/gear/roman_realalt + cost = 60 + unit_name = "legionnaire helmet" + export_types = list(/obj/item/clothing/head/helmet/roman/legionnaire) + +/datum/export/gear/roman_fake + cost = 10 + unit_name = "toy roman helmet" + export_types = list(/obj/item/clothing/head/helmet/roman/fake) + +/datum/export/gear/roman_fakealt + cost = 20 + unit_name = "toy legionnaire helmet" + export_types = list(/obj/item/clothing/head/helmet/roman/legionnaire/fake) + +/datum/export/gear/ash_walker_helm + cost = 70 + unit_name = "gladiator helmet" + export_types = list(/obj/item/clothing/head/helmet/gladiator) + +/datum/export/gear/lasertag + cost = 30 //Has armor + unit_name = "lasertag helmet" + export_types = list(/obj/item/clothing/head/helmet/redtaghelm) + +/datum/export/gear/lasertag/blue + export_types = list(/obj/item/clothing/head/helmet/bluetaghelm) + +/datum/export/gear/knight_helmet + cost = 200 + k_elasticity = 1/5 //Rare, dont flood it + unit_name = "knight helmet" + export_types = list(/obj/item/clothing/head/helmet/knight, /obj/item/clothing/head/helmet/knight/blue, /obj/item/clothing/head/helmet/knight/yellow, /obj/item/clothing/head/helmet/knight/red) + +/datum/export/gear/skull_hat + cost = 70 + k_elasticity = 1/15 //Its just a skull + unit_name = "skull" + export_types = list(/obj/item/clothing/head/helmet/skull) + +/datum/export/gear/durathread_helm + cost = 100 + k_elasticity = 1/15 + unit_name = "durathread hat" + export_types = list(/obj/item/clothing/head/helmet/durathread, /obj/item/clothing/head/beret/durathread, /obj/item/clothing/head/beanie/durathread) + +/datum/export/gear/hard_hats + cost = 50 + unit_name = "hard hat" + export_types = list(/obj/item/clothing/head/hardhat, /obj/item/clothing/head/hardhat/orange, /obj/item/clothing/head/hardhat/white, /obj/item/clothing/head/hardhat/dblue) + +/datum/export/gear/atmos_helm + cost = 200 //Armored, fire proof, light, and presser proof + unit_name = "atmos hard hat" + export_types = list(/obj/item/clothing/head/hardhat/atmos) + +/datum/export/gear/crowns + cost = 350 //Armored, gold 300cr of gold to make so give them 50 more for working + k_elasticity = 1/5 //Anti-floods + unit_name = "crown" + export_types = list(/obj/item/clothing/head/crown, /obj/item/clothing/head/crown/fancy) + +/datum/export/gear/cchat + cost = 40 + unit_name = "centcom hat" + export_types = list(/obj/item/clothing/head/centhat) + +/datum/export/gear/caphat + cost = 150 + unit_name = "command hat" + export_types = list(/obj/item/clothing/head/caphat, /obj/item/clothing/head/caphat/parade, /obj/item/clothing/head/caphat/beret) + +/datum/export/gear/hophat + cost = 130 + unit_name = "hop hat" + export_types = list(/obj/item/clothing/head/hopcap, /obj/item/clothing/head/hopcap/beret) + +/datum/export/gear/dechat + cost = 75 + k_elasticity = 1/8 //Anti-floods + unit_name = "fedora" + export_types = list(/obj/item/clothing/head/fedora/det_hat, /obj/item/clothing/head/fedora/curator, /obj/item/clothing/head/fedora) + +/datum/export/gear/hoshat + cost = 140 + unit_name = "hos hat" + export_types = list(/obj/item/clothing/head/HoS, /obj/item/clothing/head/HoS/beret, /obj/item/clothing/head/beret/sec/navyhos) + +/datum/export/gear/syndahoshat + cost = 300 + unit_name = "syndicate command hat" + export_types = list(/obj/item/clothing/head/HoS/syndicate, /obj/item/clothing/head/HoS/beret/syndicate) + +/datum/export/gear/wardenhat + cost = 90 + unit_name = "warden hat" + export_types = list(/obj/item/clothing/head/warden, /obj/item/clothing/head/warden/drill, /obj/item/clothing/head/beret/sec/navywarden) + +/datum/export/gear/sechats + cost = 60 + unit_name = "sec beret" + export_types = list(/obj/item/clothing/head/beret/sec, /obj/item/clothing/head/beret/sec/navyofficer) + +/datum/export/gear/berets + cost = 30 + unit_name = "beret" + export_types = list(/obj/item/clothing/head/beret/qm, /obj/item/clothing/head/beret/rd, /obj/item/clothing/head/beret/cmo, /obj/item/clothing/head/beret) + +/datum/export/gear/berets + cost = 30 + unit_name = "beret" + export_types = list(/obj/item/clothing/head/beret/qm, /obj/item/clothing/head/beret/rd, /obj/item/clothing/head/beret/cmo, /obj/item/clothing/head/beret) + +/datum/export/gear/collectable + cost = 500 + unit_name = "collectable hat" + k_elasticity = 1/10 //dont flood these + export_types = list(/obj/item/clothing/head/collectable) + include_subtypes = TRUE + +/datum/export/gear/fancyhats + cost = 75 + unit_name = "fancy hat" + k_elasticity = 1/10 //dont flood these + export_types = list(/obj/item/clothing/head/that, /obj/item/clothing/head/bowler, /obj/item/clothing/head/lizard, /obj/item/clothing/head/canada) + +/datum/export/gear/welders + cost = 30 + unit_name = "welder helm" + k_elasticity = 1/20 //dont flood these + export_types = list(/obj/item/clothing/head/welding) + +/datum/export/gear/magichat //Magic as is Antags-Wiz/Cults + cost = 450 + unit_name = "magic hat" + export_types = list(/obj/item/clothing/head/wizard, /obj/item/clothing/head/culthood, /obj/item/clothing/head/magus, /obj/item/clothing/head/helmet/clockwork) + exclude_types = list(/obj/item/clothing/head/wizard/fake, /obj/item/clothing/head/wizard/marisa/fake) + include_subtypes = TRUE + +//Shoes + +//Blanket +/datum/export/gear/shoes + cost = 1 //Really dont want to sell EVERY SHOE EVER - yet* + unit_name = "shoes" + export_types = list(/obj/item/clothing/shoes) + include_subtypes = TRUE + +/datum/export/gear/clown_shoesmk + cost = 600 + unit_name = "mk-honk prototype shoes" + export_types = list(/obj/item/clothing/shoes/clown_shoes/banana_shoes) + +/datum/export/gear/magboots + cost = 50 + unit_name = "magboots" + export_types = list(/obj/item/clothing/shoes/magboots, /obj/item/clothing/shoes/magboots/atmos) + +/datum/export/gear/nosellboots + cost = -5000 //We DONT want scew antags + unit_name = "error shipment stolen" + export_types = list(/obj/item/clothing/shoes/magboots/advance, /obj/item/clothing/shoes/magboots/deathsquad) + +/datum/export/gear/syndamagboots + cost = 250 + unit_name = "blood redmagboots" + export_types = list(/obj/item/clothing/shoes/magboots/syndie) + +/datum/export/gear/combatboots + cost = 30 + unit_name = "combat boots" + export_types = list(/obj/item/clothing/shoes/combat) + +/datum/export/gear/swatboots + cost = 45 + unit_name = "swat boots" + export_types = list(/obj/item/clothing/shoes/combat/swat) + +/datum/export/gear/galoshes + cost = 50 + unit_name = "galoshes" + export_types = list(/obj/item/clothing/shoes/galoshes, /obj/item/clothing/shoes/galoshes/dry) + +/datum/export/gear/clown + cost = 10 + unit_name = "clown shoes" + export_types = list(/obj/item/clothing/shoes/clown_shoes, /obj/item/clothing/shoes/clown_shoes/jester) + +/datum/export/gear/dressshoes + cost = 10 + unit_name = "dress shoes" + export_types = list(/obj/item/clothing/shoes/laceup, /obj/item/clothing/shoes/singerb, /obj/item/clothing/shoes/singery) + +/datum/export/gear/working + cost = 15 + unit_name = "boots" + export_types = list(/obj/item/clothing/shoes/jackboots/fast, /obj/item/clothing/shoes/winterboots, /obj/item/clothing/shoes/jackboots, /obj/item/clothing/shoes/workboots, /obj/item/clothing/shoes/workboots/mining) + +/datum/export/gear/hopboots + cost = 350 //costs 1000 credits for miners to get + unit_name = "jump boots" + export_types = list(/obj/item/clothing/shoes/bhop) + +/datum/export/gear/magicboots //Magic as in Antag - Wiz/Cults + cost = 450 + unit_name = "magic shoes" + export_types = list(/obj/item/clothing/shoes/sandal/marisa, /obj/item/clothing/shoes/sandal/magic, /obj/item/clothing/shoes/cult, /obj/item/clothing/shoes/clockwork, /obj/item/clothing/shoes/clown_shoes/taeclowndo, /obj/item/clothing/shoes/sandal/slippers) + include_subtypes = TRUE + +//Headsets/Ears + +//Blanket +/datum/export/gear/ears + cost = 2 //We dont want to sell every headset ever + unit_name = "ear gear" + export_types = list(/obj/item/clothing/ears, /obj/item/radio/headset) + include_subtypes = TRUE + +//Gloves + +//Blanket +/datum/export/gear/gloves + cost = 4 //Glove crafting can be done + unit_name = "gloves" + export_types = list(/obj/item/clothing/gloves) + include_subtypes = TRUE + +/datum/export/gear/boxing + cost = 10 //Padding as well as a weapon + unit_name = "boxing gloves" + export_types = list(/obj/item/clothing/gloves/boxing) + include_subtypes = TRUE + +/datum/export/gear/combatgloves + cost = 80 + unit_name = "combat gloves" + export_types = list(/obj/item/clothing/gloves/combat, /obj/item/clothing/gloves/rapid, /obj/item/clothing/gloves/krav_maga) + include_subtypes = TRUE + +/datum/export/gear/bonegloves + cost = 30 + unit_name = "bone bracers" + export_types = list(/obj/item/clothing/gloves/bracer) + +/datum/export/gear/yellowgloves + cost = 50 + unit_name = "insulated gloves" + export_types = list(/obj/item/clothing/gloves/color/yellow, /obj/item/clothing/gloves/color/red/insulated) + +/datum/export/gear/leathergloves + cost = 20 + unit_name = "leather gloves" + export_types = list(/obj/item/clothing/gloves/botanic_leather) + +/datum/export/gear/fancy + cost = 25 + unit_name = "fancy gloves" + export_types = list(/obj/item/clothing/gloves/color/black, /obj/item/clothing/gloves/color/captain, /obj/item/clothing/gloves/color/white) + +/datum/export/gear/magicgloves//Magic as in Antag - Wiz/Cults + cost = 400 + unit_name = "magic gloves" + export_types = list(/obj/item/clothing/gloves/clockwork) + include_subtypes = TRUE + +//Ties/neck + +//Blanket +/datum/export/gear/neck + cost = 5 //Fancy! + unit_name = "neck based gear" + export_types = list(/obj/item/clothing/neck) + include_subtypes = TRUE + +/datum/export/gear/collar + cost = 7 + unit_name = "collar" + export_types = list(/obj/item/clothing/neck/petcollar) + include_subtypes = TRUE + +/datum/export/gear/bling + cost = 15 //Needs a coin + unit_name = "gold plated necklace" + export_types = list(/obj/item/clothing/neck/necklace/dope) + +//masks + +//Blanket +/datum/export/gear/masks + cost = 3 //Mostly just fake stuff and clowngear + unit_name = "face gear" + export_types = list(/obj/item/clothing/mask) + include_subtypes = TRUE + +/datum/export/gear/gasmask + cost = 4 + unit_name = "gas mask" + export_types = list(/obj/item/clothing/mask/gas, /obj/item/clothing/mask/gas/glass) + +/datum/export/gear/minermask + cost = 10 + unit_name = "armored mask" + export_types = list(/obj/item/clothing/mask/gas/welding, /obj/item/clothing/mask/gas/explorer, /obj/item/clothing/mask/gas/syndicate) + +/datum/export/gear/sechailer + cost = 6 + unit_name = "sec hailer" + export_types = list(/obj/item/clothing/mask/gas/sechailer) + include_subtypes = TRUE /datum/export/gear/mask/breath cost = 2 unit_name = "breath mask" export_types = list(/obj/item/clothing/mask/breath) -/datum/export/gear/mask/gas - cost = 10 - unit_name = "gas mask" - export_types = list(/obj/item/clothing/mask/gas) - include_subtypes = FALSE +//Hardsuits //If you steal/fine more they are worth selling +//Blanket +/datum/export/gear/hardsuit + cost = 250 //Its just metal/plastic after all + unit_name = "unknown hardsuit" + export_types = list(/obj/item/clothing/suit/space/hardsuit) + include_subtypes = TRUE -/datum/export/gear/space/helmet - cost = 75 +/datum/export/gear/engi_hardsuit + cost = 500 + unit_name = "engine hardsuit" + export_types = list(/obj/item/clothing/suit/space/hardsuit/engine) + +/datum/export/gear/atmos_hardsuit + cost = 600 + unit_name = "atmos hardsuit" + export_types = list(/obj/item/clothing/suit/space/hardsuit/engine/atmos) + +/datum/export/gear/engi_hardsuit + cost = 1000 + unit_name = "elite engine hardsuit" + export_types = list(/obj/item/clothing/suit/space/hardsuit/engine/elite) + +/datum/export/gear/mining_hardsuit + cost = 350 //common + unit_name = "mining hardsuit" + export_types = list(/obj/item/clothing/suit/space/hardsuit/mining) + +/datum/export/gear/sec_hardsuit + cost = 750 + unit_name = "sec hardsuit" + export_types = list(/obj/item/clothing/head/helmet/space/hardsuit/mining, /obj/item/clothing/head/helmet/space/hardsuit/syndi/owl) + +/datum/export/gear/syndi_hardsuit + cost = 1250 + unit_name = "syndi hardsuit" + export_types = list(/obj/item/clothing/suit/space/hardsuit/syndi) + +/datum/export/gear/syndi_hardsuit + cost = 2750 + unit_name = "elite syndi hardsuit" + export_types = list(/obj/item/clothing/suit/space/hardsuit/syndi/elite) + +/datum/export/gear/medical_hardsuit + cost = 350 //Not all that good + unit_name = "meidcal hardsuit" + export_types = list(/obj/item/clothing/suit/space/hardsuit/medical) + +/datum/export/gear/rd_hardsuit + cost = 850 //rare + unit_name = "prototype hardsuit" + export_types = list(/obj/item/clothing/suit/space/hardsuit/rd) + +/datum/export/gear/sec_hardsuit + cost = 750 + unit_name = "sec hardsuit" + export_types = list(/obj/item/clothing/suit/space/hardsuit/security) + +/datum/export/gear/command_hardsuit + cost = 1300 + unit_name = "command hardsuit" + export_types = list(/obj/item/clothing/suit/space/hardsuit/security/hos, /obj/item/clothing/suit/space/hardsuit/captain) + +/datum/export/gear/magic_hardsuit + cost = 3000 + unit_name = "magic hardsuit" + export_types = list(/obj/item/clothing/suit/space/hardsuit/wizard, /obj/item/clothing/suit/space/hardsuit/shielded/wizard, /obj/item/clothing/suit/space/hardsuit/cult) + include_subtypes = TRUE + +/datum/export/gear/shield_hardsuit + cost = 2000 + unit_name = "shielded hardsuit" + export_types = list(/obj/item/clothing/suit/space/hardsuit/shielded) + include_subtypes = TRUE + +/datum/export/gear/rigs + cost = 2750 + unit_name = "RIG" + export_types = list(/obj/item/clothing/suit/space/hardsuit/ancient, /obj/item/clothing/suit/space/hardsuit/ancient/mason) + +//Soft Suits + +//Blanket +datum/export/gear/space/helmet + cost = 55 unit_name = "space helmet" - export_types = list(/obj/item/clothing/head/helmet/space, /obj/item/clothing/head/helmet/space/eva, /obj/item/clothing/head/helmet/space/nasavoid) - include_subtypes = FALSE + export_types = list(/obj/item/clothing/head/helmet/space) + include_subtypes = TRUE /datum/export/gear/space/suit - cost = 150 + cost = 60 unit_name = "space suit" - export_types = list(/obj/item/clothing/suit/space, /obj/item/clothing/suit/space/eva, /obj/item/clothing/suit/space/nasavoid) - include_subtypes = FALSE + export_types = list(/obj/item/clothing/suit/space) + include_subtypes = TRUE +datum/export/gear/space/helmet/plasma + cost = 100 + unit_name = "plasmaman space helmet" + export_types = list(/obj/item/clothing/suit/space/eva/plasmaman) -/datum/export/gear/space/syndiehelmet - cost = 150 - unit_name = "Syndicate space helmet" +/datum/export/gear/space/suit/plasma + cost = 100 + unit_name = "plasmaman space suit" + export_types = list(/obj/item/clothing/suit/space/eva/plasmaman) + +datum/export/gear/space/helmet/synda + cost = 150 //Flash proof + unit_name = "syndicate space helmet" export_types = list(/obj/item/clothing/head/helmet/space/syndicate) + include_subtypes = TRUE -/datum/export/gear/space/syndiesuit - cost = 300 - unit_name = "Syndicate space suit" - export_types = list(/obj/item/clothing/suit/space/syndicate) +/datum/export/gear/space/suit/synda + cost = 150 + unit_name = "syndicate space suit" + export_types = list(/obj/item/clothing/head/helmet/space/syndicate) + include_subtypes = TRUE +//Glasses + +//Blanket +datum/export/gear/glasses //glasses are not worth selling + cost = 3 + unit_name = "glasses" + export_types = list(/obj/item/clothing/glasses) + include_subtypes = TRUE + +/datum/export/gear/mesons + cost = 6 + unit_name = "mesons" + export_types = list(/obj/item/clothing/glasses/meson, /obj/item/clothing/glasses/material/mining) + include_subtypes = TRUE + +/datum/export/gear/scigoggles + cost = 8 + unit_name = "chem giggles" + export_types = list(/obj/item/clothing/glasses/science) + include_subtypes = TRUE + +/datum/export/gear/nvgoggles + cost = 20 + unit_name = "night vison giggles" + export_types = list(/obj/item/clothing/glasses/night) + include_subtypes = TRUE + +/datum/export/gear/sunglasses + cost = 12 + unit_name = "sunglasses" + export_types = list(/obj/item/clothing/glasses/sunglasses) + include_subtypes = TRUE + +/datum/export/gear/huds + cost = 10 + unit_name = "huds" + export_types = list(/obj/item/clothing/glasses/hud) + include_subtypes = TRUE + +/datum/export/gear/huds/glasses + cost = 22 + export_types = list(/obj/item/clothing/glasses/hud/health/sunglasses, /obj/item/clothing/glasses/hud/security/sunglasses) + +/datum/export/gear/weldinggoggles + cost = 20 + unit_name = "welding goggles" + export_types = list(/obj/item/clothing/glasses/welding) + include_subtypes = TRUE + +/datum/export/gear/thermals + cost = 30 + unit_name = "heat seeing goggles" + export_types = list(/obj/item/clothing/glasses/thermal, /obj/item/clothing/glasses/hud/toggle/thermal) + include_subtypes = TRUE + +/datum/export/gear/magic_glasses + cost = 140 + unit_name = "magic goggles" + export_types = list(/obj/item/clothing/glasses/godeye, /obj/item/clothing/glasses/hud/health/night/cultblind, /obj/item/clothing/glasses/wraith_spectacles, /obj/item/clothing/glasses/judicial_visor) + include_subtypes = TRUE + +////////// +//UNDER/// +////////// + +/datum/export/gear/jumpsuit + cost = 3 + unit_name = "jumpsuit" + k_elasticity = 1/100 //you can craft white jumpsuits, if someone does that 300 times, they deserve the 800 credits + export_types = list(/obj/item/clothing/under) + include_subtypes = TRUE + +/datum/export/gear/fancy_jumpsuit + cost = 10 + unit_name = "fancy clothing" + k_elasticity = 1/90 //These will be what sells + export_types = list(/obj/item/clothing/under/scratch, /obj/item/clothing/under/sl_suit, /obj/item/clothing/under/rank/vice, /obj/item/clothing/under/suit_jacket, \ + /obj/item/clothing/under/burial, /obj/item/clothing/under/skirt/black, /obj/item/clothing/under/captainparade, /obj/item/clothing/under/hosparademale, \ + /obj/item/clothing/under/hosparadefem, /obj/item/clothing/under/assistantformal, /obj/item/clothing/under/stripeddress, /obj/item/clothing/under/redeveninggown, \ + /obj/item/clothing/under/plaid_skirt, /obj/item/clothing/under/geisha, /obj/item/clothing/under/trek, /obj/item/clothing/under/wedding, /obj/item/clothing/under/aviatoruniform,\ + /obj/item/clothing/under/mega, /obj/item/clothing/under/cia, /obj/item/clothing/under/casualwear, /obj/item/clothing/under/rank) + include_subtypes = TRUE + +/datum/export/gear/armored_jumpsuit + cost = 15 + unit_name = "armored_jumpsuit" + k_elasticity = 1/90 //These will be what sells + export_types = list(/obj/item/clothing/under/durathread, /obj/item/clothing/under/rank/security, /obj/item/clothing/under/plasmaman, /obj/item/clothing/under/syndicate, \ + /obj/item/clothing/under/rank/det, /obj/item/clothing/under/rank/head_of_security, /obj/item/clothing/under/rank/security/spacepol) + exclude_types = list(/obj/item/clothing/under/syndicate/tacticool, /obj/item/clothing/under/syndicate/tacticool/skirt) + include_subtypes = TRUE + +/datum/export/gear/jumpsuit_addon + cost = 12 //Few and rare as well as quick drop off of vaule + unit_name = "jumpsuit add on" + k_elasticity = 1/10 + export_types = list(/obj/item/clothing/accessory) + include_subtypes = TRUE + +/datum/export/gear/robes_magic + cost = 120 + unit_name = "magic robes" + export_types = list(/obj/item/clothing/suit/wizrobe, /obj/item/clothing/suit/cultrobes, /obj/item/clothing/suit/magusred, /obj/item/clothing/suit/hooded/cultrobes) + exclude_types = list(/obj/item/clothing/suit/wizrobe/fake) + include_subtypes = TRUE + +//Amror +/datum/export/gear/armor + cost = 80 + unit_name = "misc armor" + export_types = list(/obj/item/clothing/suit/armor) + include_subtypes = TRUE + +/datum/export/gear/sec_armor + cost = 180 + unit_name = "sec armor" + export_types = list(/obj/item/clothing/suit/armor/vest/leather, /obj/item/clothing/suit/armor/bulletproof, /obj/item/clothing/suit/armor/vest/det_suit) + include_subtypes = TRUE + +/datum/export/gear/hosarmor + cost = 380 + unit_name = "hos armor" + export_types = list(/obj/item/clothing/suit/armor/hos) + include_subtypes = TRUE + +/datum/export/gear/wardenarmor + cost = 280 + unit_name = "warden armor" + export_types = list(/obj/item/clothing/suit/armor/vest/warden) + include_subtypes = TRUE + +/datum/export/gear/reflector + cost = 500 + unit_name = "reflector armor" + export_types = list(/obj/item/clothing/suit/armor/laserproof) + include_subtypes = TRUE + +/datum/export/gear/heavy_armor + cost = 600 //REALY hard to fine/make takes lots of slimes + unit_name = "heavy armor" + export_types = list(/obj/item/clothing/suit/armor/heavy) + include_subtypes = TRUE + +/datum/export/gear/plate_armor + cost = 200 + unit_name = "plate armor" + export_types = list(/obj/item/clothing/suit/armor/riot/knight) + include_subtypes = TRUE + +/datum/export/gear/riot_armor + cost = 250 + unit_name = "riot armor" + export_types = list(/obj/item/clothing/suit/armor/riot) + include_subtypes = TRUE + +/datum/export/gear/bone_armor + cost = 50 + unit_name = "bone armor" + export_types = list(/obj/item/clothing/suit/armor/bone) + include_subtypes = TRUE + +/datum/export/gear/swat_armor + cost = 350 + unit_name = "swat mki armor" + export_types = list(/obj/item/clothing/suit/space/swat) + include_subtypes = TRUE + +/datum/export/gear/dragon_armor + cost = 750 + unit_name = "drake bone armor" + export_types = list(/obj/item/clothing/suit/hooded/cloak/drake) + include_subtypes = TRUE + +/datum/export/gear/commandamor + cost = 480 + unit_name = "command armor" + export_types = list(/obj/item/clothing/suit/armor/vest/capcarapace, /obj/item/clothing/suit/armor/centcom) + include_subtypes = TRUE + +/datum/export/gear/reactive_base + cost = 600 + k_elasticity = 1/2 //Lets not go over board + unit_name = "hollow reactive armor" + export_types = list(/obj/item/reactive_armour_shell, /obj/item/clothing/suit/armor/reactive) + +/datum/export/gear/reactive_active + cost = 1200 + k_elasticity = 1/3 //Lets not go over board + unit_name = "working reactive armor" + export_types = list(/obj/item/clothing/suit/armor/reactive/repulse, /obj/item/clothing/suit/armor/reactive/tesla, /obj/item/clothing/suit/armor/reactive/teleport) + +/////////////////////////// +//Bomb/Rad/Bio Suits/Fire// +/////////////////////////// /datum/export/gear/radhelmet - cost = 50 + cost = 20 unit_name = "radsuit hood" export_types = list(/obj/item/clothing/head/radiation) /datum/export/gear/radsuit - cost = 100 + cost = 40 unit_name = "radsuit" export_types = list(/obj/item/clothing/suit/radiation) +/datum/export/gear/firehelmet + cost = 10 + unit_name = "firesuit helmet" + export_types = list(/obj/item/clothing/head/hardhat/red) + +/datum/export/gear/fireatmos + cost = 120 + unit_name = "atmos firesuit" + export_types = list(/obj/item/clothing/suit/fire/atmos) + +/datum/export/gear/firesuit + cost = 20 + unit_name = "firesuit" + export_types = list(/obj/item/clothing/suit/fire, /obj/item/clothing/suit/fire/firefighter, /obj/item/clothing/suit/fire/heavy) + /datum/export/gear/biohood - cost = 50 + cost = 40 unit_name = "biosuit hood" export_types = list(/obj/item/clothing/head/bio_hood) + include_subtypes = TRUE /datum/export/gear/biosuit - cost = 100 + cost = 60 unit_name = "biosuit" export_types = list(/obj/item/clothing/suit/bio_suit) + include_subtypes = TRUE /datum/export/gear/bombhelmet - cost = 50 + cost = 40 unit_name = "bomb suit hood" export_types = list(/obj/item/clothing/head/bomb_hood) + include_subtypes = TRUE /datum/export/gear/bombsuit - cost = 100 + cost = 60 unit_name = "bomb suit" export_types = list(/obj/item/clothing/suit/bomb_suit) + include_subtypes = TRUE + +//////////////////// +//Cloaks and Coats// +//////////////////// + +/datum/export/gear/cloaks + cost = 30 + unit_name = "cloak" + export_types = list(/obj/item/clothing/neck/cloak) + include_subtypes = TRUE + +/datum/export/gear/cloaksmining + cost = 90 + unit_name = "lava land cloak" + export_types = list(/obj/item/clothing/suit/hooded/cloak/goliath) + include_subtypes = TRUE + +/datum/export/gear/labcoats + cost = 15 + unit_name = "labcoats" + export_types = list(/obj/item/clothing/suit/toggle/labcoat) + include_subtypes = TRUE + +/datum/export/gear/wintercoats + cost = 25 + unit_name = "wintercoats" + export_types = list(/obj/item/clothing/suit/hooded/wintercoat) + include_subtypes = TRUE + +////////// +//SUITS/// +////////// + +/datum/export/gear/suits + cost = 40 + unit_name = "suit" + export_types = list(/obj/item/clothing/suit) + include_subtypes = TRUE + +////////////////////// +//Chameleon Gear////// +////////////////////// +/datum/export/gear/chameleon //Selling a full kit is easy money for 2 tc + cost = 280 + unit_name = "chameleon item" + export_types = list(/obj/item/clothing/head/chameleon, /obj/item/clothing/mask/chameleon, /obj/item/clothing/under/chameleon, /obj/item/clothing/suit/chameleon, /obj/item/clothing/glasses/chameleon,\ + /obj/item/clothing/gloves/chameleon, /obj/item/clothing/head/chameleon, /obj/item/clothing/shoes/chameleon, /obj/item/storage/backpack/chameleon, \ + /obj/item/storage/belt/chameleon, /obj/item/radio/headset/chameleon, /obj/item/pda/chameleon, /obj/item/stamp/chameleon, /obj/item/clothing/neck/cloak/chameleon) + include_subtypes = TRUE \ No newline at end of file diff --git a/code/modules/cargo/exports/large_objects.dm b/code/modules/cargo/exports/large_objects.dm index bf77d836fb..88ff5f4729 100644 --- a/code/modules/cargo/exports/large_objects.dm +++ b/code/modules/cargo/exports/large_objects.dm @@ -1,3 +1,6 @@ +/datum/export/large + k_elasticity = 0 + /datum/export/large/crate cost = 500 k_elasticity = 0 @@ -21,13 +24,13 @@ export_types = list(/obj/structure/ore_box) /datum/export/large/crate/wood - cost = 240 + cost = 140 unit_name = "wooden crate" export_types = list(/obj/structure/closet/crate/wooden) exclude_types = list() /datum/export/large/crate/coffin - cost = 250//50 wooden crates cost 2000 points, and you can make 10 coffins in seconds with those planks. Each coffin selling for 250 means you can make a net gain of 500 points for wasting your time making coffins. + cost = 150 unit_name = "coffin" export_types = list(/obj/structure/closet/crate/coffin) @@ -131,16 +134,48 @@ unit_name = "security barrier" export_types = list(/obj/item/grenade/barrier, /obj/structure/barricade/security) +/datum/export/large/frame + cost = 20 + unit_name = "structure frame" + export_types = list(/obj/structure/frame, /obj/structure/table_frame) + include_subtypes = TRUE + +/datum/export/large/pacman + cost = 125 + unit_name = "pacman" + export_types = list(/obj/machinery/power/port_gen/pacman) + +/datum/export/large/pacman + cost = 150 + unit_name = "super pacman" + export_types = list(/obj/machinery/power/port_gen/pacman/super) + +/datum/export/large/pacman + cost = 175 + unit_name = "mrs super pacman" + export_types = list(/obj/machinery/power/port_gen/pacman/mrs) + +/datum/export/large/hydroponics + cost = 120 + unit_name = "hydroponics tray" + export_types = list(/obj/machinery/hydroponics) + +/datum/export/large/nice_chair + cost = 12 + unit_name = "Padded Chair" + export_types = list(/obj/structure/chair/comfy) + /datum/export/large/gas_canister cost = 10 //Base cost of canister. You get more for nice gases inside. unit_name = "Gas Canister" export_types = list(/obj/machinery/portable_atmospherics/canister) + /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]*4 + worth += gases[/datum/gas/bz]*4 worth += gases[/datum/gas/stimulum]*25 worth += gases[/datum/gas/hypernoblium]*1000 worth += gases[/datum/gas/miasma]*15 @@ -149,86 +184,169 @@ worth += gases[/datum/gas/nitryl]*30 return worth -/datum/export/large/odysseus + +////////////// +//Matstatues// +////////////// + +/datum/export/large/nukestatue + cost = 175 + unit_name = "Nuke statue" + export_types = list(/obj/structure/statue/uranium/nuke) + +/datum/export/large/engstatue + cost = 175 + unit_name = "Engine statue" + export_types = list(/obj/structure/statue/uranium/eng) + +/datum/export/large/plasmastatue + cost = 720 + unit_name = "Scientist statue" + export_types = list(/obj/structure/statue/plasma/scientist) + +/datum/export/large/hosstatue + cost = 225 + unit_name = "HoS statue" + export_types = list(/obj/structure/statue/gold/hos) + +/datum/export/large/rdstatue + cost = 225 + unit_name = "RD statue" + export_types = list(/obj/structure/statue/gold/rd) + +/datum/export/large/hopstatue + cost = 225 + unit_name = "HoP statue" + export_types = list(/obj/structure/statue/gold/hop) + +/datum/export/large/cmostatue + cost = 225 + unit_name = "CMO statue" + export_types = list(/obj/structure/statue/gold/cmo) + +/datum/export/large/cestatue + cost = 225 + unit_name = "CE statue" + export_types = list(/obj/structure/statue/gold/ce) + +/datum/export/large/mdstatue + cost = 200 + unit_name = "MD statue" + export_types = list(/obj/structure/statue/silver/md) + +/datum/export/large/janitorstatue + cost = 200 + unit_name = "Janitor statue" + export_types = list(/obj/structure/statue/silver/janitor) + +/datum/export/large/secstatue + cost = 200 + unit_name = "Sec statue" + export_types = list(/obj/structure/statue/silver/sec) + +/datum/export/large/medborgstatue + cost = 200 + unit_name = "Medborg statue" + export_types = list(/obj/structure/statue/silver/medborg) + +/datum/export/large/secborgstatue + cost = 200 + unit_name = "Secborg statue" + export_types = list(/obj/structure/statue/silver/secborg) + +/datum/export/large/capstatue + cost = 1200 + unit_name = "Captain statue" + export_types = list(/obj/structure/statue/diamond/captain) + +/datum/export/large/aistatue + cost = 1200 + unit_name = "AI statue" + export_types = list(/obj/structure/statue/diamond/ai1, /obj/structure/statue/diamond/ai2) + +/datum/export/large/clownstatue + cost = 2750 + unit_name = "Clown statue" + export_types = list(/obj/structure/statue/bananium/clown) + +/datum/export/large/sandstatue + cost = 90 //Big cash + unit_name = "sandstone statue" + export_types = list(/obj/structure/statue/sandstone/assistant) + +//////////// +//MECHS///// +//////////// + +/datum/export/large/mech + include_subtypes = FALSE + +/datum/export/large/mech/odysseus cost = 5500 unit_name = "working odysseus" export_types = list(/obj/mecha/medical/odysseus) - include_subtypes = FALSE -/datum/export/large/ripley +/datum/export/large/mech/ripley cost = 6500 unit_name = "working ripley" export_types = list(/obj/mecha/working/ripley) - include_subtypes = FALSE -/datum/export/large/firefighter +/datum/export/large/mech/firefighter cost = 9000 unit_name = "working firefighter" export_types = list(/obj/mecha/working/ripley/firefighter) - include_subtypes = FALSE -/datum/export/large/gygax +/datum/export/large/mech/gygax cost = 19000 unit_name = "working gygax" export_types = list(/obj/mecha/combat/gygax) - include_subtypes = FALSE -/datum/export/large/durand +/datum/export/large/mech/durand cost = 10000 unit_name = "working durand" export_types = list(/obj/mecha/combat/durand) - include_subtypes = FALSE -/datum/export/large/phazon +/datum/export/large/mech/phazon cost = 25000 //Little over half do to needing a core unit_name = "working phazon" export_types = list(/obj/mecha/combat/phazon) - include_subtypes = FALSE -/datum/export/large/marauder +/datum/export/large/mech/marauder cost = 15000 //Still a Combat class mech - CC tech as well! 150% "normal" boundy price. unit_name = "working marauder" export_types = list(/obj/mecha/combat/marauder) - include_subtypes = FALSE -/datum/export/large/deathripley +/datum/export/large/mech/deathripley cost = 8500 //Still a "Combat class" mech - Illegal tech as well! 165% "normal" boundy price. unit_name = "working illegally modified" export_types = list(/obj/mecha/working/ripley/deathripley) - include_subtypes = FALSE -/datum/export/large/gygaxdark +/datum/export/large/mech/gygaxdark cost = 28500 //Still a Combat class mech - Illegal tech as well! 150% "normal" boundy price. unit_name = "working illegally modified gygax" export_types = list(/obj/mecha/combat/gygax/dark) - include_subtypes = FALSE -/datum/export/large/oldripley +/datum/export/large/mech/oldripley cost = 6250 //old mech - Scrap metal ! 50% "normal" boundy price. unit_name = "working miner ripley" export_types = list(/obj/mecha/working/ripley/mining) - include_subtypes = FALSE -/datum/export/large/honk +/datum/export/large/mech/honk cost = 12000 //Still a "Combat class" mech - Comats bordem honk! unit_name = "working honker" export_types = list(/obj/mecha/combat/honker) - include_subtypes = FALSE -/datum/export/large/reticence +/datum/export/large/mech/reticence cost = 12000 //Still a "Combat class" mech - Has cloking and lethal weaponds. unit_name = "working reticence" export_types = list(/obj/mecha/combat/reticence) - include_subtypes = FALSE -/datum/export/large/seraph +/datum/export/large/mech/seraph cost = 25500 //Still a Combat class mech - CC tech as well! 150% "normal" boundy price. unit_name = "working seraph" export_types = list(/obj/mecha/combat/marauder/seraph) - include_subtypes = FALSE -/datum/export/large/mauler +/datum/export/large/mech/mauler cost = 12000 //Still a Combat class mech - CC lethal weaponds. unit_name = "working legally modified marauder" export_types = list(/obj/mecha/combat/marauder/mauler) - include_subtypes = FALSE diff --git a/code/modules/cargo/exports/manifest.dm b/code/modules/cargo/exports/manifest.dm index d03f5a46ce..60515781f9 100644 --- a/code/modules/cargo/exports/manifest.dm +++ b/code/modules/cargo/exports/manifest.dm @@ -80,7 +80,7 @@ // Paper work done correctly /datum/export/paperwork_correct - cost = 150 + cost = 120 // finicky number 20 x 120 = 2400 per crate k_elasticity = 0 unit_name = "correct paperwork" export_types = list(/obj/item/folder/paperwork_correct) diff --git a/code/modules/cargo/exports/materials.dm b/code/modules/cargo/exports/materials.dm index 04dc76fd52..cd11660ed8 100644 --- a/code/modules/cargo/exports/materials.dm +++ b/code/modules/cargo/exports/materials.dm @@ -1,4 +1,5 @@ /datum/export/material + k_elasticity = 0 cost = 5 // Cost per MINERAL_MATERIAL_AMOUNT, which is 2000cm3 as of April 2016. message = "cm3 of developer's tears. Please, report this on github" var/material_id = null @@ -27,51 +28,56 @@ return round(amount/MINERAL_MATERIAL_AMOUNT) -// Materials. Nothing but plasma is really worth selling. Better leave it all to RnD and sell some plasma instead. +// Materials. Selling raw can lead to a big payout but takes a lot of work for miners to get a lot. Best to craft art/rnd gear /datum/export/material/bananium - cost = 1000 + cost = 500 material_id = MAT_BANANIUM message = "cm3 of bananium" /datum/export/material/diamond - cost = 500 + cost = 250 material_id = MAT_DIAMOND message = "cm3 of diamonds" /datum/export/material/plasma - cost = 200 + cost = 100 k_elasticity = 0 material_id = MAT_PLASMA message = "cm3 of plasma" /datum/export/material/uranium - cost = 100 + cost = 50 material_id = MAT_URANIUM message = "cm3 of uranium" /datum/export/material/gold - cost = 125 + cost = 60 material_id = MAT_GOLD message = "cm3 of gold" /datum/export/material/silver - cost = 50 + cost = 25 material_id = MAT_SILVER message = "cm3 of silver" /datum/export/material/titanium - cost = 125 + cost = 60 material_id = MAT_TITANIUM message = "cm3 of titanium" /datum/export/material/plastitanium - cost = 325 // plasma + titanium costs + cost = 165 // plasma + titanium costs material_id = MAT_TITANIUM // code can only check for one material_id; plastitanium is half plasma, half titanium message = "cm3 of plastitanium" -/datum/export/material/metal +/datum/export/material/plastic cost = 5 + material_id = MAT_PLASTIC + message = "cm3 of plastic" + +/datum/export/material/metal + cost = 3 message = "cm3 of metal" material_id = MAT_METAL export_types = list( @@ -79,7 +85,7 @@ /obj/item/stack/rods, /obj/item/stack/ore, /obj/item/coin) /datum/export/material/glass - cost = 5 + cost = 3 message = "cm3 of glass" material_id = MAT_GLASS export_types = list(/obj/item/stack/sheet/glass, /obj/item/stack/ore, diff --git a/code/modules/cargo/exports/orgains_robotics.dm b/code/modules/cargo/exports/orgains_robotics.dm new file mode 100644 index 0000000000..924d27c1d2 --- /dev/null +++ b/code/modules/cargo/exports/orgains_robotics.dm @@ -0,0 +1,141 @@ +// Orgains and Robotics exports. Hearts, new lims, implants, etc. + +/datum/export/robotics + include_subtypes = FALSE + k_elasticity = 0 //ALWAYS worth selling upgrades + +/datum/export/implant + include_subtypes = FALSE + k_elasticity = 0 //ALWAYS worth selling upgrades + +/datum/export/orgains + include_subtypes = TRUE + k_elasticity = 0 //ALWAYS worth selling orgains + +/datum/export/implant/autodoc + cost = 150 + unit_name = "autsurgeon" + export_types = list(/obj/item/autosurgeon) + include_subtypes = TRUE + +/datum/export/implant/implant + cost = 50 + unit_name = "implant" + export_types = list(/obj/item/implant) + include_subtypes = TRUE + +/datum/export/implant/cnsreboot + cost = 350 + unit_name = "anti drop implant" + export_types = list(/obj/item/organ/cyberimp/brain/anti_drop) + +/datum/export/implant/antistun + cost = 450 + unit_name = "rebooter implant" + export_types = list(/obj/item/organ/cyberimp/brain/anti_stun) + +/datum/export/implant/breathtube + cost = 150 + unit_name = "breath implant" + export_types = list(/obj/item/organ/cyberimp/mouth/breathing_tube) + +/datum/export/implant/hungerbgone + cost = 200 + unit_name = "nutriment implant" + export_types = list(/obj/item/organ/cyberimp/chest/nutriment) + +/datum/export/implant/hungerbgoneplus + cost = 300 + unit_name = "upgraded nutriment implant" + export_types = list(/obj/item/organ/cyberimp/chest/nutriment/plus) + +/datum/export/implant/reviver + cost = 350 + unit_name = "reviver implant" + export_types = list(/obj/item/organ/cyberimp/chest/reviver) + +/datum/export/implant/thrusters + cost = 150 + unit_name = "thrusters set implant" + export_types = list(/obj/item/organ/cyberimp/chest/thrusters) + +/datum/export/implant/thrusters + cost = 150 + unit_name = "thrusters set implant" + export_types = list(/obj/item/organ/cyberimp/chest/thrusters) + +/datum/export/implant/arm + cost = 200 + unit_name = "arm set implant" + export_types = list(/obj/item/organ/cyberimp/arm/toolset, /obj/item/organ/cyberimp/arm/surgery) + include_subtypes = TRUE + +/datum/export/implant/combatarm + cost = 800 + unit_name = "combat arm set implant" + export_types = list(/obj/item/organ/cyberimp/arm/gun/laser, /obj/item/organ/cyberimp/arm/gun/taser, /obj/item/organ/cyberimp/arm/esword, /obj/item/organ/cyberimp/arm/medibeam, /obj/item/organ/cyberimp/arm/combat, /obj/item/organ/cyberimp/arm/flash, /obj/item/organ/cyberimp/arm/baton) + include_subtypes = TRUE + +/datum/export/orgains/heart + cost = 250 + unit_name = "heart" + export_types = list(/obj/item/organ/heart) + exclude_types = list(/obj/item/organ/heart/cursed, /obj/item/organ/heart/cybernetic) + +/datum/export/orgains/tongue + cost = 75 + unit_name = "tongue" + export_types = list(/obj/item/organ/tongue) + +/datum/export/orgains/eyes + cost = 50 //So many things take your eyes out anyways + unit_name = "eyes" + export_types = list(/obj/item/organ/eyes) + exclude_types = list(/obj/item/organ/eyes/robotic) + +/datum/export/orgains/stomach + cost = 50 //can be replaced + unit_name = "stomach" + export_types = list(/obj/item/organ/stomach) + +/datum/export/orgains/lungs + cost = 150 + unit_name = "lungs" + export_types = list(/obj/item/organ/lungs) + exclude_types = list(/obj/item/organ/lungs/cybernetic, /obj/item/organ/lungs/cybernetic/upgraded) + +/datum/export/orgains/liver + cost = 175 + unit_name = "liver" + export_types = list(/obj/item/organ/liver) + exclude_types = list(/obj/item/organ/liver/cybernetic, /obj/item/organ/liver/cybernetic/upgraded) + +/datum/export/orgains/tail //Shhh + cost = 500 + unit_name = "error shipment failer" + export_types = list(/obj/item/organ/tail) + +/datum/export/orgains/vocal_cords + cost = 500 + unit_name = "vocal cords" + export_types = list(/obj/item/organ/vocal_cords) //These are gotten via different races + +/datum/export/robotics/lims + cost = 30 + unit_name = "robotic lim replacement" + export_types = list(/obj/item/bodypart/l_arm/robot, /obj/item/bodypart/r_arm/robot, /obj/item/bodypart/l_leg/robot, /obj/item/bodypart/r_leg/robot, /obj/item/bodypart/chest/robot, /obj/item/bodypart/head/robot) + +/datum/export/robotics/surpluse + cost = 40 + unit_name = "robotic lim replacement" + export_types = list(/obj/item/bodypart/l_arm/robot/surplus, /obj/item/bodypart/r_arm/robot/surplus, /obj/item/bodypart/l_leg/robot/surplus, /obj/item/bodypart/r_leg/robot/surplus) + +/datum/export/robotics/surplus_upgraded + cost = 50 + unit_name = "upgraded robotic lim replacement" + export_types = list(/obj/item/bodypart/l_arm/robot/surplus_upgraded, /obj/item/bodypart/r_arm/robot/surplus_upgraded, /obj/item/bodypart/l_leg/robot/surplus_upgraded, /obj/item/bodypart/r_leg/robot/surplus_upgraded) + +/datum/export/robotics/surgery_gear_basic + cost = 5 + 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) diff --git a/code/modules/cargo/exports/parts.dm b/code/modules/cargo/exports/parts.dm index e6fda5f6b1..b505bb5da4 100644 --- a/code/modules/cargo/exports/parts.dm +++ b/code/modules/cargo/exports/parts.dm @@ -6,16 +6,96 @@ export_types = list(/obj/item/solar_assembly) /datum/export/solar/tracker_board - cost = 100 + cost = 30 unit_name = "solar tracker board" export_types = list(/obj/item/electronics/tracker) /datum/export/solar/control_board - cost = 150 + cost = 75 unit_name = "solar panel control board" export_types = list(/obj/item/circuitboard/computer/solar_control) /datum/export/swarmer - cost = 2000 + cost = 500 unit_name = "deactivated alien deconstruction drone" export_types = list(/obj/item/deactivated_swarmer) + +//Board + +/datum/export/board + cost = 5 + unit_name = "circuit board" + export_types = list(/obj/item/circuitboard) + include_subtypes = TRUE + +/datum/export/board/SMES + cost = 20 + k_elasticity = 1/2 //Only a few + unit_name = "smes board" + export_types = list(/obj/item/circuitboard/machine/smes) + +//Stock Parts + +/datum/export/subspace + cost = 3 + unit_name = "subspace part" + export_types = list(/obj/item/stock_parts/subspace) + include_subtypes = TRUE + +/datum/export/t1 + cost = 1 + unit_name = "basic stock part" + export_types = list(/obj/item/stock_parts/capacitor, /obj/item/stock_parts/scanning_module, /obj/item/stock_parts/manipulator, /obj/item/stock_parts/micro_laser, /obj/item/stock_parts/matter_bin) + +/datum/export/t2 + cost = 2 + unit_name = "upgraded stock part" + export_types = list(/obj/item/stock_parts/capacitor/adv, /obj/item/stock_parts/scanning_module/adv, /obj/item/stock_parts/manipulator/nano, /obj/item/stock_parts/micro_laser/high, /obj/item/stock_parts/matter_bin/adv) + +/datum/export/t3 + cost = 3 + unit_name = "advanced stock part" + export_types = list(/obj/item/stock_parts/capacitor/super, /obj/item/stock_parts/scanning_module/phasic, /obj/item/stock_parts/manipulator/pico, /obj/item/stock_parts/micro_laser/ultra, /obj/item/stock_parts/matter_bin/super) + +/datum/export/t4 + cost = 4 + unit_name = "blue space stock part" + export_types = list(/obj/item/stock_parts/capacitor/quadratic, /obj/item/stock_parts/scanning_module/triphasic, /obj/item/stock_parts/manipulator/femto, /obj/item/stock_parts/micro_laser/quadultra, /obj/item/stock_parts/matter_bin/bluespace) + +//Cells + +/datum/export/cell + cost = 5 + unit_name = "power cell" + export_types = list(/obj/item/stock_parts/cell) + include_subtypes = TRUE + +/datum/export/cell + cost = 10 + unit_name = "upgraded power cell" + export_types = list(/obj/item/stock_parts/cell/upgraded, /obj/item/stock_parts/cell/upgraded/plus) + +/datum/export/cellhigh + cost = 15 + unit_name = "high power cell" + export_types = list(/obj/item/stock_parts/cell/high, /obj/item/stock_parts/cell/high/plus) + +/datum/export/cellhyper + cost = 20 + unit_name = "super-capacity power cell" + export_types = list(/obj/item/stock_parts/cell/super, /obj/item/stock_parts/cell/hyper) + +/datum/export/cellbs + cost = 25 + unit_name = "bluespace power cell" + export_types = list(/obj/item/stock_parts/cell/bluespace) + +/datum/export/cellyellow + cost = 40 + unit_name = "slime power cell" + export_types = list(/obj/item/stock_parts/cell/high/slime) + +/datum/export/cellyellowhyper + cost = 120 //Takes a lot to make and is really good + unit_name = "hyper slime power cell" + export_types = list(/obj/item/stock_parts/cell/high/slime/hypercharged) \ No newline at end of file diff --git a/code/modules/cargo/exports/sheets.dm b/code/modules/cargo/exports/sheets.dm index 708eb34133..8397a7dc1f 100644 --- a/code/modules/cargo/exports/sheets.dm +++ b/code/modules/cargo/exports/sheets.dm @@ -1,5 +1,6 @@ /datum/export/stack unit_name = "sheet" + k_elasticity = 0 /datum/export/stack/get_amount(obj/O) var/obj/item/stack/S = O @@ -9,47 +10,52 @@ // Hides +/datum/export/stack/leather + cost = 30 + unit_name = "leather" + export_types = list(/obj/item/stack/sheet/leather) + /datum/export/stack/skin/monkey - cost = 50 + cost = 30 unit_name = "monkey hide" export_types = list(/obj/item/stack/sheet/animalhide/monkey) /datum/export/stack/skin/human - cost = 100 + cost = 70 export_category = EXPORT_CONTRABAND unit_name = "piece" message = "of human skin" export_types = list(/obj/item/stack/sheet/animalhide/human) /datum/export/stack/skin/goliath_hide - cost = 200 + cost = 160 unit_name = "goliath hide" export_types = list(/obj/item/stack/sheet/animalhide/goliath_hide) /datum/export/stack/skin/cat - cost = 150 + cost = 120 export_category = EXPORT_CONTRABAND unit_name = "cat hide" export_types = list(/obj/item/stack/sheet/animalhide/cat) /datum/export/stack/skin/corgi - cost = 200 + cost = 140 export_category = EXPORT_CONTRABAND unit_name = "corgi hide" export_types = list(/obj/item/stack/sheet/animalhide/corgi) /datum/export/stack/skin/lizard - cost = 150 + cost = 50 unit_name = "lizard hide" export_types = list(/obj/item/stack/sheet/animalhide/lizard) /datum/export/stack/skin/gondola - cost = 5000 + cost = 1000 unit_name = "gondola hide" export_types = list(/obj/item/stack/sheet/animalhide/gondola) /datum/export/stack/skin/xeno - cost = 500 + cost = 300 unit_name = "alien hide" export_types = list(/obj/item/stack/sheet/animalhide/xeno) @@ -57,23 +63,23 @@ // For base materials, see materials.dm /datum/export/stack/plasteel - cost = 155 // 2000u of plasma + 2000u of metal. + cost = 105 // 2000u of plasma + 2000u of metal. message = "of plasteel" export_types = list(/obj/item/stack/sheet/plasteel) // 1 glass + 0.5 metal, cost is rounded up. /datum/export/stack/rglass - cost = 8 + cost = 6 message = "of reinforced glass" export_types = list(/obj/item/stack/sheet/rglass) /datum/export/stack/bscrystal - cost = 300 + cost = 150 message = "of bluespace crystals" export_types = list(/obj/item/stack/sheet/bluespace_crystal) /datum/export/stack/wood - cost = 30 + cost = 15 unit_name = "wood plank" export_types = list(/obj/item/stack/sheet/mineral/wood) @@ -93,16 +99,50 @@ unit_name = "cable piece" export_types = list(/obj/item/stack/cable_coil) +/datum/export/stack/cloth + cost = 10 + unit_name = "sheets" + message = "of cloth" + export_types = list(/obj/item/stack/sheet/cloth) + +/datum/export/stack/duracloth + cost = 40 + unit_name = "sheets" + message = "of duracloth" + export_types = list(/obj/item/stack/sheet/durathread) + // Weird Stuff /datum/export/stack/abductor - cost = 1000 + cost = 400 message = "of alien alloy" export_types = list(/obj/item/stack/sheet/mineral/abductor) /datum/export/stack/adamantine unit_name = "bar" - cost = 500 + cost = 250 message = "of adamantine" export_types = list(/obj/item/stack/sheet/mineral/adamantine) +/datum/export/stack/bone + cost = 20 + message = "of bones" + export_types = list(/obj/item/stack/sheet/bone) + +/datum/export/stack/bronze + unit_name = "tiles" + cost = 5 + message = "of brozne" + export_types = list(/obj/item/stack/tile/bronze) + +/datum/export/stack/brass + unit_name = "tiles" + cost = 50 + message = "of brass" + export_types = list(/obj/item/stack/tile/brass) + +/datum/export/stack/paper + unit_name = "sheets" + cost = 30 + message = "of paperframes" + export_types = list(/obj/item/stack/sheet/paperframes) \ No newline at end of file diff --git a/code/modules/cargo/exports/tools.dm b/code/modules/cargo/exports/tools.dm index 9e58e4ba95..4984bfe9b9 100644 --- a/code/modules/cargo/exports/tools.dm +++ b/code/modules/cargo/exports/tools.dm @@ -1,5 +1,5 @@ /datum/export/toolbox - cost = 4 + cost = 6 unit_name = "toolbox" export_types = list(/obj/item/storage/toolbox) @@ -8,7 +8,80 @@ // electrical toolbox: 36cr // robust: priceless +// Adv tools + +/datum/export/gear/powerdrill + cost = 25 + k_elasticity = 1/40 //Market can only take so much + unit_name = "power tool" + export_types = list(/obj/item/crowbar/power, /obj/item/screwdriver/power, \ + /obj/item/weldingtool/experimental, /obj/item/wirecutters/power, /obj/item/wrench/power) + include_subtypes = TRUE + +/datum/export/gear/advtool + cost = 175 + k_elasticity = 0 //Only known to be made by 2 station, market is hungery for it + unit_name = "adv tool" + export_types = list(/obj/item/crowbar/advanced, /obj/item/crowbar/abductor, /obj/item/screwdriver/abductor, /obj/item/screwdriver/advanced, \ + /obj/item/weldingtool/abductor, /obj/item/weldingtool/advanced, /obj/item/wirecutters/abductor, /obj/item/wirecutters/advanced, \ + /obj/item/wrench/abductor, /obj/item/wrench/advanced) + include_subtypes = TRUE + +// Lights/Eletronic + +/datum/export/lights + cost = 10 + unit_name = "light fixer" + export_types = list(/obj/item/wallframe/light_fixture) + include_subtypes = TRUE + +/datum/export/apc_board + cost = 5 + unit_name = "apc electronics" + export_types = list(/obj/item/electronics/apc) + include_subtypes = TRUE + +/datum/export/apc_frame + cost = 3 + unit_name = "apc frame" + export_types = list(/obj/item/wallframe/apc) + include_subtypes = TRUE + +/datum/export/floodlights + cost = 15 + unit_name = "floodlight fixer" + export_types = list(/obj/structure/floodlight_frame) + include_subtypes = TRUE + +/datum/export/bolbstubes + cost = 1 //Time + unit_name = "light replacement" + export_types = list(/obj/item/light/tube, /obj/item/light/bulb) + +/datum/export/lightreplacer + cost = 20 + unit_name = "lightreplacer" + export_types = list(/obj/item/lightreplacer) + // Basic tools +/datum/export/basicmining + cost = 20 + unit_name = "basic mining tool" + export_types = list(/obj/item/pickaxe, /obj/item/pickaxe/mini, /obj/item/shovel, /obj/item/resonator) + include_subtypes = FALSE + +/datum/export/upgradedmining + cost = 50 + unit_name = "mining tool" + export_types = list(/obj/item/pickaxe/silver, /obj/item/pickaxe/drill, /obj/item/gun/energy/plasmacutter, /obj/item/resonator/upgraded) + include_subtypes = FALSE + +/datum/export/advdmining + cost = 150 + unit_name = "advanced mining tool" + export_types = list(/obj/item/pickaxe/diamond, /obj/item/pickaxe/drill/diamonddrill, /obj/item/pickaxe/drill/jackhammer, /obj/item/gun/energy/plasmacutter/adv) + include_subtypes = FALSE + /datum/export/screwdriver cost = 2 unit_name = "screwdriver" @@ -31,7 +104,6 @@ message = "of wirecutters" export_types = list(/obj/item/wirecutters) - /datum/export/weldingtool cost = 5 unit_name = "welding tool" @@ -48,9 +120,8 @@ unit_name = "industrial welding tool" export_types = list(/obj/item/weldingtool/largetank, /obj/item/weldingtool/hugetank) - /datum/export/extinguisher - cost = 15 + cost = 10 unit_name = "fire extinguisher" export_types = list(/obj/item/extinguisher) include_subtypes = FALSE @@ -60,9 +131,8 @@ unit_name = "pocket fire extinguisher" export_types = list(/obj/item/extinguisher/mini) - /datum/export/flashlight - cost = 5 + cost = 3 unit_name = "flashlight" export_types = list(/obj/item/flashlight) include_subtypes = FALSE @@ -73,11 +143,10 @@ export_types = list(/obj/item/flashlight/flare) /datum/export/flashlight/seclite - cost = 10 + cost = 5 unit_name = "seclite" export_types = list(/obj/item/flashlight/seclite) - /datum/export/analyzer cost = 5 unit_name = "analyzer" @@ -88,14 +157,12 @@ unit_name = "t-ray scanner" export_types = list(/obj/item/t_scanner) - /datum/export/radio cost = 5 unit_name = "radio" export_types = list(/obj/item/radio) exclude_types = list(/obj/item/radio/mech) - /datum/export/rcd cost = 100 unit_name = "rapid construction device" @@ -111,6 +178,21 @@ unit_name = "rapid piping device" export_types = list(/obj/item/pipe_dispenser) +/datum/export/rld + cost = 150 + unit_name = "rapid light device" + export_types = list(/obj/item/construction/rld) + +/datum/export/rped + cost = 100 + unit_name = "rapid part exchange device" + export_types = list(/obj/item/storage/part_replacer) + +/datum/export/bsrped + cost = 200 + unit_name = "blue space part exchange device" + export_types = list(/obj/item/storage/part_replacer/bluespace) + /datum/export/singulo //failsafe in case someone decides to ship a live singularity to CentCom without the corresponding bounty cost = 1 unit_name = "singularity" diff --git a/code/modules/cargo/exports/weapons.dm b/code/modules/cargo/exports/weapons.dm index bad221c3ac..97dd9c10aa 100644 --- a/code/modules/cargo/exports/weapons.dm +++ b/code/modules/cargo/exports/weapons.dm @@ -3,6 +3,26 @@ /datum/export/weapon include_subtypes = FALSE +/datum/export/weapon/makeshift_shield + cost = 30 + unit_name = "unknown shield" + export_types = list(/obj/item/shield/riot, /obj/item/shield/riot/roman, /obj/item/shield/riot/buckler, /obj/item/shield/makeshift) + +/datum/export/weapon/riot_shield + cost = 50 + unit_name = "riot shield" + export_types = list(/obj/item/shield/riot, /obj/item/shield/riot/tower) + +/datum/export/weapon/riot_shield + cost = 70 + unit_name = "flash shield" + export_types = list(/obj/item/assembly/flash/shield) + +/datum/export/weapon/tele_shield + cost = 100 + unit_name = "tele shield" + export_types = list(/obj/item/shield/riot/tele, /obj/item/shield/energy) + /datum/export/weapon/baton cost = 100 unit_name = "stun baton" @@ -15,7 +35,6 @@ unit_name = "combat knife" export_types = list(/obj/item/kitchen/knife/combat) - /datum/export/weapon/taser cost = 200 unit_name = "advanced taser" @@ -27,26 +46,25 @@ export_types = list(/obj/item/gun/energy/laser) /datum/export/weapon/disabler - cost = 100 + cost = 50 unit_name = "disabler" export_types = list(/obj/item/gun/energy/disabler) /datum/export/weapon/energy_gun - cost = 300 + cost = 200 unit_name = "energy gun" export_types = list(/obj/item/gun/energy/e_gun) /datum/export/weapon/wt550 - cost = 300 + cost = 130 unit_name = "WT-550 automatic rifle" export_types = list(/obj/item/gun/ballistic/automatic/wt550) /datum/export/weapon/shotgun - cost = 300 + cost = 200 unit_name = "combat shotgun" export_types = list(/obj/item/gun/ballistic/shotgun/automatic/combat) - /datum/export/weapon/flashbang cost = 5 unit_name = "flashbang grenade" @@ -57,7 +75,6 @@ unit_name = "tear gas grenade" export_types = list(/obj/item/grenade/chem_grenade/teargas) - /datum/export/weapon/flash cost = 5 unit_name = "handheld flash" @@ -69,3 +86,271 @@ unit_name = "pair" message = "of handcuffs" export_types = list(/obj/item/restraints/handcuffs) + +////////////// +//RND Guns//// +////////////// + +/datum/export/weapon/lasercarbine + cost = 120 + unit_name = "laser carbine" + export_types = list(/obj/item/gun/energy/laser/carbine) + include_subtypes = TRUE + +/datum/export/weapon/teslagun + cost = 130 + unit_name = "tesla revolver" + export_types = list(/obj/item/gun/energy/tesla_revolver) + +/datum/export/weapon/aeg + cost = 200 //Endless power + unit_name = "advance engery gun" + export_types = list(/obj/item/gun/energy/e_gun/nuclear) + +/datum/export/weapon/deconer + cost = 600 + unit_name = "deconer" + export_types = list(/obj/item/gun/energy/decloner) + +/datum/export/weapon/ntsniper + cost = 500 + unit_name = "beam rifle" + export_types = list(/obj/item/gun/energy/beam_rifle) + +/datum/export/weapon/needle_gun + cost = 50 + unit_name = "syringe revolver" + export_types = list(/obj/item/gun/syringe/rapidsyringe) + +/datum/export/weapon/temp_gun + cost = 175 //Its just smaller + unit_name = "small temperature gun" + k_elasticity = 1/5 //Its just a smaller temperature gun, easy to mass make + export_types = list(/obj/item/gun/energy/temperature) + +/datum/export/weapon/flowergun + cost = 100 + unit_name = "floral somatoray" + export_types = list(/obj/item/gun/energy/floragun) + +/datum/export/weapon/xraygun + cost = 300 //Wall hacks + unit_name = "x ray gun" + export_types = list(/obj/item/gun/energy/xray) + +/datum/export/weapon/ioncarbine + cost = 200 + k_elasticity = 1/5 //Its just a smaller temperature gun, easy to mass make + unit_name = "ion carbine" + export_types = list(/obj/item/gun/energy/ionrifle/carbine) + +/datum/export/weapon/largeebow + cost = 500 + unit_name = "crossbow" + export_types = list(/obj/item/gun/energy/kinetic_accelerator/crossbow/large) + +/datum/export/weapon/largebomb + cost = 20 + unit_name = "large grenade" + export_types = list(/obj/item/grenade/chem_grenade/large) + +/datum/export/weapon/gravworm + cost = 150 + unit_name = "bluespace weapon" + export_types = list(/obj/item/gun/energy/wormhole_projector, /obj/item/gun/energy/gravity_gun) + +/datum/export/weapon/cryopryo + cost = 70 + unit_name = "heat based grenade" + export_types = list(/obj/item/grenade/chem_grenade/pyro, /obj/item/grenade/chem_grenade/cryo) + +/datum/export/weapon/advgrenade + cost = 80 + unit_name = "advanced grenade" + export_types = list(/obj/item/grenade/chem_grenade/adv_release) + +///////////////// +//Ammo and Pins// +///////////////// + +/datum/export/weapon/wtammo + cost = 10 + unit_name = "WT-550 automatic rifle ammo" + export_types = list(/obj/item/ammo_box/magazine/wt550m9, /obj/item/ammo_box/magazine/wt550m9/wtrubber) + +/datum/export/weapon/wtammo/advanced + cost = 30 + unit_name = "advanced WT-550 automatic rifle ammo" + export_types = list( /obj/item/ammo_box/magazine/wt550m9/wtap, /obj/item/ammo_box/magazine/wt550m9/wttx, /obj/item/ammo_box/magazine/wt550m9/wtic) + +/datum/export/weapon/mindshield + cost = 80 + unit_name = "mindshield locked pin" + export_types = list(/obj/item/firing_pin/implant/mindshield) + +/datum/export/weapon/testrange + cost = 20 + unit_name = "test range pin" + export_types = list(/obj/item/firing_pin/test_range) + +/datum/export/weapon/techslug + cost = 15 + k_elasticity = 0 + unit_name = "advanced shotgun shell" + export_types = list(/obj/item/ammo_casing/shotgun/dragonsbreath, /obj/item/ammo_casing/shotgun/meteorslug, /obj/item/ammo_casing/shotgun/pulseslug, /obj/item/ammo_casing/shotgun/frag12, /obj/item/ammo_casing/shotgun/ion, /obj/item/ammo_casing/shotgun/laserslug) + +///////////////////////// +//The Traitor Sell Outs// +///////////////////////// + +/datum/export/weapon/pistol + cost = 120 + unit_name = "illegal firearm" + export_types = list(/obj/item/gun/ballistic/automatic/pistol) + +/datum/export/weapon/revolver + cost = 200 + unit_name = "large handgun" + export_types = list(/obj/item/gun/ballistic/revolver/syndie) + +/datum/export/weapon/rocketlauncher + cost = 1000 + unit_name = "rocketlauncher" + export_types = list(/obj/item/gun/ballistic/rocketlauncher) + +/datum/export/weapon/antitank + cost = 300 + unit_name = "hand cannon" + export_types = list(/obj/item/gun/ballistic/automatic/pistol/antitank/syndicate) + +/datum/export/weapon/clownstuff + cost = 500 + unit_name = "clown war tech" + export_types = list(/obj/item/pneumatic_cannon/pie/selfcharge, /obj/item/shield/energy/bananium, /obj/item/melee/transforming/energy/sword/bananium, ) + +/datum/export/weapon/bulldog + cost = 400 + unit_name = "drum loaded shotgun" + export_types = list(/obj/item/gun/ballistic/automatic/shotgun/bulldog) + +/datum/export/weapon/smg + cost = 350 + unit_name = "automatic c-20r" + export_types = list(/obj/item/gun/ballistic/automatic/c20r) + +/datum/export/weapon/duelsaber + cost = 360 //Get it? + unit_name = "energy saber" + export_types = list(/obj/item/twohanded/dualsaber) + +/datum/export/weapon/esword + cost = 130 + unit_name = "energy sword" + export_types = list(/obj/item/melee/transforming/energy/sword/cx/traitor, /obj/item/melee/transforming/energy/sword/saber) + +/datum/export/weapon/rapier + cost = 150 + unit_name = "rapier" + export_types = list(/obj/item/storage/belt/sabre/rapier) + +/datum/export/weapon/flamer + cost = 20 //welder + some rods cheap + unit_name = "flamethrower" + export_types = list(/obj/item/flamethrower) + +/datum/export/weapon/gloves + cost = 90 + unit_name = "star struck gloves" + export_types = list(/obj/item/clothing/gloves/rapid) + +/datum/export/weapon/l6 + cost = 500 + unit_name = "law 6 saw" + export_types = list(/obj/item/gun/ballistic/automatic/l6_saw) + +/datum/export/weapon/m90 + cost = 400 + unit_name = "assault class weapon" + export_types = list(/obj/item/gun/ballistic/automatic/m90) + +/datum/export/weapon/powerglove + cost = 100 + unit_name = "hydraulic glove" + export_types = list(/obj/item/melee/powerfist) + +/datum/export/weapon/sniper + cost = 750 + unit_name = ".50 sniper" + export_types = list(/obj/item/gun/ballistic/automatic/sniper_rifle/syndicate) + +/datum/export/weapon/ebow + cost = 600 + unit_name = "mini crossbow" + export_types = list(/obj/item/gun/energy/kinetic_accelerator/crossbow) + +/datum/export/weapon/m10mm + cost = 10 + unit_name = "10mm magazine" + export_types = list(/obj/item/ammo_box/magazine/m10mm) + include_subtypes = TRUE + +/datum/export/weapon/dj_a_bomb + cost = 100 + unit_name = "40mm shell" + export_types = list(/obj/item/ammo_casing/a40mm) + +/datum/export/weapon/point50mags + cost = 50 + unit_name = ".50 magazine" + export_types = list(/obj/item/ammo_box/magazine/sniper_rounds) + include_subtypes = TRUE + +/datum/export/weapon/smg_mag + cost = 45 + unit_name = "smg magazine" + export_types = list(/obj/item/ammo_box/magazine/smgm45, /obj/item/ammo_box/magazine/m556) + +/datum/export/weapon/l6sawammo + cost = 60 + unit_name = "law 6 saw ammo box" + export_types = list(/obj/item/ammo_box/magazine/mm195x129) + include_subtypes = TRUE + +/datum/export/weapon/rocket + cost = 120 + unit_name = "rocket" + export_types = list(/obj/item/ammo_casing/caseless/rocket) + include_subtypes = TRUE + +/datum/export/weapon/ninemmammo + cost = 20 + unit_name = "9mm ammo magazine" + export_types = list(/obj/item/ammo_box/magazine/pistolm9mm) + +/datum/export/weapon/fletcher_ammo + cost = 60 + unit_name = "illegal ammo magazines" + export_types = list(/obj/item/ammo_box/magazine/flechette) + include_subtypes = TRUE + +/datum/export/weapon/dj_a_pizzabomb + cost = -6000 + unit_name = "Repair Costs" + export_types = list(/obj/item/pizzabox/bomb, /obj/item/sbeacondrop/bomb) + +/datum/export/weapon/real_toolbox + cost = 600 + unit_name = "golden toolbox" + export_types = list(/obj/item/storage/toolbox/gold_real) + +/datum/export/weapon/melee + cost = 30 + unit_name = "unlisted weapon" + export_types = list(/obj/item/melee) + include_subtypes = TRUE + +/datum/export/weapon/gun + cost = 30 + unit_name = "unlisted weapon" + export_types = list(/obj/item/gun) + include_subtypes = TRUE \ No newline at end of file diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 1087f1ebb5..89c463f3e3 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -36,2821 +36,3 @@ else for(var/item in contains) new item(C) - -// If you add something to this list, please group it by type and sort it alphabetically instead of just jamming it in like an animal - -////////////////////////////////////////////////////////////////////////////// -//////////////////////////// Emergency /////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -/datum/supply_pack/emergency - group = "Emergency" - -/datum/supply_pack/emergency/vehicle - name = "Biker Gang Kit" //TUNNEL SNAKES OWN THIS TOWN - desc = "TUNNEL SNAKES OWN THIS TOWN. Contains an unbranded All Terrain Vehicle, and a complete gang outfit -- consists of black gloves, a menacing skull bandanna, and a SWEET leather overcoat!" - cost = 2000 - contraband = TRUE - contains = list(/obj/vehicle/ridden/atv, - /obj/item/key, - /obj/item/clothing/suit/jacket/leather/overcoat, - /obj/item/clothing/gloves/color/black, - /obj/item/clothing/head/soft, - /obj/item/clothing/mask/bandana/skull)//so you can properly #cargoniabikergang - crate_name = "Biker Kit" - crate_type = /obj/structure/closet/crate/large - -/datum/supply_pack/emergency/equipment - name = "Emergency Bot/Internals Crate" - desc = "Explosions got you down? These supplies are guaranteed to patch up holes, in stations and people alike! Comes with two floorbots, two medbots, five oxygen masks and five small oxygen tanks." - cost = 3500 - contains = list(/mob/living/simple_animal/bot/floorbot, - /mob/living/simple_animal/bot/floorbot, - /mob/living/simple_animal/bot/medbot, - /mob/living/simple_animal/bot/medbot, - /obj/item/tank/internals/air, - /obj/item/tank/internals/air, - /obj/item/tank/internals/air, - /obj/item/tank/internals/air, - /obj/item/tank/internals/air, - /obj/item/clothing/mask/gas, - /obj/item/clothing/mask/gas, - /obj/item/clothing/mask/gas, - /obj/item/clothing/mask/gas, - /obj/item/clothing/mask/gas) - crate_name = "emergency crate" - crate_type = /obj/structure/closet/crate/internals - -/datum/supply_pack/emergency/radiatione_emergency - name = "Emergenc Radiation Protection Crate" - desc = "Survive the Nuclear Apocalypse and Supermatter Engine alike with two sets of Radiation suits. Each set contains a helmet, suit, and Geiger counter. We'll even throw in a few pill bottles that are able to handles radiation and the affects of the poisoning." - cost = 2500 - contains = list(/obj/item/clothing/head/radiation, - /obj/item/clothing/head/radiation, - /obj/item/clothing/suit/radiation, - /obj/item/clothing/suit/radiation, - /obj/item/geiger_counter, - /obj/item/geiger_counter, - /obj/item/storage/pill_bottle/mutarad, - /obj/item/storage/firstaid/radbgone) - crate_name = "radiation protection crate" - crate_type = /obj/structure/closet/crate/radiation - -/datum/supply_pack/emergency/rcds - name = "Emergency RCDs" - desc = "Bombs going off on station? SME blown and now you need to fix the hole it left behind? Well this crate has a pare of Rcds to be able to easily fix up any problem you may have!" - cost = 1500 - contains = list(/obj/item/construction/rcd, - /obj/item/construction/rcd) - crate_name = "emergency rcds" - crate_type = /obj/structure/closet/crate/internals - -/datum/supply_pack/emergency/soft_suit - name = "Emergency Space Suit " - desc = "Is there bombs going off left and right? Is there meteors shooting around the station? Well we have two fragile space suit for emergencys as well as air and masks." - cost = 1000 - contains = list(/obj/item/tank/internals/air, - /obj/item/tank/internals/air, - /obj/item/clothing/mask/gas, - /obj/item/clothing/mask/gas, - /obj/item/clothing/suit/space/fragile, - /obj/item/clothing/suit/space/fragile, - /obj/item/clothing/head/helmet/space/fragile, - /obj/item/clothing/head/helmet/space/fragile) - crate_name = "emergency crate" - crate_type = /obj/structure/closet/crate/internals - -/datum/supply_pack/emergency/firefighting - name = "Firefighting Crate" - desc = "Only you can prevent station fires. Partner up with two firefighter suits, gas masks, flashlights, large oxygen tanks, extinguishers, and hardhats!" - cost = 1000 - contains = list(/obj/item/clothing/suit/fire/firefighter, - /obj/item/clothing/suit/fire/firefighter, - /obj/item/clothing/mask/gas, - /obj/item/clothing/mask/gas, - /obj/item/flashlight, - /obj/item/flashlight, - /obj/item/tank/internals/oxygen/red, - /obj/item/tank/internals/oxygen/red, - /obj/item/extinguisher/advanced, - /obj/item/extinguisher/advanced, - /obj/item/clothing/head/hardhat/red, - /obj/item/clothing/head/hardhat/red) - crate_name = "firefighting crate" - -/datum/supply_pack/emergency/atmostank - name = "Firefighting Tank Backpack" - desc = "Mow down fires with this high-capacity fire fighting tank backpack. Requires Atmospherics access to open." - cost = 1000 - access = ACCESS_ATMOSPHERICS - contains = list(/obj/item/watertank/atmos) - crate_name = "firefighting backpack crate" - crate_type = /obj/structure/closet/crate/secure - -/datum/supply_pack/emergency/internals - name = "Internals Crate" - desc = "Master your life energy and control your breathing with three breath masks, three emergency oxygen tanks and three large air tanks."//IS THAT A - cost = 1000 - contains = list(/obj/item/clothing/mask/gas, - /obj/item/clothing/mask/gas, - /obj/item/clothing/mask/gas, - /obj/item/clothing/mask/breath, - /obj/item/clothing/mask/breath, - /obj/item/clothing/mask/breath, - /obj/item/tank/internals/emergency_oxygen, - /obj/item/tank/internals/emergency_oxygen, - /obj/item/tank/internals/emergency_oxygen, - /obj/item/tank/internals/air, - /obj/item/tank/internals/air, - /obj/item/tank/internals/air) - crate_name = "internals crate" - crate_type = /obj/structure/closet/crate/internals - -/datum/supply_pack/emergency/metalfoam - name = "Metal Foam Grenade Crate" - desc = "Seal up those pesky hull breaches with 14 Metal Foam Grenades." - cost = 2000 - contains = list(/obj/item/storage/box/metalfoam, - /obj/item/storage/box/metalfoam) - crate_name = "metal foam grenade crate" - -/datum/supply_pack/emergency/syndicate - name = "NULL_ENTRY" - desc = "(#@&^$THIS PACKAGE CONTAINS 30TC WORTH OF SOME RANDOM SYNDICATE GEAR WE HAD LYING AROUND THE WAREHOUSE. GIVE EM HELL, OPERATIVE@&!*() " - hidden = TRUE - cost = 20000 - contains = list() - crate_name = "emergency crate" - crate_type = /obj/structure/closet/crate/internals - dangerous = TRUE - -/datum/supply_pack/emergency/syndicate/fill(obj/structure/closet/crate/C) - var/crate_value = 30 - 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_nullcrates || prob(100 - I.surplus_nullcrates)) - continue - if(crate_value < I.cost) - continue - crate_value -= I.cost - new I.item(C) - -/datum/supply_pack/emergency/plasma_spacesuit - name = "Plasmaman Space Envirosuits" - desc = "Contains two space-worthy envirosuits for Plasmamen. Order now and we'll throw in two free helmets! Requires EVA access to open." - cost = 4000 - access = ACCESS_EVA - contains = list(/obj/item/clothing/suit/space/eva/plasmaman, - /obj/item/clothing/suit/space/eva/plasmaman, - /obj/item/clothing/head/helmet/space/plasmaman, - /obj/item/clothing/head/helmet/space/plasmaman) - crate_name = "plasmaman EVA crate" - crate_type = /obj/structure/closet/crate/secure - -/datum/supply_pack/emergency/plasmaman - name = "Plasmaman Supply Kit" - desc = "Keep those Plasmamen alive with two sets of Plasmaman outfits. Each set contains a plasmaman jumpsuit, internals tank, and helmet." - cost = 2000 - contains = list(/obj/item/clothing/under/plasmaman, - /obj/item/clothing/under/plasmaman, - /obj/item/tank/internals/plasmaman/belt/full, - /obj/item/tank/internals/plasmaman/belt/full, - /obj/item/clothing/head/helmet/space/plasmaman, - /obj/item/clothing/head/helmet/space/plasmaman) - crate_name = "plasmaman supply kit" - -/datum/supply_pack/emergency/radiation - name = "Radiation Protection Crate" - desc = "Survive the Nuclear Apocalypse and Supermatter Engine alike with two sets of Radiation suits. Each set contains a helmet, suit, and Geiger counter. We'll even throw in a bottle of vodka and some glasses too, considering the life-expectancy of people who order this." - cost = 1000 - contains = list(/obj/item/clothing/head/radiation, - /obj/item/clothing/head/radiation, - /obj/item/clothing/suit/radiation, - /obj/item/clothing/suit/radiation, - /obj/item/geiger_counter, - /obj/item/geiger_counter, - /obj/item/reagent_containers/food/drinks/bottle/vodka, - /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, - /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass) - crate_name = "radiation protection crate" - crate_type = /obj/structure/closet/crate/radiation - -/datum/supply_pack/emergency/spacesuit - name = "Space Suit Crate" - desc = "Contains two aging suits from Space-Goodwill. Requires EVA access to open." - cost = 3000 - access = ACCESS_EVA - contains = list(/obj/item/clothing/suit/space, - /obj/item/clothing/suit/space, - /obj/item/clothing/head/helmet/space, - /obj/item/clothing/head/helmet/space, - /obj/item/clothing/mask/breath, - /obj/item/clothing/mask/breath) - crate_name = "space suit crate" - crate_type = /obj/structure/closet/crate/secure - -/datum/supply_pack/emergency/spacejets - name = "Spare EVA Jetpacks" - desc = "Contains three EVA grade jectpaks. Requires EVA access to open." - cost = 2000 - access = ACCESS_EVA - contains = list(/obj/item/tank/jetpack/carbondioxide/eva, - /obj/item/tank/jetpack/carbondioxide/eva, - /obj/item/tank/jetpack/carbondioxide/eva) - crate_name = "eva jetpacks crate" - crate_type = /obj/structure/closet/crate/secure - -/datum/supply_pack/emergency/specialops - name = "Special Ops Supplies" - desc = "(*!&@#TOO CHEAP FOR THAT NULL_ENTRY, HUH OPERATIVE? WELL, THIS LITTLE ORDER CAN STILL HELP YOU OUT IN A PINCH. CONTAINS A BOX OF FIVE EMP GRENADES, THREE SMOKEBOMBS, AN INCENDIARY GRENADE, AND A \"SLEEPY PEN\" FULL OF NICE TOXINS!#@*$" - hidden = TRUE - cost = 2000 - contains = list(/obj/item/storage/box/emps, - /obj/item/grenade/smokebomb, - /obj/item/grenade/smokebomb, - /obj/item/grenade/smokebomb, - /obj/item/pen/sleepy, - /obj/item/grenade/chem_grenade/incendiary) - crate_name = "emergency crate" - crate_type = /obj/structure/closet/crate/internals - -/datum/supply_pack/emergency/weedcontrol - name = "Weed Control Crate" - desc = "Keep those invasive species OUT. Contains a scythe, gasmask, two sprays of Plant-B-Gone, and two anti-weed chemical grenades. Warranty void if used on ambrosia. Requires Hydroponics access to open." - cost = 1500 - access = ACCESS_HYDROPONICS - contains = list(/obj/item/scythe, - /obj/item/clothing/mask/gas, - /obj/item/grenade/chem_grenade/antiweed, - /obj/item/grenade/chem_grenade/antiweed, - /obj/item/reagent_containers/spray/plantbgone, - /obj/item/reagent_containers/spray/plantbgone) - crate_name = "weed control crate" - crate_type = /obj/structure/closet/crate/secure/hydroponics - -/datum/supply_pack/medical/anitvirus - name = "Virus Containment Crate" - desc = "Viro let out a death plague Mk II again? Someone didnt wash there hands? Old plagues born anew? Well this crate is for you! Hope you cure it before it brakes out of the station... This crate needs medical access to open and has two bio suits, a box of needles and beakers, five spaceacillin needles, and a medibot." - cost = 3000 - access = ACCESS_MEDICAL - contains = list(/mob/living/simple_animal/bot/medbot, - /obj/item/clothing/head/bio_hood, - /obj/item/clothing/head/bio_hood, - /obj/item/clothing/suit/bio_suit, - /obj/item/clothing/suit/bio_suit, - /obj/item/reagent_containers/syringe/antiviral, - /obj/item/reagent_containers/syringe/antiviral, - /obj/item/reagent_containers/syringe/antiviral, - /obj/item/reagent_containers/syringe/antiviral, - /obj/item/reagent_containers/syringe/antiviral, - /obj/item/storage/box/syringes, - /obj/item/storage/box/beakers) - crate_name = "virus containment unit crate" - crate_type = /obj/structure/closet/crate/secure/plasma - -////////////////////////////////////////////////////////////////////////////// -//////////////////////////// Security //////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -/datum/supply_pack/security - group = "Security" - access = ACCESS_SECURITY - crate_type = /obj/structure/closet/crate/secure/gear - -/datum/supply_pack/security/armor - name = "Armor Crate" - desc = "Three vests of well-rounded, decently-protective armor. Requires Security access to open." - cost = 1000 - contains = list(/obj/item/clothing/suit/armor/vest, - /obj/item/clothing/suit/armor/vest, - /obj/item/clothing/suit/armor/vest) - crate_name = "armor crate" - -/datum/supply_pack/security/disabler - name = "Disabler Crate" - desc = "Three stamina-draining disabler weapons. Requires Security access to open." - cost = 1500 - contains = list(/obj/item/gun/energy/disabler, - /obj/item/gun/energy/disabler, - /obj/item/gun/energy/disabler) - crate_name = "disabler crate" - -/datum/supply_pack/security/forensics - name = "Forensics Crate" - desc = "Stay hot on the criminal's heels with Nanotrasen's Detective Essentials(tm). Contains a forensics scanner, six evidence bags, camera, tape recorder, white crayon, and of course, a fedora. Requires Security access to open." - cost = 2000 - contains = list(/obj/item/detective_scanner, - /obj/item/storage/box/evidence, - /obj/item/camera, - /obj/item/taperecorder, - /obj/item/toy/crayon/white, - /obj/item/clothing/head/fedora/det_hat) - crate_name = "forensics crate" - -/datum/supply_pack/security/helmets - name = "Helmets Crate" - desc = "Contains three standard-issue brain buckets. Requires Security access to open." - cost = 1000 - contains = list(/obj/item/clothing/head/helmet/sec, - /obj/item/clothing/head/helmet/sec, - /obj/item/clothing/head/helmet/sec) - crate_name = "helmet crate" - -/datum/supply_pack/security/laser - name = "Lasers Crate" - desc = "Contains three lethal, high-energy laser guns. Requires Security access to open." - cost = 2000 - contains = list(/obj/item/gun/energy/laser, - /obj/item/gun/energy/laser, - /obj/item/gun/energy/laser) - crate_name = "laser crate" - -/datum/supply_pack/security/russianclothing - name = "Russian Surplus Clothing" - desc = "An old russian crate full of surplus armor that they used to use! Has two sets of bulletproff armor, a few union suits and some warm hats!" - contraband = TRUE - cost = 5000 // Its basicly sec suits, good boots/gloves - contains = list(/obj/item/clothing/suit/security/officer/russian, - /obj/item/clothing/suit/security/officer/russian, - /obj/item/clothing/shoes/combat, - /obj/item/clothing/shoes/combat, - /obj/item/clothing/head/ushanka, - /obj/item/clothing/head/ushanka, - /obj/item/clothing/suit/armor/bulletproof, - /obj/item/clothing/suit/armor/bulletproof, - /obj/item/clothing/head/helmet/alt, - /obj/item/clothing/head/helmet/alt, - /obj/item/clothing/gloves/combat, - /obj/item/clothing/gloves/combat, - /obj/item/clothing/mask/gas, - /obj/item/clothing/mask/gas) - crate_name = "surplus russian clothing" - crate_type = /obj/structure/closet/crate/internals - -/datum/supply_pack/security/russianmosin - name = "Russian Minutemen Gear" - desc = "An old russian Minutemen crate, comes with a full russian outfit, a mosin and a stripper clip." - contraband = TRUE - access = FALSE - cost = 5000 // - contains = list(/obj/item/clothing/suit/security/officer/russian, - /obj/item/clothing/shoes/combat, - /obj/item/clothing/head/ushanka, - /obj/item/clothing/suit/armor/bulletproof, - /obj/item/clothing/head/helmet/alt, - /obj/item/clothing/gloves/combat, - /obj/item/clothing/mask/gas, - /obj/item/gun/ballistic/shotgun/boltaction, - /obj/item/ammo_box/a762) - crate_name = "surplus russian gear" - crate_type = /obj/structure/closet/crate/internals - -/datum/supply_pack/security/sechardsuit - name = "Sec Hardsuit" - desc = "One Sec Hardsuit with a small air tank and mask." - cost = 3000 // half of SWAT gear for have the armor and half the gear - contains = list(/obj/item/clothing/suit/space/hardsuit/security, - /obj/item/tank/internals/air, - /obj/item/clothing/mask/gas) - crate_name = "sec hardsuit crate" - -/datum/supply_pack/security/securitybarriers - name = "Security Barrier Grenades" - desc = "Stem the tide with four Security Barrier grenades. Requires Security access to open." - contains = list(/obj/item/grenade/barrier, - /obj/item/grenade/barrier, - /obj/item/grenade/barrier, - /obj/item/grenade/barrier) - cost = 2000 - crate_name = "security barriers crate" - -/datum/supply_pack/security/securityclothes - name = "Security Clothing Crate" - desc = "Contains appropriate outfits for the station's private security force. Contains outfits for the Warden, Head of Security, and two Security Officers. Each outfit comes with a rank-appropriate jumpsuit, suit, and beret. Requires Security access to open." - cost = 3000 - contains = list(/obj/item/clothing/under/rank/security/navyblue, - /obj/item/clothing/under/rank/security/navyblue, - /obj/item/clothing/suit/security/officer, - /obj/item/clothing/suit/security/officer, - /obj/item/clothing/head/beret/sec/navyofficer, - /obj/item/clothing/head/beret/sec/navyofficer, - /obj/item/clothing/under/rank/warden/navyblue, - /obj/item/clothing/suit/security/warden, - /obj/item/clothing/head/beret/sec/navywarden, - /obj/item/clothing/under/rank/head_of_security/navyblue, - /obj/item/clothing/suit/security/hos, - /obj/item/clothing/head/beret/sec/navyhos) - crate_name = "security clothing crate" - -/datum/supply_pack/security/supplies - name = "Security Supplies Crate" - desc = "Contains seven flashbangs, seven teargas grenades, six flashes, and seven handcuffs. Requires Security access to open." - cost = 1000 - contains = list(/obj/item/storage/box/flashbangs, - /obj/item/storage/box/teargas, - /obj/item/storage/box/flashes, - /obj/item/storage/box/handcuffs) - crate_name = "security supply crate" - -/datum/supply_pack/security/firingpins - name = "Standard Firing Pins Crate" - desc = "Upgrade your arsenal with 10 standard firing pins. Requires Security access to open." - cost = 2000 - contains = list(/obj/item/storage/box/firingpins, - /obj/item/storage/box/firingpins) - crate_name = "firing pins crate" - -/datum/supply_pack/security/justiceinbound - name = "Standard Justice Enforcer Crate" - desc = "This is it. The Bee's Knees. The Creme of the Crop. The Pick of the Litter. The best of the best of the best. The Crown Jewel of Nanotrasen. The Alpha and the Omega of security headwear. Guaranteed to strike fear into the hearts of each and every criminal aboard the station. Also comes with a security gasmask. Requires Security access to open." - cost = 6000 //justice comes at a price. An expensive, noisy price. - contraband = TRUE - contains = list(/obj/item/clothing/head/helmet/justice, - /obj/item/clothing/mask/gas/sechailer) - crate_name = "security clothing crate" - -/datum/supply_pack/security/baton - name = "Stun Batons Crate" - desc = "Arm the Civil Protection Forces with three stun batons. Batteries included. Requires Security access to open." - cost = 1000 - contains = list(/obj/item/melee/baton/loaded, - /obj/item/melee/baton/loaded, - /obj/item/melee/baton/loaded) - crate_name = "stun baton crate" - -/datum/supply_pack/security/taser - name = "Taser Crate" - desc = "From the depths of stunbased combat, this order rises above, supreme. Contains three hybrid tasers, capable of firing both electrodes and disabling shots. Requires Security access to open." - cost = 3000 - contains = list(/obj/item/gun/energy/e_gun/advtaser, - /obj/item/gun/energy/e_gun/advtaser, - /obj/item/gun/energy/e_gun/advtaser) - crate_name = "taser crate" - -/datum/supply_pack/security/wall_flash - name = "Wall-Mounted Flash Crate" - desc = "Contains four wall-mounted flashes. Requires Security access to open." - cost = 1000 - contains = list(/obj/item/storage/box/wall_flash, - /obj/item/storage/box/wall_flash, - /obj/item/storage/box/wall_flash, - /obj/item/storage/box/wall_flash) - crate_name = "wall-mounted flash crate" - -////////////////////////////////////////////////////////////////////////////// -//////////////////////////// Armory ////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -/datum/supply_pack/security/armory - group = "Armory" - access = ACCESS_ARMORY - crate_type = /obj/structure/closet/crate/secure/weapon - -/datum/supply_pack/security/armory/bulletarmor - name = "Bulletproof Armor Crate" - desc = "Contains three sets of bulletproof armor. Guaranteed to reduce a bullet's stopping power by over half. Requires Armory access to open." - cost = 1500 - contains = list(/obj/item/clothing/suit/armor/bulletproof, - /obj/item/clothing/suit/armor/bulletproof, - /obj/item/clothing/suit/armor/bulletproof) - crate_name = "bulletproof armor crate" - -/datum/supply_pack/security/armory/bullethelmets - name = "Bulletproof Helmet Crate" - desc = "Contains three sets of bulletproof helmets. Guaranteed to reduce a bullet's stopping power by over half. Requires Armory access to open." - cost = 1500 - contains = list(/obj/item/clothing/head/helmet/alt, - /obj/item/clothing/head/helmet/alt, - /obj/item/clothing/head/helmet/alt) - crate_name = "bulletproof helmet crate" - -/datum/supply_pack/security/armory/chemimp - name = "Chemical Implants Crate" - desc = "Contains five Remote Chemical implants. Requires Armory access to open." - cost = 2000 - 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 = 3000 - 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." - cost = 8000 - contains = list(/obj/item/gun/ballistic/shotgun/automatic/combat, - /obj/item/gun/ballistic/shotgun/automatic/combat, - /obj/item/gun/ballistic/shotgun/automatic/combat, - /obj/item/storage/belt/bandolier, - /obj/item/storage/belt/bandolier, - /obj/item/storage/belt/bandolier, - /obj/item/storage/box/lethalshot, - /obj/item/storage/box/lethalslugs) - crate_name = "combat shotguns crate" - -/datum/supply_pack/security/armory/dragnetgun - name = "DRAGnet gun Crate" - desc = "Contains two DRAGnet gun. A Dynamic Rapid-Apprehension of the Guilty net the revolution in law enforcement technology that YOU Want! Requires Armory access to open." - cost = 3500 - contains = list(/obj/item/gun/energy/e_gun/dragnet, - /obj/item/gun/energy/e_gun/dragnet) - crate_name = "anti riot net guns crate" - -/datum/supply_pack/security/armory/energy - name = "Energy Guns Crate" - desc = "Contains three Energy Guns, capable of firing both nonlethal and lethal blasts of light. Requires Armory access to open." - cost = 3500 - contains = list(/obj/item/gun/energy/e_gun, - /obj/item/gun/energy/e_gun, - /obj/item/gun/energy/e_gun) - crate_name = "energy gun crate" - crate_type = /obj/structure/closet/crate/secure/plasma - -/datum/supply_pack/security/armory/exileimp // Theres boxes in 2 lockers as well as gateway never realy being used sad - name = "Exile Implants Crate" - desc = "Contains five Exile implants. Requires Armory access to open." - cost = 1000 - contains = list(/obj/item/storage/box/exileimp) - crate_name = "exile implant crate" - -/datum/supply_pack/security/armory/mindshield - name = "Mindshield Implants Crate" - desc = "Prevent against radical thoughts with three Mindshield implants. Requires Armory access to open." - cost = 4000 - contains = list(/obj/item/storage/lockbox/loyalty) - crate_name = "mindshield implant crate" - -/datum/supply_pack/security/armory/trackingimp - name = "Tracking Implants Crate" - desc = "Contains four tracking implants. Requires Armory access to open." - cost = 1000 - contains = list(/obj/item/storage/box/trackimp) - crate_name = "tracking implant crate" - -/datum/supply_pack/security/armory/fire - name = "Incendiary Weapons Crate" - desc = "Burn, baby burn. Contains three incendiary grenades, seven incendiary slugs, three plasma canisters, and a flamethrower. Requires Brige access to open." - cost = 1500 - access = ACCESS_HEADS - contains = list(/obj/item/flamethrower/full, - /obj/item/tank/internals/plasma, - /obj/item/tank/internals/plasma, - /obj/item/tank/internals/plasma, - /obj/item/grenade/chem_grenade/incendiary, - /obj/item/grenade/chem_grenade/incendiary, - /obj/item/grenade/chem_grenade/incendiary, - /obj/item/storage/box/fireshot) - crate_name = "incendiary weapons crate" - crate_type = /obj/structure/closet/crate/secure/plasma - dangerous = TRUE - -/datum/supply_pack/security/armory/miniguns - name = "Personal Miniature Energy Guns" - desc = "Contains three miniature energy guns. Each gun has a disabler and a lethal option. Requires Armory access to open." - cost = 5000 - contains = list(/obj/item/gun/energy/e_gun/mini, - /obj/item/gun/energy/e_gun/mini, - /obj/item/gun/energy/e_gun/mini) - crate_name = "personal energy guns crate" - crate_type = /obj/structure/closet/crate/secure/plasma - -/datum/supply_pack/security/armory/laserarmor - name = "Reflector Vest Crate" - desc = "Contains two vests of highly reflective material. Each armor piece diffuses a laser's energy by over half, as well as offering a good chance to reflect the laser entirely. Requires Armory access to open." - cost = 2000 - contains = list(/obj/item/clothing/suit/armor/laserproof, - /obj/item/clothing/suit/armor/laserproof) - crate_name = "reflector vest crate" - crate_type = /obj/structure/closet/crate/secure/plasma - -/datum/supply_pack/security/armory/riotarmor - name = "Riot Armor Crate" - desc = "Contains three sets of heavy body armor. Advanced padding protects against close-ranged weaponry, making melee attacks feel only half as potent to the user. Requires Armory access to open." - cost = 1500 - contains = list(/obj/item/clothing/suit/armor/riot, - /obj/item/clothing/suit/armor/riot, - /obj/item/clothing/suit/armor/riot) - crate_name = "riot armor crate" - -/datum/supply_pack/security/armory/riothelmets - name = "Riot Helmets Crate" - desc = "Contains three riot helmets. Requires Armory access to open." - cost = 1500 - contains = list(/obj/item/clothing/head/helmet/riot, - /obj/item/clothing/head/helmet/riot, - /obj/item/clothing/head/helmet/riot) - crate_name = "riot helmets crate" - -/datum/supply_pack/security/armory/riotshields - name = "Riot Shields Crate" - desc = "For when the greytide gets really uppity. Contains three riot shields. Requires Armory access to open." - cost = 2000 - contains = list(/obj/item/shield/riot, - /obj/item/shield/riot, - /obj/item/shield/riot) - crate_name = "riot shields crate" - -/datum/supply_pack/security/armory/riotshotguns - name = "Riot Shotgun Crate" - desc = "For when the greytide gets really uppity. Contains three riot shotguns, seven rubber shot and beanbag shells. Requires Armory access to open." - cost = 6000 - contains = list(/obj/item/gun/ballistic/shotgun/riot, - /obj/item/gun/ballistic/shotgun/riot, - /obj/item/gun/ballistic/shotgun/riot, - /obj/item/storage/box/rubbershot, - /obj/item/storage/box/beanbag) - crate_name = "riot shotgun crate" - -/datum/supply_pack/security/armory/swat - name = "SWAT Crate" - desc = "Contains two fullbody sets of tough, fireproof, pressurized suits designed in a joint effort by IS-ERI and Nanotrasen. Each set contains a suit, helmet, mask, combat belt, and combat gloves. Requires Armory access to open." - cost = 6000 - contains = list(/obj/item/clothing/head/helmet/swat/nanotrasen, - /obj/item/clothing/head/helmet/swat/nanotrasen, - /obj/item/clothing/suit/space/swat, - /obj/item/clothing/suit/space/swat, - /obj/item/clothing/mask/gas/sechailer/swat, - /obj/item/clothing/mask/gas/sechailer/swat, - /obj/item/storage/belt/military/assault, - /obj/item/storage/belt/military/assault, - /obj/item/clothing/gloves/combat, - /obj/item/clothing/gloves/combat) - crate_name = "swat crate" - -/datum/supply_pack/security/armory/swattasers //Lesser AEG tbh - name = "SWAT tatical tasers Crate" - desc = "Contains two tactical energy gun, these guns are able to tase, disable and lethal as well as hold a seclight. Requires Armory access to open." - cost = 8000 - contains = list(/obj/item/gun/energy/e_gun/stun, - /obj/item/gun/energy/e_gun/stun) - crate_name = "swat taser crate" - -/datum/supply_pack/security/armory/woodstock - name = "Classic WoodStock Shotguns Crate" - desc = "Contains three rustic, pumpaction shotguns. Requires Armory access to open." - cost = 3500 - contains = list(/obj/item/gun/ballistic/shotgun, - /obj/item/gun/ballistic/shotgun, - /obj/item/gun/ballistic/shotgun) - crate_name = "woodstock shotguns crate" - -/datum/supply_pack/security/armory/wt550 - name = "WT-550 Semi-Auto Rifle Crate" - desc = "Contains two high-powered, semiautomatic rifles chambered in 4.6x30mm. Requires Armory access to open." - cost = 3500 - contains = list(/obj/item/gun/ballistic/automatic/wt550, - /obj/item/gun/ballistic/automatic/wt550) - crate_name = "auto rifle crate" - -/datum/supply_pack/security/armory/wt550ammo - name = "WT-550 Semi-Auto SMG Ammo Crate" - desc = "Contains four 20-round magazines for the WT-550 Semi-Auto SMG. Each magazine is designed to facilitate rapid tactical reloads. Requires Armory access to open." - cost = 2500 - contains = list(/obj/item/ammo_box/magazine/wt550m9, - /obj/item/ammo_box/magazine/wt550m9, - /obj/item/ammo_box/magazine/wt550m9, - /obj/item/ammo_box/magazine/wt550m9) - crate_name = "auto rifle ammo crate" - -/datum/supply_pack/security/armory/wt550ammo_nonlethal // Takes around 12 shots to stun crit someone - name = "WT-550 Semi-Auto SMG Non-Lethal Ammo Crate" - desc = "Contains four 20-round magazines for the WT-550 Semi-Auto SMG. Each magazine is designed to facilitate rapid tactical reloads. Requires Armory access to open." - cost = 1500 - contains = list(/obj/item/ammo_box/magazine/wt550m9/wtrubber, - /obj/item/ammo_box/magazine/wt550m9/wtrubber, - /obj/item/ammo_box/magazine/wt550m9/wtrubber, - /obj/item/ammo_box/magazine/wt550m9/wtrubber) - crate_name = "auto rifle ammo crate" - -/datum/supply_pack/security/armory/wt550ammo_special - name = "WT-550 Semi-Auto SMG Special Ammo Crate" - desc = "Contains 2 20-round Armour Piercing and Incendiary magazines for the WT-550 Semi-Auto SMG. Each magazine is designed to facilitate rapid tactical reloads. Requires Armory access to open." - cost = 4500 - contains = list(/obj/item/ammo_box/magazine/wt550m9/wtap, - /obj/item/ammo_box/magazine/wt550m9/wtap, - /obj/item/ammo_box/magazine/wt550m9/wtic, - /obj/item/ammo_box/magazine/wt550m9/wtic) - crate_name = "auto rifle ammo crate" - -////////////////////////////////////////////////////////////////////////////// -//////////////////////////// Engineering ///////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -/datum/supply_pack/engineering - group = "Engineering" - crate_type = /obj/structure/closet/crate/engineering - -/datum/supply_pack/engineering/shieldgen - name = "Anti-breach Shield Projector Crate" - desc = "Hull breaches again? Say no more with the Nanotrasen Anti-Breach Shield Projector! Uses forcefield technology to keep the air in, and the space out. Contains two shield projectors." - cost = 2500 - contains = list(/obj/machinery/shieldgen, - /obj/machinery/shieldgen) - crate_name = "anti-breach shield projector crate" - -/datum/supply_pack/engineering/conveyor - name = "Conveyor Assembly Crate" - desc = "Keep production moving along with six conveyor belts. Conveyor switch included. If you have any questions, check out the enclosed instruction book." - cost = 750 - contains = list(/obj/item/conveyor_construct, - /obj/item/conveyor_construct, - /obj/item/conveyor_construct, - /obj/item/conveyor_construct, - /obj/item/conveyor_construct, - /obj/item/conveyor_construct, - /obj/item/conveyor_switch_construct, - /obj/item/paper/guides/conveyor) - crate_name = "conveyor assembly crate" - -/datum/supply_pack/engineering/engiequipment - name = "Engineering Gear Crate" - desc = "Gear up with three toolbelts, high-visibility vests, welding helmets, hardhats, and two pairs of meson goggles!" - cost = 1300 - contains = list(/obj/item/storage/belt/utility, - /obj/item/storage/belt/utility, - /obj/item/storage/belt/utility, - /obj/item/clothing/suit/hazardvest, - /obj/item/clothing/suit/hazardvest, - /obj/item/clothing/suit/hazardvest, - /obj/item/clothing/head/welding, - /obj/item/clothing/head/welding, - /obj/item/clothing/head/welding, - /obj/item/clothing/head/hardhat, - /obj/item/clothing/head/hardhat, - /obj/item/clothing/head/hardhat, - /obj/item/clothing/glasses/meson/engine, - /obj/item/clothing/glasses/meson/engine) - crate_name = "engineering gear crate" - -/datum/supply_pack/engineering/engihardsuit - name = "Engineering Hardsuit" - desc = "Poly 'Who stole all the hardsuits!' Well now you can get more hardsuits if needed! NOTE ONE HARDSUIT IS IN THIS CRATE, as well as one air tank and mask!" - cost = 2500 - contains = list(/obj/item/tank/internals/air, - /obj/item/clothing/mask/gas, - /obj/item/clothing/suit/space/hardsuit/engine) - crate_name = "engineering hardsuit" - -/datum/supply_pack/engineering/atmoshardsuit - name = "Atmospherics Hardsuit" - desc = "Too many techs and not enough hardsuits? Time to buy some more! Comes with gas mask and air tank. Ask the CE to open." - cost = 5000 - access = ACCESS_CE - contains = list(/obj/item/tank/internals/air, - /obj/item/clothing/mask/gas, - /obj/item/clothing/suit/space/hardsuit/engine/atmos) - crate_name = "atmospherics hardsuit" - crate_type = /obj/structure/closet/crate/secure/engineering - -/datum/supply_pack/engineering/industrialrcd - name = "Industrial RCD" - desc = "A industrial RCD in case the station has gone through more then one meteor storm and the CE needs to bring out the somthing a bit more reliable. Dose not contain spare ammo for the industrial RCD or any other RCD modles." - cost = 4500 - access = ACCESS_CE - contains = list(/obj/item/construction/rcd/industrial) - 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 = 2000 //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 - -/obj/item/stock_parts/cell/inducer_supply - maxcharge = 5000 - charge = 5000 - -/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." - cost = 2000 - contains = list(/obj/item/inducer/sci {cell_type = /obj/item/stock_parts/cell/inducer_supply; opened = 0}, /obj/item/inducer/sci {cell_type = /obj/item/stock_parts/cell/inducer_supply; opened = 0}) //FALSE doesn't work in modified type paths apparently. - crate_name = "inducer crate" - crate_type = /obj/structure/closet/crate/engineering/electrical - -/datum/supply_pack/engineering/pacman - name = "P.A.C.M.A.N Generator Crate" - desc = "Engineers can't set up the engine? Not an issue for you, once you get your hands on this P.A.C.M.A.N. Generator! Takes in plasma and spits out sweet sweet energy." - cost = 2500 - contains = list(/obj/machinery/power/port_gen/pacman) - crate_name = "PACMAN generator crate" - crate_type = /obj/structure/closet/crate/engineering/electrical - -/datum/supply_pack/engineering/power - name = "Power Cell Crate" - desc = "Looking for power overwhelming? Look no further. Contains three high-voltage power cells." - cost = 1000 - contains = list(/obj/item/stock_parts/cell/high, - /obj/item/stock_parts/cell/high, - /obj/item/stock_parts/cell/high) - crate_name = "power cell crate" - crate_type = /obj/structure/closet/crate/engineering/electrical - -/datum/supply_pack/engineering/shuttle_engine - name = "Shuttle Engine Crate" - desc = "Through advanced bluespace-shenanigans, our engineers have managed to fit an entire shuttle engine into one tiny little crate. Requires CE access to open." - cost = 5000 - access = ACCESS_CE - contains = list(/obj/structure/shuttle/engine/propulsion/burst/cargo) - crate_name = "shuttle engine crate" - crate_type = /obj/structure/closet/crate/secure/engineering - special = TRUE - -/datum/supply_pack/engineering/tools - name = "Toolbox Crate" - desc = "Any robust spaceman is never far from their trusty toolbox. Contains three electrical toolboxes and three mechanical toolboxes." - contains = list(/obj/item/storage/toolbox/electrical, - /obj/item/storage/toolbox/electrical, - /obj/item/storage/toolbox/electrical, - /obj/item/storage/toolbox/mechanical, - /obj/item/storage/toolbox/mechanical, - /obj/item/storage/toolbox/mechanical) - cost = 1000 - crate_name = "toolbox crate" - -/datum/supply_pack/engineering/bsa - name = "Bluespace Artillery Parts" - desc = "The pride of Nanotrasen Naval Command. The legendary Bluespace Artillery Cannon is a devastating feat of human engineering and testament to wartime determination. Highly advanced research is required for proper construction. " - cost = 15000 - special = TRUE - contains = list(/obj/item/circuitboard/machine/bsa/front, - /obj/item/circuitboard/machine/bsa/middle, - /obj/item/circuitboard/machine/bsa/back, - /obj/item/circuitboard/computer/bsa_control - ) - crate_name= "bluespace artillery parts crate" - -/datum/supply_pack/engineering/dna_vault - name = "DNA Vault Parts" - desc = "Secure the longevity of the current state of humanity within this massive library of scientific knowledge, capable of granting superhuman powers and abilities. Highly advanced research is required for proper construction. Also contains five DNA probes." - cost = 12000 - special = TRUE - contains = list( - /obj/item/circuitboard/machine/dna_vault, - /obj/item/dna_probe, - /obj/item/dna_probe, - /obj/item/dna_probe, - /obj/item/dna_probe, - /obj/item/dna_probe - ) - crate_name= "dna vault parts crate" - -/datum/supply_pack/engineering/dna_probes - name = "DNA Vault Samplers" - desc = "Contains five DNA probes for use in the DNA vault." - cost = 3000 - special = TRUE - contains = list(/obj/item/dna_probe, - /obj/item/dna_probe, - /obj/item/dna_probe, - /obj/item/dna_probe, - /obj/item/dna_probe - ) - crate_name= "dna samplers crate" - - -/datum/supply_pack/engineering/shield_sat - name = "Shield Generator Satellite" - desc = "Protect the very existence of this station with these Anti-Meteor defenses. Contains three Shield Generator Satellites." - cost = 4000 - contains = list( - /obj/machinery/satellite/meteor_shield, - /obj/machinery/satellite/meteor_shield, - /obj/machinery/satellite/meteor_shield - ) - crate_name= "shield sat crate" - -/datum/supply_pack/engineering/shield_sat_control - name = "Shield System Control Board" - desc = "A control system for the Shield Generator Satellite system." - cost = 4000 - contains = list(/obj/item/circuitboard/computer/sat_control) - crate_name= "shield control board crate" - -////////////////////////////////////////////////////////////////////////////// -//////////////////////// Engine Construction ///////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -/datum/supply_pack/engine - group = "Engine Construction" - crate_type = /obj/structure/closet/crate/engineering - -/datum/supply_pack/engine/am_jar - name = "Antimatter Containment Jar Crate" - desc = "Two Antimatter containment jars stuffed into a single crate." - cost = 2000 - contains = list(/obj/item/am_containment, - /obj/item/am_containment) - crate_name = "antimatter jar crate" - -/datum/supply_pack/engine/am_core - name = "Antimatter Control Crate" - desc = "The brains of the Antimatter engine, this device is sure to teach the station's powergrid the true meaning of real power." - cost = 5000 - contains = list(/obj/machinery/power/am_control_unit) - crate_name = "antimatter control crate" - -/datum/supply_pack/engine/am_shielding - name = "Antimatter Shielding Crate" - desc = "Contains ten Antimatter shields, somehow crammed into a crate." - cost = 2000 - contains = list(/obj/item/am_shielding_container, - /obj/item/am_shielding_container, - /obj/item/am_shielding_container, - /obj/item/am_shielding_container, - /obj/item/am_shielding_container, - /obj/item/am_shielding_container, - /obj/item/am_shielding_container, - /obj/item/am_shielding_container, - /obj/item/am_shielding_container, - /obj/item/am_shielding_container) //10 shields: 3x3 containment and a core - crate_name = "antimatter shielding crate" - -/datum/supply_pack/engine/emitter - name = "Emitter Crate" - desc = "Useful for powering forcefield generators while destroying locked crates and intruders alike. Contains two high-powered energy emitters. Requires CE access to open." - cost = 1500 - access = ACCESS_CE - contains = list(/obj/machinery/power/emitter, - /obj/machinery/power/emitter) - crate_name = "emitter crate" - crate_type = /obj/structure/closet/crate/secure/engineering - dangerous = TRUE - -/datum/supply_pack/engine/field_gen - name = "Field Generator Crate" - desc = "Typically the only thing standing between the station and a messy death. Powered by emitters. Contains two field generators." - cost = 1500 - contains = list(/obj/machinery/field/generator, - /obj/machinery/field/generator) - crate_name = "field generator crate" - -/datum/supply_pack/engine/grounding_rods - name = "Grounding Rod Crate" - desc = "Four grounding rods guaranteed to keep any uppity tesla's lightning under control." - cost = 1700 - contains = list(/obj/machinery/power/grounding_rod, - /obj/machinery/power/grounding_rod, - /obj/machinery/power/grounding_rod, - /obj/machinery/power/grounding_rod) - crate_name = "grounding rod crate" - crate_type = /obj/structure/closet/crate/engineering/electrical - -/datum/supply_pack/engine/mason - name = "M.A.S.O.N RIG Crate" - desc = "The rare M.A.S.O.N RIG. Requires CE access to open." - cost = 15000 - access = ACCESS_CE - contains = list(/obj/item/clothing/suit/space/hardsuit/ancient/mason) - crate_name = "M.A.S.O.N Rig" - crate_type = /obj/structure/closet/crate/secure/engineering - -/datum/supply_pack/engine/PA - name = "Particle Accelerator Crate" - desc = "A supermassive black hole or hyper-powered teslaball are the perfect way to spice up any party! This \"My First Apocalypse\" kit contains everything you need to build your own Particle Accelerator! Ages 10 and up." - cost = 3000 - contains = list(/obj/structure/particle_accelerator/fuel_chamber, - /obj/machinery/particle_accelerator/control_box, - /obj/structure/particle_accelerator/particle_emitter/center, - /obj/structure/particle_accelerator/particle_emitter/left, - /obj/structure/particle_accelerator/particle_emitter/right, - /obj/structure/particle_accelerator/power_box, - /obj/structure/particle_accelerator/end_cap) - crate_name = "particle accelerator crate" - -/datum/supply_pack/engine/collector - name = "Radiation Collector Crate" - desc = "Contains three radiation collectors. Useful for collecting energy off nearby Supermatter Crystals, Singularities or Teslas!" - cost = 2500 - contains = list(/obj/machinery/power/rad_collector, - /obj/machinery/power/rad_collector, - /obj/machinery/power/rad_collector) - crate_name = "collector crate" - -/datum/supply_pack/engine/sing_gen - name = "Singularity Generator Crate" - desc = "The key to unlocking the power of Lord Singuloth. Particle Accelerator not included." - cost = 5000 - contains = list(/obj/machinery/the_singularitygen) - crate_name = "singularity generator crate" - -/datum/supply_pack/engine/solar - name = "Solar Panel Crate" - desc = "Go green with this DIY advanced solar array. Contains twenty one solar assemblies, a solar-control circuit board, and tracker. If you have any questions, please check out the enclosed instruction book." - cost = 2000 - contains = list(/obj/item/solar_assembly, - /obj/item/solar_assembly, - /obj/item/solar_assembly, - /obj/item/solar_assembly, - /obj/item/solar_assembly, - /obj/item/solar_assembly, - /obj/item/solar_assembly, - /obj/item/solar_assembly, - /obj/item/solar_assembly, - /obj/item/solar_assembly, - /obj/item/solar_assembly, - /obj/item/solar_assembly, - /obj/item/solar_assembly, - /obj/item/solar_assembly, - /obj/item/solar_assembly, - /obj/item/solar_assembly, - /obj/item/solar_assembly, - /obj/item/solar_assembly, - /obj/item/solar_assembly, - /obj/item/solar_assembly, - /obj/item/solar_assembly, - /obj/item/circuitboard/computer/solar_control, - /obj/item/electronics/tracker, - /obj/item/paper/guides/jobs/engi/solars) - crate_name = "solar panel crate" - crate_type = /obj/structure/closet/crate/engineering/electrical - -/datum/supply_pack/engine/supermatter_shard - name = "Supermatter Shard Crate" - desc = "The power of the heavens condensed into a single crystal. Requires CE access to open." - cost = 10000 - access = ACCESS_CE - contains = list(/obj/machinery/power/supermatter_crystal/shard) - crate_name = "supermatter shard crate" - crate_type = /obj/structure/closet/crate/secure/engineering - dangerous = TRUE - -/datum/supply_pack/engine/tesla_coils - name = "Tesla Coil Crate" - desc = "Whether it's high-voltage executions, creating research points, or just plain old power generation: This pack of four Tesla coils can do it all!" - cost = 2500 - contains = list(/obj/machinery/power/tesla_coil, - /obj/machinery/power/tesla_coil, - /obj/machinery/power/tesla_coil, - /obj/machinery/power/tesla_coil) - crate_name = "tesla coil crate" - crate_type = /obj/structure/closet/crate/engineering/electrical - -/datum/supply_pack/engine/tesla_gen - name = "Tesla Generator Crate" - desc = "The key to unlocking the power of the Tesla energy ball. Particle Accelerator not included." - cost = 5000 - contains = list(/obj/machinery/the_singularitygen/tesla) - crate_name = "tesla generator crate" - -////////////////////////////////////////////////////////////////////////////// -/////////////////////// Canisters & Materials //////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -/datum/supply_pack/materials - group = "Canisters & Materials" - -/datum/supply_pack/materials/cardboard50 - name = "50 Cardboard Sheets" - desc = "Create a bunch of boxes." - cost = 1000 - contains = list(/obj/item/stack/sheet/cardboard/fifty) - crate_name = "cardboard sheets crate" - -/datum/supply_pack/materials/glass50 - name = "50 Glass Sheets" - desc = "Let some nice light in with fifty glass sheets!" - cost = 1000 - contains = list(/obj/item/stack/sheet/glass/fifty) - crate_name = "glass sheets crate" - -/datum/supply_pack/materials/metal50 - name = "50 Metal Sheets" - desc = "Any construction project begins with a good stack of fifty metal sheets!" - cost = 1000 - contains = list(/obj/item/stack/sheet/metal/fifty) - crate_name = "metal sheets crate" - -/datum/supply_pack/materials/plasteel20 - name = "20 Plasteel Sheets" - desc = "Reinforce the station's integrity with twenty plasteel sheets!" - cost = 7500 - 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 = 16500 - contains = list(/obj/item/stack/sheet/plasteel/fifty) - crate_name = "plasteel sheets crate" - -/datum/supply_pack/materials/plastic50 - name = "50 Plastic Sheets" - desc = "Build a limitless amount of toys with fifty plastic sheets!" - cost = 1000 - contains = list(/obj/item/stack/sheet/plastic/fifty) - crate_name = "plastic sheets crate" - -/datum/supply_pack/materials/sandstone30 - name = "30 Sandstone Blocks" - desc = "Neither sandy nor stoney, these thirty blocks will still get the job done." - cost = 1000 - contains = list(/obj/item/stack/sheet/mineral/sandstone/thirty) - crate_name = "sandstone blocks crate" - -/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 = 2000 - contains = list(/obj/item/stack/sheet/mineral/wood/fifty) - crate_name = "wood planks crate" - -/datum/supply_pack/materials/rcdammo - name = "Spare RDC ammo" - desc = "This crate contains sixteen RCD ammo packs, to help with any holes or projects people mite 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" - -/datum/supply_pack/materials/bz - name = "BZ Canister Crate" - desc = "Contains a canister of BZ. Requires Toxins access to open." - cost = 7500 // Costs 3 credits more than what you can get for selling it. - access = ACCESS_TOX_STORAGE - contains = list(/obj/machinery/portable_atmospherics/canister/bz) - crate_name = "BZ canister crate" - crate_type = /obj/structure/closet/crate/secure/science - -/datum/supply_pack/materials/carbon_dio - name = "Carbon Dioxide Canister" - desc = "Contains a canister of Carbon Dioxide." - cost = 3000 - contains = list(/obj/machinery/portable_atmospherics/canister/carbon_dioxide) - crate_name = "carbon dioxide canister crate" - crate_type = /obj/structure/closet/crate/large - -/datum/supply_pack/materials/nitrogen - name = "Nitrogen Canister" - desc = "Contains a canister of Nitrogen." - cost = 2000 - contains = list(/obj/machinery/portable_atmospherics/canister/nitrogen) - crate_name = "nitrogen canister crate" - crate_type = /obj/structure/closet/crate/large - -/datum/supply_pack/materials/nitrous_oxide_canister - name = "Nitrous Oxide Canister" - desc = "Contains a canister of Nitrous Oxide. Requires Atmospherics access to open." - cost = 3000 - access = ACCESS_ATMOSPHERICS - contains = list(/obj/machinery/portable_atmospherics/canister/nitrous_oxide) - crate_name = "nitrous oxide canister crate" - crate_type = /obj/structure/closet/crate/secure - -/datum/supply_pack/materials/oxygen - name = "Oxygen Canister" - desc = "Contains a canister of Oxygen. Canned in Druidia." - cost = 1500 - contains = list(/obj/machinery/portable_atmospherics/canister/oxygen) - crate_name = "oxygen canister crate" - crate_type = /obj/structure/closet/crate/large - -/datum/supply_pack/materials/water_vapor - name = "Water Vapor Canister" - desc = "Contains a canister of Water Vapor. I swear to god if you open this in the halls..." - cost = 2500 - contains = list(/obj/machinery/portable_atmospherics/canister/water_vapor) - crate_name = "water vapor canister crate" - crate_type = /obj/structure/closet/crate/large - -/datum/supply_pack/materials/fueltank - name = "Fuel Tank Crate" - desc = "Contains a welding fuel tank. Caution, highly flammable." - cost = 800 - contains = list(/obj/structure/reagent_dispensers/fueltank) - crate_name = "fuel tank crate" - crate_type = /obj/structure/closet/crate/large - -/datum/supply_pack/materials/watertank - name = "Water Tank Crate" - desc = "Contains a tank of dihydrogen monoxide... sounds dangerous." - cost = 600 - contains = list(/obj/structure/reagent_dispensers/watertank) - crate_name = "water tank crate" - crate_type = /obj/structure/closet/crate/large - -/datum/supply_pack/materials/foamtank - name = "Firefighting Foam Tank Crate" - desc = "Contains a tank of firefighting foam. Also known as \"plasmaman's bane\"." - cost = 1500 - contains = list(/obj/structure/reagent_dispensers/foamtank) - crate_name = "foam tank crate" - crate_type = /obj/structure/closet/crate/large - -/datum/supply_pack/materials/hightank - name = "Large Water Tank Crate" - desc = "Contains a high-capacity water tank. Useful for botany or other service jobs." - cost = 1200 - contains = list(/obj/structure/reagent_dispensers/watertank/high) - crate_name = "high-capacity water tank crate" - crate_type = /obj/structure/closet/crate/large - -////////////////////////////////////////////////////////////////////////////// -//////////////////////////// Medical ///////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -/datum/supply_pack/medical - group = "Medical" - crate_type = /obj/structure/closet/crate/medical - -/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/bloodpacks - name = "Blood Pack Variety Crate" - desc = "Contains eight different blood packs for reintroducing blood to patients." - cost = 3000 - contains = list(/obj/item/reagent_containers/blood, - /obj/item/reagent_containers/blood, - /obj/item/reagent_containers/blood/APlus, - /obj/item/reagent_containers/blood/AMinus, - /obj/item/reagent_containers/blood/BPlus, - /obj/item/reagent_containers/blood/BMinus, - /obj/item/reagent_containers/blood/OPlus, - /obj/item/reagent_containers/blood/OMinus, - /obj/item/reagent_containers/blood/lizard) - crate_name = "blood freezer" - crate_type = /obj/structure/closet/crate/freezer - -/datum/supply_pack/medical/defibs - name = "Defibrillator Crate" - desc = "Contains two defibrillators for bringing the recently deceased back to life." - cost = 2500 - contains = list(/obj/item/defibrillator/loaded, - /obj/item/defibrillator/loaded) - crate_name = "defibrillator 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/iv_drip - name = "IV Drip Crate" - desc = "Contains a single IV drip stand for intravenous delivery." - cost = 700 - contains = list(/obj/machinery/iv_drip) - crate_name = "iv drip crate" - -/datum/supply_pack/science/adv_surgery_tools - name = "Med-Co Advanced surgery tools" - desc = "A full set of Med-Co advanced surgery tools, this crate also comes with a spay of synth flesh as well as a can of . Requires Surgery access to open." - cost = 5000 - access = ACCESS_SURGERY - contains = list(/obj/item/storage/belt/medical/surgery_belt_adv, - /obj/item/reagent_containers/medspray/synthflesh, - /obj/item/reagent_containers/medspray/sterilizine) - crate_name = "medco newest surgery tools" - crate_type = /obj/structure/closet/crate/medical - -/datum/supply_pack/medical/medicalhardsuit - name = "Medical Hardsuit" - desc = "Got people being spaced left and right? Hole in the same room as the dead body of Hos or cap? Fear not, now you can buy one medical hardsuit with a mask and air tank to save your fellow crewmembers." - cost = 2500 - contains = list(/obj/item/tank/internals/air, - /obj/item/clothing/mask/gas, - /obj/item/clothing/suit/space/hardsuit/medical) - crate_name = "medical hardsuit" - -/datum/supply_pack/medical/supplies - name = "Medical Supplies Crate" - desc = "Contains seven beakers, syringes, and bodybags. Three morphine bottles, four insulin pills. Two charcoal bottles, epinephrine bottles, antitoxin bottles, and large beakers. Finally, a single roll of medical gauze, as well as a bottle of stimulant pills for long, hard work days. German doctor not included." - cost = 2500 - contains = list(/obj/item/reagent_containers/glass/bottle/charcoal, - /obj/item/reagent_containers/glass/bottle/charcoal, - /obj/item/reagent_containers/glass/bottle/epinephrine, - /obj/item/reagent_containers/glass/bottle/epinephrine, - /obj/item/reagent_containers/glass/bottle/morphine, - /obj/item/reagent_containers/glass/bottle/morphine, - /obj/item/reagent_containers/glass/bottle/morphine, - /obj/item/reagent_containers/glass/bottle/toxin, - /obj/item/reagent_containers/glass/bottle/toxin, - /obj/item/reagent_containers/glass/beaker/large, - /obj/item/reagent_containers/glass/beaker/large, - /obj/item/reagent_containers/pill/insulin, - /obj/item/reagent_containers/pill/insulin, - /obj/item/reagent_containers/pill/insulin, - /obj/item/reagent_containers/pill/insulin, - /obj/item/stack/medical/gauze, - /obj/item/storage/box/beakers, - /obj/item/storage/box/medsprays, - /obj/item/storage/box/syringes, - /obj/item/storage/box/bodybags, - /obj/item/storage/pill_bottle/stimulant) - crate_name = "medical supplies crate" - -/datum/supply_pack/medical/vending - name = "Medical Vending Crate" - desc = "Contains refills for medical vending machines." - cost = 2000 - contains = list(/obj/item/vending_refill/medical, - /obj/item/vending_refill/wallmed) - crate_name = "medical vending 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." - cost = 2500 - contains = list(/obj/item/reagent_containers/medspray/styptic, - /obj/item/reagent_containers/medspray/styptic, - /obj/item/reagent_containers/medspray/silver_sulf, - /obj/item/reagent_containers/medspray/silver_sulf, - /obj/item/reagent_containers/medspray/synthflesh, - /obj/item/reagent_containers/medspray/synthflesh, - /obj/item/reagent_containers/medspray/sterilizine, - /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 = 1500 - 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/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 pill bottle, as well as a radiation treatment deluxe pill bottle!" - cost = 3500 - contains = list(/obj/item/storage/pill_bottle/antirad_plus, - /obj/item/storage/pill_bottle/mutarad, - /obj/item/storage/firstaid/radbgone, - /obj/item/storage/firstaid/radbgone, - /obj/item/geiger_counter, - /obj/item/geiger_counter) - crate_name = "radiation protection crate" - crate_type = /obj/structure/closet/crate/radiation - -/datum/supply_pack/medical/surgery - name = "Surgical Supplies Crate" - desc = "Do you want to perform surgery, but don't have one of those fancy shmancy degrees? Just get started with this crate containing a medical duffelbag, Sterilizine spray and collapsible roller bed." - cost = 1000 - contains = list(/obj/item/storage/backpack/duffelbag/med/surgery, - /obj/item/reagent_containers/medspray/sterilizine, - /obj/item/roller) - crate_name = "surgical supplies 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/virus - name = "Virus Crate" - desc = "Contains twelve different bottles, containing several viral samples for virology research. Also includes seven beakers and syringes. Balled-up jeans not included. Requires CMO access to open." - cost = 2500 - access = ACCESS_CMO - contains = list(/obj/item/reagent_containers/glass/bottle/flu_virion, - /obj/item/reagent_containers/glass/bottle/cold, - /obj/item/reagent_containers/glass/bottle/random_virus, - /obj/item/reagent_containers/glass/bottle/random_virus, - /obj/item/reagent_containers/glass/bottle/random_virus, - /obj/item/reagent_containers/glass/bottle/random_virus, - /obj/item/reagent_containers/glass/bottle/fake_gbs, - /obj/item/reagent_containers/glass/bottle/magnitis, - /obj/item/reagent_containers/glass/bottle/pierrot_throat, - /obj/item/reagent_containers/glass/bottle/brainrot, - /obj/item/reagent_containers/glass/bottle/anxiety, - /obj/item/reagent_containers/glass/bottle/beesease, - /obj/item/storage/box/syringes, - /obj/item/storage/box/beakers, - /obj/item/reagent_containers/glass/bottle/mutagen) - crate_name = "virus crate" - crate_type = /obj/structure/closet/crate/secure/plasma - dangerous = TRUE - - -////////////////////////////////////////////////////////////////////////////// -//////////////////////////// Science ///////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -/datum/supply_pack/science - group = "Science" - crate_type = /obj/structure/closet/crate/science - -/datum/supply_pack/science/robotics/mecha_odysseus - name = "Circuit Crate (Odysseus)" - desc = "Ever wanted to build your own giant medical robot? Well, now you can! Contains the Odysseus main control board and Odysseus peripherals board. Requires Robotics access to open." - cost = 2500 - access = ACCESS_ROBOTICS - contains = list(/obj/item/circuitboard/mecha/odysseus/peripherals, - /obj/item/circuitboard/mecha/odysseus/main) - crate_name = "\improper Odysseus circuit crate" - crate_type = /obj/structure/closet/crate/secure/science - -/datum/supply_pack/science/robotics/mecha_ripley - name = "Circuit Crate (Ripley APLU)" - desc = "Rip apart rocks and xenomorphs alike with the Ripley APLU. Contains the Main Ripley control board, as well as the Ripley Peripherals board. Requires Robotics access to open." - cost = 3000 - access = ACCESS_ROBOTICS - contains = list(/obj/item/book/manual/ripley_build_and_repair, - /obj/item/circuitboard/mecha/ripley/main, - /obj/item/circuitboard/mecha/ripley/peripherals) - crate_name = "\improper APLU Ripley circuit crate" - crate_type = /obj/structure/closet/crate/secure/science - -/datum/supply_pack/science/circuitry - name = "Circuitry Starter Pack Crate" - desc = "Journey into the mysterious world of Circuitry with this starter pack. Contains a circuit printer, analyzer, debugger and wirer. Power cells not included." - cost = 1000 - contains = list(/obj/item/integrated_electronics/analyzer, - /obj/item/integrated_circuit_printer, - /obj/item/integrated_electronics/debugger, - /obj/item/integrated_electronics/wirer) - crate_name = "circuitry starter pack crate" - -/datum/supply_pack/science/plasma - name = "Plasma Assembly Crate" - desc = "Everything you need to burn something to the ground, this contains three plasma assembly sets. Each set contains a plasma tank, igniter, proximity sensor, and timer! Warranty void if exposed to high temperatures. Requires Toxins access to open." - cost = 1000 - access = ACCESS_TOX_STORAGE - contains = list(/obj/item/tank/internals/plasma, - /obj/item/tank/internals/plasma, - /obj/item/tank/internals/plasma, - /obj/item/assembly/igniter, - /obj/item/assembly/igniter, - /obj/item/assembly/igniter, - /obj/item/assembly/prox_sensor, - /obj/item/assembly/prox_sensor, - /obj/item/assembly/prox_sensor, - /obj/item/assembly/timer, - /obj/item/assembly/timer, - /obj/item/assembly/timer) - crate_name = "plasma assembly crate" - crate_type = /obj/structure/closet/crate/secure/plasma - -/datum/supply_pack/science/robotics - name = "Robotics Assembly Crate" - desc = "The tools you need to replace those finicky humans with a loyal robot army! Contains three proximity sensors, two high-powered cells, six flashes, and an electrical toolbox. Requires Robotics access to open." - cost = 1000 - access = ACCESS_ROBOTICS - contains = list(/obj/item/assembly/prox_sensor, - /obj/item/assembly/prox_sensor, - /obj/item/assembly/prox_sensor, - /obj/item/storage/toolbox/electrical, - /obj/item/storage/box/flashes, - /obj/item/stock_parts/cell/high, - /obj/item/stock_parts/cell/high) - crate_name = "robotics assembly crate" - crate_type = /obj/structure/closet/crate/secure/science - -/datum/supply_pack/science/shieldwalls - name = "Shield Generator Crate" - desc = "These high powered Shield Wall Generators are guaranteed to keep any unwanted lifeforms on the outside, where they belong! Contains four shield wall generators. Requires Teleporter access to open." - cost = 2000 - access = ACCESS_TELEPORTER - contains = list(/obj/machinery/shieldwallgen, - /obj/machinery/shieldwallgen, - /obj/machinery/shieldwallgen, - /obj/machinery/shieldwallgen) - crate_name = "shield generators crate" - crate_type = /obj/structure/closet/crate/secure/science - -/datum/supply_pack/science/tablets - name = "Tablet Crate" - desc = "What's a computer? Contains five cargo tablets." - cost = 5000 - contains = list(/obj/item/modular_computer/tablet/preset/cargo, - /obj/item/modular_computer/tablet/preset/cargo, - /obj/item/modular_computer/tablet/preset/cargo, - /obj/item/modular_computer/tablet/preset/cargo, - /obj/item/modular_computer/tablet/preset/cargo) - crate_name = "tablet crate" - -/datum/supply_pack/science/transfer_valves - name = "Tank Transfer Valves Crate" - desc = "The key ingredient for making a lot of people very angry very fast. Contains two tank transfer valves. Requires RD access to open." - cost = 6000 - access = ACCESS_RD - contains = list(/obj/item/transfer_valve, - /obj/item/transfer_valve) - crate_name = "tank transfer valves crate" - crate_type = /obj/structure/closet/crate/secure/science - dangerous = TRUE - -/datum/supply_pack/science/tech_slugs - name = "Tech Slug Ammo Shells" - desc = "A new type of shell that is able to be made into a few different dangerous types. Contains two boxes of tech slugs, 14 shells in all." - cost = 1000 - contains = list(/obj/item/storage/box/techsslug, - /obj/item/storage/box/techsslug) - crate_name = "tech slug crate" - - -////////////////////////////////////////////////////////////////////////////// -/////////////////////////////// Service ////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -/datum/supply_pack/service - group = "Service" - -/datum/supply_pack/service/advlighting - name = "Advanced Lighting crate" - desc = "Thanks to advanced lighting tech we here at the Lamp Factory have be able to produce more lamps and lamp items! This crate has three lamps, a box of lights and a state of the art rapid-light-device!" - cost = 2500 //Fair - contains = list(/obj/item/construction/rld, - /obj/item/flashlight/lamp, - /obj/item/flashlight/lamp, - /obj/item/flashlight/lamp/green, - /obj/item/storage/box/lights/mixed) - crate_name = "advanced lighting crate" - crate_type = /obj/structure/closet/crate/secure - -/datum/supply_pack/service/cargo_supples - name = "Cargo Supplies Crate" - desc = "Sold everything that wasn't bolted down? You can get right back to work with this crate containing stamps, an export scanner, destination tagger, hand labeler and some package wrapping." - cost = 1000 - contains = list(/obj/item/stamp, - /obj/item/stamp/denied, - /obj/item/export_scanner, - /obj/item/destTagger, - /obj/item/hand_labeler, - /obj/item/stack/packageWrap) - crate_name = "cargo supplies crate" - -/datum/supply_pack/service/food_cart - name = "Food Cart Crate" - desc = "Want to sell food on the go? Cook lost their cart? Well we just so happen to have a few carts to spare!" - cost = 1000 - contains = list(/obj/machinery/food_cart) - crate_name = "food cart crate" - crate_type = /obj/structure/closet/crate - -/datum/supply_pack/service/noslipfloor - name = "High-traction Floor Tiles" - desc = "Make slipping a thing of the past with sixty industrial-grade anti-slip floortiles!" - cost = 2000 - contains = list(/obj/item/stack/tile/noslip/thirty, - /obj/item/stack/tile/noslip/thirty) - crate_name = "high-traction floor tiles crate" - -/datum/supply_pack/service/icecream_cart - name = "Ice Cream Cart Crate" - desc = "Plasma fire a to hot for you, want a nice treat after a hard days work? Well now we have the cart for you! This Ice Cream Vat has everthing you need to make you and your friends so ice cream treats! This cart comes stocked with some ingredients for each type of scoopable icecream." - cost = 2750 //Comes prestocked with basic ingredients - contains = list(/obj/machinery/icecream_vat) - crate_name = "ice cream vat crate" - crate_type = /obj/structure/closet/crate - -/datum/supply_pack/service/janitor - name = "Janitorial Supplies Crate" - desc = "Fight back against dirt and grime with Nanotrasen's Janitorial Essentials(tm)! Contains three buckets, caution signs, and cleaner grenades. Also has a single mop, spray cleaner, rag, NT soap and a trash bag." - cost = 1000 - contains = list(/obj/item/reagent_containers/glass/bucket, - /obj/item/reagent_containers/glass/bucket, - /obj/item/reagent_containers/glass/bucket, - /obj/item/mop, - /obj/item/caution, - /obj/item/caution, - /obj/item/caution, - /obj/item/storage/bag/trash, - /obj/item/reagent_containers/spray/cleaner, - /obj/item/reagent_containers/rag, - /obj/item/grenade/chem_grenade/cleaner, - /obj/item/grenade/chem_grenade/cleaner, - /obj/item/grenade/chem_grenade/cleaner, - /obj/item/soap/nanotrasen) - crate_name = "janitorial supplies crate" - -/datum/supply_pack/service/janitor/janicart - name = "Janitorial Cart and Galoshes Crate" - desc = "The keystone to any successful janitor. As long as you have feet, this pair of galoshes will keep them firmly planted on the ground. Also contains a janitorial cart." - cost = 2000 - contains = list(/obj/structure/janitorialcart, - /obj/item/clothing/shoes/galoshes) - crate_name = "janitorial cart crate" - crate_type = /obj/structure/closet/crate/large - -/datum/supply_pack/service/janitor/janitank - name = "Janitor Backpack Crate" - desc = "Call forth divine judgement upon dirt and grime with this high capacity janitor backpack. Contains 500 units of station-cleansing cleaner. Requires janitor access to open." - cost = 1000 - access = ACCESS_JANITOR - contains = list(/obj/item/watertank/janitor) - crate_name = "janitor backpack crate" - crate_type = /obj/structure/closet/crate/secure - -/datum/supply_pack/service/janitor/janpremium - name = "Janitor Premium Supplies" - desc = "Do to the union for better supplies, we have desided to make a deal for you, In this crate you can get a brand new chem, Drying Angent this stuff is the work of slimes or magic! This crate also contains a rag to test out the Drying Angent magic, three wet floor signs, and some spare bottles of ammonia." - cost = 1750 - access = ACCESS_JANITOR - contains = list(/obj/item/caution, - /obj/item/caution, - /obj/item/caution, - /obj/item/reagent_containers/rag, - /obj/item/reagent_containers/glass/bottle/ammonia, - /obj/item/reagent_containers/glass/bottle/ammonia, - /obj/item/reagent_containers/glass/bottle/ammonia, - /obj/item/reagent_containers/spray/drying_agent) - crate_name = "janitor backpack crate" - -/datum/supply_pack/service/janitor/janpimp - name = "Custodial Cruiser" - desc = "Clown steal your ride? Assistant lock it in the dorms? Order a new one and get back to cleaning in style!" - cost = 3000 - access = ACCESS_JANITOR - contains = list(/obj/vehicle/ridden/janicart, - /obj/item/key/janitor) - crate_name = "janitor ride crate" - crate_type = /obj/structure/closet/crate/large - -/datum/supply_pack/service/mule - name = "MULEbot Crate" - desc = "Pink-haired Quartermaster not doing her job? Replace her with this tireless worker, today!" - cost = 2000 - contains = list(/mob/living/simple_animal/bot/mulebot) - crate_name = "\improper MULEbot Crate" - crate_type = /obj/structure/closet/crate/large - -/datum/supply_pack/service/party - name = "Party Equipment" - desc = "Celebrate both life and death on the station with Nanotrasen's Party Essentials(tm)! Contains seven colored glowsticks, four beers, two ales, and a bottle of patron, goldschlager, and shaker!" - cost = 2000 - contains = list(/obj/item/storage/box/drinkingglasses, - /obj/item/reagent_containers/food/drinks/shaker, - /obj/item/reagent_containers/food/drinks/bottle/patron, - /obj/item/reagent_containers/food/drinks/bottle/goldschlager, - /obj/item/reagent_containers/food/drinks/ale, - /obj/item/reagent_containers/food/drinks/ale, - /obj/item/reagent_containers/food/drinks/beer, - /obj/item/reagent_containers/food/drinks/beer, - /obj/item/reagent_containers/food/drinks/beer, - /obj/item/reagent_containers/food/drinks/beer, - /obj/item/flashlight/glowstick, - /obj/item/flashlight/glowstick/red, - /obj/item/flashlight/glowstick/blue, - /obj/item/flashlight/glowstick/cyan, - /obj/item/flashlight/glowstick/orange, - /obj/item/flashlight/glowstick/yellow, - /obj/item/flashlight/glowstick/pink) - crate_name = "party equipment crate" - -/datum/supply_pack/service/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 the classics." - cost = 1000 - 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) - crate_name = "premium carpet crate" - -/datum/supply_pack/service/carpet2 - name = "Premium Carpet Crate #2" - desc = "Plasteel floor tiles getting on your nerves? These stacks of extra soft carpet will tie any room together. Contains red, and monochrome" - cost = 1000 - contains = list(/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 #2" - -/datum/supply_pack/service/lightbulbs - name = "Replacement Lights" - desc = "May the light of Aether shine upon this station! Or at least, the light of forty two light tubes and twenty one light bulbs as well as a light replacer." - cost = 1200 - contains = list(/obj/item/storage/box/lights/mixed, - /obj/item/storage/box/lights/mixed, - /obj/item/storage/box/lights/mixed, - /obj/item/lightreplacer) - crate_name = "replacement lights" - -/datum/supply_pack/service/minerkit - name = "Shaft Miner Starter Kit" - desc = "All the miners died too fast? Assistant wants to get a taste of life off-station? Either way, this kit is the best way to turn a regular crewman into an ore-producing, monster-slaying machine. Contains meson goggles, a pickaxe, advanced mining scanner, cargo headset, ore bag, gasmask, and explorer suit. Requires QM access to open." - cost = 2500 - access = ACCESS_QM - contains = list(/obj/item/pickaxe/mini, - /obj/item/clothing/glasses/meson, - /obj/item/t_scanner/adv_mining_scanner/lesser, - /obj/item/radio/headset/headset_cargo/mining, - /obj/item/storage/bag/ore, - /obj/item/clothing/suit/hooded/explorer/standard, - /obj/item/clothing/mask/gas/explorer) - crate_name = "shaft miner starter kit" - crate_type = /obj/structure/closet/crate/secure - -////////////////////////////////////////////////////////////////////////////// -/////////////////////////// Vending Restocks ///////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -/datum/supply_pack/service/vending/bartending - name = "Bartending Supply Crate" - desc = "Bring on the booze with vending machine refills, as well as a free book containing the well-kept secrets to the bartending trade!" - cost = 2000 - contains = list(/obj/item/vending_refill/boozeomat, - /obj/item/vending_refill/coffee, - /obj/item/book/granter/action/drink_fling) - crate_name = "bartending supply crate" - -/datum/supply_pack/service/vending/cigarette - name = "Cigarette Supply Crate" - desc = "Don't believe the reports - smoke today! Contains a cigarette vending machine refill." - cost = 1500 - contains = list(/obj/item/vending_refill/cigarette) - crate_name = "cigarette supply crate" - crate_type = /obj/structure/closet/crate - -/datum/supply_pack/service/vending/games - name = "Games Supply Crate" - desc = "Get your game on with this game vending machine refill." - cost = 1000 - contains = list(/obj/item/vending_refill/games) - crate_name = "games supply crate" - crate_type = /obj/structure/closet/crate - -/datum/supply_pack/service/vending/snack - name = "Snack Supply Crate" - desc = "One vending machine refill of cavity-bringin' goodness! The number one dentist recommended order!" - cost = 1500 - contains = list(/obj/item/vending_refill/snack) - crate_name = "snacks supply crate" - -/datum/supply_pack/service/vending/cola - name = "Softdrinks Supply Crate" - desc = "Got whacked by a toolbox, but you still have those pesky teeth? Get rid of those pearly whites with this soda machine refill, today!" - cost = 1500 - contains = list(/obj/item/vending_refill/cola) - crate_name = "soft drinks supply crate" - -////////////////////////////////////////////////////////////////////////////// -//////////////////////////// Organic ///////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -/datum/supply_pack/organic - group = "Food & Hydroponics" - crate_type = /obj/structure/closet/crate/freezer - -/datum/supply_pack/organic/hydroponics/beekeeping_suits - name = "Beekeeper Suit Crate" - desc = "Bee business booming? Better be benevolent and boost botany by bestowing bi-Beekeeper-suits! Contains two beekeeper suits and matching headwear." - cost = 1000 - contains = list(/obj/item/clothing/head/beekeeper_head, - /obj/item/clothing/suit/beekeeper_suit, - /obj/item/clothing/head/beekeeper_head, - /obj/item/clothing/suit/beekeeper_suit) - crate_name = "beekeeper suits" - crate_type = /obj/structure/closet/crate/hydroponics - -/datum/supply_pack/organic/hydroponics/beekeeping_fullkit - name = "Beekeeping Starter Crate" - desc = "BEES BEES BEES. Contains three honey frames, a beekeeper suit and helmet, flyswatter, bee house, and, of course, a pure-bred Nanotrasen-Standardized Queen Bee!" - cost = 1500 - contains = list(/obj/structure/beebox/unwrenched, - /obj/item/honey_frame, - /obj/item/honey_frame, - /obj/item/honey_frame, - /obj/item/queen_bee/bought, - /obj/item/clothing/head/beekeeper_head, - /obj/item/clothing/suit/beekeeper_suit, - /obj/item/melee/flyswatter) - crate_name = "beekeeping starter crate" - crate_type = /obj/structure/closet/crate/hydroponics - -/datum/supply_pack/organic/candy - name = "Candy Crate" - desc = "For people that have a insatiable sweet tooth! Has ten candies to be eaten up.." - cost = 2500 - var/num_contained = 10 //number of items picked to be contained in a randomised crate - contains = list(/obj/item/reagent_containers/food/snacks/candy, - /obj/item/reagent_containers/food/snacks/lollipop, - /obj/item/reagent_containers/food/snacks/gumball, - /obj/item/reagent_containers/food/snacks/chocolateegg, - /obj/item/reagent_containers/food/snacks/donut, - /obj/item/reagent_containers/food/snacks/cookie, - /obj/item/reagent_containers/food/snacks/sugarcookie, - /obj/item/reagent_containers/food/snacks/chococornet, - /obj/item/reagent_containers/food/snacks/mint, - /obj/item/reagent_containers/food/snacks/spiderlollipop, - /obj/item/reagent_containers/food/snacks/chococoin, - /obj/item/reagent_containers/food/snacks/fudgedice, - /obj/item/reagent_containers/food/snacks/chocoorange, - /obj/item/reagent_containers/food/snacks/honeybar, - /obj/item/reagent_containers/food/snacks/tinychocolate, - /obj/item/reagent_containers/food/snacks/spacetwinkie, - /obj/item/reagent_containers/food/snacks/syndicake, - /obj/item/reagent_containers/food/snacks/cheesiehonkers, - /obj/item/reagent_containers/food/snacks/sugarcookie/spookyskull, - /obj/item/reagent_containers/food/snacks/sugarcookie/spookycoffin, - /obj/item/reagent_containers/food/snacks/candy_corn, - /obj/item/reagent_containers/food/snacks/candiedapple, - /obj/item/reagent_containers/food/snacks/chocolatebar, - /obj/item/reagent_containers/food/snacks/candyheart, - /obj/item/storage/fancy/heart_box, - /obj/item/storage/fancy/donut_box) - crate_name = "candy crate" - -/datum/supply_pack/organic/cutlery - name = "Kitchen Cutlery Deluxe Set" - desc = "Need to slice and dice away those ''Tomatos'' well we got what you need! From a nice set of knifes, forks, plates, glasses, and a whetstone for when you got some grizzle that is a bit harder to slice then normal." - cost = 10000 - contraband = TRUE - contains = list(/obj/item/sharpener, - /obj/item/kitchen/fork, - /obj/item/kitchen/fork, - /obj/item/kitchen/knife, - /obj/item/kitchen/knife, - /obj/item/kitchen/knife, - /obj/item/kitchen/knife, - /obj/item/kitchen/knife/butcher, - /obj/item/kitchen/knife/butcher, - /obj/item/kitchen/rollingpin, //Deluxe for a reason - /obj/item/trash/plate, - /obj/item/trash/plate, - /obj/item/trash/plate, - /obj/item/trash/plate, - /obj/item/reagent_containers/food/drinks/drinkingglass, - /obj/item/reagent_containers/food/drinks/drinkingglass, - /obj/item/reagent_containers/food/drinks/drinkingglass, - /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, - /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass) - crate_name = "kitchen cutlery deluxe set" - -/datum/supply_pack/organic/food - name = "Food Crate" - desc = "Get things cooking with this crate full of useful ingredients! Contains a two dozen eggs, three bananas, and two bags of flour and rice, two cartons of milk, soymilk, as well as salt and pepper shakers, a enzyme and sugar bottle, and three slabs of monkeymeat." - cost = 1000 - contains = list(/obj/item/reagent_containers/food/condiment/flour, - /obj/item/reagent_containers/food/condiment/flour, - /obj/item/reagent_containers/food/condiment/rice, - /obj/item/reagent_containers/food/condiment/rice, - /obj/item/reagent_containers/food/condiment/milk, - /obj/item/reagent_containers/food/condiment/milk, - /obj/item/reagent_containers/food/condiment/soymilk, - /obj/item/reagent_containers/food/condiment/saltshaker, - /obj/item/reagent_containers/food/condiment/peppermill, - /obj/item/storage/fancy/egg_box, - /obj/item/storage/fancy/egg_box, - /obj/item/reagent_containers/food/condiment/enzyme, - /obj/item/reagent_containers/food/condiment/sugar, - /obj/item/reagent_containers/food/snacks/meat/slab/monkey, - /obj/item/reagent_containers/food/snacks/meat/slab/monkey, - /obj/item/reagent_containers/food/snacks/meat/slab/monkey, - /obj/item/reagent_containers/food/snacks/grown/banana, - /obj/item/reagent_containers/food/snacks/grown/banana, - /obj/item/reagent_containers/food/snacks/grown/banana) - crate_name = "food crate" - -/datum/supply_pack/organic/cream_piee - name = "High-yield Clown-grade Cream Pie Crate" - desc = "Designed by Aussec's Advanced Warfare Research Division, these high-yield, Clown-grade cream pies are powered by a synergy of performance and efficiency. Guaranteed to provide maximum results." - cost = 6000 - contains = list(/obj/item/storage/backpack/duffelbag/clown/cream_pie) - crate_name = "party equipment crate" - contraband = TRUE - access = ACCESS_THEATRE - crate_type = /obj/structure/closet/crate/secure - -/datum/supply_pack/organic/hunting - name = "Huntting gear" - desc = "Even in space, we can fine prey to hunt, this crate contains everthing a fine hunter needs to have a sporting time. This crate needs armory access to open. A true huntter only needs a fine bottle of cognac, a nice coat, some good o' cigars, and of cource a huntting shotgun. " - cost = 3500 - contraband = TRUE - contains = list(/obj/item/clothing/head/flatcap, - /obj/item/clothing/suit/hooded/wintercoat/captain, - /obj/item/reagent_containers/food/drinks/bottle/cognac, - /obj/item/storage/fancy/cigarettes/cigars/havana, - /obj/item/clothing/gloves/color/white, - /obj/item/clothing/under/rank/curator, - /obj/item/gun/ballistic/shotgun/lethal) - 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/organic/hydroponics - name = "Hydroponics Crate" - desc = "Supplies for growing a great garden! Contains two bottles of ammonia, two Plant-B-Gone spray bottles, a hatchet, cultivator, plant analyzer, as well as a pair of leather gloves and a botanist's apron." - cost = 1500 - contains = list(/obj/item/reagent_containers/spray/plantbgone, - /obj/item/reagent_containers/spray/plantbgone, - /obj/item/reagent_containers/glass/bottle/ammonia, - /obj/item/reagent_containers/glass/bottle/ammonia, - /obj/item/hatchet, - /obj/item/cultivator, - /obj/item/plant_analyzer, - /obj/item/clothing/gloves/botanic_leather, - /obj/item/clothing/suit/apron) - crate_name = "hydroponics crate" - crate_type = /obj/structure/closet/crate/hydroponics - -/datum/supply_pack/organic/hydroponics/hydrotank - name = "Hydroponics Backpack Crate" - desc = "Bring on the flood with this high-capacity backpack crate. Contains 500 units of life-giving H2O. Requires hydroponics access to open." - cost = 1000 - access = ACCESS_HYDROPONICS - contains = list(/obj/item/watertank) - crate_name = "hydroponics backpack crate" - crate_type = /obj/structure/closet/crate/secure - -/datum/supply_pack/organic/mre - name = "MRE supply kit (emergency rations)" - desc = "The lights are out. Oxygen's running low. You've run out of food except space weevils. Don't let this be you! Order our NT branded MRE kits today! This pack contains 5 MRE packs with a randomized menu and an oxygen tank." - cost = 2000 - contains = list(/obj/item/storage/box/mre/menu1/safe, - /obj/item/storage/box/mre/menu1/safe, - /obj/item/storage/box/mre/menu2/safe, - /obj/item/storage/box/mre/menu2/safe, - /obj/item/storage/box/mre/menu3, - /obj/item/storage/box/mre/menu4/safe) - crate_name = "MRE crate (emergency rations)" - -/datum/supply_pack/organic/pizza - name = "Pizza Crate" - desc = "Best prices on this side of the galaxy. All deliveries are guaranteed to be 99% anomaly-free!" - cost = 6000 // Best prices this side of the galaxy. - contains = list(/obj/item/pizzabox/margherita, - /obj/item/pizzabox/mushroom, - /obj/item/pizzabox/meat, - /obj/item/pizzabox/vegetable, - /obj/item/pizzabox/pineapple) - crate_name = "pizza crate" - var/static/anomalous_box_provided = FALSE - -/datum/supply_pack/organic/pizza/fill(obj/structure/closet/crate/C) - . = ..() - if(!anomalous_box_provided) - for(var/obj/item/pizzabox/P in C) - if(prob(1)) //1% chance for each box, so 4% total chance per order - var/obj/item/pizzabox/infinite/fourfiveeight = new(C) - fourfiveeight.boxtag = P.boxtag - qdel(P) - anomalous_box_provided = TRUE - log_game("An anomalous pizza box was provided in a pizza crate at during cargo delivery") - if(prob(50)) - addtimer(CALLBACK(src, .proc/anomalous_pizza_report), rand(300, 1800)) - else - message_admins("An anomalous pizza box was silently created with no command report in a pizza crate delivery.") - break - -/datum/supply_pack/organic/pizza/proc/anomalous_pizza_report() - print_command_report("[station_name()], our anomalous materials divison has reported a missing object that is highly likely to have been sent to your station during a routine cargo \ - delivery. Please search all crates and manifests provided with the delivery and return the object if is located. The object resembles a standard \[DATA EXPUNGED\] and is to be \ - considered \[REDACTED\] and returned at your leisure. Note that objects the anomaly produces are specifically attuned exactly to the individual opening the anomaly; regardless \ - of species, the individual will find the object edible and it will taste great according to their personal definitions, which vary significantly based on person and species.") - -/datum/supply_pack/organic/potted_plants - 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 = 700 - 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) - crate_name = "potted plants crate" - crate_type = /obj/structure/closet/crate/hydroponics - -/datum/supply_pack/organic/seeds - name = "Seeds Crate" - desc = "Big things have small beginnings. Contains thirteen different seeds." - cost = 1000 - contains = list(/obj/item/seeds/chili, - /obj/item/seeds/berry, - /obj/item/seeds/corn, - /obj/item/seeds/eggplant, - /obj/item/seeds/tomato, - /obj/item/seeds/soya, - /obj/item/seeds/wheat, - /obj/item/seeds/wheat/rice, - /obj/item/seeds/carrot, - /obj/item/seeds/sunflower, - /obj/item/seeds/chanter, - /obj/item/seeds/potato, - /obj/item/seeds/sugarcane) - crate_name = "seeds crate" - crate_type = /obj/structure/closet/crate/hydroponics - -/datum/supply_pack/organic/vday - name = "Surplus Valentine Crate" - desc = "Turns out we got warehouses of this love-y dove-y crap. Were sending out small barged buddle of Valentine gear. This crate has two boxes of chocolate, three poppy flowers, five candy hearts, and three cards." - cost = 3000 - contraband = TRUE - contains = list(/obj/item/storage/fancy/heart_box, - /obj/item/storage/fancy/heart_box, - /obj/item/reagent_containers/food/snacks/grown/poppy, - /obj/item/reagent_containers/food/snacks/grown/poppy, - /obj/item/reagent_containers/food/snacks/grown/poppy, - /obj/item/reagent_containers/food/snacks/candyheart, - /obj/item/reagent_containers/food/snacks/candyheart, - /obj/item/reagent_containers/food/snacks/candyheart, - /obj/item/reagent_containers/food/snacks/candyheart, - /obj/item/reagent_containers/food/snacks/candyheart, - /obj/item/valentine, - /obj/item/valentine, - /obj/item/valentine) - crate_name = "valentine crate" - crate_type = /obj/structure/closet/crate/secure - -/datum/supply_pack/organic/exoticseeds - name = "Exotic Seeds Crate" - desc = "Any entrepreneuring botanist's dream. Contains twelve different seeds, including three replica-pod seeds and two mystery seeds!" - cost = 1500 - contains = list(/obj/item/seeds/nettle, - /obj/item/seeds/replicapod, - /obj/item/seeds/replicapod, - /obj/item/seeds/replicapod, - /obj/item/seeds/plump, - /obj/item/seeds/liberty, - /obj/item/seeds/amanita, - /obj/item/seeds/reishi, - /obj/item/seeds/banana, - /obj/item/seeds/eggplant/eggy, - /obj/item/seeds/random, - /obj/item/seeds/random) - crate_name = "exotic seeds crate" - crate_type = /obj/structure/closet/crate/hydroponics - -////////////////////////////////////////////////////////////////////////////// -////////////////////////////// Livestock ///////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -/datum/supply_pack/critter - group = "Livestock" - crate_type = /obj/structure/closet/crate/critter - -/datum/supply_pack/critter/butterfly - name = "Butterflies Crate" - desc = "Not a very dangerous insect, but they do give off a better image than, say, flies or cockroaches."//is that a motherfucking worm reference - contraband = TRUE - cost = 5000 - contains = list(/mob/living/simple_animal/butterfly) - crate_name = "entomology samples crate" - -/datum/supply_pack/critter/butterfly/generate() - . = ..() - for(var/i in 1 to 49) - new /mob/living/simple_animal/butterfly(.) - -/datum/supply_pack/critter/cat - name = "Cat Crate" - desc = "The cat goes meow! Comes with a collar and a nice cat toy! Cheeseburger not included."//i can't believe im making this reference - cost = 5000 //Cats are worth as much as corgis. - contains = list(/mob/living/simple_animal/pet/cat, - /obj/item/clothing/neck/petcollar, - /obj/item/toy/cattoy) - crate_name = "cat crate" - -/datum/supply_pack/critter/cat/generate() - . = ..() - if(prob(50)) - var/mob/living/simple_animal/pet/cat/C = locate() in . - qdel(C) - new /mob/living/simple_animal/pet/cat/Proc(.) - -/datum/supply_pack/critter/chick - name = "Chicken Crate" - desc = "The chicken goes bwaak!" - cost = 2000 - contains = list( /mob/living/simple_animal/chick) - crate_name = "chicken crate" - -/datum/supply_pack/critter/crab - name = "Crab Rocket" - desc = "CRAAAAAAB ROCKET. CRAB ROCKET. CRAB ROCKET. CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB ROCKET. CRAFT. ROCKET. BUY. CRAFT ROCKET. CRAB ROOOCKET. CRAB ROOOOCKET. CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB ROOOOOOOOOOOOOOOOOOOOOOCK EEEEEEEEEEEEEEEEEEEEEEEEE EEEETTTTTTTTTTTTAAAAAAAAA AAAHHHHHHHHHHHHH. CRAB ROCKET. CRAAAB ROCKEEEEEEEEEGGGGHHHHTT CRAB CRAB CRAABROCKET CRAB ROCKEEEET."//fun fact: i actually spent like 10 minutes and transcribed the entire video. - cost = 5000 - contains = list(/mob/living/simple_animal/crab) - crate_name = "look sir free crabs" - DropPodOnly = TRUE - -/datum/supply_pack/critter/crab/generate() - . = ..() - for(var/i in 1 to 49) - new /mob/living/simple_animal/crab(.) - -/datum/supply_pack/critter/corgi - name = "Corgi Crate" - desc = "Considered the optimal dog breed by thousands of research scientists, this Corgi is but one dog from the millions of Ian's noble bloodline. Comes with a cute collar!" - cost = 5000 - contains = list(/mob/living/simple_animal/pet/dog/corgi, - /obj/item/clothing/neck/petcollar) - crate_name = "corgi crate" - -/datum/supply_pack/critter/corgi/generate() - . = ..() - if(prob(50)) - var/mob/living/simple_animal/pet/dog/corgi/D = locate() in . - if(D.gender == FEMALE) - qdel(D) - new /mob/living/simple_animal/pet/dog/corgi/Lisa(.) - -/datum/supply_pack/critter/corgis/exotic - name = "Exotic Corgi Crate" - desc = "Corgis fit for a king, these corgis come in a unique color to signify their superiority. Comes with a cute collar!" - cost = 5500 - contains = list(/mob/living/simple_animal/pet/dog/corgi/exoticcorgi, - /obj/item/clothing/neck/petcollar) - crate_name = "exotic corgi crate" - -/datum/supply_pack/critter/cow - name = "Cow Crate" - desc = "The cow goes moo!" - cost = 3000 - contains = list(/mob/living/simple_animal/cow) - crate_name = "cow crate" - -/datum/supply_pack/critter/fox - name = "Fox Crate" - desc = "The fox goes...? Comes with a collar!"//what does the fox say - cost = 5000 - contains = list(/mob/living/simple_animal/pet/fox, - /obj/item/clothing/neck/petcollar) - crate_name = "fox crate" - -/datum/supply_pack/critter/goat - name = "Goat Crate" - desc = "The goat goes baa! Warranty void if used as a replacement for Pete." - cost = 2500 - contains = list(/mob/living/simple_animal/hostile/retaliate/goat) - crate_name = "goat crate" - -/datum/supply_pack/critter/monkey - name = "Monkey Cube Crate" - desc = "Stop monkeying around! Contains seven monkey cubes. Just add water!" - cost = 2000 - contains = list (/obj/item/storage/box/monkeycubes) - crate_name = "monkey cube crate" - -/datum/supply_pack/critter/pug - name = "Pug Crate" - desc = "Like a normal dog, but... squished. Comes with a nice collar!" - cost = 5000 - contains = list(/mob/living/simple_animal/pet/dog/pug, - /obj/item/clothing/neck/petcollar) - crate_name = "pug crate" - -/datum/supply_pack/organic/critter/kiwi - name = "Space kiwi Crate" - cost = 2000 - contains = list( /mob/living/simple_animal/kiwi) - crate_name = "space kiwi crate" - -/datum/supply_pack/critter/snake - name = "Snake Crate" - desc = "Tired of these MOTHER FUCKING snakes on this MOTHER FUCKING space station? Then this isn't the crate for you. Contains three poisonous snakes." - cost = 3000 - contains = list(/mob/living/simple_animal/hostile/retaliate/poison/snake, - /mob/living/simple_animal/hostile/retaliate/poison/snake, - /mob/living/simple_animal/hostile/retaliate/poison/snake) - crate_name = "snake crate" - -/datum/supply_pack/critter/secbat - name = "Security Bat Crate" - desc = "Contains five security bats, perfect to Bat-up any security officer." - cost = 2500 - contains = list(/mob/living/simple_animal/hostile/retaliate/bat/secbat, - /mob/living/simple_animal/hostile/retaliate/bat/secbat, - /mob/living/simple_animal/hostile/retaliate/bat/secbat, - /mob/living/simple_animal/hostile/retaliate/bat/secbat, - /mob/living/simple_animal/hostile/retaliate/bat/secbat) - crate_name = "security bat crate" - -////////////////////////////////////////////////////////////////////////////// -//////////////////////////// Costumes & Toys ///////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -/datum/supply_pack/costumes_toys - group = "Costumes & Toys" - -/datum/supply_pack/costumes_toys/randomised - name = "Collectable Hats Crate" - desc = "Flaunt your status with three unique, highly-collectable hats!" - cost = 20000 - var/num_contained = 3 //number of items picked to be contained in a randomised crate - contains = list(/obj/item/clothing/head/collectable/chef, - /obj/item/clothing/head/collectable/paper, - /obj/item/clothing/head/collectable/tophat, - /obj/item/clothing/head/collectable/captain, - /obj/item/clothing/head/collectable/beret, - /obj/item/clothing/head/collectable/welding, - /obj/item/clothing/head/collectable/flatcap, - /obj/item/clothing/head/collectable/pirate, - /obj/item/clothing/head/collectable/kitty, - /obj/item/clothing/head/collectable/rabbitears, - /obj/item/clothing/head/collectable/wizard, - /obj/item/clothing/head/collectable/hardhat, - /obj/item/clothing/head/collectable/HoS, - /obj/item/clothing/head/collectable/HoP, - /obj/item/clothing/head/collectable/thunderdome, - /obj/item/clothing/head/collectable/swat, - /obj/item/clothing/head/collectable/slime, - /obj/item/clothing/head/collectable/police, - /obj/item/clothing/head/collectable/slime, - /obj/item/clothing/head/collectable/xenom, - /obj/item/clothing/head/collectable/petehat) - crate_name = "collectable hats crate" - crate_type = /obj/structure/closet/crate/wooden - -/datum/supply_pack/costumes_toys/randomised/contraband - name = "Contraband Crate" - desc = "Psst.. bud... want some contraband? I can get you a poster, some nice cigs, dank, even some sponsored items...you know, the good stuff. Just keep it away from the cops, kay?" - contraband = TRUE - cost = 3000 - num_contained = 5 //SOME - contains = list(/obj/item/poster/random_contraband, - /obj/item/poster/random_contraband, - /obj/item/reagent_containers/food/snacks/grown/cannabis, - /obj/item/reagent_containers/food/snacks/grown/cannabis/rainbow, - /obj/item/reagent_containers/food/snacks/grown/cannabis/white, - /obj/item/storage/pill_bottle/zoom, - /obj/item/storage/pill_bottle/happy, - /obj/item/storage/pill_bottle/lsd, - /obj/item/storage/pill_bottle/aranesp, - /obj/item/storage/pill_bottle/stimulant, - /obj/item/toy/cards/deck/syndicate, - /obj/item/reagent_containers/food/drinks/bottle/absinthe, - /obj/item/clothing/under/syndicate/tacticool, - /obj/item/storage/fancy/cigarettes/cigpack_syndicate, - /obj/item/storage/fancy/cigarettes/cigpack_shadyjims, - /obj/item/clothing/mask/gas/syndicate, - /obj/item/clothing/neck/necklace/dope, - /obj/item/vending_refill/donksoft, - /obj/item/circuitboard/computer/arcade/amputation) - crate_name = "crate" - -/datum/supply_pack/costumes_toys/foamforce - name = "Foam Force Crate" - desc = "Break out the big guns with eight Foam Force shotguns!" - cost = 1000 - contains = list(/obj/item/gun/ballistic/shotgun/toy, - /obj/item/gun/ballistic/shotgun/toy, - /obj/item/gun/ballistic/shotgun/toy, - /obj/item/gun/ballistic/shotgun/toy, - /obj/item/gun/ballistic/shotgun/toy, - /obj/item/gun/ballistic/shotgun/toy, - /obj/item/gun/ballistic/shotgun/toy, - /obj/item/gun/ballistic/shotgun/toy) - crate_name = "foam force crate" - -/datum/supply_pack/costumes_toys/foamforce/bonus - name = "Foam Force Pistols Crate" - desc = "Psst.. hey bud... remember those old foam force pistols that got discontinued for being too cool? Well I got two of those right here with your name on em. I'll even throw in a spare mag for each, waddya say?" - contraband = TRUE - cost = 4000 - contains = list(/obj/item/gun/ballistic/automatic/toy/pistol, - /obj/item/gun/ballistic/automatic/toy/pistol, - /obj/item/ammo_box/magazine/toy/pistol, - /obj/item/ammo_box/magazine/toy/pistol) - crate_name = "foam force crate" - -/datum/supply_pack/costumes_toys/formalwear - name = "Formalwear Crate" - desc = "You're gonna like the way you look, I guaranteed it. Contains an asston of fancy clothing." - cost = 3000 //Lots of very expensive items. You gotta pay up to look good! - contains = list(/obj/item/clothing/under/blacktango, - /obj/item/clothing/under/assistantformal, - /obj/item/clothing/under/assistantformal, - /obj/item/clothing/under/lawyer/bluesuit, - /obj/item/clothing/suit/toggle/lawyer, - /obj/item/clothing/under/lawyer/purpsuit, - /obj/item/clothing/suit/toggle/lawyer/purple, - /obj/item/clothing/under/lawyer/blacksuit, - /obj/item/clothing/suit/toggle/lawyer/black, - /obj/item/clothing/accessory/waistcoat, - /obj/item/clothing/neck/tie/blue, - /obj/item/clothing/neck/tie/red, - /obj/item/clothing/neck/tie/black, - /obj/item/clothing/head/bowler, - /obj/item/clothing/head/fedora, - /obj/item/clothing/head/flatcap, - /obj/item/clothing/head/beret, - /obj/item/clothing/head/that, - /obj/item/clothing/shoes/laceup, - /obj/item/clothing/shoes/laceup, - /obj/item/clothing/shoes/laceup, - /obj/item/clothing/under/suit_jacket/charcoal, - /obj/item/clothing/under/suit_jacket/navy, - /obj/item/clothing/under/suit_jacket/burgundy, - /obj/item/clothing/under/suit_jacket/checkered, - /obj/item/clothing/under/suit_jacket/tan, - /obj/item/lipstick/random) - crate_name = "formalwear crate" - crate_type = /obj/structure/closet/crate/wooden - -/datum/supply_pack/costumes_toys/clownpin - name = "Hilarious Firing Pin Crate" - desc = "I uh... I'm not really sure what this does. Wanna buy it?" - cost = 5000 - contraband = TRUE - contains = list(/obj/item/firing_pin/clown) - crate_name = "toy crate" // It's /technically/ a toy. For the clown, at least. - crate_type = /obj/structure/closet/crate/wooden - -/datum/supply_pack/costumes_toys/lasertag - name = "Laser Tag Crate" - desc = "Foam Force is for boys. Laser Tag is for men. Contains three sets of red suits, blue suits, matching helmets, and matching laser tag guns." - cost = 1500 - contains = list(/obj/item/gun/energy/laser/redtag, - /obj/item/gun/energy/laser/redtag, - /obj/item/gun/energy/laser/redtag, - /obj/item/gun/energy/laser/bluetag, - /obj/item/gun/energy/laser/bluetag, - /obj/item/gun/energy/laser/bluetag, - /obj/item/clothing/suit/redtag, - /obj/item/clothing/suit/redtag, - /obj/item/clothing/suit/redtag, - /obj/item/clothing/suit/bluetag, - /obj/item/clothing/suit/bluetag, - /obj/item/clothing/suit/bluetag, - /obj/item/clothing/head/helmet/redtaghelm, - /obj/item/clothing/head/helmet/redtaghelm, - /obj/item/clothing/head/helmet/redtaghelm, - /obj/item/clothing/head/helmet/bluetaghelm, - /obj/item/clothing/head/helmet/bluetaghelm, - /obj/item/clothing/head/helmet/bluetaghelm) - crate_name = "laser tag crate" - -/datum/supply_pack/costumes_toys/lasertag/pins - name = "Laser Tag Firing Pins Crate" - desc = "Three laser tag firing pins used in laser-tag units to ensure users are wearing their vests." - cost = 3000 - contraband = TRUE - contains = list(/obj/item/storage/box/lasertagpins) - crate_name = "laser tag crate" - -/datum/supply_pack/costumes_toys/costume_original - name = "Original Costume Crate" - desc = "Reenact Shakespearean plays with this assortment of outfits. Contains eight different costumes!" - cost = 1000 - contains = list(/obj/item/clothing/head/snowman, - /obj/item/clothing/suit/snowman, - /obj/item/clothing/head/chicken, - /obj/item/clothing/suit/chickensuit, - /obj/item/clothing/mask/gas/monkeymask, - /obj/item/clothing/suit/monkeysuit, - /obj/item/clothing/head/cardborg, - /obj/item/clothing/suit/cardborg, - /obj/item/clothing/head/xenos, - /obj/item/clothing/suit/xenos, - /obj/item/clothing/suit/hooded/ian_costume, - /obj/item/clothing/suit/hooded/carp_costume, - /obj/item/clothing/suit/hooded/bee_costume) - crate_name = "original costume crate" - crate_type = /obj/structure/closet/crate/wooden - -/datum/supply_pack/costumes_toys/costume - name = "Standard Costume Crate" - desc = "Supply the station's entertainers with the equipment of their trade with these Nanotrasen-approved costumes! Contains a full clown and mime outfit, along with a bike horn and a bottle of nothing." - cost = 1000 - access = ACCESS_THEATRE - contains = list(/obj/item/storage/backpack/clown, - /obj/item/clothing/shoes/clown_shoes, - /obj/item/clothing/mask/gas/clown_hat, - /obj/item/clothing/under/rank/clown, - /obj/item/bikehorn, - /obj/item/clothing/under/rank/mime, - /obj/item/clothing/shoes/sneakers/black, - /obj/item/clothing/gloves/color/white, - /obj/item/clothing/mask/gas/mime, - /obj/item/clothing/head/beret, - /obj/item/clothing/suit/suspenders, - /obj/item/reagent_containers/food/drinks/bottle/bottleofnothing, - /obj/item/storage/backpack/mime) - crate_name = "standard costume crate" - crate_type = /obj/structure/closet/crate/wooden - -/datum/supply_pack/costumes_toys/randomised/toys - name = "Toy Crate" - desc = "Who cares about pride and accomplishment? Skip the gaming and get straight to the sweet rewards with this product! Contains five random toys. Warranty void if used to prank research directors." - cost = 1500 // or play the arcade machines ya lazy bum - num_contained = 5 - contains = list(/obj/item/storage/box/snappops, - /obj/item/toy/talking/AI, - /obj/item/toy/talking/codex_gigas, - /obj/item/clothing/under/syndicate/tacticool, - /obj/item/toy/sword , - /obj/item/toy/gun, - /obj/item/gun/ballistic/shotgun/toy/crossbow, - /obj/item/storage/box/fakesyndiesuit, - /obj/item/storage/crayons, - /obj/item/toy/spinningtoy, - /obj/item/toy/prize/ripley, - /obj/item/toy/prize/fireripley, - /obj/item/toy/prize/deathripley, - /obj/item/toy/prize/gygax, - /obj/item/toy/prize/durand, - /obj/item/toy/prize/honk, - /obj/item/toy/prize/marauder, - /obj/item/toy/prize/seraph, - /obj/item/toy/prize/mauler, - /obj/item/toy/prize/odysseus, - /obj/item/toy/prize/phazon, - /obj/item/toy/prize/reticence, - /obj/item/toy/cards/deck, - /obj/item/toy/nuke, - /obj/item/toy/minimeteor, - /obj/item/toy/redbutton, - /obj/item/toy/talking/owl, - /obj/item/toy/talking/griffin, - /obj/item/coin/antagtoken, - /obj/item/stack/tile/fakespace/loaded, - /obj/item/stack/tile/fakepit/loaded, - /obj/item/toy/toy_xeno, - /obj/item/storage/box/actionfigure, - /obj/item/restraints/handcuffs/fake, - /obj/item/grenade/chem_grenade/glitter/pink, - /obj/item/grenade/chem_grenade/glitter/blue, - /obj/item/grenade/chem_grenade/glitter/white, - /obj/item/toy/eightball, - /obj/item/toy/windupToolbox, - /obj/item/toy/clockwork_watch, - /obj/item/toy/toy_dagger, - /obj/item/extendohand/acme, - /obj/item/hot_potato/harmless/toy, - /obj/item/card/emagfake, - /obj/item/clothing/shoes/wheelys, - /obj/item/clothing/shoes/kindleKicks, - /obj/item/storage/belt/military/snack, - /obj/item/toy/eightball, - /obj/item/vending_refill/donksoft) - crate_name = "toy crate" - crate_type = /obj/structure/closet/crate/wooden - -/datum/supply_pack/costumes_toys/randomised/plush - name = "Plush Crate" - desc = "Plush tide station wide. Contains 5 random plushies for you to love. Warranty void if your love violates the terms of use." - cost = 1500 // or play the arcade machines ya lazy bum - num_contained = 5 - contains = list(/obj/item/toy/plush/random, - /obj/item/toy/plush/random, - /obj/item/toy/plush/random, - /obj/item/toy/plush/random, - /obj/item/toy/plush/random) //I'm lazy - crate_name = "plushie crate" - crate_type = /obj/structure/closet/crate/wooden - -/datum/supply_pack/costumes_toys/wizard - name = "Wizard Costume Crate" - desc = "Pretend to join the Wizard Federation with this full wizard outfit! Nanotrasen would like to remind its employees that actually joining the Wizard Federation is subject to termination of job and life." - cost = 2000 - contains = list(/obj/item/staff, - /obj/item/clothing/suit/wizrobe/fake, - /obj/item/clothing/shoes/sandal, - /obj/item/clothing/head/wizard/fake) - crate_name = "wizard costume crate" - crate_type = /obj/structure/closet/crate/wooden - -/datum/supply_pack/costumes_toys/randomised/fill(obj/structure/closet/crate/C) - var/list/L = contains.Copy() - for(var/i in 1 to num_contained) - var/item = pick_n_take(L) - new item(C) - -/datum/supply_pack/costumes_toys/wardrobes/autodrobe - name = "Autodrobe Supply Crate" - desc = "Autodrobe missing your favorite dress? Solve that issue today with this autodrobe refill." - cost = 1500 - contains = list(/obj/item/vending_refill/autodrobe) - crate_name = "autodrobe supply crate" - -/datum/supply_pack/costumes_toys/wardrobes/cargo - name = "Cargo Wardrobe Supply Crate" - desc = "This crate contains a refill for the CargoDrobe." - cost = 750 - contains = list(/obj/item/vending_refill/wardrobe/cargo_wardrobe) - crate_name = "cargo department supply crate" - -/datum/supply_pack/costumes_toys/wardrobes/engineering - name = "Engineering Wardrobe Supply Crate" - desc = "This crate contains refills for the EngiDrobe and AtmosDrobe." - cost = 1500 - contains = list(/obj/item/vending_refill/wardrobe/engi_wardrobe, - /obj/item/vending_refill/wardrobe/atmos_wardrobe) - crate_name = "engineering department wardrobe supply crate" - -/datum/supply_pack/costumes_toys/wardrobes/general - name = "General Wardrobes Supply Crate" - desc = "This crate contains refills for the CuraDrobe, BarDrobe, ChefDrobe, JaniDrobe, ChapDrobe." - cost = 3750 - contains = list(/obj/item/vending_refill/wardrobe/curator_wardrobe, - /obj/item/vending_refill/wardrobe/bar_wardrobe, - /obj/item/vending_refill/wardrobe/chef_wardrobe, - /obj/item/vending_refill/wardrobe/jani_wardrobe, - /obj/item/vending_refill/wardrobe/chap_wardrobe) - crate_name = "general wardrobes vendor refills" - -/datum/supply_pack/costumes_toys/wardrobes/hydroponics - name = "Hydrobe Supply Crate" - desc = "This crate contains a refill for the Hydrobe." - cost = 750 - contains = list(/obj/item/vending_refill/wardrobe/hydro_wardrobe) - crate_name = "hydrobe supply crate" - -/datum/supply_pack/costumes_toys/wardrobes/medical - name = "Medical Wardrobe Supply Crate" - desc = "This crate contains refills for the MediDrobe, ChemDrobe, GeneDrobe, and ViroDrobe." - cost = 3000 - contains = list(/obj/item/vending_refill/wardrobe/medi_wardrobe, - /obj/item/vending_refill/wardrobe/chem_wardrobe, - /obj/item/vending_refill/wardrobe/gene_wardrobe, - /obj/item/vending_refill/wardrobe/viro_wardrobe) - crate_name = "medical department wardrobe supply crate" - -/datum/supply_pack/costumes_toys/wardrobes/science - name = "Science Wardrobe Supply Crate" - desc = "This crate contains refills for the SciDrobe and RoboDrobe." - cost = 1500 - contains = list(/obj/item/vending_refill/wardrobe/robo_wardrobe, - /obj/item/vending_refill/wardrobe/science_wardrobe) - crate_name = "science department wardrobe supply crate" - -/datum/supply_pack/costumes_toys/wardrobes/security - name = "Security Wardrobe Supply Crate" - desc = "This crate contains refills for the SecDrobe and LawDrobe." - cost = 1500 - contains = list(/obj/item/vending_refill/wardrobe/sec_wardrobe, - /obj/item/vending_refill/wardrobe/law_wardrobe) - crate_name = "security department supply crate" - -/datum/supply_pack/costumes_toys/kinkmate - name = "Kinkmate construction kit" - cost = 2000 - contraband = TRUE - contains = list(/obj/item/vending_refill/kink, /obj/item/circuitboard/machine/kinkmate) - crate_name = "Kinkmate construction kit" - -////////////////////////////////////////////////////////////////////////////// -//////////////////////////// Miscellaneous /////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -/datum/supply_pack/misc - group = "Miscellaneous Supplies" - -/datum/supply_pack/misc/artsupply - name = "Art Supplies" - desc = "Make some happy little accidents with six canvasses, two easels, two boxes of crayons, and a rainbow crayon!" - cost = 800 - contains = list(/obj/structure/easel, - /obj/structure/easel, - /obj/item/canvas/nineteenXnineteen, - /obj/item/canvas/nineteenXnineteen, - /obj/item/canvas/twentythreeXnineteen, - /obj/item/canvas/twentythreeXnineteen, - /obj/item/canvas/twentythreeXtwentythree, - /obj/item/canvas/twentythreeXtwentythree, - /obj/item/storage/crayons, - /obj/item/storage/crayons, - /obj/item/toy/crayon/rainbow, - /obj/item/toy/crayon/white, - /obj/item/toy/crayon/white) - crate_name = "art supply crate" - crate_type = /obj/structure/closet/crate/wooden - -/datum/supply_pack/misc/captain_pen - name = "Captain Pen" - desc = "A spare Captain fountain pen." - access = ACCESS_CAPTAIN - cost = 10000 - contains = list(/obj/item/pen/fountain/captain) - crate_name = "captain pen" - crate_type = /obj/structure/closet/crate/secure/weapon //It is a combat pen - -/datum/supply_pack/misc/bicycle - name = "Bicycle" - desc = "Nanotrasen reminds all employees to never toy with powers outside their control." - cost = 1000000 - contains = list(/obj/vehicle/ridden/bicycle) - crate_name = "Bicycle Crate" - crate_type = /obj/structure/closet/crate/large - -/datum/supply_pack/misc/bigband - name = "Big Band Instrument Collection" - desc = "Get your sad station movin' and groovin' with this fine collection! Contains nine different instruments!" - cost = 5000 - crate_name = "Big band musical instruments collection" - contains = list(/obj/item/instrument/violin, - /obj/item/instrument/guitar, - /obj/item/instrument/glockenspiel, - /obj/item/instrument/accordion, - /obj/item/instrument/saxophone, - /obj/item/instrument/trombone, - /obj/item/instrument/recorder, - /obj/item/instrument/harmonica, - /obj/structure/piano/unanchored) - crate_type = /obj/structure/closet/crate/wooden - -/datum/supply_pack/misc/book_crate - name = "Book Crate" - desc = "Surplus from the Nanotrasen Archives, these five books are sure to be good reads." - cost = 1500 - contains = list(/obj/item/book/codex_gigas, - /obj/item/book/manual/random/, - /obj/item/book/manual/random/, - /obj/item/book/manual/random/, - /obj/item/book/random/triple) - crate_type = /obj/structure/closet/crate/wooden - -/datum/supply_pack/misc/paper - name = "Bureaucracy Crate" - desc = "High stacks of papers on your desk Are a big problem - make it Pea-sized with these bureaucratic supplies! Contains five pens, some camera film, hand labeler supplies, a paper bin, three folders, two clipboards and two stamps as well as a briefcase."//that was too forced - cost = 1500 - contains = list(/obj/structure/filingcabinet/chestdrawer/wheeled, - /obj/item/camera_film, - /obj/item/hand_labeler, - /obj/item/hand_labeler_refill, - /obj/item/hand_labeler_refill, - /obj/item/paper_bin, - /obj/item/pen/fourcolor, - /obj/item/pen/fourcolor, - /obj/item/pen, - /obj/item/pen/blue, - /obj/item/pen/red, - /obj/item/folder/blue, - /obj/item/folder/red, - /obj/item/folder/yellow, - /obj/item/clipboard, - /obj/item/clipboard, - /obj/item/stamp, - /obj/item/stamp/denied, - /obj/item/storage/briefcase) - crate_name = "bureaucracy crate" - -/datum/supply_pack/misc/fountainpens - name = "Calligraphy Crate" - desc = "Sign death warrants in style with these seven executive fountain pens." - cost = 700 - contains = list(/obj/item/storage/box/fountainpens, - /obj/item/paper_bin) - crate_type = /obj/structure/closet/crate/wooden - crate_name = "calligraphy crate" - -/datum/supply_pack/misc/wrapping_paper - name = "Festive Wrapping Paper Crate" - desc = "Want to mail your loved ones gift-wrapped chocolates, stuffed animals, the Clown's severed head? You can do all that, with this crate full of wrapping paper." - cost = 1000 - contains = list(/obj/item/stack/wrapping_paper) - crate_type = /obj/structure/closet/crate/wooden - crate_name = "festive wrapping paper crate" - -/datum/supply_pack/misc/paper_work - name = "Freelance Paper work" - desc = "The Nanotrasen Primary Bureaucratic Database Intelligence (PDBI) reports that the station has not completed its funding and grant paperwork this solar cycle. In order to gain further funding, your station is required to fill out (10) ten of these forms or no additional capital will be disbursed. We have sent you ten copies of the following form and we expect every one to be up to Nanotrasen Standards." // Disbursement. It's not a typo, look it up. - cost = 700 // Net of 0 credits - contains = list(/obj/item/folder/paperwork, - /obj/item/folder/paperwork, - /obj/item/folder/paperwork, - /obj/item/folder/paperwork, - /obj/item/folder/paperwork, - /obj/item/folder/paperwork, - /obj/item/folder/paperwork, - /obj/item/folder/paperwork, - /obj/item/folder/paperwork, - /obj/item/folder/paperwork, - /obj/item/pen/fountain, - /obj/item/pen/fountain, - /obj/item/pen/fountain, - /obj/item/pen/fountain, - /obj/item/pen/fountain) - crate_name = "Paperwork" - -/datum/supply_pack/misc/funeral - name = "Funeral Supply crate" - desc = "At the end of the day, someone's gonna want someone dead. Give them a proper send-off with these funeral supplies! Contains a coffin with burial garmets and flowers." - cost = 600 - contains = list(/obj/item/clothing/under/burial, - /obj/item/reagent_containers/food/snacks/grown/harebell, - /obj/item/reagent_containers/food/snacks/grown/poppy/geranium - ) - crate_name = "coffin" - crate_type = /obj/structure/closet/crate/coffin - -/datum/supply_pack/misc/jukebox - name = "Jukebox" - cost = 35000 - contains = list(/obj/machinery/jukebox) - crate_name = "Jukebox" - -/datum/supply_pack/misc/lewd - name = "Lewd Crate" // OwO - desc = "Psss want to have a good time with your sluts? Well I got what you want maid clothing, dildos, collars and more!" - cost = 5000 - contraband = TRUE - contains = list(/obj/item/dildo/custom, - /obj/item/dildo/custom, - /obj/item/vending_refill/kink, - /obj/item/vending_refill/kink, - /obj/item/clothing/under/maid, - /obj/item/clothing/under/maid, - /obj/item/electropack/shockcollar, - /obj/item/electropack/shockcollar, - /obj/item/restraints/handcuffs/fake/kinky, - /obj/item/restraints/handcuffs/fake/kinky, - /obj/item/clothing/head/kitty/genuine, // Why its illegal - /obj/item/clothing/head/kitty/genuine, - /obj/item/storage/pill_bottle/penis_enlargement, - /obj/structure/reagent_dispensers/keg/aphro) - crate_name = "lewd kit" - crate_type = /obj/structure/closet/crate - -/datum/supply_pack/misc/lewdkeg - name = "Lewd Deluxe Keg" - desc = "That other stuff not getting you ready? Well I have a Chemslut making tons of the good stuff." - cost = 7000 //It can be a weapon - contraband = TRUE - contains = list(/obj/structure/reagent_dispensers/keg/aphro/strong) - crate_name = "deluxe keg" - crate_type = /obj/structure/closet/crate - -/datum/supply_pack/misc/religious_supplies - name = "Religious Supplies Crate" - desc = "Keep your local chaplain happy and well-supplied, lest they call down judgement upon your cargo bay. Contains two bottles of holywater, bibles, chaplain robes, and burial garmets." - cost = 4000 // it costs so much because the Space Church is ran by Space Jews - contains = list(/obj/item/reagent_containers/food/drinks/bottle/holywater, - /obj/item/reagent_containers/food/drinks/bottle/holywater, - /obj/item/storage/book/bible/booze, - /obj/item/storage/book/bible/booze, - /obj/item/clothing/suit/hooded/chaplain_hoodie, - /obj/item/clothing/suit/hooded/chaplain_hoodie - ) - crate_name = "religious supplies crate" - -/datum/supply_pack/misc/randomised/promiscuous - name = "Promiscuous Organs" - desc = "Do YOU want to have more genital? Well we have just the thing for you~. This crate has two autosurgeon, that will let you have a new sex, organ to impress that hot stud and or chick." - cost = 4000 //Only get 2! - contraband = TRUE - var/num_contained = 2 - contains = list(/obj/item/autosurgeon/penis, - /obj/item/autosurgeon/testicles, - /obj/item/autosurgeon/vagina, - /obj/item/autosurgeon/breasts, - /obj/item/autosurgeon/womb) - crate_name = "promiscuous organs" - -/datum/supply_pack/misc/toner - name = "Toner Crate" - desc = "Spent too much ink printing butt pictures? Fret not, with these six toner refills, you'll be printing butts 'till the cows come home!'" - cost = 1000 - contains = list(/obj/item/toner, - /obj/item/toner, - /obj/item/toner, - /obj/item/toner, - /obj/item/toner, - /obj/item/toner) - crate_name = "toner crate" diff --git a/code/modules/cargo/packs/armory.dm b/code/modules/cargo/packs/armory.dm new file mode 100644 index 0000000000..11aae8a054 --- /dev/null +++ b/code/modules/cargo/packs/armory.dm @@ -0,0 +1,244 @@ + +//Reminders- +// If you add something to this list, please group it by type and sort it alphabetically instead of just jamming it in like an animal +// cost = 700- Minimum cost, or infinite points are possible. +////////////////////////////////////////////////////////////////////////////// +//////////////////////////// Armory ////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +/datum/supply_pack/security/armory + group = "Armory" + access = ACCESS_ARMORY + crate_type = /obj/structure/closet/crate/secure/weapon + +/datum/supply_pack/security/armory/bulletarmor + name = "Bulletproof Armor Crate" + desc = "Contains three sets of bulletproof armor. Guaranteed to reduce a bullet's stopping power by over half. Requires Armory access to open." + cost = 1250 + contains = list(/obj/item/clothing/suit/armor/bulletproof, + /obj/item/clothing/suit/armor/bulletproof, + /obj/item/clothing/suit/armor/bulletproof) + crate_name = "bulletproof armor crate" + +/datum/supply_pack/security/armory/bullethelmets + name = "Bulletproof Helmet Crate" + desc = "Contains three sets of bulletproof helmets. Guaranteed to reduce a bullet's stopping power by over half. Requires Armory access to open." + cost = 1250 + contains = list(/obj/item/clothing/head/helmet/alt, + /obj/item/clothing/head/helmet/alt, + /obj/item/clothing/head/helmet/alt) + crate_name = "bulletproof helmet crate" + +/datum/supply_pack/security/armory/chemimp + name = "Chemical Implants Crate" + desc = "Contains five Remote Chemical implants. Requires Armory access to open." + cost = 1700 + 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." + cost = 8000 + contains = list(/obj/item/gun/ballistic/shotgun/automatic/combat, + /obj/item/gun/ballistic/shotgun/automatic/combat, + /obj/item/gun/ballistic/shotgun/automatic/combat, + /obj/item/storage/belt/bandolier, + /obj/item/storage/belt/bandolier, + /obj/item/storage/belt/bandolier, + /obj/item/storage/box/lethalshot, + /obj/item/storage/box/lethalslugs) + crate_name = "combat shotguns crate" + +/datum/supply_pack/security/armory/dragnetgun + name = "DRAGnet gun Crate" + desc = "Contains two DRAGnet gun. A Dynamic Rapid-Apprehension of the Guilty net the revolution in law enforcement technology that YOU Want! Requires Armory access to open." + cost = 3250 + contains = list(/obj/item/gun/energy/e_gun/dragnet, + /obj/item/gun/energy/e_gun/dragnet) + crate_name = "anti riot net guns crate" + +/datum/supply_pack/security/armory/energy + name = "Energy Guns Crate" + desc = "Contains three Energy Guns, capable of firing both nonlethal and lethal blasts of light. Requires Armory access to open." + cost = 3250 + contains = list(/obj/item/gun/energy/e_gun, + /obj/item/gun/energy/e_gun, + /obj/item/gun/energy/e_gun) + crate_name = "energy gun crate" + crate_type = /obj/structure/closet/crate/secure/plasma + +/datum/supply_pack/security/armory/exileimp // Theres boxes in 2 lockers as well as gateway never realy being used sad + name = "Exile Implants Crate" + desc = "Contains five Exile implants. Requires Armory access to open." + cost = 1050 //stops endless points + contains = list(/obj/item/storage/box/exileimp) + crate_name = "exile implant crate" + +/datum/supply_pack/security/armory/mindshield + name = "Mindshield Implants Crate" + desc = "Prevent against radical thoughts with three Mindshield implants. Requires Armory access to open." + cost = 3000 //Lowered untill cargo rework MK II is done + contains = list(/obj/item/storage/lockbox/loyalty) + crate_name = "mindshield implant crate" + +/datum/supply_pack/security/armory/trackingimp + name = "Tracking Implants Crate" + desc = "Contains four tracking implants. Requires Armory access to open." + cost = 1050 + contains = list(/obj/item/storage/box/trackimp) + crate_name = "tracking implant crate" + +/datum/supply_pack/security/armory/fire + name = "Incendiary Weapons Crate" + desc = "Burn, baby burn. Contains three incendiary grenades, seven incendiary slugs, three plasma canisters, and a flamethrower. Requires Brige access to open." + cost = 1750 + access = ACCESS_HEADS + contains = list(/obj/item/flamethrower/full, + /obj/item/tank/internals/plasma, + /obj/item/tank/internals/plasma, + /obj/item/tank/internals/plasma, + /obj/item/grenade/chem_grenade/incendiary, + /obj/item/grenade/chem_grenade/incendiary, + /obj/item/grenade/chem_grenade/incendiary, + /obj/item/storage/box/fireshot) + crate_name = "incendiary weapons crate" + crate_type = /obj/structure/closet/crate/secure/plasma + dangerous = TRUE + +/datum/supply_pack/security/armory/miniguns + name = "Personal Miniature Energy Guns" + desc = "Contains three miniature energy guns. Each gun has a disabler and a lethal option. Requires Armory access to open." + cost = 3000 + contains = list(/obj/item/gun/energy/e_gun/mini, + /obj/item/gun/energy/e_gun/mini, + /obj/item/gun/energy/e_gun/mini) + crate_name = "personal energy guns crate" + crate_type = /obj/structure/closet/crate/secure/plasma + +/datum/supply_pack/security/armory/laserarmor + name = "Reflector Vest Crate" + desc = "Contains two vests of highly reflective material. Each armor piece diffuses a laser's energy by over half, as well as offering a good chance to reflect the laser entirely. Requires Armory access to open." + cost = 2000 + contains = list(/obj/item/clothing/suit/armor/laserproof, + /obj/item/clothing/suit/armor/laserproof) + crate_name = "reflector vest crate" + crate_type = /obj/structure/closet/crate/secure/plasma + +/datum/supply_pack/security/armory/riotarmor + name = "Riot Armor Crate" + desc = "Contains three sets of heavy body armor. Advanced padding protects against close-ranged weaponry, making melee attacks feel only half as potent to the user. Requires Armory access to open." + cost = 1750 + contains = list(/obj/item/clothing/suit/armor/riot, + /obj/item/clothing/suit/armor/riot, + /obj/item/clothing/suit/armor/riot) + crate_name = "riot armor crate" + +/datum/supply_pack/security/armory/riothelmets + name = "Riot Helmets Crate" + desc = "Contains three riot helmets. Requires Armory access to open." + cost = 1750 + contains = list(/obj/item/clothing/head/helmet/riot, + /obj/item/clothing/head/helmet/riot, + /obj/item/clothing/head/helmet/riot) + crate_name = "riot helmets crate" + +/datum/supply_pack/security/armory/riotshields + name = "Riot Shields Crate" + desc = "For when the greytide gets really uppity. Contains three riot shields. Requires Armory access to open." + cost = 2200 + contains = list(/obj/item/shield/riot, + /obj/item/shield/riot, + /obj/item/shield/riot) + crate_name = "riot shields crate" + +/datum/supply_pack/security/armory/riotshotguns + name = "Riot Shotgun Crate" + desc = "For when the greytide gets really uppity. Contains three riot shotguns, seven rubber shot and beanbag shells. Requires Armory access to open." + cost = 6500 + contains = list(/obj/item/gun/ballistic/shotgun/riot, + /obj/item/gun/ballistic/shotgun/riot, + /obj/item/gun/ballistic/shotgun/riot, + /obj/item/storage/box/rubbershot, + /obj/item/storage/box/beanbag) + crate_name = "riot shotgun crate" + +/datum/supply_pack/security/armory/swat + name = "SWAT Crate" + desc = "Contains two fullbody sets of tough, fireproof, pressurized suits designed in a joint effort by IS-ERI and Nanotrasen. Each set contains a suit, helmet, mask, combat belt, and combat gloves. Requires Armory access to open." + cost = 6000 + contains = list(/obj/item/clothing/head/helmet/swat/nanotrasen, + /obj/item/clothing/head/helmet/swat/nanotrasen, + /obj/item/clothing/suit/space/swat, + /obj/item/clothing/suit/space/swat, + /obj/item/clothing/mask/gas/sechailer/swat, + /obj/item/clothing/mask/gas/sechailer/swat, + /obj/item/storage/belt/military/assault, + /obj/item/storage/belt/military/assault, + /obj/item/clothing/gloves/combat, + /obj/item/clothing/gloves/combat) + crate_name = "swat crate" + +/datum/supply_pack/security/armory/swattasers //Lesser AEG tbh + name = "SWAT tatical tasers Crate" + desc = "Contains two tactical energy gun, these guns are able to tase, disable and lethal as well as hold a seclight. Requires Armory access to open." + cost = 7000 + contains = list(/obj/item/gun/energy/e_gun/stun, + /obj/item/gun/energy/e_gun/stun) + crate_name = "swat taser crate" + +/datum/supply_pack/security/armory/woodstock + name = "Classic WoodStock Shotguns Crate" + desc = "Contains three rustic, pumpaction shotguns. Requires Armory access to open." + cost = 3000 + contains = list(/obj/item/gun/ballistic/shotgun, + /obj/item/gun/ballistic/shotgun, + /obj/item/gun/ballistic/shotgun) + crate_name = "woodstock shotguns crate" + +/datum/supply_pack/security/armory/wt550 + name = "WT-550 Semi-Auto Rifle Crate" + desc = "Contains two high-powered, semiautomatic rifles chambered in 4.6x30mm. Requires Armory access to open." + cost = 2550 + contains = list(/obj/item/gun/ballistic/automatic/wt550, + /obj/item/gun/ballistic/automatic/wt550) + crate_name = "auto rifle crate" + +/datum/supply_pack/security/armory/wt550ammo + name = "WT-550 Semi-Auto SMG Ammo Crate" + desc = "Contains four 20-round magazines for the WT-550 Semi-Auto SMG. Each magazine is designed to facilitate rapid tactical reloads. Requires Armory access to open." + cost = 1750 + contains = list(/obj/item/ammo_box/magazine/wt550m9, + /obj/item/ammo_box/magazine/wt550m9, + /obj/item/ammo_box/magazine/wt550m9, + /obj/item/ammo_box/magazine/wt550m9) + crate_name = "auto rifle ammo crate" + +/datum/supply_pack/security/armory/wt550ammo_nonlethal // Takes around 12 shots to stun crit someone + name = "WT-550 Semi-Auto SMG Non-Lethal Ammo Crate" + desc = "Contains four 20-round magazines for the WT-550 Semi-Auto SMG. Each magazine is designed to facilitate rapid tactical reloads. Requires Armory access to open." + cost = 1000 + contains = list(/obj/item/ammo_box/magazine/wt550m9/wtrubber, + /obj/item/ammo_box/magazine/wt550m9/wtrubber, + /obj/item/ammo_box/magazine/wt550m9/wtrubber, + /obj/item/ammo_box/magazine/wt550m9/wtrubber) + crate_name = "auto rifle ammo crate" + +/datum/supply_pack/security/armory/wt550ammo_special + name = "WT-550 Semi-Auto SMG Special Ammo Crate" + desc = "Contains 2 20-round Armour Piercing and Incendiary magazines for the WT-550 Semi-Auto SMG. Each magazine is designed to facilitate rapid tactical reloads. Requires Armory access to open." + cost = 3000 + contains = list(/obj/item/ammo_box/magazine/wt550m9/wtap, + /obj/item/ammo_box/magazine/wt550m9/wtap, + /obj/item/ammo_box/magazine/wt550m9/wtic, + /obj/item/ammo_box/magazine/wt550m9/wtic) + crate_name = "auto rifle ammo crate" diff --git a/code/modules/cargo/packs/costumes_toys.dm b/code/modules/cargo/packs/costumes_toys.dm new file mode 100644 index 0000000000..40d21e4505 --- /dev/null +++ b/code/modules/cargo/packs/costumes_toys.dm @@ -0,0 +1,369 @@ + +//Reminders- +// If you add something to this list, please group it by type and sort it alphabetically instead of just jamming it in like an animal +// cost = 700- Minimum cost, or infinite points are possible. +////////////////////////////////////////////////////////////////////////////// +//////////////////////////// Costumes & Toys ///////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +/datum/supply_pack/costumes_toys + group = "Costumes & Toys" + +/datum/supply_pack/costumes_toys/randomised + name = "Collectable Hats Crate" + desc = "Flaunt your status with three unique, highly-collectable hats!" + cost = 20000 + var/num_contained = 3 //number of items picked to be contained in a randomised crate + contains = list(/obj/item/clothing/head/collectable/chef, + /obj/item/clothing/head/collectable/paper, + /obj/item/clothing/head/collectable/tophat, + /obj/item/clothing/head/collectable/captain, + /obj/item/clothing/head/collectable/beret, + /obj/item/clothing/head/collectable/welding, + /obj/item/clothing/head/collectable/flatcap, + /obj/item/clothing/head/collectable/pirate, + /obj/item/clothing/head/collectable/kitty, + /obj/item/clothing/head/collectable/rabbitears, + /obj/item/clothing/head/collectable/wizard, + /obj/item/clothing/head/collectable/hardhat, + /obj/item/clothing/head/collectable/HoS, + /obj/item/clothing/head/collectable/HoP, + /obj/item/clothing/head/collectable/thunderdome, + /obj/item/clothing/head/collectable/swat, + /obj/item/clothing/head/collectable/slime, + /obj/item/clothing/head/collectable/police, + /obj/item/clothing/head/collectable/slime, + /obj/item/clothing/head/collectable/xenom, + /obj/item/clothing/head/collectable/petehat) + crate_name = "collectable hats crate" + crate_type = /obj/structure/closet/crate/wooden + +/datum/supply_pack/costumes_toys/randomised/contraband + name = "Contraband Crate" + desc = "Psst.. bud... want some contraband? I can get you a poster, some nice cigs, dank, even some sponsored items...you know, the good stuff. Just keep it away from the cops, kay?" + contraband = TRUE + cost = 3000 + num_contained = 5 //SOME + contains = list(/obj/item/poster/random_contraband, + /obj/item/poster/random_contraband, + /obj/item/reagent_containers/food/snacks/grown/cannabis, + /obj/item/reagent_containers/food/snacks/grown/cannabis/rainbow, + /obj/item/reagent_containers/food/snacks/grown/cannabis/white, + /obj/item/storage/pill_bottle/zoom, + /obj/item/storage/pill_bottle/happy, + /obj/item/storage/pill_bottle/lsd, + /obj/item/storage/pill_bottle/aranesp, + /obj/item/storage/pill_bottle/stimulant, + /obj/item/toy/cards/deck/syndicate, + /obj/item/reagent_containers/food/drinks/bottle/absinthe, + /obj/item/clothing/under/syndicate/tacticool, + /obj/item/clothing/under/syndicate, + /obj/item/suppressor, + /obj/item/storage/fancy/cigarettes/cigpack_syndicate, + /obj/item/storage/fancy/cigarettes/cigpack_shadyjims, + /obj/item/clothing/mask/gas/syndicate, + /obj/item/clothing/neck/necklace/dope, + /obj/item/vending_refill/donksoft, + /obj/item/circuitboard/computer/arcade/amputation) + crate_name = "crate" + +/datum/supply_pack/costumes_toys/foamforce + name = "Foam Force Crate" + desc = "Break out the big guns with eight Foam Force shotguns!" + cost = 1000 + contains = list(/obj/item/gun/ballistic/shotgun/toy, + /obj/item/gun/ballistic/shotgun/toy, + /obj/item/gun/ballistic/shotgun/toy, + /obj/item/gun/ballistic/shotgun/toy, + /obj/item/gun/ballistic/shotgun/toy, + /obj/item/gun/ballistic/shotgun/toy, + /obj/item/gun/ballistic/shotgun/toy, + /obj/item/gun/ballistic/shotgun/toy) + crate_name = "foam force crate" + +/datum/supply_pack/costumes_toys/foamforce/bonus + name = "Foam Force Pistols Crate" + desc = "Psst.. hey bud... remember those old foam force pistols that got discontinued for being too cool? Well I got two of those right here with your name on em. I'll even throw in a spare mag for each, waddya say?" + contraband = TRUE + cost = 4000 + contains = list(/obj/item/gun/ballistic/automatic/toy/pistol, + /obj/item/gun/ballistic/automatic/toy/pistol, + /obj/item/ammo_box/magazine/toy/pistol, + /obj/item/ammo_box/magazine/toy/pistol) + crate_name = "foam force crate" + +/datum/supply_pack/costumes_toys/formalwear + name = "Formalwear Crate" + desc = "You're gonna like the way you look, I guaranteed it. Contains an asston of fancy clothing." + cost = 4750 //Lots of fancy clothing that can be sold back! + contains = list(/obj/item/clothing/under/blacktango, + /obj/item/clothing/under/assistantformal, + /obj/item/clothing/under/assistantformal, + /obj/item/clothing/under/lawyer/bluesuit, + /obj/item/clothing/suit/toggle/lawyer, + /obj/item/clothing/under/lawyer/purpsuit, + /obj/item/clothing/suit/toggle/lawyer/purple, + /obj/item/clothing/under/lawyer/blacksuit, + /obj/item/clothing/suit/toggle/lawyer/black, + /obj/item/clothing/accessory/waistcoat, + /obj/item/clothing/neck/tie/blue, + /obj/item/clothing/neck/tie/red, + /obj/item/clothing/neck/tie/black, + /obj/item/clothing/head/bowler, + /obj/item/clothing/head/fedora, + /obj/item/clothing/head/flatcap, + /obj/item/clothing/head/beret, + /obj/item/clothing/head/that, + /obj/item/clothing/shoes/laceup, + /obj/item/clothing/shoes/laceup, + /obj/item/clothing/shoes/laceup, + /obj/item/clothing/under/suit_jacket/charcoal, + /obj/item/clothing/under/suit_jacket/navy, + /obj/item/clothing/under/suit_jacket/burgundy, + /obj/item/clothing/under/suit_jacket/checkered, + /obj/item/clothing/under/suit_jacket/tan, + /obj/item/lipstick/random) + crate_name = "formalwear crate" + crate_type = /obj/structure/closet/crate/wooden + +/datum/supply_pack/costumes_toys/clownpin + name = "Hilarious Firing Pin Crate" + desc = "I uh... I'm not really sure what this does. Wanna buy it?" + cost = 5000 + contraband = TRUE + contains = list(/obj/item/firing_pin/clown) + crate_name = "toy crate" // It's /technically/ a toy. For the clown, at least. + crate_type = /obj/structure/closet/crate/wooden + +/datum/supply_pack/costumes_toys/lasertag + name = "Laser Tag Crate" + desc = "Foam Force is for boys. Laser Tag is for men. Contains three sets of red suits, blue suits, matching helmets, and matching laser tag guns." + cost = 3500 + contains = list(/obj/item/gun/energy/laser/redtag, + /obj/item/gun/energy/laser/redtag, + /obj/item/gun/energy/laser/redtag, + /obj/item/gun/energy/laser/bluetag, + /obj/item/gun/energy/laser/bluetag, + /obj/item/gun/energy/laser/bluetag, + /obj/item/clothing/suit/redtag, + /obj/item/clothing/suit/redtag, + /obj/item/clothing/suit/redtag, + /obj/item/clothing/suit/bluetag, + /obj/item/clothing/suit/bluetag, + /obj/item/clothing/suit/bluetag, + /obj/item/clothing/head/helmet/redtaghelm, + /obj/item/clothing/head/helmet/redtaghelm, + /obj/item/clothing/head/helmet/redtaghelm, + /obj/item/clothing/head/helmet/bluetaghelm, + /obj/item/clothing/head/helmet/bluetaghelm, + /obj/item/clothing/head/helmet/bluetaghelm) + crate_name = "laser tag crate" + +/datum/supply_pack/costumes_toys/lasertag/pins + name = "Laser Tag Firing Pins Crate" + desc = "Three laser tag firing pins used in laser-tag units to ensure users are wearing their vests." + cost = 3000 + contraband = TRUE + contains = list(/obj/item/storage/box/lasertagpins) + crate_name = "laser tag crate" + +/datum/supply_pack/costumes_toys/costume_original + name = "Original Costume Crate" + desc = "Reenact Shakespearean plays with this assortment of outfits. Contains eight different costumes!" + cost = 1750 + contains = list(/obj/item/clothing/head/snowman, + /obj/item/clothing/suit/snowman, + /obj/item/clothing/head/chicken, + /obj/item/clothing/suit/chickensuit, + /obj/item/clothing/mask/gas/monkeymask, + /obj/item/clothing/suit/monkeysuit, + /obj/item/clothing/head/cardborg, + /obj/item/clothing/suit/cardborg, + /obj/item/clothing/head/xenos, + /obj/item/clothing/suit/xenos, + /obj/item/clothing/suit/hooded/ian_costume, + /obj/item/clothing/suit/hooded/carp_costume, + /obj/item/clothing/suit/hooded/bee_costume) + crate_name = "original costume crate" + crate_type = /obj/structure/closet/crate/wooden + +/datum/supply_pack/costumes_toys/costume + name = "Standard Costume Crate" + desc = "Supply the station's entertainers with the equipment of their trade with these Nanotrasen-approved costumes! Contains a full clown and mime outfit, along with a bike horn and a bottle of nothing." + cost = 1300 + access = ACCESS_THEATRE + contains = list(/obj/item/storage/backpack/clown, + /obj/item/clothing/shoes/clown_shoes, + /obj/item/clothing/mask/gas/clown_hat, + /obj/item/clothing/under/rank/clown, + /obj/item/bikehorn, + /obj/item/clothing/under/rank/mime, + /obj/item/clothing/shoes/sneakers/black, + /obj/item/clothing/gloves/color/white, + /obj/item/clothing/mask/gas/mime, + /obj/item/clothing/head/beret, + /obj/item/clothing/suit/suspenders, + /obj/item/reagent_containers/food/drinks/bottle/bottleofnothing, + /obj/item/storage/backpack/mime) + crate_name = "standard costume crate" + crate_type = /obj/structure/closet/crate/wooden + +/datum/supply_pack/costumes_toys/randomised/toys + name = "Toy Crate" + desc = "Who cares about pride and accomplishment? Skip the gaming and get straight to the sweet rewards with this product! Contains five random toys. Warranty void if used to prank research directors." + cost = 1500 // or play the arcade machines ya lazy bum + num_contained = 5 + contains = list(/obj/item/storage/box/snappops, + /obj/item/toy/talking/AI, + /obj/item/toy/talking/codex_gigas, + /obj/item/clothing/under/syndicate/tacticool, + /obj/item/toy/sword , + /obj/item/toy/gun, + /obj/item/gun/ballistic/shotgun/toy/crossbow, + /obj/item/storage/box/fakesyndiesuit, + /obj/item/storage/crayons, + /obj/item/toy/spinningtoy, + /obj/item/toy/prize/ripley, + /obj/item/toy/prize/fireripley, + /obj/item/toy/prize/deathripley, + /obj/item/toy/prize/gygax, + /obj/item/toy/prize/durand, + /obj/item/toy/prize/honk, + /obj/item/toy/prize/marauder, + /obj/item/toy/prize/seraph, + /obj/item/toy/prize/mauler, + /obj/item/toy/prize/odysseus, + /obj/item/toy/prize/phazon, + /obj/item/toy/prize/reticence, + /obj/item/toy/cards/deck, + /obj/item/toy/nuke, + /obj/item/toy/minimeteor, + /obj/item/toy/redbutton, + /obj/item/toy/talking/owl, + /obj/item/toy/talking/griffin, + /obj/item/coin/antagtoken, + /obj/item/stack/tile/fakespace/loaded, + /obj/item/stack/tile/fakepit/loaded, + /obj/item/toy/toy_xeno, + /obj/item/storage/box/actionfigure, + /obj/item/restraints/handcuffs/fake, + /obj/item/grenade/chem_grenade/glitter/pink, + /obj/item/grenade/chem_grenade/glitter/blue, + /obj/item/grenade/chem_grenade/glitter/white, + /obj/item/toy/eightball, + /obj/item/toy/windupToolbox, + /obj/item/toy/clockwork_watch, + /obj/item/toy/toy_dagger, + /obj/item/extendohand/acme, + /obj/item/hot_potato/harmless/toy, + /obj/item/card/emagfake, + /obj/item/clothing/shoes/wheelys, + /obj/item/clothing/shoes/kindleKicks, + /obj/item/storage/belt/military/snack, + /obj/item/toy/eightball, + /obj/item/vending_refill/donksoft) + crate_name = "toy crate" + crate_type = /obj/structure/closet/crate/wooden + +/datum/supply_pack/costumes_toys/randomised/plush + name = "Plush Crate" + desc = "Plush tide station wide. Contains 5 random plushies for you to love. Warranty void if your love violates the terms of use." + cost = 1500 // or play the arcade machines ya lazy bum + num_contained = 5 + contains = list(/obj/item/toy/plush/random, + /obj/item/toy/plush/random, + /obj/item/toy/plush/random, + /obj/item/toy/plush/random, + /obj/item/toy/plush/random) //I'm lazy + crate_name = "plushie crate" + crate_type = /obj/structure/closet/crate/wooden + +/datum/supply_pack/costumes_toys/wizard + name = "Wizard Costume Crate" + desc = "Pretend to join the Wizard Federation with this full wizard outfit! Nanotrasen would like to remind its employees that actually joining the Wizard Federation is subject to termination of job and life." + cost = 2000 + contains = list(/obj/item/staff, + /obj/item/clothing/suit/wizrobe/fake, + /obj/item/clothing/shoes/sandal, + /obj/item/clothing/head/wizard/fake) + crate_name = "wizard costume crate" + crate_type = /obj/structure/closet/crate/wooden + +/datum/supply_pack/costumes_toys/randomised/fill(obj/structure/closet/crate/C) + var/list/L = contains.Copy() + for(var/i in 1 to num_contained) + var/item = pick_n_take(L) + new item(C) + +/datum/supply_pack/costumes_toys/wardrobes/autodrobe + name = "Autodrobe Supply Crate" + desc = "Autodrobe missing your favorite dress? Solve that issue today with this autodrobe refill." + cost = 1500 + contains = list(/obj/item/vending_refill/autodrobe) + crate_name = "autodrobe supply crate" + +/datum/supply_pack/costumes_toys/wardrobes/cargo + name = "Cargo Wardrobe Supply Crate" + desc = "This crate contains a refill for the CargoDrobe." + cost = 750 + contains = list(/obj/item/vending_refill/wardrobe/cargo_wardrobe) + crate_name = "cargo department supply crate" + +/datum/supply_pack/costumes_toys/wardrobes/engineering + name = "Engineering Wardrobe Supply Crate" + desc = "This crate contains refills for the EngiDrobe and AtmosDrobe." + cost = 1500 + contains = list(/obj/item/vending_refill/wardrobe/engi_wardrobe, + /obj/item/vending_refill/wardrobe/atmos_wardrobe) + crate_name = "engineering department wardrobe supply crate" + +/datum/supply_pack/costumes_toys/wardrobes/general + name = "General Wardrobes Supply Crate" + desc = "This crate contains refills for the CuraDrobe, BarDrobe, ChefDrobe, JaniDrobe, ChapDrobe." + cost = 3750 + contains = list(/obj/item/vending_refill/wardrobe/curator_wardrobe, + /obj/item/vending_refill/wardrobe/bar_wardrobe, + /obj/item/vending_refill/wardrobe/chef_wardrobe, + /obj/item/vending_refill/wardrobe/jani_wardrobe, + /obj/item/vending_refill/wardrobe/chap_wardrobe) + crate_name = "general wardrobes vendor refills" + +/datum/supply_pack/costumes_toys/wardrobes/hydroponics + name = "Hydrobe Supply Crate" + desc = "This crate contains a refill for the Hydrobe." + cost = 750 + contains = list(/obj/item/vending_refill/wardrobe/hydro_wardrobe) + crate_name = "hydrobe supply crate" + +/datum/supply_pack/costumes_toys/wardrobes/medical + name = "Medical Wardrobe Supply Crate" + desc = "This crate contains refills for the MediDrobe, ChemDrobe, GeneDrobe, and ViroDrobe." + cost = 3000 + contains = list(/obj/item/vending_refill/wardrobe/medi_wardrobe, + /obj/item/vending_refill/wardrobe/chem_wardrobe, + /obj/item/vending_refill/wardrobe/gene_wardrobe, + /obj/item/vending_refill/wardrobe/viro_wardrobe) + crate_name = "medical department wardrobe supply crate" + +/datum/supply_pack/costumes_toys/wardrobes/science + name = "Science Wardrobe Supply Crate" + desc = "This crate contains refills for the SciDrobe and RoboDrobe." + cost = 1500 + contains = list(/obj/item/vending_refill/wardrobe/robo_wardrobe, + /obj/item/vending_refill/wardrobe/science_wardrobe) + crate_name = "science department wardrobe supply crate" + +/datum/supply_pack/costumes_toys/wardrobes/security + name = "Security Wardrobe Supply Crate" + desc = "This crate contains refills for the SecDrobe and LawDrobe." + cost = 1500 + contains = list(/obj/item/vending_refill/wardrobe/sec_wardrobe, + /obj/item/vending_refill/wardrobe/law_wardrobe) + crate_name = "security department supply crate" + +/datum/supply_pack/costumes_toys/kinkmate + name = "Kinkmate construction kit" + cost = 2000 + contraband = TRUE + contains = list(/obj/item/vending_refill/kink, /obj/item/circuitboard/machine/kinkmate) + crate_name = "Kinkmate construction kit" diff --git a/code/modules/cargo/packs/emergency.dm b/code/modules/cargo/packs/emergency.dm new file mode 100644 index 0000000000..1987369d20 --- /dev/null +++ b/code/modules/cargo/packs/emergency.dm @@ -0,0 +1,275 @@ + +//Reminders- +// If you add something to this list, please group it by type and sort it alphabetically instead of just jamming it in like an animal +// cost = 700- Minimum cost, or infinite points are possible. +////////////////////////////////////////////////////////////////////////////// +//////////////////////////// Emergency /////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +/datum/supply_pack/emergency + group = "Emergency" + +/datum/supply_pack/emergency/vehicle + name = "Biker Gang Kit" //TUNNEL SNAKES OWN THIS TOWN + desc = "TUNNEL SNAKES OWN THIS TOWN. Contains an unbranded All Terrain Vehicle, and a complete gang outfit -- consists of black gloves, a menacing skull bandanna, and a SWEET leather overcoat!" + cost = 2500 + contraband = TRUE + contains = list(/obj/vehicle/ridden/atv, + /obj/item/key, + /obj/item/clothing/suit/jacket/leather/overcoat, + /obj/item/clothing/gloves/color/black, + /obj/item/clothing/head/soft, + /obj/item/clothing/mask/bandana/skull)//so you can properly #cargoniabikergang + crate_name = "Biker Kit" + crate_type = /obj/structure/closet/crate/large + +/datum/supply_pack/emergency/equipment + name = "Emergency Bot/Internals Crate" + desc = "Explosions got you down? These supplies are guaranteed to patch up holes, in stations and people alike! Comes with two floorbots, two medbots, five oxygen masks and five small oxygen tanks." + cost = 2750 + contains = list(/mob/living/simple_animal/bot/floorbot, + /mob/living/simple_animal/bot/floorbot, + /mob/living/simple_animal/bot/medbot, + /mob/living/simple_animal/bot/medbot, + /obj/item/tank/internals/air, + /obj/item/tank/internals/air, + /obj/item/tank/internals/air, + /obj/item/tank/internals/air, + /obj/item/tank/internals/air, + /obj/item/clothing/mask/gas, + /obj/item/clothing/mask/gas, + /obj/item/clothing/mask/gas, + /obj/item/clothing/mask/gas, + /obj/item/clothing/mask/gas) + crate_name = "emergency crate" + crate_type = /obj/structure/closet/crate/internals + +/datum/supply_pack/emergency/radiatione_emergency + name = "Emergenc Radiation Protection Crate" + desc = "Survive the Nuclear Apocalypse and Supermatter Engine alike with two sets of Radiation suits. Each set contains a helmet, suit, and Geiger counter. We'll even throw in a few pill bottles that are able to handles radiation and the affects of the poisoning." + cost = 2500 + contains = list(/obj/item/clothing/head/radiation, + /obj/item/clothing/head/radiation, + /obj/item/clothing/suit/radiation, + /obj/item/clothing/suit/radiation, + /obj/item/geiger_counter, + /obj/item/geiger_counter, + /obj/item/storage/pill_bottle/mutarad, + /obj/item/storage/firstaid/radbgone) + crate_name = "radiation protection crate" + crate_type = /obj/structure/closet/crate/radiation + +/datum/supply_pack/emergency/rcds + name = "Emergency RCDs" + desc = "Bombs going off on station? SME blown and now you need to fix the hole it left behind? Well this crate has a pare of Rcds to be able to easily fix up any problem you may have!" + cost = 1500 + contains = list(/obj/item/construction/rcd, + /obj/item/construction/rcd) + crate_name = "emergency rcds" + crate_type = /obj/structure/closet/crate/internals + +/datum/supply_pack/emergency/soft_suit + name = "Emergency Space Suit " + desc = "Is there bombs going off left and right? Is there meteors shooting around the station? Well we have two fragile space suit for emergencys as well as air and masks." + cost = 1200 + contains = list(/obj/item/tank/internals/air, + /obj/item/tank/internals/air, + /obj/item/clothing/mask/gas, + /obj/item/clothing/mask/gas, + /obj/item/clothing/suit/space/fragile, + /obj/item/clothing/suit/space/fragile, + /obj/item/clothing/head/helmet/space/fragile, + /obj/item/clothing/head/helmet/space/fragile) + crate_name = "emergency crate" + crate_type = /obj/structure/closet/crate/internals + +/datum/supply_pack/emergency/firefighting + name = "Firefighting Crate" + desc = "Only you can prevent station fires. Partner up with two firefighter suits, gas masks, flashlights, large oxygen tanks, extinguishers, and hardhats!" + cost = 1200 + contains = list(/obj/item/clothing/suit/fire/firefighter, + /obj/item/clothing/suit/fire/firefighter, + /obj/item/clothing/mask/gas, + /obj/item/clothing/mask/gas, + /obj/item/flashlight, + /obj/item/flashlight, + /obj/item/tank/internals/oxygen/red, + /obj/item/tank/internals/oxygen/red, + /obj/item/extinguisher/advanced, + /obj/item/extinguisher/advanced, + /obj/item/clothing/head/hardhat/red, + /obj/item/clothing/head/hardhat/red) + crate_name = "firefighting crate" + +/datum/supply_pack/emergency/atmostank + name = "Firefighting Tank Backpack" + desc = "Mow down fires with this high-capacity fire fighting tank backpack. Requires Atmospherics access to open." + cost = 1000 + access = ACCESS_ATMOSPHERICS + contains = list(/obj/item/watertank/atmos) + crate_name = "firefighting backpack crate" + crate_type = /obj/structure/closet/crate/secure + +/datum/supply_pack/emergency/internals + name = "Internals Crate" + desc = "Master your life energy and control your breathing with three breath masks, three emergency oxygen tanks and three large air tanks."//IS THAT A + cost = 1000 + contains = list(/obj/item/clothing/mask/gas, + /obj/item/clothing/mask/gas, + /obj/item/clothing/mask/gas, + /obj/item/clothing/mask/breath, + /obj/item/clothing/mask/breath, + /obj/item/clothing/mask/breath, + /obj/item/tank/internals/emergency_oxygen, + /obj/item/tank/internals/emergency_oxygen, + /obj/item/tank/internals/emergency_oxygen, + /obj/item/tank/internals/air, + /obj/item/tank/internals/air, + /obj/item/tank/internals/air) + crate_name = "internals crate" + crate_type = /obj/structure/closet/crate/internals + +/datum/supply_pack/emergency/metalfoam + name = "Metal Foam Grenade Crate" + desc = "Seal up those pesky hull breaches with 14 Metal Foam Grenades." + cost = 1500 + contains = list(/obj/item/storage/box/metalfoam, + /obj/item/storage/box/metalfoam) + crate_name = "metal foam grenade crate" + +/datum/supply_pack/emergency/syndicate + name = "NULL_ENTRY" + desc = "(#@&^$THIS PACKAGE CONTAINS 30TC WORTH OF SOME RANDOM SYNDICATE GEAR WE HAD LYING AROUND THE WAREHOUSE. GIVE EM HELL, OPERATIVE@&!*() " + hidden = TRUE + cost = 20000 + contains = list() + crate_name = "emergency crate" + crate_type = /obj/structure/closet/crate/internals + dangerous = TRUE + +/datum/supply_pack/emergency/syndicate/fill(obj/structure/closet/crate/C) + var/crate_value = 30 + 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_nullcrates || prob(100 - I.surplus_nullcrates)) + continue + if(crate_value < I.cost) + continue + crate_value -= I.cost + new I.item(C) + +/datum/supply_pack/emergency/plasma_spacesuit + name = "Plasmaman Space Envirosuits" + desc = "Contains two space-worthy envirosuits for Plasmamen. Order now and we'll throw in two free helmets! Requires EVA access to open." + cost = 4000 + access = ACCESS_EVA + contains = list(/obj/item/clothing/suit/space/eva/plasmaman, + /obj/item/clothing/suit/space/eva/plasmaman, + /obj/item/clothing/head/helmet/space/plasmaman, + /obj/item/clothing/head/helmet/space/plasmaman) + crate_name = "plasmaman EVA crate" + crate_type = /obj/structure/closet/crate/secure + +/datum/supply_pack/emergency/plasmaman + name = "Plasmaman Supply Kit" + desc = "Keep those Plasmamen alive with two sets of Plasmaman outfits. Each set contains a plasmaman jumpsuit, internals tank, and helmet." + cost = 2000 + contains = list(/obj/item/clothing/under/plasmaman, + /obj/item/clothing/under/plasmaman, + /obj/item/tank/internals/plasmaman/belt/full, + /obj/item/tank/internals/plasmaman/belt/full, + /obj/item/clothing/head/helmet/space/plasmaman, + /obj/item/clothing/head/helmet/space/plasmaman) + crate_name = "plasmaman supply kit" + +/datum/supply_pack/emergency/radiation + name = "Radiation Protection Crate" + desc = "Survive the Nuclear Apocalypse and Supermatter Engine alike with two sets of Radiation suits. Each set contains a helmet, suit, and Geiger counter. We'll even throw in a bottle of vodka and some glasses too, considering the life-expectancy of people who order this." + cost = 1300 + contains = list(/obj/item/clothing/head/radiation, + /obj/item/clothing/head/radiation, + /obj/item/clothing/suit/radiation, + /obj/item/clothing/suit/radiation, + /obj/item/geiger_counter, + /obj/item/geiger_counter, + /obj/item/reagent_containers/food/drinks/bottle/vodka, + /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, + /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass) + crate_name = "radiation protection crate" + crate_type = /obj/structure/closet/crate/radiation + +/datum/supply_pack/emergency/spacesuit + name = "Space Suit Crate" + desc = "Contains two aging suits from Space-Goodwill. Requires EVA access to open." + cost = 3000 + access = ACCESS_EVA + contains = list(/obj/item/clothing/suit/space, + /obj/item/clothing/suit/space, + /obj/item/clothing/head/helmet/space, + /obj/item/clothing/head/helmet/space, + /obj/item/clothing/mask/breath, + /obj/item/clothing/mask/breath) + crate_name = "space suit crate" + crate_type = /obj/structure/closet/crate/secure + +/datum/supply_pack/emergency/spacejets + name = "Spare EVA Jetpacks" + desc = "Contains three EVA grade jectpaks. Requires EVA access to open." + cost = 2000 + access = ACCESS_EVA + contains = list(/obj/item/tank/jetpack/carbondioxide/eva, + /obj/item/tank/jetpack/carbondioxide/eva, + /obj/item/tank/jetpack/carbondioxide/eva) + crate_name = "eva jetpacks crate" + crate_type = /obj/structure/closet/crate/secure + +/datum/supply_pack/emergency/specialops + name = "Special Ops Supplies" + desc = "(*!&@#TOO CHEAP FOR THAT NULL_ENTRY, HUH OPERATIVE? WELL, THIS LITTLE ORDER CAN STILL HELP YOU OUT IN A PINCH. CONTAINS A BOX OF FIVE EMP GRENADES, THREE SMOKEBOMBS, AN INCENDIARY GRENADE, AND A \"SLEEPY PEN\" FULL OF NICE TOXINS!#@*$" + hidden = TRUE + cost = 2200 + contains = list(/obj/item/storage/box/emps, + /obj/item/grenade/smokebomb, + /obj/item/grenade/smokebomb, + /obj/item/grenade/smokebomb, + /obj/item/pen/sleepy, + /obj/item/grenade/chem_grenade/incendiary) + crate_name = "emergency crate" + crate_type = /obj/structure/closet/crate/internals + +/datum/supply_pack/emergency/weedcontrol + name = "Weed Control Crate" + desc = "Keep those invasive species OUT. Contains a scythe, gasmask, two sprays of Plant-B-Gone, and two anti-weed chemical grenades. Warranty void if used on ambrosia. Requires Hydroponics access to open." + cost = 1800 + access = ACCESS_HYDROPONICS + contains = list(/obj/item/scythe, + /obj/item/clothing/mask/gas, + /obj/item/grenade/chem_grenade/antiweed, + /obj/item/grenade/chem_grenade/antiweed, + /obj/item/reagent_containers/spray/plantbgone, + /obj/item/reagent_containers/spray/plantbgone) + crate_name = "weed control crate" + crate_type = /obj/structure/closet/crate/secure/hydroponics + +/datum/supply_pack/medical/anitvirus + name = "Virus Containment Crate" + desc = "Viro let out a death plague Mk II again? Someone didnt wash there hands? Old plagues born anew? Well this crate is for you! Hope you cure it before it brakes out of the station... This crate needs medical access to open and has two bio suits, a box of needles and beakers, five spaceacillin needles, and a medibot." + cost = 3000 + access = ACCESS_MEDICAL + contains = list(/mob/living/simple_animal/bot/medbot, + /obj/item/clothing/head/bio_hood, + /obj/item/clothing/head/bio_hood, + /obj/item/clothing/suit/bio_suit, + /obj/item/clothing/suit/bio_suit, + /obj/item/reagent_containers/syringe/antiviral, + /obj/item/reagent_containers/syringe/antiviral, + /obj/item/reagent_containers/syringe/antiviral, + /obj/item/reagent_containers/syringe/antiviral, + /obj/item/reagent_containers/syringe/antiviral, + /obj/item/storage/box/syringes, + /obj/item/storage/box/beakers) + crate_name = "virus containment unit crate" + crate_type = /obj/structure/closet/crate/secure/plasma diff --git a/code/modules/cargo/packs/engine.dm b/code/modules/cargo/packs/engine.dm new file mode 100644 index 0000000000..a4438c7ef8 --- /dev/null +++ b/code/modules/cargo/packs/engine.dm @@ -0,0 +1,169 @@ + +//Reminders- +// If you add something to this list, please group it by type and sort it alphabetically instead of just jamming it in like an animal +// cost = 700- Minimum cost, or infinite points are possible. +////////////////////////////////////////////////////////////////////////////// +//////////////////////// Engine Construction ///////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +/datum/supply_pack/engine + group = "Engine Construction" + crate_type = /obj/structure/closet/crate/engineering + +/datum/supply_pack/engine/am_jar + name = "Antimatter Containment Jar Crate" + desc = "Two Antimatter containment jars stuffed into a single crate." + cost = 2300 + contains = list(/obj/item/am_containment, + /obj/item/am_containment) + crate_name = "antimatter jar crate" + +/datum/supply_pack/engine/am_core + name = "Antimatter Control Crate" + desc = "The brains of the Antimatter engine, this device is sure to teach the station's powergrid the true meaning of real power." + cost = 5200 + contains = list(/obj/machinery/power/am_control_unit) + crate_name = "antimatter control crate" + +/datum/supply_pack/engine/am_shielding + name = "Antimatter Shielding Crate" + desc = "Contains ten Antimatter shields, somehow crammed into a crate." + cost = 2500 + contains = list(/obj/item/am_shielding_container, + /obj/item/am_shielding_container, + /obj/item/am_shielding_container, + /obj/item/am_shielding_container, + /obj/item/am_shielding_container, + /obj/item/am_shielding_container, + /obj/item/am_shielding_container, + /obj/item/am_shielding_container, + /obj/item/am_shielding_container, + /obj/item/am_shielding_container) //10 shields: 3x3 containment and a core + crate_name = "antimatter shielding crate" + +/datum/supply_pack/engine/emitter + name = "Emitter Crate" + desc = "Useful for powering forcefield generators while destroying locked crates and intruders alike. Contains two high-powered energy emitters. Requires CE access to open." + cost = 1750 + access = ACCESS_CE + contains = list(/obj/machinery/power/emitter, + /obj/machinery/power/emitter) + crate_name = "emitter crate" + crate_type = /obj/structure/closet/crate/secure/engineering + dangerous = TRUE + +/datum/supply_pack/engine/field_gen + name = "Field Generator Crate" + desc = "Typically the only thing standing between the station and a messy death. Powered by emitters. Contains two field generators." + cost = 1750 + contains = list(/obj/machinery/field/generator, + /obj/machinery/field/generator) + crate_name = "field generator crate" + +/datum/supply_pack/engine/grounding_rods + name = "Grounding Rod Crate" + desc = "Four grounding rods guaranteed to keep any uppity tesla's lightning under control." + cost = 2200 + contains = list(/obj/machinery/power/grounding_rod, + /obj/machinery/power/grounding_rod, + /obj/machinery/power/grounding_rod, + /obj/machinery/power/grounding_rod) + crate_name = "grounding rod crate" + crate_type = /obj/structure/closet/crate/engineering/electrical + +/datum/supply_pack/engine/mason + name = "M.A.S.O.N RIG Crate" + desc = "The rare M.A.S.O.N RIG. Requires CE access to open." + cost = 15000 + access = ACCESS_CE + contains = list(/obj/item/clothing/suit/space/hardsuit/ancient/mason) + crate_name = "M.A.S.O.N Rig" + crate_type = /obj/structure/closet/crate/secure/engineering + +/datum/supply_pack/engine/PA + name = "Particle Accelerator Crate" + desc = "A supermassive black hole or hyper-powered teslaball are the perfect way to spice up any party! This \"My First Apocalypse\" kit contains everything you need to build your own Particle Accelerator! Ages 10 and up." + cost = 3750 + contains = list(/obj/structure/particle_accelerator/fuel_chamber, + /obj/machinery/particle_accelerator/control_box, + /obj/structure/particle_accelerator/particle_emitter/center, + /obj/structure/particle_accelerator/particle_emitter/left, + /obj/structure/particle_accelerator/particle_emitter/right, + /obj/structure/particle_accelerator/power_box, + /obj/structure/particle_accelerator/end_cap) + crate_name = "particle accelerator crate" + +/datum/supply_pack/engine/collector + name = "Radiation Collector Crate" + desc = "Contains three radiation collectors. Useful for collecting energy off nearby Supermatter Crystals, Singularities or Teslas!" + cost = 2750 + contains = list(/obj/machinery/power/rad_collector, + /obj/machinery/power/rad_collector, + /obj/machinery/power/rad_collector) + crate_name = "collector crate" + +/datum/supply_pack/engine/sing_gen + name = "Singularity Generator Crate" + desc = "The key to unlocking the power of Lord Singuloth. Particle Accelerator not included." + cost = 6000 + contains = list(/obj/machinery/the_singularitygen) + crate_name = "singularity generator crate" + +/datum/supply_pack/engine/solar + name = "Solar Panel Crate" + desc = "Go green with this DIY advanced solar array. Contains twenty one solar assemblies, a solar-control circuit board, and tracker. If you have any questions, please check out the enclosed instruction book." + cost = 2850 + contains = list(/obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/solar_assembly, + /obj/item/circuitboard/computer/solar_control, + /obj/item/electronics/tracker, + /obj/item/paper/guides/jobs/engi/solars) + crate_name = "solar panel crate" + crate_type = /obj/structure/closet/crate/engineering/electrical + +/datum/supply_pack/engine/supermatter_shard + name = "Supermatter Shard Crate" + desc = "The power of the heavens condensed into a single crystal. Requires CE access to open." + cost = 10000 + access = ACCESS_CE + contains = list(/obj/machinery/power/supermatter_crystal/shard) + crate_name = "supermatter shard crate" + crate_type = /obj/structure/closet/crate/secure/engineering + dangerous = TRUE + +/datum/supply_pack/engine/tesla_coils + name = "Tesla Coil Crate" + desc = "Whether it's high-voltage executions, creating research points, or just plain old power generation: This pack of four Tesla coils can do it all!" + cost = 3500 + contains = list(/obj/machinery/power/tesla_coil, + /obj/machinery/power/tesla_coil, + /obj/machinery/power/tesla_coil, + /obj/machinery/power/tesla_coil) + crate_name = "tesla coil crate" + crate_type = /obj/structure/closet/crate/engineering/electrical + +/datum/supply_pack/engine/tesla_gen + name = "Tesla Generator Crate" + desc = "The key to unlocking the power of the Tesla energy ball. Particle Accelerator not included." + cost = 7000 + contains = list(/obj/machinery/the_singularitygen/tesla) + crate_name = "tesla generator crate" diff --git a/code/modules/cargo/packs/engineering.dm b/code/modules/cargo/packs/engineering.dm new file mode 100644 index 0000000000..19cb53489e --- /dev/null +++ b/code/modules/cargo/packs/engineering.dm @@ -0,0 +1,229 @@ + +//Reminders- +// If you add something to this list, please group it by type and sort it alphabetically instead of just jamming it in like an animal +// cost = 700- Minimum cost, or infinite points are possible. +////////////////////////////////////////////////////////////////////////////// +//////////////////////////// Engineering ///////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +/datum/supply_pack/engineering + group = "Engineering" + crate_type = /obj/structure/closet/crate/engineering + +/datum/supply_pack/engineering/shieldgen + name = "Anti-breach Shield Projector Crate" + desc = "Hull breaches again? Say no more with the Nanotrasen Anti-Breach Shield Projector! Uses forcefield technology to keep the air in, and the space out. Contains two shield projectors." + cost = 2500 + contains = list(/obj/machinery/shieldgen, + /obj/machinery/shieldgen) + crate_name = "anti-breach shield projector crate" + +/datum/supply_pack/engineering/conveyor + name = "Conveyor Assembly Crate" + desc = "Keep production moving along with six conveyor belts. Conveyor switch included. If you have any questions, check out the enclosed instruction book." + cost = 750 + contains = list(/obj/item/conveyor_construct, + /obj/item/conveyor_construct, + /obj/item/conveyor_construct, + /obj/item/conveyor_construct, + /obj/item/conveyor_construct, + /obj/item/conveyor_construct, + /obj/item/conveyor_switch_construct, + /obj/item/paper/guides/conveyor) + crate_name = "conveyor assembly crate" + +/datum/supply_pack/engineering/engiequipment + name = "Engineering Gear Crate" + desc = "Gear up with three toolbelts, high-visibility vests, welding helmets, hardhats, and two pairs of meson goggles!" + cost = 1500 + contains = list(/obj/item/storage/belt/utility, + /obj/item/storage/belt/utility, + /obj/item/storage/belt/utility, + /obj/item/clothing/suit/hazardvest, + /obj/item/clothing/suit/hazardvest, + /obj/item/clothing/suit/hazardvest, + /obj/item/clothing/head/welding, + /obj/item/clothing/head/welding, + /obj/item/clothing/head/welding, + /obj/item/clothing/head/hardhat, + /obj/item/clothing/head/hardhat, + /obj/item/clothing/head/hardhat, + /obj/item/clothing/glasses/meson/engine, + /obj/item/clothing/glasses/meson/engine) + crate_name = "engineering gear crate" + +/datum/supply_pack/engineering/engihardsuit + name = "Engineering Hardsuit" + desc = "Poly 'Who stole all the hardsuits!' Well now you can get more hardsuits if needed! NOTE ONE HARDSUIT IS IN THIS CRATE, as well as one air tank and mask!" + cost = 2250 + contains = list(/obj/item/tank/internals/air, + /obj/item/clothing/mask/gas, + /obj/item/clothing/suit/space/hardsuit/engine) + crate_name = "engineering hardsuit" + +/datum/supply_pack/engineering/atmoshardsuit + name = "Atmospherics Hardsuit" + desc = "Too many techs and not enough hardsuits? Time to buy some more! Comes with gas mask and air tank. Ask the CE to open." + cost = 5000 + access = ACCESS_CE + contains = list(/obj/item/tank/internals/air, + /obj/item/clothing/mask/gas, + /obj/item/clothing/suit/space/hardsuit/engine/atmos) + crate_name = "atmospherics hardsuit" + crate_type = /obj/structure/closet/crate/secure/engineering + +/datum/supply_pack/engineering/industrialrcd + name = "Industrial RCD" + desc = "A industrial RCD in case the station has gone through more then one meteor storm and the CE needs to bring out the somthing a bit more reliable. Dose not contain spare ammo for the industrial RCD or any other RCD modles." + cost = 4500 + access = ACCESS_CE + contains = list(/obj/item/construction/rcd/industrial) + 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 + +/obj/item/stock_parts/cell/inducer_supply + maxcharge = 5000 + charge = 5000 + +/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." + cost = 2300 + contains = list(/obj/item/inducer/sci {cell_type = /obj/item/stock_parts/cell/inducer_supply; opened = 0}, /obj/item/inducer/sci {cell_type = /obj/item/stock_parts/cell/inducer_supply; opened = 0}) //FALSE doesn't work in modified type paths apparently. + crate_name = "inducer crate" + crate_type = /obj/structure/closet/crate/engineering/electrical + +/datum/supply_pack/engineering/pacman + name = "P.A.C.M.A.N Generator Crate" + desc = "Engineers can't set up the engine? Not an issue for you, once you get your hands on this P.A.C.M.A.N. Generator! Takes in plasma and spits out sweet sweet energy." + cost = 2250 + contains = list(/obj/machinery/power/port_gen/pacman) + crate_name = "PACMAN generator crate" + crate_type = /obj/structure/closet/crate/engineering/electrical + +/datum/supply_pack/engineering/power + name = "Power Cell Crate" + desc = "Looking for power overwhelming? Look no further. Contains three high-voltage power cells." + cost = 1000 + contains = list(/obj/item/stock_parts/cell/high, + /obj/item/stock_parts/cell/high, + /obj/item/stock_parts/cell/high) + crate_name = "power cell crate" + crate_type = /obj/structure/closet/crate/engineering/electrical + + +/datum/supply_pack/engineering/siezedpower + name = "Siezed Power Cell Crate" + desc = "We took the means of power! Contains three high-voltage plus power cells." + cost = 1300 + contraband = TRUE + contains = list(/obj/item/stock_parts/cell/high/plus, + /obj/item/stock_parts/cell/high/plus, + /obj/item/stock_parts/cell/high/plus) + crate_name = "siezed crate" + crate_type = /obj/structure/closet/crate/engineering/electrical + +/datum/supply_pack/engineering/shuttle_engine + name = "Shuttle Engine Crate" + desc = "Through advanced bluespace-shenanigans, our engineers have managed to fit an entire shuttle engine into one tiny little crate. Requires CE access to open." + cost = 5000 + access = ACCESS_CE + contains = list(/obj/structure/shuttle/engine/propulsion/burst/cargo) + crate_name = "shuttle engine crate" + crate_type = /obj/structure/closet/crate/secure/engineering + +/datum/supply_pack/engineering/siezedproduction + name = "The Means of Production" + desc = "We will win for we have took over the production! S five metal sheets, five wire, three matter bins, one manipulater and one sheet of glass." + cost = 1500 + contraband = TRUE + contains = list(/obj/item/stock_parts/cell/high/plus, + /obj/item/circuitboard/machine/autolathe, + /obj/item/stack/cable_coil/random/five, + /obj/item/stack/sheet/metal/five, + /obj/item/stock_parts/matter_bin, + /obj/item/stock_parts/matter_bin, + /obj/item/stock_parts/matter_bin, + /obj/item/stock_parts/manipulator, + /obj/item/stack/sheet/glass,) + crate_name = "siezed crate" + +/datum/supply_pack/engineering/tools + name = "Toolbox Crate" + desc = "Any robust spaceman is never far from their trusty toolbox. Contains three electrical toolboxes and three mechanical toolboxes." + contains = list(/obj/item/storage/toolbox/electrical, + /obj/item/storage/toolbox/electrical, + /obj/item/storage/toolbox/electrical, + /obj/item/storage/toolbox/mechanical, + /obj/item/storage/toolbox/mechanical, + /obj/item/storage/toolbox/mechanical) + cost = 1200 + crate_name = "toolbox crate" + +/datum/supply_pack/engineering/bsa + name = "Bluespace Artillery Parts" + desc = "The pride of Nanotrasen Naval Command. The legendary Bluespace Artillery Cannon is a devastating feat of human engineering and testament to wartime determination. Highly advanced research is required for proper construction. " + cost = 15000 + special = TRUE + contains = list(/obj/item/circuitboard/machine/bsa/front, + /obj/item/circuitboard/machine/bsa/middle, + /obj/item/circuitboard/machine/bsa/back, + /obj/item/circuitboard/computer/bsa_control + ) + crate_name= "bluespace artillery parts crate" + +/datum/supply_pack/engineering/dna_vault + name = "DNA Vault Parts" + desc = "Secure the longevity of the current state of humanity within this massive library of scientific knowledge, capable of granting superhuman powers and abilities. Highly advanced research is required for proper construction. Also contains five DNA probes." + cost = 12000 + special = TRUE + contains = list( + /obj/item/circuitboard/machine/dna_vault, + /obj/item/dna_probe, + /obj/item/dna_probe, + /obj/item/dna_probe, + /obj/item/dna_probe, + /obj/item/dna_probe + ) + crate_name= "dna vault parts crate" + +/datum/supply_pack/engineering/dna_probes + name = "DNA Vault Samplers" + desc = "Contains five DNA probes for use in the DNA vault." + cost = 3000 + special = TRUE + contains = list(/obj/item/dna_probe, + /obj/item/dna_probe, + /obj/item/dna_probe, + /obj/item/dna_probe, + /obj/item/dna_probe + ) + crate_name= "dna samplers crate" + +/datum/supply_pack/engineering/shield_sat + name = "Shield Generator Satellite" + desc = "Protect the very existence of this station with these Anti-Meteor defenses. Contains three Shield Generator Satellites." + cost = 4000 + contains = list( + /obj/machinery/satellite/meteor_shield, + /obj/machinery/satellite/meteor_shield, + /obj/machinery/satellite/meteor_shield + ) + crate_name= "shield sat crate" + +/datum/supply_pack/engineering/shield_sat_control + name = "Shield System Control Board" + desc = "A control system for the Shield Generator Satellite system." + cost = 4000 + contains = list(/obj/item/circuitboard/computer/sat_control) + crate_name= "shield control board crate" diff --git a/code/modules/cargo/packs/livestock.dm b/code/modules/cargo/packs/livestock.dm new file mode 100644 index 0000000000..6479869ee0 --- /dev/null +++ b/code/modules/cargo/packs/livestock.dm @@ -0,0 +1,154 @@ + +//Reminders- +// If you add something to this list, please group it by type and sort it alphabetically instead of just jamming it in like an animal +// cost = 700- Minimum cost, or infinite points are possible. +////////////////////////////////////////////////////////////////////////////// +////////////////////////////// Livestock ///////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +/datum/supply_pack/critter + group = "Livestock" + crate_type = /obj/structure/closet/crate/critter + +/datum/supply_pack/critter/butterfly + name = "Butterflies Crate" + desc = "Not a very dangerous insect, but they do give off a better image than, say, flies or cockroaches."//is that a motherfucking worm reference + contraband = TRUE + cost = 5000 + contains = list(/mob/living/simple_animal/butterfly) + crate_name = "entomology samples crate" + +/datum/supply_pack/critter/butterfly/generate() + . = ..() + for(var/i in 1 to 49) + new /mob/living/simple_animal/butterfly(.) + +/datum/supply_pack/critter/cat + name = "Cat Crate" + desc = "The cat goes meow! Comes with a collar and a nice cat toy! Cheeseburger not included."//i can't believe im making this reference + cost = 5000 //Cats are worth as much as corgis. + contains = list(/mob/living/simple_animal/pet/cat, + /obj/item/clothing/neck/petcollar, + /obj/item/toy/cattoy) + crate_name = "cat crate" + +/datum/supply_pack/critter/cat/generate() + . = ..() + if(prob(50)) + var/mob/living/simple_animal/pet/cat/C = locate() in . + qdel(C) + new /mob/living/simple_animal/pet/cat/Proc(.) + +/datum/supply_pack/critter/chick + name = "Chicken Crate" + desc = "The chicken goes bwaak!" + cost = 2000 + contains = list( /mob/living/simple_animal/chick) + crate_name = "chicken crate" + +/datum/supply_pack/critter/crab + name = "Crab Rocket" + desc = "CRAAAAAAB ROCKET. CRAB ROCKET. CRAB ROCKET. CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB ROCKET. CRAFT. ROCKET. BUY. CRAFT ROCKET. CRAB ROOOCKET. CRAB ROOOOCKET. CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB ROOOOOOOOOOOOOOOOOOOOOOCK EEEEEEEEEEEEEEEEEEEEEEEEE EEEETTTTTTTTTTTTAAAAAAAAA AAAHHHHHHHHHHHHH. CRAB ROCKET. CRAAAB ROCKEEEEEEEEEGGGGHHHHTT CRAB CRAB CRAABROCKET CRAB ROCKEEEET."//fun fact: i actually spent like 10 minutes and transcribed the entire video. + cost = 5000 + contains = list(/mob/living/simple_animal/crab) + crate_name = "look sir free crabs" + DropPodOnly = TRUE + +/datum/supply_pack/critter/crab/generate() + . = ..() + for(var/i in 1 to 49) + new /mob/living/simple_animal/crab(.) + +/datum/supply_pack/critter/corgi + name = "Corgi Crate" + desc = "Considered the optimal dog breed by thousands of research scientists, this Corgi is but one dog from the millions of Ian's noble bloodline. Comes with a cute collar!" + cost = 5000 + contains = list(/mob/living/simple_animal/pet/dog/corgi, + /obj/item/clothing/neck/petcollar) + crate_name = "corgi crate" + +/datum/supply_pack/critter/corgi/generate() + . = ..() + if(prob(50)) + var/mob/living/simple_animal/pet/dog/corgi/D = locate() in . + if(D.gender == FEMALE) + qdel(D) + new /mob/living/simple_animal/pet/dog/corgi/Lisa(.) + +/datum/supply_pack/critter/corgis/exotic + name = "Exotic Corgi Crate" + desc = "Corgis fit for a king, these corgis come in a unique color to signify their superiority. Comes with a cute collar!" + cost = 5500 + contains = list(/mob/living/simple_animal/pet/dog/corgi/exoticcorgi, + /obj/item/clothing/neck/petcollar) + crate_name = "exotic corgi crate" + +/datum/supply_pack/critter/cow + name = "Cow Crate" + desc = "The cow goes moo!" + cost = 3000 + contains = list(/mob/living/simple_animal/cow) + crate_name = "cow crate" + +/datum/supply_pack/critter/fox + name = "Fox Crate" + desc = "The fox goes...? Comes with a collar!"//what does the fox say + cost = 5000 + contains = list(/mob/living/simple_animal/pet/fox, + /obj/item/clothing/neck/petcollar) + crate_name = "fox crate" + +/datum/supply_pack/critter/goat + name = "Goat Crate" + desc = "The goat goes baa! Warranty void if used as a replacement for Pete." + cost = 2500 + contains = list(/mob/living/simple_animal/hostile/retaliate/goat) + crate_name = "goat crate" + +/datum/supply_pack/critter/goose + name = "Goose Crate" + desc = "Angry and violent birds. Evil, evil creatures." + cost = 2500 + contains = list(/mob/living/simple_animal/hostile/retaliate/goose) + crate_name = "goose crate" + +/datum/supply_pack/critter/monkey + name = "Monkey Cube Crate" + desc = "Stop monkeying around! Contains seven monkey cubes. Just add water!" + cost = 2000 + contains = list (/obj/item/storage/box/monkeycubes) + crate_name = "monkey cube crate" + +/datum/supply_pack/critter/pug + name = "Pug Crate" + desc = "Like a normal dog, but... squished. Comes with a nice collar!" + cost = 5000 + contains = list(/mob/living/simple_animal/pet/dog/pug, + /obj/item/clothing/neck/petcollar) + crate_name = "pug crate" + +/datum/supply_pack/organic/critter/kiwi + name = "Space kiwi Crate" + cost = 2000 + contains = list( /mob/living/simple_animal/kiwi) + crate_name = "space kiwi crate" + +/datum/supply_pack/critter/snake + name = "Snake Crate" + desc = "Tired of these MOTHER FUCKING snakes on this MOTHER FUCKING space station? Then this isn't the crate for you. Contains three poisonous snakes." + cost = 3000 + contains = list(/mob/living/simple_animal/hostile/retaliate/poison/snake, + /mob/living/simple_animal/hostile/retaliate/poison/snake, + /mob/living/simple_animal/hostile/retaliate/poison/snake) + crate_name = "snake crate" + +/datum/supply_pack/critter/secbat + name = "Security Bat Crate" + desc = "Contains five security bats, perfect to Bat-up any security officer." + cost = 2500 + contains = list(/mob/living/simple_animal/hostile/retaliate/bat/secbat, + /mob/living/simple_animal/hostile/retaliate/bat/secbat, + /mob/living/simple_animal/hostile/retaliate/bat/secbat, + /mob/living/simple_animal/hostile/retaliate/bat/secbat, + /mob/living/simple_animal/hostile/retaliate/bat/secbat) + crate_name = "security bat crate" diff --git a/code/modules/cargo/packs/materials.dm b/code/modules/cargo/packs/materials.dm new file mode 100644 index 0000000000..0f8ad2462a --- /dev/null +++ b/code/modules/cargo/packs/materials.dm @@ -0,0 +1,170 @@ + +//Reminders- +// If you add something to this list, please group it by type and sort it alphabetically instead of just jamming it in like an animal +// cost = 700- Minimum cost, or infinite points are possible. +////////////////////////////////////////////////////////////////////////////// +/////////////////////// Canisters & Materials //////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +/datum/supply_pack/materials + group = "Canisters & Materials" + +/datum/supply_pack/materials/cardboard50 + name = "50 Cardboard Sheets" + desc = "Create a bunch of boxes." + cost = 1000 + contains = list(/obj/item/stack/sheet/cardboard/fifty) + crate_name = "cardboard sheets crate" + +/datum/supply_pack/materials/glass50 + name = "50 Glass Sheets" + desc = "Let some nice light in with fifty glass sheets!" + cost = 850 + contains = list(/obj/item/stack/sheet/glass/fifty) + crate_name = "glass sheets crate" + +/datum/supply_pack/materials/metal50 + name = "50 Metal Sheets" + desc = "Any construction project begins with a good stack of fifty metal sheets!" + cost = 850 + contains = list(/obj/item/stack/sheet/metal/fifty) + crate_name = "metal sheets crate" + +/datum/supply_pack/materials/plasteel20 + name = "20 Plasteel Sheets" + desc = "Reinforce the station's integrity with twenty plasteel sheets!" + cost = 4700 + 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 + 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" + +/datum/supply_pack/materials/sandstone30 + name = "30 Sandstone Blocks" + desc = "Neither sandy nor stoney, these thirty blocks will still get the job done." + cost = 800 + contains = list(/obj/item/stack/sheet/mineral/sandstone/thirty) + crate_name = "sandstone blocks crate" + +/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 RDC ammo" + desc = "This crate contains sixteen RCD ammo packs, to help with any holes or projects people mite 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" + +/datum/supply_pack/materials/bz + name = "BZ Canister Crate" + desc = "Contains a canister of BZ. Requires Toxins access to open." + cost = 7500 // Costs 3 credits more than what you can get for selling it. + access = ACCESS_TOX_STORAGE + contains = list(/obj/machinery/portable_atmospherics/canister/bz) + crate_name = "BZ canister crate" + crate_type = /obj/structure/closet/crate/secure/science + +/datum/supply_pack/materials/carbon_dio + name = "Carbon Dioxide Canister" + desc = "Contains a canister of Carbon Dioxide." + cost = 3000 + contains = list(/obj/machinery/portable_atmospherics/canister/carbon_dioxide) + crate_name = "carbon dioxide canister crate" + crate_type = /obj/structure/closet/crate/large + +/datum/supply_pack/materials/nitrogen + name = "Nitrogen Canister" + desc = "Contains a canister of Nitrogen." + cost = 2000 + contains = list(/obj/machinery/portable_atmospherics/canister/nitrogen) + crate_name = "nitrogen canister crate" + crate_type = /obj/structure/closet/crate/large + +/datum/supply_pack/materials/nitrous_oxide_canister + name = "Nitrous Oxide Canister" + desc = "Contains a canister of Nitrous Oxide. Requires Atmospherics access to open." + cost = 3000 + access = ACCESS_ATMOSPHERICS + contains = list(/obj/machinery/portable_atmospherics/canister/nitrous_oxide) + crate_name = "nitrous oxide canister crate" + crate_type = /obj/structure/closet/crate/secure + +/datum/supply_pack/materials/oxygen + name = "Oxygen Canister" + desc = "Contains a canister of Oxygen. Canned in Druidia." + cost = 1500 + contains = list(/obj/machinery/portable_atmospherics/canister/oxygen) + crate_name = "oxygen canister crate" + crate_type = /obj/structure/closet/crate/large + +/datum/supply_pack/materials/water_vapor + name = "Water Vapor Canister" + desc = "Contains a canister of Water Vapor. I swear to god if you open this in the halls..." + cost = 2500 + contains = list(/obj/machinery/portable_atmospherics/canister/water_vapor) + crate_name = "water vapor canister crate" + crate_type = /obj/structure/closet/crate/large + +/datum/supply_pack/materials/fueltank + name = "Fuel Tank Crate" + desc = "Contains a welding fuel tank. Caution, highly flammable." + cost = 800 + contains = list(/obj/structure/reagent_dispensers/fueltank) + crate_name = "fuel tank crate" + crate_type = /obj/structure/closet/crate/large + +/datum/supply_pack/materials/watertank + name = "Water Tank Crate" + desc = "Contains a tank of dihydrogen monoxide... sounds dangerous." + cost = 600 + contains = list(/obj/structure/reagent_dispensers/watertank) + crate_name = "water tank crate" + crate_type = /obj/structure/closet/crate/large + +/datum/supply_pack/materials/foamtank + name = "Firefighting Foam Tank Crate" + desc = "Contains a tank of firefighting foam. Also known as \"plasmaman's bane\"." + cost = 1500 + contains = list(/obj/structure/reagent_dispensers/foamtank) + crate_name = "foam tank crate" + crate_type = /obj/structure/closet/crate/large + +/datum/supply_pack/materials/hightank + name = "Large Water Tank Crate" + desc = "Contains a high-capacity water tank. Useful for botany or other service jobs." + cost = 1200 + contains = list(/obj/structure/reagent_dispensers/watertank/high) + crate_name = "high-capacity water tank crate" + crate_type = /obj/structure/closet/crate/large diff --git a/code/modules/cargo/packs/medical.dm b/code/modules/cargo/packs/medical.dm new file mode 100644 index 0000000000..656474cc1d --- /dev/null +++ b/code/modules/cargo/packs/medical.dm @@ -0,0 +1,228 @@ + +//Reminders- +// If you add something to this list, please group it by type and sort it alphabetically instead of just jamming it in like an animal +// cost = 700- Minimum cost, or infinite points are possible. +////////////////////////////////////////////////////////////////////////////// +//////////////////////////// Medical ///////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +/datum/supply_pack/medical + group = "Medical" + crate_type = /obj/structure/closet/crate/medical + +/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/bloodpacks + name = "Blood Pack Variety Crate" + desc = "Contains ten different blood packs for reintroducing blood to patients." + cost = 3000 + contains = list(/obj/item/reagent_containers/blood/random, + /obj/item/reagent_containers/blood/random, + /obj/item/reagent_containers/blood/APlus, + /obj/item/reagent_containers/blood/AMinus, + /obj/item/reagent_containers/blood/BPlus, + /obj/item/reagent_containers/blood/BMinus, + /obj/item/reagent_containers/blood/OPlus, + /obj/item/reagent_containers/blood/OMinus, + /obj/item/reagent_containers/blood/lizard, + /obj/item/reagent_containers/blood/jellyblood, + /obj/item/reagent_containers/blood/insect) + crate_name = "blood freezer" + crate_type = /obj/structure/closet/crate/freezer + +/datum/supply_pack/medical/bloodpackssynth + name = "Synthetics Blood Pack Crate" + desc = "Contains five synthetics blood packs for reintroducing blood to patients." + cost = 3000 + contains = list(/obj/item/reagent_containers/blood/synthetics, + /obj/item/reagent_containers/blood/synthetics, + /obj/item/reagent_containers/blood/synthetics, + /obj/item/reagent_containers/blood/synthetics, + /obj/item/reagent_containers/blood/synthetics) + crate_name = "blood freezer" + crate_type = /obj/structure/closet/crate/freezer + +/datum/supply_pack/medical/defibs + name = "Defibrillator Crate" + desc = "Contains two defibrillators for bringing the recently deceased back to life." + cost = 2500 + contains = list(/obj/item/defibrillator/loaded, + /obj/item/defibrillator/loaded) + crate_name = "defibrillator 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/iv_drip + name = "IV Drip Crate" + desc = "Contains a single IV drip stand for intravenous delivery." + cost = 800 + contains = list(/obj/machinery/iv_drip) + crate_name = "iv drip crate" + +/datum/supply_pack/science/adv_surgery_tools + name = "Med-Co Advanced surgery tools" + desc = "A full set of Med-Co advanced surgery tools, this crate also comes with a spay of synth flesh as well as a can of . Requires Surgery access to open." + cost = 5500 + access = ACCESS_SURGERY + contains = list(/obj/item/storage/belt/medical/surgery_belt_adv, + /obj/item/reagent_containers/medspray/synthflesh, + /obj/item/reagent_containers/medspray/sterilizine) + crate_name = "medco newest surgery tools" + crate_type = /obj/structure/closet/crate/medical + +/datum/supply_pack/medical/medicalhardsuit + name = "Medical Hardsuit" + desc = "Got people being spaced left and right? Hole in the same room as the dead body of Hos or cap? Fear not, now you can buy one medical hardsuit with a mask and air tank to save your fellow crewmembers." + cost = 2750 + contains = list(/obj/item/tank/internals/air, + /obj/item/clothing/mask/gas, + /obj/item/clothing/suit/space/hardsuit/medical) + crate_name = "medical hardsuit" + +/datum/supply_pack/medical/supplies + name = "Medical Supplies Crate" + desc = "Contains seven beakers, syringes, and bodybags. Three morphine bottles, four insulin pills. Two charcoal bottles, epinephrine bottles, antitoxin bottles, and large beakers. Finally, a single roll of medical gauze, as well as a bottle of stimulant pills for long, hard work days. German doctor not included." + cost = 2500 + contains = list(/obj/item/reagent_containers/glass/bottle/charcoal, + /obj/item/reagent_containers/glass/bottle/charcoal, + /obj/item/reagent_containers/glass/bottle/epinephrine, + /obj/item/reagent_containers/glass/bottle/epinephrine, + /obj/item/reagent_containers/glass/bottle/morphine, + /obj/item/reagent_containers/glass/bottle/morphine, + /obj/item/reagent_containers/glass/bottle/morphine, + /obj/item/reagent_containers/glass/bottle/toxin, + /obj/item/reagent_containers/glass/bottle/toxin, + /obj/item/reagent_containers/glass/beaker/large, + /obj/item/reagent_containers/glass/beaker/large, + /obj/item/reagent_containers/pill/insulin, + /obj/item/reagent_containers/pill/insulin, + /obj/item/reagent_containers/pill/insulin, + /obj/item/reagent_containers/pill/insulin, + /obj/item/stack/medical/gauze, + /obj/item/storage/box/beakers, + /obj/item/storage/box/medsprays, + /obj/item/storage/box/syringes, + /obj/item/storage/box/bodybags, + /obj/item/storage/pill_bottle/stimulant) + crate_name = "medical supplies crate" + +/datum/supply_pack/medical/vending + name = "Medical Vending Crate" + desc = "Contains refills for medical vending machines." + cost = 2000 + contains = list(/obj/item/vending_refill/medical, + /obj/item/vending_refill/wallmed) + crate_name = "medical vending 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." + cost = 2250 + contains = list(/obj/item/reagent_containers/medspray/styptic, + /obj/item/reagent_containers/medspray/styptic, + /obj/item/reagent_containers/medspray/silver_sulf, + /obj/item/reagent_containers/medspray/silver_sulf, + /obj/item/reagent_containers/medspray/synthflesh, + /obj/item/reagent_containers/medspray/synthflesh, + /obj/item/reagent_containers/medspray/sterilizine, + /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/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 pill bottle, as well as a radiation treatment deluxe pill bottle!" + cost = 3500 + contains = list(/obj/item/storage/pill_bottle/antirad_plus, + /obj/item/storage/pill_bottle/mutarad, + /obj/item/storage/firstaid/radbgone, + /obj/item/storage/firstaid/radbgone, + /obj/item/geiger_counter, + /obj/item/geiger_counter) + crate_name = "radiation protection crate" + crate_type = /obj/structure/closet/crate/radiation + +/datum/supply_pack/medical/surgery + name = "Surgical Supplies Crate" + desc = "Do you want to perform surgery, but don't have one of those fancy shmancy degrees? Just get started with this crate containing a medical duffelbag, Sterilizine spray and collapsible roller bed." + cost = 1300 + contains = list(/obj/item/storage/backpack/duffelbag/med/surgery, + /obj/item/reagent_containers/medspray/sterilizine, + /obj/item/roller) + crate_name = "surgical supplies 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/virus + name = "Virus Crate" + desc = "Contains twelve different bottles, containing several viral samples for virology research. Also includes seven beakers and syringes. Balled-up jeans not included. Requires CMO access to open." + cost = 2500 + access = ACCESS_CMO + contains = list(/obj/item/reagent_containers/glass/bottle/flu_virion, + /obj/item/reagent_containers/glass/bottle/cold, + /obj/item/reagent_containers/glass/bottle/random_virus, + /obj/item/reagent_containers/glass/bottle/random_virus, + /obj/item/reagent_containers/glass/bottle/random_virus, + /obj/item/reagent_containers/glass/bottle/random_virus, + /obj/item/reagent_containers/glass/bottle/fake_gbs, + /obj/item/reagent_containers/glass/bottle/magnitis, + /obj/item/reagent_containers/glass/bottle/pierrot_throat, + /obj/item/reagent_containers/glass/bottle/brainrot, + /obj/item/reagent_containers/glass/bottle/anxiety, + /obj/item/reagent_containers/glass/bottle/beesease, + /obj/item/storage/box/syringes, + /obj/item/storage/box/beakers, + /obj/item/reagent_containers/glass/bottle/mutagen) + crate_name = "virus crate" + crate_type = /obj/structure/closet/crate/secure/plasma + dangerous = TRUE diff --git a/code/modules/cargo/packs/misc.dm b/code/modules/cargo/packs/misc.dm new file mode 100644 index 0000000000..c380d5411e --- /dev/null +++ b/code/modules/cargo/packs/misc.dm @@ -0,0 +1,230 @@ + +//Reminders- +// If you add something to this list, please group it by type and sort it alphabetically instead of just jamming it in like an animal +// cost = 700- Minimum cost, or infinite points are possible. +////////////////////////////////////////////////////////////////////////////// +//////////////////////////// Miscellaneous /////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +/datum/supply_pack/misc + group = "Miscellaneous Supplies" + +/datum/supply_pack/misc/artsupply + name = "Art Supplies" + desc = "Make some happy little accidents with six canvasses, two easels, two boxes of crayons, and a rainbow crayon!" + cost = 800 + contains = list(/obj/structure/easel, + /obj/structure/easel, + /obj/item/canvas/nineteenXnineteen, + /obj/item/canvas/nineteenXnineteen, + /obj/item/canvas/twentythreeXnineteen, + /obj/item/canvas/twentythreeXnineteen, + /obj/item/canvas/twentythreeXtwentythree, + /obj/item/canvas/twentythreeXtwentythree, + /obj/item/storage/crayons, + /obj/item/storage/crayons, + /obj/item/toy/crayon/rainbow, + /obj/item/toy/crayon/white, + /obj/item/toy/crayon/white) + crate_name = "art supply crate" + crate_type = /obj/structure/closet/crate/wooden + +/datum/supply_pack/misc/captain_pen + name = "Captain Pen" + desc = "A spare Captain fountain pen." + access = ACCESS_CAPTAIN + cost = 10000 + contains = list(/obj/item/pen/fountain/captain) + crate_name = "captain pen" + crate_type = /obj/structure/closet/crate/secure/weapon //It is a combat pen + +/datum/supply_pack/misc/bicycle + name = "Bicycle" + desc = "Nanotrasen reminds all employees to never toy with powers outside their control." + cost = 1000000 + contains = list(/obj/vehicle/ridden/bicycle) + crate_name = "Bicycle Crate" + crate_type = /obj/structure/closet/crate/large + +/datum/supply_pack/misc/bigband + name = "Big Band Instrument Collection" + desc = "Get your sad station movin' and groovin' with this fine collection! Contains nine different instruments!" + cost = 5000 + crate_name = "Big band musical instruments collection" + contains = list(/obj/item/instrument/violin, + /obj/item/instrument/guitar, + /obj/item/instrument/glockenspiel, + /obj/item/instrument/accordion, + /obj/item/instrument/saxophone, + /obj/item/instrument/trombone, + /obj/item/instrument/recorder, + /obj/item/instrument/harmonica, + /obj/structure/piano/unanchored) + crate_type = /obj/structure/closet/crate/wooden + +/datum/supply_pack/misc/book_crate + name = "Book Crate" + desc = "Surplus from the Nanotrasen Archives, these five books are sure to be good reads." + cost = 1500 + contains = list(/obj/item/book/codex_gigas, + /obj/item/book/manual/random/, + /obj/item/book/manual/random/, + /obj/item/book/manual/random/, + /obj/item/book/random/triple) + crate_type = /obj/structure/closet/crate/wooden + +/datum/supply_pack/misc/paper + name = "Bureaucracy Crate" + desc = "High stacks of papers on your desk Are a big problem - make it Pea-sized with these bureaucratic supplies! Contains five pens, some camera film, hand labeler supplies, a paper bin, three folders, two clipboards and two stamps as well as a briefcase."//that was too forced + cost = 1500 + contains = list(/obj/structure/filingcabinet/chestdrawer/wheeled, + /obj/item/camera_film, + /obj/item/hand_labeler, + /obj/item/hand_labeler_refill, + /obj/item/hand_labeler_refill, + /obj/item/paper_bin, + /obj/item/pen/fourcolor, + /obj/item/pen/fourcolor, + /obj/item/pen, + /obj/item/pen/blue, + /obj/item/pen/red, + /obj/item/folder/blue, + /obj/item/folder/red, + /obj/item/folder/yellow, + /obj/item/clipboard, + /obj/item/clipboard, + /obj/item/stamp, + /obj/item/stamp/denied, + /obj/item/storage/briefcase) + crate_name = "bureaucracy crate" + +/datum/supply_pack/misc/fountainpens + name = "Calligraphy Crate" + desc = "Sign death warrants in style with these seven executive fountain pens." + cost = 730 + contains = list(/obj/item/storage/box/fountainpens, + /obj/item/paper_bin) + crate_type = /obj/structure/closet/crate/wooden + crate_name = "calligraphy crate" + +/datum/supply_pack/misc/wrapping_paper + name = "Festive Wrapping Paper Crate" + desc = "Want to mail your loved ones gift-wrapped chocolates, stuffed animals, the Clown's severed head? You can do all that, with this crate full of wrapping paper." + cost = 1000 + contains = list(/obj/item/stack/wrapping_paper) + crate_type = /obj/structure/closet/crate/wooden + crate_name = "festive wrapping paper crate" + +/datum/supply_pack/misc/paper_work + name = "Freelance Paper work" + desc = "The Nanotrasen Primary Bureaucratic Database Intelligence (PDBI) reports that the station has not completed its funding and grant paperwork this solar cycle. In order to gain further funding, your station is required to fill out (20) ten of these forms or no additional capital will be disbursed. We have sent you ten copies of the following form and we expect every one to be up to Nanotrasen Standards." // Disbursement. It's not a typo, look it up. + cost = 700 // Net of 0 credits but makes (120 x 20 = 2400) + contains = list(/obj/item/folder/paperwork, + /obj/item/folder/paperwork, + /obj/item/folder/paperwork, + /obj/item/folder/paperwork, + /obj/item/folder/paperwork, + /obj/item/folder/paperwork, + /obj/item/folder/paperwork, + /obj/item/folder/paperwork, + /obj/item/folder/paperwork, + /obj/item/folder/paperwork, + /obj/item/folder/paperwork, + /obj/item/folder/paperwork, + /obj/item/folder/paperwork, + /obj/item/folder/paperwork, + /obj/item/folder/paperwork, + /obj/item/folder/paperwork, + /obj/item/folder/paperwork, + /obj/item/folder/paperwork, + /obj/item/folder/paperwork, + /obj/item/folder/paperwork, + /obj/item/pen/fountain + ) + crate_name = "Paperwork" + +/datum/supply_pack/misc/funeral + name = "Funeral Supply crate" + desc = "At the end of the day, someone's gonna want someone dead. Give them a proper send-off with these funeral supplies! Contains a coffin with burial garmets and flowers." + cost = 800 + contains = list(/obj/item/clothing/under/burial, + /obj/item/reagent_containers/food/snacks/grown/harebell, + /obj/item/reagent_containers/food/snacks/grown/poppy/geranium + ) + crate_name = "coffin" + crate_type = /obj/structure/closet/crate/coffin + +/datum/supply_pack/misc/jukebox + name = "Jukebox" + cost = 10000 + contains = list(/obj/machinery/jukebox) + crate_name = "Jukebox" + +/datum/supply_pack/misc/lewd + name = "Lewd Crate" // OwO + desc = "Psss want to have a good time with your sluts? Well I got what you want maid clothing, dildos, collars and more!" + cost = 5250 + contraband = TRUE + contains = list(/obj/item/dildo/custom, + /obj/item/dildo/custom, + /obj/item/vending_refill/kink, + /obj/item/vending_refill/kink, + /obj/item/clothing/under/maid, + /obj/item/clothing/under/maid, + /obj/item/electropack/shockcollar, + /obj/item/electropack/shockcollar, + /obj/item/restraints/handcuffs/fake/kinky, + /obj/item/restraints/handcuffs/fake/kinky, + /obj/item/clothing/head/kitty/genuine, // Why its illegal + /obj/item/clothing/head/kitty/genuine, + /obj/item/storage/pill_bottle/penis_enlargement, + /obj/structure/reagent_dispensers/keg/aphro) + crate_name = "lewd kit" + crate_type = /obj/structure/closet/crate + +/datum/supply_pack/misc/lewdkeg + name = "Lewd Deluxe Keg" + desc = "That other stuff not getting you ready? Well I have a Chemslut making tons of the good stuff." + cost = 7500 //It can be a weapon + contraband = TRUE + contains = list(/obj/structure/reagent_dispensers/keg/aphro/strong) + crate_name = "deluxe keg" + crate_type = /obj/structure/closet/crate + +/datum/supply_pack/misc/religious_supplies + name = "Religious Supplies Crate" + desc = "Keep your local chaplain happy and well-supplied, lest they call down judgement upon your cargo bay. Contains two bottles of holywater, bibles, chaplain robes, and burial garmets." + cost = 4000 // it costs so much because the Space Church is ran by Space Jews + contains = list(/obj/item/reagent_containers/food/drinks/bottle/holywater, + /obj/item/reagent_containers/food/drinks/bottle/holywater, + /obj/item/storage/book/bible/booze, + /obj/item/storage/book/bible/booze, + /obj/item/clothing/suit/hooded/chaplain_hoodie, + /obj/item/clothing/suit/hooded/chaplain_hoodie + ) + crate_name = "religious supplies crate" + +/datum/supply_pack/misc/randomised/promiscuous + name = "Promiscuous Organs" + desc = "Do YOU want to have more genital? Well we have just the thing for you~. This crate has two autosurgeon, that will let you have a new sex, organ to impress that hot stud and or chick." + cost = 4000 //Only get 2! + contraband = TRUE + var/num_contained = 2 + contains = list(/obj/item/autosurgeon/penis, + /obj/item/autosurgeon/testicles, + /obj/item/autosurgeon/vagina, + /obj/item/autosurgeon/breasts, + /obj/item/autosurgeon/womb) + crate_name = "promiscuous organs" + +/datum/supply_pack/misc/toner + name = "Toner Crate" + desc = "Spent too much ink printing butt pictures? Fret not, with these six toner refills, you'll be printing butts 'till the cows come home!'" + cost = 1000 + contains = list(/obj/item/toner, + /obj/item/toner, + /obj/item/toner, + /obj/item/toner, + /obj/item/toner, + /obj/item/toner) + crate_name = "toner crate" diff --git a/code/modules/cargo/packs/organic.dm b/code/modules/cargo/packs/organic.dm new file mode 100644 index 0000000000..2b5df207c3 --- /dev/null +++ b/code/modules/cargo/packs/organic.dm @@ -0,0 +1,290 @@ + +//Reminders- +// If you add something to this list, please group it by type and sort it alphabetically instead of just jamming it in like an animal +// cost = 700- Minimum cost, or infinite points are possible. +////////////////////////////////////////////////////////////////////////////// +//////////////////////////// Organic ///////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +/datum/supply_pack/organic + group = "Food & Hydroponics" + crate_type = /obj/structure/closet/crate/freezer + +/datum/supply_pack/organic/hydroponics/beekeeping_suits + name = "Beekeeper Suit Crate" + desc = "Bee business booming? Better be benevolent and boost botany by bestowing bi-Beekeeper-suits! Contains two beekeeper suits and matching headwear." + cost = 1300 + contains = list(/obj/item/clothing/head/beekeeper_head, + /obj/item/clothing/suit/beekeeper_suit, + /obj/item/clothing/head/beekeeper_head, + /obj/item/clothing/suit/beekeeper_suit) + crate_name = "beekeeper suits" + crate_type = /obj/structure/closet/crate/hydroponics + +/datum/supply_pack/organic/hydroponics/beekeeping_fullkit + name = "Beekeeping Starter Crate" + desc = "BEES BEES BEES. Contains three honey frames, a beekeeper suit and helmet, flyswatter, bee house, and, of course, a pure-bred Nanotrasen-Standardized Queen Bee!" + cost = 1800 + contains = list(/obj/structure/beebox/unwrenched, + /obj/item/honey_frame, + /obj/item/honey_frame, + /obj/item/honey_frame, + /obj/item/queen_bee/bought, + /obj/item/clothing/head/beekeeper_head, + /obj/item/clothing/suit/beekeeper_suit, + /obj/item/melee/flyswatter) + crate_name = "beekeeping starter crate" + crate_type = /obj/structure/closet/crate/hydroponics + +/datum/supply_pack/organic/candy/randomised + name = "Candy Crate" + desc = "For people that have a insatiable sweet tooth! Has ten candies to be eaten up.." + cost = 2500 + var/num_contained = 10 //number of items picked to be contained in a randomised crate + contains = list(/obj/item/reagent_containers/food/snacks/candy, + /obj/item/reagent_containers/food/snacks/lollipop, + /obj/item/reagent_containers/food/snacks/gumball, + /obj/item/reagent_containers/food/snacks/chocolateegg, + /obj/item/reagent_containers/food/snacks/donut, + /obj/item/reagent_containers/food/snacks/cookie, + /obj/item/reagent_containers/food/snacks/sugarcookie, + /obj/item/reagent_containers/food/snacks/chococornet, + /obj/item/reagent_containers/food/snacks/mint, + /obj/item/reagent_containers/food/snacks/spiderlollipop, + /obj/item/reagent_containers/food/snacks/chococoin, + /obj/item/reagent_containers/food/snacks/fudgedice, + /obj/item/reagent_containers/food/snacks/chocoorange, + /obj/item/reagent_containers/food/snacks/honeybar, + /obj/item/reagent_containers/food/snacks/tinychocolate, + /obj/item/reagent_containers/food/snacks/spacetwinkie, + /obj/item/reagent_containers/food/snacks/syndicake, + /obj/item/reagent_containers/food/snacks/cheesiehonkers, + /obj/item/reagent_containers/food/snacks/sugarcookie/spookyskull, + /obj/item/reagent_containers/food/snacks/sugarcookie/spookycoffin, + /obj/item/reagent_containers/food/snacks/candy_corn, + /obj/item/reagent_containers/food/snacks/candiedapple, + /obj/item/reagent_containers/food/snacks/chocolatebar, + /obj/item/reagent_containers/food/snacks/candyheart, + /obj/item/storage/fancy/heart_box, + /obj/item/storage/fancy/donut_box) + crate_name = "candy crate" + +/datum/supply_pack/organic/cutlery + name = "Kitchen Cutlery Deluxe Set" + desc = "Need to slice and dice away those ''Tomatos'' well we got what you need! From a nice set of knifes, forks, plates, glasses, and a whetstone for when you got some grizzle that is a bit harder to slice then normal." + cost = 10000 + contraband = TRUE + contains = list(/obj/item/sharpener, + /obj/item/kitchen/fork, + /obj/item/kitchen/fork, + /obj/item/kitchen/knife, + /obj/item/kitchen/knife, + /obj/item/kitchen/knife, + /obj/item/kitchen/knife, + /obj/item/kitchen/knife/butcher, + /obj/item/kitchen/knife/butcher, + /obj/item/kitchen/rollingpin, //Deluxe for a reason + /obj/item/trash/plate, + /obj/item/trash/plate, + /obj/item/trash/plate, + /obj/item/trash/plate, + /obj/item/reagent_containers/food/drinks/drinkingglass, + /obj/item/reagent_containers/food/drinks/drinkingglass, + /obj/item/reagent_containers/food/drinks/drinkingglass, + /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, + /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass) + crate_name = "kitchen cutlery deluxe set" + +/datum/supply_pack/organic/food + name = "Food Crate" + desc = "Get things cooking with this crate full of useful ingredients! Contains a two dozen eggs, three bananas, and two bags of flour and rice, two cartons of milk, soymilk, as well as salt and pepper shakers, a enzyme and sugar bottle, and three slabs of monkeymeat." + cost = 1000 + contains = list(/obj/item/reagent_containers/food/condiment/flour, + /obj/item/reagent_containers/food/condiment/flour, + /obj/item/reagent_containers/food/condiment/rice, + /obj/item/reagent_containers/food/condiment/rice, + /obj/item/reagent_containers/food/condiment/milk, + /obj/item/reagent_containers/food/condiment/milk, + /obj/item/reagent_containers/food/condiment/soymilk, + /obj/item/reagent_containers/food/condiment/saltshaker, + /obj/item/reagent_containers/food/condiment/peppermill, + /obj/item/storage/fancy/egg_box, + /obj/item/storage/fancy/egg_box, + /obj/item/reagent_containers/food/condiment/enzyme, + /obj/item/reagent_containers/food/condiment/sugar, + /obj/item/reagent_containers/food/snacks/meat/slab/monkey, + /obj/item/reagent_containers/food/snacks/meat/slab/monkey, + /obj/item/reagent_containers/food/snacks/meat/slab/monkey, + /obj/item/reagent_containers/food/snacks/grown/banana, + /obj/item/reagent_containers/food/snacks/grown/banana, + /obj/item/reagent_containers/food/snacks/grown/banana) + crate_name = "food crate" + +/datum/supply_pack/organic/cream_piee + name = "High-yield Clown-grade Cream Pie Crate" + desc = "Designed by Aussec's Advanced Warfare Research Division, these high-yield, Clown-grade cream pies are powered by a synergy of performance and efficiency. Guaranteed to provide maximum results." + cost = 6000 + contains = list(/obj/item/storage/backpack/duffelbag/clown/cream_pie) + crate_name = "party equipment crate" + contraband = TRUE + access = ACCESS_THEATRE + crate_type = /obj/structure/closet/crate/secure + +/datum/supply_pack/organic/hunting + name = "Huntting gear" + desc = "Even in space, we can fine prey to hunt, this crate contains everthing a fine hunter needs to have a sporting time. This crate needs armory access to open. A true huntter only needs a fine bottle of cognac, a nice coat, some good o' cigars, and of cource a huntting shotgun. " + cost = 3500 + contraband = TRUE + contains = list(/obj/item/clothing/head/flatcap, + /obj/item/clothing/suit/hooded/wintercoat/captain, + /obj/item/reagent_containers/food/drinks/bottle/cognac, + /obj/item/storage/fancy/cigarettes/cigars/havana, + /obj/item/clothing/gloves/color/white, + /obj/item/clothing/under/rank/curator, + /obj/item/gun/ballistic/shotgun/lethal) + 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/organic/hydroponics + name = "Hydroponics Crate" + desc = "Supplies for growing a great garden! Contains two bottles of ammonia, two Plant-B-Gone spray bottles, a hatchet, cultivator, plant analyzer, as well as a pair of leather gloves and a botanist's apron." + cost = 1750 + contains = list(/obj/item/reagent_containers/spray/plantbgone, + /obj/item/reagent_containers/spray/plantbgone, + /obj/item/reagent_containers/glass/bottle/ammonia, + /obj/item/reagent_containers/glass/bottle/ammonia, + /obj/item/hatchet, + /obj/item/cultivator, + /obj/item/plant_analyzer, + /obj/item/clothing/gloves/botanic_leather, + /obj/item/clothing/suit/apron) + crate_name = "hydroponics crate" + crate_type = /obj/structure/closet/crate/hydroponics + +/datum/supply_pack/organic/hydroponics/hydrotank + name = "Hydroponics Backpack Crate" + desc = "Bring on the flood with this high-capacity backpack crate. Contains 500 units of life-giving H2O. Requires hydroponics access to open." + cost = 1200 + access = ACCESS_HYDROPONICS + contains = list(/obj/item/watertank) + crate_name = "hydroponics backpack crate" + crate_type = /obj/structure/closet/crate/secure + +/datum/supply_pack/organic/mre + name = "MRE supply kit (emergency rations)" + desc = "The lights are out. Oxygen's running low. You've run out of food except space weevils. Don't let this be you! Order our NT branded MRE kits today! This pack contains 5 MRE packs with a randomized menu and an oxygen tank." + cost = 2000 + contains = list(/obj/item/storage/box/mre/menu1/safe, + /obj/item/storage/box/mre/menu1/safe, + /obj/item/storage/box/mre/menu2/safe, + /obj/item/storage/box/mre/menu2/safe, + /obj/item/storage/box/mre/menu3, + /obj/item/storage/box/mre/menu4/safe) + crate_name = "MRE crate (emergency rations)" + +/datum/supply_pack/organic/pizza + name = "Pizza Crate" + desc = "Best prices on this side of the galaxy. All deliveries are guaranteed to be 99% anomaly-free!" + cost = 6000 // Best prices this side of the galaxy. + contains = list(/obj/item/pizzabox/margherita, + /obj/item/pizzabox/mushroom, + /obj/item/pizzabox/meat, + /obj/item/pizzabox/vegetable, + /obj/item/pizzabox/pineapple) + crate_name = "pizza crate" + var/static/anomalous_box_provided = FALSE + +/datum/supply_pack/organic/pizza/fill(obj/structure/closet/crate/C) + . = ..() + if(!anomalous_box_provided) + for(var/obj/item/pizzabox/P in C) + if(prob(1)) //1% chance for each box, so 4% total chance per order + var/obj/item/pizzabox/infinite/fourfiveeight = new(C) + fourfiveeight.boxtag = P.boxtag + qdel(P) + anomalous_box_provided = TRUE + log_game("An anomalous pizza box was provided in a pizza crate at during cargo delivery") + if(prob(50)) + addtimer(CALLBACK(src, .proc/anomalous_pizza_report), rand(300, 1800)) + else + message_admins("An anomalous pizza box was silently created with no command report in a pizza crate delivery.") + break + +/datum/supply_pack/organic/pizza/proc/anomalous_pizza_report() + print_command_report("[station_name()], our anomalous materials divison has reported a missing object that is highly likely to have been sent to your station during a routine cargo \ + delivery. Please search all crates and manifests provided with the delivery and return the object if is located. The object resembles a standard \[DATA EXPUNGED\] and is to be \ + considered \[REDACTED\] and returned at your leisure. Note that objects the anomaly produces are specifically attuned exactly to the individual opening the anomaly; regardless \ + of species, the individual will find the object edible and it will taste great according to their personal definitions, which vary significantly based on person and species.") + +/datum/supply_pack/organic/potted_plants + 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) + crate_name = "potted plants crate" + crate_type = /obj/structure/closet/crate/hydroponics + +/datum/supply_pack/organic/seeds + name = "Seeds Crate" + desc = "Big things have small beginnings. Contains thirteen different seeds." + cost = 1250 + contains = list(/obj/item/seeds/chili, + /obj/item/seeds/berry, + /obj/item/seeds/corn, + /obj/item/seeds/eggplant, + /obj/item/seeds/tomato, + /obj/item/seeds/soya, + /obj/item/seeds/wheat, + /obj/item/seeds/wheat/rice, + /obj/item/seeds/carrot, + /obj/item/seeds/sunflower, + /obj/item/seeds/chanter, + /obj/item/seeds/potato, + /obj/item/seeds/sugarcane) + crate_name = "seeds crate" + crate_type = /obj/structure/closet/crate/hydroponics + +/datum/supply_pack/organic/vday + name = "Surplus Valentine Crate" + desc = "Turns out we got warehouses of this love-y dove-y crap. Were sending out small barged buddle of Valentine gear. This crate has two boxes of chocolate, three poppy flowers, five candy hearts, and three cards." + cost = 3000 + contraband = TRUE + contains = list(/obj/item/storage/fancy/heart_box, + /obj/item/storage/fancy/heart_box, + /obj/item/reagent_containers/food/snacks/grown/poppy, + /obj/item/reagent_containers/food/snacks/grown/poppy, + /obj/item/reagent_containers/food/snacks/grown/poppy, + /obj/item/reagent_containers/food/snacks/candyheart, + /obj/item/reagent_containers/food/snacks/candyheart, + /obj/item/reagent_containers/food/snacks/candyheart, + /obj/item/reagent_containers/food/snacks/candyheart, + /obj/item/reagent_containers/food/snacks/candyheart, + /obj/item/valentine, + /obj/item/valentine, + /obj/item/valentine) + crate_name = "valentine crate" + crate_type = /obj/structure/closet/crate/secure + +/datum/supply_pack/organic/exoticseeds + name = "Exotic Seeds Crate" + desc = "Any entrepreneuring botanist's dream. Contains twelve different seeds, including three replica-pod seeds and two mystery seeds!" + cost = 1500 + contains = list(/obj/item/seeds/nettle, + /obj/item/seeds/replicapod, + /obj/item/seeds/replicapod, + /obj/item/seeds/replicapod, + /obj/item/seeds/plump, + /obj/item/seeds/liberty, + /obj/item/seeds/amanita, + /obj/item/seeds/reishi, + /obj/item/seeds/banana, + /obj/item/seeds/eggplant/eggy, + /obj/item/seeds/random, + /obj/item/seeds/random) + crate_name = "exotic seeds crate" + crate_type = /obj/structure/closet/crate/hydroponics diff --git a/code/modules/cargo/packs/science.dm b/code/modules/cargo/packs/science.dm new file mode 100644 index 0000000000..c4fbc0bfe5 --- /dev/null +++ b/code/modules/cargo/packs/science.dm @@ -0,0 +1,119 @@ + +//Reminders- +// If you add something to this list, please group it by type and sort it alphabetically instead of just jamming it in like an animal +// cost = 700- Minimum cost, or infinite points are possible. +////////////////////////////////////////////////////////////////////////////// +//////////////////////////// Science ///////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +/datum/supply_pack/science + group = "Science" + crate_type = /obj/structure/closet/crate/science + +/datum/supply_pack/science/robotics/mecha_odysseus + name = "Circuit Crate (Odysseus)" + desc = "Ever wanted to build your own giant medical robot? Well, now you can! Contains the Odysseus main control board and Odysseus peripherals board. Requires Robotics access to open." + cost = 2500 + access = ACCESS_ROBOTICS + contains = list(/obj/item/circuitboard/mecha/odysseus/peripherals, + /obj/item/circuitboard/mecha/odysseus/main) + crate_name = "\improper Odysseus circuit crate" + crate_type = /obj/structure/closet/crate/secure/science + +/datum/supply_pack/science/robotics/mecha_ripley + name = "Circuit Crate (Ripley APLU)" + desc = "Rip apart rocks and xenomorphs alike with the Ripley APLU. Contains the Main Ripley control board, as well as the Ripley Peripherals board. Requires Robotics access to open." + cost = 3000 + access = ACCESS_ROBOTICS + contains = list(/obj/item/book/manual/ripley_build_and_repair, + /obj/item/circuitboard/mecha/ripley/main, + /obj/item/circuitboard/mecha/ripley/peripherals) + crate_name = "\improper APLU Ripley circuit crate" + crate_type = /obj/structure/closet/crate/secure/science + +/datum/supply_pack/science/circuitry + name = "Circuitry Starter Pack Crate" + desc = "Journey into the mysterious world of Circuitry with this starter pack. Contains a circuit printer, analyzer, debugger and wirer. Power cells not included." + cost = 1000 + contains = list(/obj/item/integrated_electronics/analyzer, + /obj/item/integrated_circuit_printer, + /obj/item/integrated_electronics/debugger, + /obj/item/integrated_electronics/wirer) + crate_name = "circuitry starter pack crate" + +/datum/supply_pack/science/plasma + name = "Plasma Assembly Crate" + desc = "Everything you need to burn something to the ground, this contains three plasma assembly sets. Each set contains a plasma tank, igniter, proximity sensor, and timer! Warranty void if exposed to high temperatures. Requires Toxins access to open." + cost = 1800 + access = ACCESS_TOX_STORAGE + contains = list(/obj/item/tank/internals/plasma, + /obj/item/tank/internals/plasma, + /obj/item/tank/internals/plasma, + /obj/item/assembly/igniter, + /obj/item/assembly/igniter, + /obj/item/assembly/igniter, + /obj/item/assembly/prox_sensor, + /obj/item/assembly/prox_sensor, + /obj/item/assembly/prox_sensor, + /obj/item/assembly/timer, + /obj/item/assembly/timer, + /obj/item/assembly/timer) + crate_name = "plasma assembly crate" + crate_type = /obj/structure/closet/crate/secure/plasma + +/datum/supply_pack/science/robotics + name = "Robotics Assembly Crate" + desc = "The tools you need to replace those finicky humans with a loyal robot army! Contains three proximity sensors, two high-powered cells, six flashes, and an electrical toolbox. Requires Robotics access to open." + cost = 1500 + access = ACCESS_ROBOTICS + contains = list(/obj/item/assembly/prox_sensor, + /obj/item/assembly/prox_sensor, + /obj/item/assembly/prox_sensor, + /obj/item/storage/toolbox/electrical, + /obj/item/storage/box/flashes, + /obj/item/stock_parts/cell/high, + /obj/item/stock_parts/cell/high) + crate_name = "robotics assembly crate" + crate_type = /obj/structure/closet/crate/secure/science + +/datum/supply_pack/science/shieldwalls + name = "Shield Generator Crate" + desc = "These high powered Shield Wall Generators are guaranteed to keep any unwanted lifeforms on the outside, where they belong! Contains four shield wall generators. Requires Teleporter access to open." + cost = 2000 + access = ACCESS_TELEPORTER + contains = list(/obj/machinery/shieldwallgen, + /obj/machinery/shieldwallgen, + /obj/machinery/shieldwallgen, + /obj/machinery/shieldwallgen) + crate_name = "shield generators crate" + crate_type = /obj/structure/closet/crate/secure/science + +/datum/supply_pack/science/tablets + name = "Tablet Crate" + desc = "What's a computer? Contains five cargo tablets." + cost = 5000 + contains = list(/obj/item/modular_computer/tablet/preset/cargo, + /obj/item/modular_computer/tablet/preset/cargo, + /obj/item/modular_computer/tablet/preset/cargo, + /obj/item/modular_computer/tablet/preset/cargo, + /obj/item/modular_computer/tablet/preset/cargo) + crate_name = "tablet crate" + +/datum/supply_pack/science/transfer_valves + name = "Tank Transfer Valves Crate" + desc = "The key ingredient for making a lot of people very angry very fast. Contains two tank transfer valves. Requires RD access to open." + cost = 6000 + access = ACCESS_RD + contains = list(/obj/item/transfer_valve, + /obj/item/transfer_valve) + crate_name = "tank transfer valves crate" + crate_type = /obj/structure/closet/crate/secure/science + dangerous = TRUE + +/datum/supply_pack/science/tech_slugs + name = "Tech Slug Ammo Shells" + desc = "A new type of shell that is able to be made into a few different dangerous types. Contains two boxes of tech slugs, 14 shells in all." + cost = 1700 + contains = list(/obj/item/storage/box/techsslug, + /obj/item/storage/box/techsslug) + crate_name = "tech slug crate" diff --git a/code/modules/cargo/packs/security.dm b/code/modules/cargo/packs/security.dm new file mode 100644 index 0000000000..3c68fe7f6d --- /dev/null +++ b/code/modules/cargo/packs/security.dm @@ -0,0 +1,192 @@ + +//Reminders- +// If you add something to this list, please group it by type and sort it alphabetically instead of just jamming it in like an animal +// cost = 700- Minimum cost, or infinite points are possible. +////////////////////////////////////////////////////////////////////////////// +//////////////////////////// Security //////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +/datum/supply_pack/security + group = "Security" + access = ACCESS_SECURITY + crate_type = /obj/structure/closet/crate/secure/gear + +/datum/supply_pack/security/armor + name = "Armor Crate" + desc = "Three vests of well-rounded, decently-protective armor. Requires Security access to open." + cost = 1200 + contains = list(/obj/item/clothing/suit/armor/vest, + /obj/item/clothing/suit/armor/vest, + /obj/item/clothing/suit/armor/vest) + crate_name = "armor crate" + +/datum/supply_pack/security/disabler + name = "Disabler Crate" + desc = "Three stamina-draining disabler weapons. Requires Security access to open." + cost = 1300 + contains = list(/obj/item/gun/energy/disabler, + /obj/item/gun/energy/disabler, + /obj/item/gun/energy/disabler) + crate_name = "disabler crate" + +/datum/supply_pack/security/forensics + name = "Forensics Crate" + desc = "Stay hot on the criminal's heels with Nanotrasen's Detective Essentials(tm). Contains a forensics scanner, six evidence bags, camera, tape recorder, white crayon, and of course, a fedora. Requires Security access to open." + cost = 1800 + contains = list(/obj/item/detective_scanner, + /obj/item/storage/box/evidence, + /obj/item/camera, + /obj/item/taperecorder, + /obj/item/toy/crayon/white, + /obj/item/clothing/head/fedora/det_hat) + crate_name = "forensics crate" + +/datum/supply_pack/security/helmets + name = "Helmets Crate" + desc = "Contains three standard-issue brain buckets. Requires Security access to open." + cost = 1200 + contains = list(/obj/item/clothing/head/helmet/sec, + /obj/item/clothing/head/helmet/sec, + /obj/item/clothing/head/helmet/sec) + crate_name = "helmet crate" + +/datum/supply_pack/security/laser + name = "Lasers Crate" + desc = "Contains three lethal, high-energy laser guns. Requires Security access to open." + cost = 1750 + contains = list(/obj/item/gun/energy/laser, + /obj/item/gun/energy/laser, + /obj/item/gun/energy/laser) + crate_name = "laser crate" + +/datum/supply_pack/security/russianclothing + name = "Russian Surplus Clothing" + desc = "An old russian crate full of surplus armor that they used to use! Has two sets of bulletproff armor, a few union suits and some warm hats!" + contraband = TRUE + cost = 5750 // Its basicly sec suits, good boots/gloves + contains = list(/obj/item/clothing/suit/security/officer/russian, + /obj/item/clothing/suit/security/officer/russian, + /obj/item/clothing/shoes/combat, + /obj/item/clothing/shoes/combat, + /obj/item/clothing/head/ushanka, + /obj/item/clothing/head/ushanka, + /obj/item/clothing/suit/armor/bulletproof, + /obj/item/clothing/suit/armor/bulletproof, + /obj/item/clothing/head/helmet/alt, + /obj/item/clothing/head/helmet/alt, + /obj/item/clothing/gloves/combat, + /obj/item/clothing/gloves/combat, + /obj/item/clothing/mask/gas, + /obj/item/clothing/mask/gas) + crate_name = "surplus russian clothing" + crate_type = /obj/structure/closet/crate/internals + +/datum/supply_pack/security/russianmosin + name = "Russian Minutemen Gear" + desc = "An old russian Minutemen crate, comes with a full russian outfit, a mosin and a stripper clip." + contraband = TRUE + access = FALSE + cost = 5500 // + contains = list(/obj/item/clothing/suit/security/officer/russian, + /obj/item/clothing/shoes/combat, + /obj/item/clothing/head/ushanka, + /obj/item/clothing/suit/armor/bulletproof, + /obj/item/clothing/head/helmet/alt, + /obj/item/clothing/gloves/combat, + /obj/item/clothing/mask/gas, + /obj/item/gun/ballistic/shotgun/boltaction, + /obj/item/ammo_box/a762) + crate_name = "surplus russian gear" + crate_type = /obj/structure/closet/crate/internals + +/datum/supply_pack/security/sechardsuit + name = "Sec Hardsuit" + desc = "One Sec Hardsuit with a small air tank and mask." + cost = 3000 // half of SWAT gear for have the armor and half the gear + contains = list(/obj/item/clothing/suit/space/hardsuit/security, + /obj/item/tank/internals/air, + /obj/item/clothing/mask/gas) + crate_name = "sec hardsuit crate" + +/datum/supply_pack/security/securitybarriers + name = "Security Barrier Grenades" + desc = "Stem the tide with four Security Barrier grenades. Requires Security access to open." + contains = list(/obj/item/grenade/barrier, + /obj/item/grenade/barrier, + /obj/item/grenade/barrier, + /obj/item/grenade/barrier) + cost = 2000 + crate_name = "security barriers crate" + +/datum/supply_pack/security/securityclothes + name = "Security Clothing Crate" + desc = "Contains appropriate outfits for the station's private security force. Contains outfits for the Warden, Head of Security, and two Security Officers. Each outfit comes with a rank-appropriate jumpsuit, suit, and beret. Requires Security access to open." + cost = 3250 + contains = list(/obj/item/clothing/under/rank/security/navyblue, + /obj/item/clothing/under/rank/security/navyblue, + /obj/item/clothing/suit/security/officer, + /obj/item/clothing/suit/security/officer, + /obj/item/clothing/head/beret/sec/navyofficer, + /obj/item/clothing/head/beret/sec/navyofficer, + /obj/item/clothing/under/rank/warden/navyblue, + /obj/item/clothing/suit/security/warden, + /obj/item/clothing/head/beret/sec/navywarden, + /obj/item/clothing/under/rank/head_of_security/navyblue, + /obj/item/clothing/suit/security/hos, + /obj/item/clothing/head/beret/sec/navyhos) + crate_name = "security clothing crate" + +/datum/supply_pack/security/supplies + name = "Security Supplies Crate" + desc = "Contains seven flashbangs, seven teargas grenades, six flashes, and seven handcuffs. Requires Security access to open." + cost = 1200 + contains = list(/obj/item/storage/box/flashbangs, + /obj/item/storage/box/teargas, + /obj/item/storage/box/flashes, + /obj/item/storage/box/handcuffs) + crate_name = "security supply crate" + +/datum/supply_pack/security/firingpins + name = "Standard Firing Pins Crate" + desc = "Upgrade your arsenal with 10 standard firing pins. Requires Security access to open." + cost = 2000 + contains = list(/obj/item/storage/box/firingpins, + /obj/item/storage/box/firingpins) + crate_name = "firing pins crate" + +/datum/supply_pack/security/justiceinbound + name = "Standard Justice Enforcer Crate" + desc = "This is it. The Bee's Knees. The Creme of the Crop. The Pick of the Litter. The best of the best of the best. The Crown Jewel of Nanotrasen. The Alpha and the Omega of security headwear. Guaranteed to strike fear into the hearts of each and every criminal aboard the station. Also comes with a security gasmask. Requires Security access to open." + cost = 6000 //justice comes at a price. An expensive, noisy price. + contraband = TRUE + contains = list(/obj/item/clothing/head/helmet/justice, + /obj/item/clothing/mask/gas/sechailer) + crate_name = "security clothing crate" + +/datum/supply_pack/security/baton + name = "Stun Batons Crate" + desc = "Arm the Civil Protection Forces with three stun batons. Batteries included. Requires Security access to open." + cost = 1200 + contains = list(/obj/item/melee/baton/loaded, + /obj/item/melee/baton/loaded, + /obj/item/melee/baton/loaded) + crate_name = "stun baton crate" + +/datum/supply_pack/security/taser + name = "Taser Crate" + desc = "From the depths of stunbased combat, this order rises above, supreme. Contains three hybrid tasers, capable of firing both electrodes and disabling shots. Requires Security access to open." + cost = 3500 + contains = list(/obj/item/gun/energy/e_gun/advtaser, + /obj/item/gun/energy/e_gun/advtaser, + /obj/item/gun/energy/e_gun/advtaser) + crate_name = "taser crate" + +/datum/supply_pack/security/wall_flash + name = "Wall-Mounted Flash Crate" + desc = "Contains four wall-mounted flashes. Requires Security access to open." + cost = 1000 + contains = list(/obj/item/storage/box/wall_flash, + /obj/item/storage/box/wall_flash, + /obj/item/storage/box/wall_flash, + /obj/item/storage/box/wall_flash) + crate_name = "wall-mounted flash crate" diff --git a/code/modules/cargo/packs/service.dm b/code/modules/cargo/packs/service.dm new file mode 100644 index 0000000000..14bde519e1 --- /dev/null +++ b/code/modules/cargo/packs/service.dm @@ -0,0 +1,266 @@ + +//Reminders- +// If you add something to this list, please group it by type and sort it alphabetically instead of just jamming it in like an animal +// cost = 700- Minimum cost, or infinite points are possible. +////////////////////////////////////////////////////////////////////////////// +/////////////////////////////// Service ////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +/datum/supply_pack/service + group = "Service" + +/datum/supply_pack/service/advlighting + name = "Advanced Lighting crate" + desc = "Thanks to advanced lighting tech we here at the Lamp Factory have be able to produce more lamps and lamp items! This crate has three lamps, a box of lights and a state of the art rapid-light-device!" + cost = 2750 + contains = list(/obj/item/construction/rld, + /obj/item/flashlight/lamp, + /obj/item/flashlight/lamp, + /obj/item/flashlight/lamp/green, + /obj/item/storage/box/lights/mixed) + crate_name = "advanced lighting crate" + crate_type = /obj/structure/closet/crate/secure + +/datum/supply_pack/service/cargo_supples + name = "Cargo Supplies Crate" + desc = "Sold everything that wasn't bolted down? You can get right back to work with this crate containing stamps, an export scanner, destination tagger, hand labeler and some package wrapping." + cost = 1000 + contains = list(/obj/item/stamp, + /obj/item/stamp/denied, + /obj/item/export_scanner, + /obj/item/destTagger, + /obj/item/hand_labeler, + /obj/item/stack/packageWrap) + crate_name = "cargo supplies crate" + +/datum/supply_pack/service/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/service/food_cart + name = "Food Cart Crate" + desc = "Want to sell food on the go? Cook lost their cart? Well we just so happen to have a few carts to spare!" + cost = 1000 + contains = list(/obj/machinery/food_cart) + crate_name = "food cart crate" + crate_type = /obj/structure/closet/crate + +/datum/supply_pack/service/noslipfloor + name = "High-traction Floor Tiles" + desc = "Make slipping a thing of the past with sixty industrial-grade anti-slip floortiles!" + cost = 2000 + contains = list(/obj/item/stack/tile/noslip/thirty, + /obj/item/stack/tile/noslip/thirty) + crate_name = "high-traction floor tiles crate" + +/datum/supply_pack/service/icecream_cart + name = "Ice Cream Cart Crate" + desc = "Plasma fire a to hot for you, want a nice treat after a hard days work? Well now we have the cart for you! This Ice Cream Vat has everthing you need to make you and your friends so ice cream treats! This cart comes stocked with some ingredients for each type of scoopable icecream." + cost = 2750 //Comes prestocked with basic ingredients + contains = list(/obj/machinery/icecream_vat) + crate_name = "ice cream vat crate" + crate_type = /obj/structure/closet/crate + +/datum/supply_pack/service/janitor + name = "Janitorial Supplies Crate" + desc = "Fight back against dirt and grime with Nanotrasen's Janitorial Essentials(tm)! Contains three buckets, caution signs, and cleaner grenades. Also has a single mop, spray cleaner, rag, NT soap and a trash bag." + cost = 1300 + contains = list(/obj/item/reagent_containers/glass/bucket, + /obj/item/reagent_containers/glass/bucket, + /obj/item/reagent_containers/glass/bucket, + /obj/item/mop, + /obj/item/caution, + /obj/item/caution, + /obj/item/caution, + /obj/item/storage/bag/trash, + /obj/item/reagent_containers/spray/cleaner, + /obj/item/reagent_containers/rag, + /obj/item/grenade/chem_grenade/cleaner, + /obj/item/grenade/chem_grenade/cleaner, + /obj/item/grenade/chem_grenade/cleaner, + /obj/item/soap/nanotrasen) + crate_name = "janitorial supplies crate" + +/datum/supply_pack/service/janitor/janicart + name = "Janitorial Cart and Galoshes Crate" + desc = "The keystone to any successful janitor. As long as you have feet, this pair of galoshes will keep them firmly planted on the ground. Also contains a janitorial cart." + cost = 2000 + contains = list(/obj/structure/janitorialcart, + /obj/item/clothing/shoes/galoshes) + crate_name = "janitorial cart crate" + crate_type = /obj/structure/closet/crate/large + +/datum/supply_pack/service/janitor/janitank + name = "Janitor Backpack Crate" + desc = "Call forth divine judgement upon dirt and grime with this high capacity janitor backpack. Contains 500 units of station-cleansing cleaner. Requires janitor access to open." + cost = 1000 + access = ACCESS_JANITOR + contains = list(/obj/item/watertank/janitor) + crate_name = "janitor backpack crate" + crate_type = /obj/structure/closet/crate/secure + +/datum/supply_pack/service/janitor/janpremium + name = "Janitor Premium Supplies" + desc = "Do to the union for better supplies, we have desided to make a deal for you, In this crate you can get a brand new chem, Drying Angent this stuff is the work of slimes or magic! This crate also contains a rag to test out the Drying Angent magic, three wet floor signs, and some spare bottles of ammonia." + cost = 1750 + access = ACCESS_JANITOR + contains = list(/obj/item/caution, + /obj/item/caution, + /obj/item/caution, + /obj/item/reagent_containers/rag, + /obj/item/reagent_containers/glass/bottle/ammonia, + /obj/item/reagent_containers/glass/bottle/ammonia, + /obj/item/reagent_containers/glass/bottle/ammonia, + /obj/item/reagent_containers/spray/drying_agent) + crate_name = "janitor backpack crate" + +/datum/supply_pack/service/janitor/janpimp + name = "Custodial Cruiser" + desc = "Clown steal your ride? Assistant lock it in the dorms? Order a new one and get back to cleaning in style!" + cost = 3000 + access = ACCESS_JANITOR + contains = list(/obj/vehicle/ridden/janicart, + /obj/item/key/janitor) + crate_name = "janitor ride crate" + crate_type = /obj/structure/closet/crate/large + +/datum/supply_pack/service/mule + name = "MULEbot Crate" + desc = "Pink-haired Quartermaster not doing her job? Replace her with this tireless worker, today!" + cost = 2000 + contains = list(/mob/living/simple_animal/bot/mulebot) + crate_name = "\improper MULEbot Crate" + crate_type = /obj/structure/closet/crate/large + +/datum/supply_pack/service/party + name = "Party Equipment" + desc = "Celebrate both life and death on the station with Nanotrasen's Party Essentials(tm)! Contains seven colored glowsticks, four beers, two ales, and a bottle of patron, goldschlager, and shaker!" + cost = 2000 + contains = list(/obj/item/storage/box/drinkingglasses, + /obj/item/reagent_containers/food/drinks/shaker, + /obj/item/reagent_containers/food/drinks/bottle/patron, + /obj/item/reagent_containers/food/drinks/bottle/goldschlager, + /obj/item/reagent_containers/food/drinks/ale, + /obj/item/reagent_containers/food/drinks/ale, + /obj/item/reagent_containers/food/drinks/beer, + /obj/item/reagent_containers/food/drinks/beer, + /obj/item/reagent_containers/food/drinks/beer, + /obj/item/reagent_containers/food/drinks/beer, + /obj/item/flashlight/glowstick, + /obj/item/flashlight/glowstick/red, + /obj/item/flashlight/glowstick/blue, + /obj/item/flashlight/glowstick/cyan, + /obj/item/flashlight/glowstick/orange, + /obj/item/flashlight/glowstick/yellow, + /obj/item/flashlight/glowstick/pink) + crate_name = "party equipment crate" + +/datum/supply_pack/service/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 the classics." + cost = 1000 + 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) + crate_name = "premium carpet crate" + +/datum/supply_pack/service/carpet2 + name = "Premium Carpet Crate #2" + desc = "Plasteel floor tiles getting on your nerves? These stacks of extra soft carpet will tie any room together. Contains red, and monochrome" + cost = 1000 + contains = list(/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 #2" + +/datum/supply_pack/service/lightbulbs + name = "Replacement Lights" + desc = "May the light of Aether shine upon this station! Or at least, the light of forty two light tubes and twenty one light bulbs as well as a light replacer." + cost = 1200 + contains = list(/obj/item/storage/box/lights/mixed, + /obj/item/storage/box/lights/mixed, + /obj/item/storage/box/lights/mixed, + /obj/item/lightreplacer) + crate_name = "replacement lights" + +/datum/supply_pack/service/minerkit + name = "Shaft Miner Starter Kit" + desc = "All the miners died too fast? Assistant wants to get a taste of life off-station? Either way, this kit is the best way to turn a regular crewman into an ore-producing, monster-slaying machine. Contains meson goggles, a pickaxe, advanced mining scanner, cargo headset, ore bag, gasmask, and explorer suit. Requires QM access to open." + cost = 2500 + access = ACCESS_QM + contains = list(/obj/item/pickaxe/mini, + /obj/item/clothing/glasses/meson, + /obj/item/t_scanner/adv_mining_scanner/lesser, + /obj/item/radio/headset/headset_cargo/mining, + /obj/item/storage/bag/ore, + /obj/item/clothing/suit/hooded/explorer/standard, + /obj/item/clothing/mask/gas/explorer) + crate_name = "shaft miner starter kit" + crate_type = /obj/structure/closet/crate/secure + +////////////////////////////////////////////////////////////////////////////// +/////////////////////////// Vending Restocks ///////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +/datum/supply_pack/service/vending/bartending + name = "Bartending Supply Crate" + desc = "Bring on the booze with vending machine refills, as well as a free book containing the well-kept secrets to the bartending trade!" + cost = 2000 + contains = list(/obj/item/vending_refill/boozeomat, + /obj/item/vending_refill/coffee, + /obj/item/book/granter/action/drink_fling) + crate_name = "bartending supply crate" + +/datum/supply_pack/service/vending/cigarette + name = "Cigarette Supply Crate" + desc = "Don't believe the reports - smoke today! Contains a cigarette vending machine refill." + cost = 1500 + contains = list(/obj/item/vending_refill/cigarette) + crate_name = "cigarette supply crate" + crate_type = /obj/structure/closet/crate + +/datum/supply_pack/service/vending/games + name = "Games Supply Crate" + desc = "Get your game on with this game vending machine refill." + cost = 1000 + contains = list(/obj/item/vending_refill/games) + crate_name = "games supply crate" + crate_type = /obj/structure/closet/crate + +/datum/supply_pack/service/vending/snack + name = "Snack Supply Crate" + desc = "One vending machine refill of cavity-bringin' goodness! The number one dentist recommended order!" + cost = 1500 + contains = list(/obj/item/vending_refill/snack) + crate_name = "snacks supply crate" + +/datum/supply_pack/service/vending/cola + name = "Softdrinks Supply Crate" + desc = "Got whacked by a toolbox, but you still have those pesky teeth? Get rid of those pearly whites with this soda machine refill, today!" + cost = 1500 + contains = list(/obj/item/vending_refill/cola) + crate_name = "soft drinks supply crate" diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index 5402353fd4..643d072469 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -571,6 +571,8 @@ GLOBAL_LIST_EMPTY(asset_datums) "fontawesome-webfont.woff" = 'tgui/assets/fonts/fontawesome-webfont.woff', "font-awesome.css" = 'code/modules/goonchat/browserassets/css/font-awesome.css', "browserOutput.css" = 'code/modules/goonchat/browserassets/css/browserOutput.css', + "browserOutput_dark.css" = 'code/modules/goonchat/browserassets/css/browserOutput_dark.css', + "browserOutput_light.css" = 'code/modules/goonchat/browserassets/css/browserOutput_light.css' ) /datum/asset/spritesheet/goonchat diff --git a/code/modules/client/darkmode.dm b/code/modules/client/darkmode.dm index 9e8d136b3b..f806e5c964 100644 --- a/code/modules/client/darkmode.dm +++ b/code/modules/client/darkmode.dm @@ -5,7 +5,7 @@ This lets you switch chat themes by using winset and CSS loading, you must relog Things to note: If you change ANYTHING in interface/skin.dmf you need to change it here: Format: -winset(src, "window as appears in skin.dmf after elem", "var to change = currentvalue;var to change = desired value") +winset(src, "window as appears in skin.dmf after elem", "var to change = desired value") How this works: I've added a function to browseroutput.js which registers a cookie for darkmode and swaps the chat accordingly. You can find the button to do this under the "cog" icon next to the ping button (top right of chat) This then swaps the window theme automatically @@ -14,104 +14,52 @@ Thanks to spacemaniac and mcdonald for help with the JS side of this. /client/proc/force_white_theme() //There's no way round it. We're essentially changing the skin by hand. It's painful but it works, and is the way Lummox suggested. //Main windows - winset(src, "infowindow", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]") - winset(src, "infowindow", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]") - winset(src, "info", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]") - winset(src, "info", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]") - winset(src, "browseroutput", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]") - winset(src, "browseroutput", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]") - winset(src, "outputwindow", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]") - winset(src, "outputwindow", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]") - winset(src, "mainwindow", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]") - winset(src, "split", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]") + winset(src, "infowindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "info", "background-color = [COLOR_WHITEMODE_BACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "browseroutput", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "outputwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "mainwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND]") + winset(src, "split", "background-color = [COLOR_WHITEMODE_BACKGROUND]") //Buttons - winset(src, "changelog", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]") - winset(src, "changelog", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]") - winset(src, "rules", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]") - winset(src, "rules", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]") - winset(src, "wiki", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]") - winset(src, "wiki", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]") - winset(src, "forum", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]") - winset(src, "forum", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]") - winset(src, "github", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]") - winset(src, "github", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]") - winset(src, "report-issue", "background-color = [COLOR_DARKMODE_ISSUE_BUTTON_BG];background-color = [COLOR_WHITEMODE_ISSUE_BUTTON_BG]") - winset(src, "report-issue", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "changelog", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];text-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "rules", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];text-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "wiki", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];text-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "forum", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];text-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "github", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];text-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "report-issue", "background-color = [COLOR_WHITEMODE_ISSUE_BUTTON_BG];text-color = [COLOR_WHITEMODE_TEXT]") //Status and verb tabs - winset(src, "output", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]") - winset(src, "output", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]") - winset(src, "statwindow", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]") - winset(src, "statwindow", "text-color = #eaeaea;text-color = [COLOR_WHITEMODE_TEXT]") - winset(src, "stat", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]") - winset(src, "stat", "tab-background-color = [COLOR_DARKMODE_BACKGROUND];tab-background-color = [COLOR_WHITEMODE_DARKBACKGROUND]") - winset(src, "stat", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]") - winset(src, "stat", "tab-text-color = [COLOR_DARKMODE_TEXT];tab-text-color = [COLOR_WHITEMODE_TEXT]") - winset(src, "stat", "prefix-color = [COLOR_DARKMODE_TEXT];prefix-color = [COLOR_WHITEMODE_TEXT]") - winset(src, "stat", "suffix-color = [COLOR_DARKMODE_TEXT];suffix-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "output", "background-color = [COLOR_WHITEMODE_BACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "statwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "stat", "background-color = [COLOR_WHITEMODE_BACKGROUND];tab-background-color = [COLOR_WHITEMODE_DARKBACKGROUND];\ + text-color = [COLOR_WHITEMODE_TEXT];tab-text-color = [COLOR_WHITEMODE_TEXT];\ + prefix-color = [COLOR_WHITEMODE_TEXT];suffix-color = [COLOR_WHITEMODE_TEXT]") //Etc. - winset(src, "say", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]") - winset(src, "say", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]") - winset(src, "asset_cache_browser", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]") - winset(src, "asset_cache_browser", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]") - winset(src, "tooltip", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]") - winset(src, "tooltip", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "say", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "asset_cache_browser", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "tooltip", "background-color = [COLOR_WHITEMODE_BACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]") /client/proc/force_dark_theme() //Inversely, if theyre using white theme and want to swap to the superior dark theme, let's get WINSET() ing //Main windows - winset(src, "infowindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_DARKBACKGROUND]") - winset(src, "infowindow", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") - winset(src, "info", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]") - winset(src, "info", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") - winset(src, "browseroutput", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]") - winset(src, "browseroutput", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") - winset(src, "outputwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]") - winset(src, "outputwindow", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") - winset(src, "mainwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_DARKBACKGROUND]") - winset(src, "split", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]") + winset(src, "infowindow", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];text-color = [COLOR_DARKMODE_TEXT]") + winset(src, "info", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]") + winset(src, "browseroutput", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]") + winset(src, "outputwindow", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]") + winset(src, "mainwindow", "background-color = [COLOR_DARKMODE_DARKBACKGROUND]") + winset(src, "split", "background-color = [COLOR_DARKMODE_BACKGROUND]") //Buttons - winset(src, "changelog", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]") - winset(src, "changelog", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") - winset(src, "rules", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]") - winset(src, "rules", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") - winset(src, "wiki", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]") - winset(src, "wiki", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") - winset(src, "forum", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]") - winset(src, "forum", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") - winset(src, "github", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]") - winset(src, "github", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") - winset(src, "report-issue", "background-color = [COLOR_WHITEMODE_ISSUE_BUTTON_BG];background-color = [COLOR_DARKMODE_ISSUE_BUTTON_BG]") - winset(src, "report-issue", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") + winset(src, "changelog", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];text-color = [COLOR_DARKMODE_TEXT]") + winset(src, "rules", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];text-color = [COLOR_DARKMODE_TEXT]") + winset(src, "wiki", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];text-color = [COLOR_DARKMODE_TEXT]") + winset(src, "forum", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];text-color = [COLOR_DARKMODE_TEXT]") + winset(src, "github", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];text-color = [COLOR_DARKMODE_TEXT]") + winset(src, "report-issue", "background-color = [COLOR_DARKMODE_ISSUE_BUTTON_BG];text-color = [COLOR_DARKMODE_TEXT]") //Status and verb tabs - winset(src, "output", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]") - winset(src, "output", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") - winset(src, "statwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_DARKBACKGROUND]") - winset(src, "statwindow", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") - winset(src, "stat", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_DARKBACKGROUND]") - winset(src, "stat", "tab-background-color = [COLOR_WHITEMODE_DARKBACKGROUND];tab-background-color = [COLOR_DARKMODE_BACKGROUND]") - winset(src, "stat", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") - winset(src, "stat", "tab-text-color = [COLOR_WHITEMODE_TEXT];tab-text-color = [COLOR_DARKMODE_TEXT]") - winset(src, "stat", "prefix-color = [COLOR_WHITEMODE_TEXT];prefix-color = [COLOR_DARKMODE_TEXT]") - winset(src, "stat", "suffix-color = [COLOR_WHITEMODE_TEXT];suffix-color = [COLOR_DARKMODE_TEXT]") + winset(src, "output", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]") + winset(src, "statwindow", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];text-color = [COLOR_DARKMODE_TEXT]") + winset(src, "stat", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];tab-background-color = [COLOR_DARKMODE_BACKGROUND];\ + text-color = [COLOR_DARKMODE_TEXT];tab-text-color = [COLOR_DARKMODE_TEXT];\ + prefix-color = [COLOR_DARKMODE_TEXT];suffix-color = [COLOR_DARKMODE_TEXT]") //Etc. - winset(src, "say", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]") - winset(src, "say", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") - winset(src, "asset_cache_browser", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]") - winset(src, "asset_cache_browser", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") - winset(src, "tooltip", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]") - winset(src, "tooltip", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") - - -/datum/asset/simple/goonchat - verify = FALSE - assets = list( - "json2.min.js" = 'code/modules/goonchat/browserassets/js/json2.min.js', - "errorHandler.js" = 'code/modules/goonchat/browserassets/js/errorHandler.js', - "browserOutput.js" = 'code/modules/goonchat/browserassets/js/browserOutput.js', - "fontawesome-webfont.eot" = 'tgui/assets/fonts/fontawesome-webfont.eot', - "fontawesome-webfont.svg" = 'tgui/assets/fonts/fontawesome-webfont.svg', - "fontawesome-webfont.ttf" = 'tgui/assets/fonts/fontawesome-webfont.ttf', - "fontawesome-webfont.woff" = 'tgui/assets/fonts/fontawesome-webfont.woff', - "font-awesome.css" = 'code/modules/goonchat/browserassets/css/font-awesome.css', - "browserOutput.css" = 'code/modules/goonchat/browserassets/css/browserOutput.css', - "browserOutput_white.css" = 'code/modules/goonchat/browserassets/css/browserOutput_white.css', - ) + winset(src, "say", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]") + winset(src, "asset_cache_browser", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]") + winset(src, "tooltip", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]") \ No newline at end of file diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index f9fc7b9221..47c3293c35 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -86,6 +86,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/skin_tone = "caucasian1" //Skin color var/eye_color = "000" //Eye color var/horn_color = "85615a" //Horn color + var/wing_color = "fff" //Wing color var/datum/species/pref_species = new /datum/species/human() //Mutant race var/list/features = list("mcolor" = "FFF", "tail_lizard" = "Smooth", @@ -95,6 +96,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) "ears" = "None", "wings" = "None", "frills" = "None", + "deco_wings" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Plantigrade", @@ -583,6 +585,15 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(mutant_category >= MAX_MUTANT_ROWS) dat += "" mutant_category = 0 + if("deco_wings" in pref_species.default_features) + if(!mutant_category) + dat += APPEARANCE_CATEGORY_COLUMN + + dat += "

Decorative wings

" + + dat += "[features["deco_wings"]]" + dat += "    Change
" + if("insect_wings" in pref_species.default_features) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -590,6 +601,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "

Insect wings

" dat += "[features["insect_wings"]]" + dat += "    Change
" mutant_category++ if(mutant_category >= MAX_MUTANT_ROWS) dat += "" @@ -1039,6 +1051,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/available_in_days = job.available_in_days(user.client) HTML += "[rank] \[IN [(available_in_days)] DAYS\]" continue + if(!user.client.prefs.pref_species.qualifies_for_rank(rank, user.client.prefs.features)) + if(user.client.prefs.pref_species.id == "human") + HTML += "[rank] \[MUTANT\]" + else + HTML += "[rank] \[NON-HUMAN\]" + continue if((job_preferences["[SSjob.overflow_role]"] == JP_LOW) && (rank != SSjob.overflow_role) && !jobban_isbanned(user, SSjob.overflow_role)) HTML += "[rank]" continue @@ -1675,7 +1693,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("horns_color") var/new_horn_color = input(user, "Choose your character's horn colour:", "Character Preference","#"+horn_color) as color|null if(new_horn_color) - horn_color = sanitize_hexcolor(new_horn_color) + if (new_horn_color == "#000000") + horn_color = "#85615A" + else + horn_color = sanitize_hexcolor(new_horn_color) if("wings") var/new_wings @@ -1683,6 +1704,14 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(new_wings) features["wings"] = new_wings + if("wings_color") + var/new_wing_color = input(user, "Choose your character's wing colour:", "Character Preference","#"+wing_color) as color|null + if(new_wing_color) + if (new_wing_color == "#000000") + wing_color = "#FFFFFF" + else + wing_color = sanitize_hexcolor(new_wing_color) + if("frills") var/new_frills new_frills = input(user, "Choose your character's frills:", "Character Preference") as null|anything in GLOB.frills_list @@ -1717,6 +1746,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(new_insect_wings) features["insect_wings"] = new_insect_wings + if("deco_wings") + var/new_deco_wings + new_deco_wings = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.deco_wings_list + if(new_deco_wings) + features["deco_wings"] = new_deco_wings + if("insect_fluffs") var/new_insect_fluff new_insect_fluff = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.insect_fluffs_list @@ -2242,6 +2277,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) character.hair_color = hair_color character.facial_hair_color = facial_hair_color character.horn_color = horn_color + character.wing_color = wing_color character.skin_tone = skin_tone character.hair_style = hair_style diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 84db999325..01a46a44a0 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -317,6 +317,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(!S["features["mcolor"]"] || S["features["mcolor"]"] == "#000") WRITE_FILE(S["features["mcolor"]"] , "#FFF") + if(!S["features["horn_color"]"] || S["features["horn_color"]"] == "#000") + WRITE_FILE(S["features["horn_color"]"] , "#85615a") + + if(!S["features["wing_color"]"] || S["features["wing_color"]"] == "#000") + WRITE_FILE(S["features["wing_color"]"] , "#FFF") + //Character S["real_name"] >> real_name S["nameless"] >> nameless @@ -338,6 +344,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["socks"] >> socks S["socks_color"] >> socks_color S["horn_color"] >> horn_color + S["wing_color"] >> wing_color S["backbag"] >> backbag S["jumpsuit_style"] >> jumpsuit_style S["uplink_loc"] >> uplink_spawn_loc @@ -352,6 +359,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["feature_human_tail"] >> features["tail_human"] S["feature_human_ears"] >> features["ears"] S["feature_insect_wings"] >> features["insect_wings"] + S["feature_deco_wings"] >> features["deco_wings"] S["feature_insect_fluff"] >> features["insect_fluff"] //Custom names @@ -448,6 +456,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(!features["mcolor"] || features["mcolor"] == "#000") features["mcolor"] = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F") + if(!features["horn_color"] || features["horn_color"] == "#000") + features["horn_color"] = "85615a" + + if(!features["wing_color"] || features["wing_color"] == "#000") + features["wing_color"] = "FFFFFF" + nameless = sanitize_integer(nameless, 0, 1, initial(nameless)) be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name)) be_random_body = sanitize_integer(be_random_body, 0, 1, initial(be_random_body)) @@ -461,15 +475,16 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car underwear = sanitize_inlist(underwear, GLOB.underwear_list) undie_color = sanitize_hexcolor(undie_color, 3, FALSE, initial(undie_color)) undershirt = sanitize_inlist(undershirt, GLOB.undershirt_list) - shirt_color = sanitize_hexcolor(shirt_color, 6, FALSE, initial(shirt_color)) + shirt_color = sanitize_hexcolor(shirt_color, 3, FALSE, initial(shirt_color)) socks = sanitize_inlist(socks, GLOB.socks_list) - socks_color = sanitize_hexcolor(socks_color, 6, FALSE, initial(socks_color)) + socks_color = sanitize_hexcolor(socks_color, 3, 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) skin_tone = sanitize_inlist(skin_tone, GLOB.skin_tones) horn_color = sanitize_hexcolor(horn_color, 3, FALSE) + wing_color = sanitize_hexcolor(wing_color, 3, 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)) @@ -484,6 +499,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car features["body_markings"] = sanitize_inlist(features["body_markings"], GLOB.body_markings_list) features["feature_lizard_legs"] = sanitize_inlist(features["legs"], GLOB.legs_list) features["insect_wings"] = sanitize_inlist(features["insect_wings"], GLOB.insect_wings_list) + features["deco_wings"] = sanitize_inlist(features["deco_wings"], GLOB.deco_wings_list, "None") features["insect_fluff"] = sanitize_inlist(features["insect_fluff"], GLOB.insect_fluffs_list) joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole)) @@ -538,6 +554,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["socks"] , socks) WRITE_FILE(S["socks_color"] , socks_color) WRITE_FILE(S["horn_color"] , horn_color) + WRITE_FILE(S["wing_color"] , wing_color) WRITE_FILE(S["backbag"] , backbag) WRITE_FILE(S["jumpsuit_style"] , jumpsuit_style) WRITE_FILE(S["uplink_loc"] , uplink_spawn_loc) @@ -553,6 +570,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["feature_lizard_body_markings"] , features["body_markings"]) WRITE_FILE(S["feature_lizard_legs"] , features["legs"]) WRITE_FILE(S["feature_insect_wings"] , features["insect_wings"]) + WRITE_FILE(S["feature_deco_wings"] , features["deco_wings"]) WRITE_FILE(S["feature_insect_fluff"] , features["insect_fluff"]) WRITE_FILE(S["feature_meat"] , features["meat_type"]) diff --git a/code/modules/client/verbs/looc.dm b/code/modules/client/verbs/looc.dm index 4049034203..b371372dfe 100644 --- a/code/modules/client/verbs/looc.dm +++ b/code/modules/client/verbs/looc.dm @@ -1,3 +1,6 @@ +GLOBAL_VAR_INIT(LOOC_COLOR, null)//If this is null, use the CSS for OOC. Otherwise, use a custom colour. +GLOBAL_VAR_INIT(normal_looc_colour, "#6699CC") + /client/verb/looc(msg as text) set name = "LOOC" set desc = "Local OOC, seen only by those in view." @@ -59,30 +62,17 @@ continue //Also handled later. if(C.prefs.toggles & CHAT_OOC) -// var/display_name = src.key -// if(holder) -// if(holder.fakekey) -// if(C.holder) -// display_name = "[holder.fakekey]/([src.key])" -// else -// display_name = holder.fakekey - to_chat(C,"LOOC: [src.mob.name]: [msg]") + if(GLOB.LOOC_COLOR) + to_chat(C, "LOOC: [src.mob.name]: [msg]") + else + to_chat(C, "LOOC: [src.mob.name]: [msg]") for(var/client/C in GLOB.admins) if(C.prefs.toggles & CHAT_OOC) var/prefix = "(R)LOOC" if (C.mob in heard) prefix = "LOOC" - to_chat(C,"[ADMIN_FLW(usr)][prefix]: [src.key]/[src.mob.name]: [msg]") - - /*for(var/mob/dead/observer/G in world) - if(!G.client) - continue - var/client/C = G.client - if (C in GLOB.admins) - continue //handled earlier. - if(C.prefs.toggles & CHAT_OOC) - var/prefix = "(G)LOOC" - if (C.mob in heard) - prefix = "LOOC" - to_chat(C,"[prefix]: [src.key]/[src.mob.name]: [msg]")*/ + if(GLOB.LOOC_COLOR) + to_chat(C, "[ADMIN_FLW(usr)] [prefix]: [src.key]/[src.mob.name]: [msg]") + else + to_chat(C, "[ADMIN_FLW(usr)] [prefix]: [src.key]/[src.mob.name]: [msg]") diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 33a83487fc..8b2a34a089 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -561,7 +561,7 @@ /obj/item/storage/belt/chameleon/ComponentInitialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.silent = TRUE /obj/item/storage/belt/chameleon/emp_act(severity) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index ed3e9f9b89..1793bd8f4b 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -41,6 +41,13 @@ var/dynamic_hair_suffix = ""//head > mask for head hair var/dynamic_fhair_suffix = ""//mask > head for facial hair + //basically a restriction list. + 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. + + /obj/item/clothing/Initialize() . = ..() if(CHECK_BITFIELD(clothing_flags, VOICEBOX_TOGGLABLE)) @@ -116,7 +123,7 @@ ..() if(damaged_clothes) to_chat(user, "It looks damaged!") - GET_COMPONENT(pockets, /datum/component/storage) + var/datum/component/storage/pockets = GetComponent(/datum/component/storage) if(pockets) var/list/how_cool_are_your_threads = list("") if(pockets.attack_hand_interact) @@ -338,3 +345,38 @@ BLIND // can't see anything deconstruct(FALSE) else ..() + + +//Species-restricted clothing check. - Thanks Oraclestation, BS13, /vg/station etc. +/obj/item/clothing/mob_can_equip(mob/M, slot, disable_warning = TRUE) + + //if we can't equip the item anyway, don't bother with species_restricted (also cuts down on spam) + if(!..()) + return FALSE + + // Skip species restriction checks on non-equipment slots + if(slot in list(SLOT_IN_BACKPACK, SLOT_L_STORE, SLOT_R_STORE)) + return TRUE + + if(species_restricted && ishuman(M)) + + var/wearable = null + var/exclusive = null + var/mob/living/carbon/human/H = M + + if("exclude" in species_restricted) //TURNS IT INTO A BLACKLIST - AKA ALL MINUS SPECIES LISTED. + exclusive = TRUE + + if(H.dna.species) + if(exclusive) + if(!(H.dna.species.name in species_restricted)) + wearable = TRUE + else + if(H.dna.species.name in species_restricted) + wearable = TRUE + + if(!wearable) + to_chat(M, "Your species cannot wear [src].") + return FALSE + + return TRUE diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 097b10cae5..f140fb3074 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -104,7 +104,7 @@ resistance_flags = ACID_PROOF armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100) -/obj/item/clothing/glasses/science/item_action_slot_check(slot) +/obj/item/clothing/glasses/science/item_action_slot_check(slot, mob/user, datum/action/A) if(slot == SLOT_GLASSES) return 1 @@ -281,6 +281,33 @@ ..() user.cure_blind("blindfold_[REF(src)]") +/obj/item/clothing/glasses/sunglasses/blindfold/white + name = "blind personnel blindfold" + desc = "Indicates that the wearer suffers from blindness." + icon_state = "blindfoldwhite" + item_state = "blindfoldwhite" + var/colored_before = FALSE + +/obj/item/clothing/glasses/sunglasses/blindfold/white/equipped(mob/living/carbon/human/user, slot) + if(ishuman(user) && slot == SLOT_GLASSES) + update_icon(user) + user.update_inv_glasses() //Color might have been changed by update_icon. + ..() + +/obj/item/clothing/glasses/sunglasses/blindfold/white/update_icon(mob/living/carbon/human/user) + if(ishuman(user) && !colored_before) + add_atom_colour("#[user.eye_color]", FIXED_COLOUR_PRIORITY) + colored_before = TRUE + +/obj/item/clothing/glasses/sunglasses/blindfold/white/worn_overlays(isinhands = FALSE, file2use) + . = list() + if(!isinhands && ishuman(loc) && !colored_before) + var/mob/living/carbon/human/H = loc + var/mutable_appearance/M = mutable_appearance('icons/mob/eyes.dmi', "blindfoldwhite") + M.appearance_flags |= RESET_COLOR + M.color = "#[H.eye_color]" + . += M + /obj/item/clothing/glasses/sunglasses/big desc = "Strangely ancient technology used to help provide rudimentary eye cover. Larger than average enhanced shielding blocks flashes." icon_state = "bigsunglasses" diff --git a/code/modules/clothing/glasses/vg_glasses.dm b/code/modules/clothing/glasses/vg_glasses.dm index 449b34b22e..a51a03242c 100644 --- a/code/modules/clothing/glasses/vg_glasses.dm +++ b/code/modules/clothing/glasses/vg_glasses.dm @@ -6,21 +6,18 @@ name = "purple sunglasses" icon_state = "sun_purple" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/glasses.dmi' /obj/item/clothing/glasses/sunglasses/star name = "star-shaped sunglasses" desc = "Novelty sunglasses, both lenses are in the shape of a star." icon_state = "sun_star" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/glasses.dmi' /obj/item/clothing/glasses/sunglasses/rockstar name = "red star-shaped sunglasses" desc = "Novelty sunglasses with a fancy silver frame and two red-tinted star-shaped lenses. You should probably stomp on them and get a pair of normal ones." icon_state = "sun_star_silver" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/glasses.dmi' /obj/item/clothing/glasses/gglasses name = "Green Glasses" @@ -28,7 +25,6 @@ icon_state = "gglasses" item_state = "gglasses" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/glasses.dmi' /obj/item/clothing/glasses/welding/superior name = "superior welding goggles" @@ -36,7 +32,6 @@ icon_state = "rwelding-g" item_state = "rwelding-g" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/glasses.dmi' actions_types = list(/datum/action/item_action/toggle) flash_protect = 2 tint = 1 diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm index f0c1eeb833..6b674c8595 100644 --- a/code/modules/clothing/gloves/_gloves.dm +++ b/code/modules/clothing/gloves/_gloves.dm @@ -14,11 +14,10 @@ /obj/item/clothing/gloves/ComponentInitialize() . = ..() - AddComponent(/datum/component/redirect, list(COMSIG_COMPONENT_CLEAN_ACT = CALLBACK(src, .proc/clean_blood))) + RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /obj/item/clothing/gloves/clean_blood) -/obj/item/clothing/gloves/proc/clean_blood(datum/source, strength) - if(strength < CLEAN_STRENGTH_BLOOD) - return +/obj/item/clothing/gloves/clean_blood(datum/source, strength) + . = ..() transfer_blood = 0 /obj/item/clothing/gloves/suicide_act(mob/living/carbon/user) @@ -30,8 +29,8 @@ if(!isinhands) if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damagedgloves") - IF_HAS_BLOOD_DNA(src) - . += mutable_appearance('icons/effects/blood.dmi', "bloodyhands") + 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) ..() @@ -41,4 +40,4 @@ // Called just before an attack_hand(), in mob/UnarmedAttack() /obj/item/clothing/gloves/proc/Touch(atom/A, proximity) - return 0 // return 1 to cancel attack_hand() \ No newline at end of file + return FALSE // return TRUE to cancel attack_hand() \ No newline at end of file diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm index 8bd7065c1f..358942627d 100644 --- a/code/modules/clothing/head/_head.dm +++ b/code/modules/clothing/head/_head.dm @@ -41,13 +41,56 @@ H.update_inv_head() +///Special throw_impact for hats to frisbee hats at people to place them on their heads/attempt to de-hat them. +/obj/item/clothing/head/throw_impact(atom/hit_atom, datum/thrownthing/thrownthing) + . = ..() + ///if the thrown object's target zone isn't the head + if(thrownthing.target_zone != BODY_ZONE_HEAD) + return + ///ignore any hats with the tinfoil counter-measure enabled + if(clothing_flags & ANTI_TINFOIL_MANEUVER) + return + ///if the hat happens to be capable of holding contents and has something in it. mostly to prevent super cheesy stuff like stuffing a mini-bomb in a hat and throwing it + if(LAZYLEN(contents)) + return + if(iscarbon(hit_atom)) + var/mob/living/carbon/H = hit_atom + if(istype(H.head, /obj/item)) + var/obj/item/WH = H.head + ///check if the item has NODROP + if(HAS_TRAIT(WH, TRAIT_NODROP)) + H.visible_message("[src] bounces off [H]'s [WH.name]!", "[src] bounces off your [WH.name], falling to the floor.") + return + ///check if the item is an actual clothing head item, since some non-clothing items can be worn + if(istype(WH, /obj/item/clothing/head)) + var/obj/item/clothing/head/WHH = WH + ///SNUG_FIT hats are immune to being knocked off + if(WHH.clothing_flags & SNUG_FIT) + H.visible_message("[src] bounces off [H]'s [WHH.name]!", "[src] bounces off your [WHH.name], falling to the floor.") + return + ///if the hat manages to knock something off + if(H.dropItemToGround(WH)) + H.visible_message("[src] knocks [WH] off [H]'s head!", "[WH] is suddenly knocked off your head by [src]!") + if(H.equip_to_slot_if_possible(src, SLOT_HEAD, FALSE, TRUE)) + H.visible_message("[src] lands neatly on [H]'s head!", "[src] lands perfectly onto your head!") + return + if(iscyborg(hit_atom)) + var/mob/living/silicon/robot/R = hit_atom + ///hats in the borg's blacklist bounce off + if(!is_type_in_typecache(src, R.equippable_hats) || R.hat_offset == INFINITY) + R.visible_message("[src] bounces off [R]!", "[src] bounces off you, falling to the floor.") + return + else + R.visible_message("[src] lands neatly on top of [R].", "[src] lands perfectly on top of you.") + R.place_on_head(src) //hats aren't designed to snugly fit borg heads or w/e so they'll always manage to knock eachother off + /obj/item/clothing/head/worn_overlays(isinhands = FALSE) . = list() if(!isinhands) if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damagedhelmet") - IF_HAS_BLOOD_DNA(src) - . += mutable_appearance('icons/effects/blood.dmi', "helmetblood") + 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) ..() diff --git a/code/modules/clothing/head/cit_hats.dm b/code/modules/clothing/head/cit_hats.dm index 7b0e68264f..df4a21d6c1 100644 --- a/code/modules/clothing/head/cit_hats.dm +++ b/code/modules/clothing/head/cit_hats.dm @@ -4,4 +4,3 @@ icon = 'modular_citadel/icons/obj/clothing/cit_hats.dmi' icon_state = "hunter" item_state = "hunter_worn" - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm index 90c0690534..5457d32e8a 100644 --- a/code/modules/clothing/head/collectable.dm +++ b/code/modules/clothing/head/collectable.dm @@ -13,12 +13,14 @@ /obj/item/clothing/head/collectable/slime name = "collectable slime cap!" desc = "It just latches right in place!" + clothing_flags = SNUG_FIT icon_state = "slime" dynamic_hair_suffix = "" /obj/item/clothing/head/collectable/xenom name = "collectable xenomorph helmet!" desc = "Hiss hiss hiss!" + clothing_flags = SNUG_FIT icon_state = "xenom" /obj/item/clothing/head/collectable/chef @@ -71,13 +73,14 @@ desc = "A collectable welding helmet. Now with 80% less lead! Not for actual welding. Any welding done while wearing this helmet is done so at the owner's own risk!" icon_state = "welding" item_state = "welding" - resistance_flags = NONE + clothing_flags = SNUG_FIT /obj/item/clothing/head/collectable/slime name = "collectable slime hat" desc = "Just like a real brain slug!" icon_state = "headslime" item_state = "headslime" + clothing_flags = SNUG_FIT /obj/item/clothing/head/collectable/flatcap name = "collectable flat cap" @@ -121,6 +124,7 @@ /obj/item/clothing/head/collectable/hardhat name = "collectable hard hat" desc = "WARNING! Offers no real protection, or luminosity, but damn, is it fancy!" + clothing_flags = SNUG_FIT icon_state = "hardhat0_yellow" item_state = "hardhat0_yellow" @@ -143,7 +147,7 @@ desc = "Go Red! I mean Green! I mean Red! No Green!" icon_state = "thunderdome" item_state = "thunderdome" - resistance_flags = NONE + clothing_flags = SNUG_FIT flags_inv = HIDEHAIR /obj/item/clothing/head/collectable/swat @@ -151,5 +155,5 @@ desc = "That's not real blood. That's red paint." //Reference to the actual description icon_state = "swat" item_state = "swat" - resistance_flags = NONE + clothing_flags = SNUG_FIT flags_inv = HIDEHAIR diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 9d38b73cd3..54f0ebea45 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -11,6 +11,7 @@ armor = list("melee" = 15, "bullet" = 5, "laser" = 20,"energy" = 10, "bomb" = 20, "bio" = 10, "rad" = 20, "fire" = 100, "acid" = 50) flags_inv = 0 actions_types = list(/datum/action/item_action/toggle_helmet_light) + clothing_flags = SNUG_FIT resistance_flags = FIRE_PROOF dynamic_hair_suffix = "+generic" diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index be6e270e45..8a1cc01bd5 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -10,7 +10,7 @@ heat_protection = HEAD max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT strip_delay = 60 - resistance_flags = NONE + clothing_flags = SNUG_FIT flags_cover = HEADCOVERSEYES flags_inv = HIDEHAIR diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 041f0ba012..cac98e74fc 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -67,12 +67,14 @@ desc = "A plastic replica of a Syndicate agent's space helmet. You'll look just like a real murderous Syndicate agent in this! This is a toy, it is not made for use in space!" flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT mutantrace_variation = MUTANTRACE_VARIATION + clothing_flags = SNUG_FIT /obj/item/clothing/head/cueball name = "cueball helmet" desc = "A large, featureless white orb meant to be worn on your head. How do you even see out of this thing?" icon_state = "cueball" item_state="cueball" + clothing_flags = SNUG_FIT flags_cover = HEADCOVERSEYES|HEADCOVERSMOUTH flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT @@ -81,6 +83,7 @@ desc = "A ball of white styrofoam. So festive." icon_state = "snowman_h" item_state = "snowman_h" + clothing_flags = SNUG_FIT flags_cover = HEADCOVERSEYES flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT @@ -90,6 +93,7 @@ icon_state = "justicered" item_state = "justicered" flags_inv = HIDEHAIR|HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDESNOUT + clothing_flags = SNUG_FIT flags_cover = HEADCOVERSEYES /obj/item/clothing/head/justice/blue @@ -161,6 +165,7 @@ icon_state = "chickenhead" item_state = "chickensuit" flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT + clothing_flags = SNUG_FIT /obj/item/clothing/head/griffin name = "griffon head" @@ -168,6 +173,7 @@ icon_state = "griffinhat" item_state = "griffinhat" flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT + clothing_flags = SNUG_FIT /obj/item/clothing/head/bearpelt name = "bear pelt hat" @@ -181,6 +187,7 @@ item_state = "xenos_helm" desc = "A helmet made out of chitinous alien hide." flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT + clothing_flags = SNUG_FIT /obj/item/clothing/head/fedora name = "fedora" @@ -302,6 +309,7 @@ desc = "When everything's going to crab, protecting your head is the best choice." icon_state = "lobster_hat" flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT + clothing_flags = SNUG_FIT /obj/item/clothing/head/drfreezehat name = "doctor freeze's wig" diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 3f96796a00..fdaa0e8158 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -29,6 +29,7 @@ visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH resistance_flags = FIRE_PROOF mutantrace_variation = MUTANTRACE_VARIATION + clothing_flags = SNUG_FIT /obj/item/clothing/head/welding/attack_self(mob/user) weldingvisortoggle(user) @@ -115,6 +116,7 @@ item_state = "hardhat0_pumpkin" item_color = "pumpkin" flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT + clothing_flags = SNUG_FIT armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) brightness_on = 2 //luminosity when on flags_cover = HEADCOVERSEYES @@ -163,6 +165,7 @@ desc = "A helmet made out of a box." icon_state = "cardborg_h" item_state = "cardborg_h" + clothing_flags = SNUG_FIT flags_cover = HEADCOVERSEYES flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT @@ -227,6 +230,7 @@ desc = "A crude helmet made out of bronze plates. It offers very little in the way of protection." icon = 'icons/obj/clothing/clockwork_garb.dmi' icon_state = "clockwork_helmet_old" + clothing_flags = SNUG_FIT flags_inv = HIDEEARS|HIDEHAIR armor = list("melee" = 5, "bullet" = 0, "laser" = -5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 20) @@ -238,6 +242,7 @@ 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 + clothing_flags = ANTI_TINFOIL_MANEUVER /obj/item/clothing/head/foilhat/equipped(mob/living/carbon/human/user, slot) ..() diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index 5c7514541d..b14b0575f9 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -129,3 +129,14 @@ icon_state = "emtsoft" item_color = "emt" dog_fashion = null + +/obj/item/clothing/head/soft/baseball + name = "baseball cap" + desc = "It's a robust baseball hat, this one belongs to syndicate major league team." + icon_state = "baseballsoft" + item_color = "baseballsoft" + item_state = "baseballsoft" + flags_inv = HIDEEYES|HIDEFACE + armor = list("melee" = 35, "bullet" = 35, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 90) + strip_delay = 90 //You dont take a Major Leage cap + dog_fashion = null \ No newline at end of file diff --git a/code/modules/clothing/head/vg_hats.dm b/code/modules/clothing/head/vg_hats.dm index efeb5291db..dc245cd39a 100644 --- a/code/modules/clothing/head/vg_hats.dm +++ b/code/modules/clothing/head/vg_hats.dm @@ -1,4 +1,3 @@ - /obj/item/clothing/head/helmet/dredd name = "Judge Helmet" desc = "Judge, Jury, and Executioner." @@ -12,7 +11,6 @@ max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT strip_delay = 80 dog_fashion = null - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' /obj/item/clothing/head/helmet/aviatorhelmet name = "Aviator Helmet" @@ -21,15 +19,12 @@ item_state = "aviator_helmet" icon_state = "aviator_helmet" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' /obj/item/clothing/head/helmet/biker name = "Biker's Helmet" desc = "This helmet should protect you from russians and masked vigilantes." armor = list(melee = 25, bullet = 15, laser = 20, energy = 10, bomb = 10, bio = 0, rad = 0) icon_state = "biker_helmet" - icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR /obj/item/clothing/head/helmet/richard @@ -38,7 +33,6 @@ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) icon_state = "richard" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR /obj/item/clothing/head/helmet/megahelmet @@ -47,7 +41,6 @@ icon_state = "megahelmet" item_state = "megahelmet" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' siemens_coefficient = 1 /obj/item/clothing/head/helmet/protohelmet @@ -56,7 +49,6 @@ icon_state = "protohelmet" item_state = "protohelmet" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' siemens_coefficient = 1 /obj/item/clothing/head/helmet/megaxhelmet @@ -65,7 +57,6 @@ icon_state = "megaxhelmet" item_state = "megaxhelmet" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' /obj/item/clothing/head/helmet/joehelmet name = "Sniper Helmet" @@ -74,7 +65,6 @@ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR item_state = "joehelmet" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' /obj/item/clothing/head/helmet/doomguy name = "Doomguy's helmet" @@ -83,7 +73,6 @@ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR item_state = "doom" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' armor = list(melee = 50, bullet = 40, laser = 40,energy = 40, bomb = 5, bio = 0, rad = 0) /obj/item/clothing/head/helmet/neorussian @@ -92,8 +81,6 @@ icon_state = "nr_helmet" item_state = "nr_helmet" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' - /obj/item/clothing/head/stalhelm name = "Stalhelm" @@ -101,7 +88,6 @@ icon_state = "stalhelm" item_state = "stalhelm" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' /obj/item/clothing/head/panzer name = "Panzer Cap" @@ -109,7 +95,6 @@ icon_state = "panzercap" item_state = "panzercap" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' /obj/item/clothing/head/naziofficer name = "Officer Cap" @@ -117,8 +102,6 @@ icon_state = "officercap" item_state = "officercap" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' - /obj/item/clothing/head/russobluecamohat name = "russian blue camo beret" @@ -133,7 +116,6 @@ icon_state = "russofurhat" item_state = "russofurhat" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' /obj/item/clothing/head/squatter_hat name = "slav squatter hat" @@ -141,7 +123,6 @@ item_state = "squatter_hat" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' desc = "Cyka blyat." - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' /obj/item/clothing/head/snake name = "snake head" @@ -149,8 +130,6 @@ icon_state = "snakehead" item_state = "snakehead" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' - /obj/item/clothing/head/mummy_rags name = "mummy rags" desc = "Ancient rags taken off from some mummy." @@ -158,7 +137,6 @@ item_state = "mummy" item_color = "mummy" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS /obj/item/clothing/head/clownpiece @@ -167,7 +145,6 @@ icon_state = "clownpiece" item_state = "clownpiece" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' /obj/item/clothing/head/mitre name = "mitre" @@ -175,7 +152,6 @@ icon_state = "mitre" item_state = "mitre" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' /obj/item/clothing/head/tinfoil name = "tinfoil hat" @@ -183,7 +159,6 @@ icon_state = "foilhat" item_state = "paper" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' siemens_coefficient = 2 /obj/item/clothing/head/celtic @@ -192,4 +167,3 @@ icon_state = "celtic_crown" item_state = "celtic_crown" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm index 9ee2ebcd54..c00e6f72e0 100644 --- a/code/modules/clothing/masks/_masks.dm +++ b/code/modules/clothing/masks/_masks.dm @@ -59,8 +59,8 @@ if(body_parts_covered & HEAD) if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damagedmask") - IF_HAS_BLOOD_DNA(src) - . += mutable_appearance('icons/effects/blood.dmi', "maskblood") + 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) ..() diff --git a/code/modules/clothing/masks/vg_masks.dm b/code/modules/clothing/masks/vg_masks.dm index 7de27fb780..29b65a6b8e 100644 --- a/code/modules/clothing/masks/vg_masks.dm +++ b/code/modules/clothing/masks/vg_masks.dm @@ -3,18 +3,15 @@ desc = "Some pranksters are truly magical." icon_state = "wizzclown" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/masks.dmi' /obj/item/clothing/mask/chapmask name = "venetian mask" desc = "A plain porcelain mask that covers the entire face. Standard attire for particularly unspeakable religions. The eyes are wide shut." icon_state = "chapmask" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/masks.dmi' /obj/item/clothing/mask/neorussian name = "neo-Russian mask" desc = "Somehow, it makes you act and look way more polite than usual." icon_state = "nr_mask" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/masks.dmi' diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index 330f69ddaf..2356bb16eb 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -12,8 +12,8 @@ if(body_parts_covered & HEAD) if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damagedmask") - IF_HAS_BLOOD_DNA(src) - . += mutable_appearance('icons/effects/blood.dmi', "maskblood") + if(blood_DNA) + . += mutable_appearance('icons/effects/blood.dmi', "maskblood", color = blood_DNA_to_color()) /obj/item/clothing/neck/tie name = "tie" diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index 523ed55aa4..88cc7123fd 100644 --- a/code/modules/clothing/outfits/ert.dm +++ b/code/modules/clothing/outfits/ert.dm @@ -10,7 +10,7 @@ if(visualsOnly) return - var/obj/item/implant/mindshield/L = new/obj/item/implant/mindshield(H) + var/obj/item/implant/mindshield/L = new L.implant(H, null, 1) var/obj/item/radio/R = H.ears diff --git a/code/modules/clothing/outfits/plasmaman.dm b/code/modules/clothing/outfits/plasmaman.dm new file mode 100644 index 0000000000..20b67891d8 --- /dev/null +++ b/code/modules/clothing/outfits/plasmaman.dm @@ -0,0 +1,164 @@ +/datum/outfit/plasmaman/bar + name = "Bartender Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/white + uniform = /obj/item/clothing/under/plasmaman/enviroslacks + +/datum/outfit/plasmaman/chef + name = "Chef Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/white + uniform = /obj/item/clothing/under/plasmaman/chef + +/datum/outfit/plasmaman/botany + name = "Botany Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/botany + uniform = /obj/item/clothing/under/plasmaman/botany + +/datum/outfit/plasmaman/curator + name = "Curator Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/curator + uniform = /obj/item/clothing/under/plasmaman/curator + +/datum/outfit/plasmaman/chaplain + name = "Chaplain Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/chaplain + uniform = /obj/item/clothing/under/plasmaman/chaplain + +/datum/outfit/plasmaman/janitor + name = "Janitor Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/janitor + uniform = /obj/item/clothing/under/plasmaman/janitor + +/datum/outfit/plasmaman/hop + name = "Head of Personell Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/hop + uniform = /obj/item/clothing/under/plasmaman/hop + +/datum/outfit/plasmaman/captain + name = "Captain Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/captain + uniform = /obj/item/clothing/under/plasmaman/captain + +/datum/outfit/plasmaman/security + name = "Security Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/security + uniform = /obj/item/clothing/under/plasmaman/security + ears = /obj/item/radio/headset/headset_sec + +/datum/outfit/plasmaman/detective + name = "Detective Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/white + uniform = /obj/item/clothing/under/plasmaman/enviroslacks + +/datum/outfit/plasmaman/warden + name = "Warden Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/security/warden + uniform = /obj/item/clothing/under/plasmaman/security/warden + +/datum/outfit/plasmaman/hos + name = "Head of Security Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/security/hos + uniform = /obj/item/clothing/under/plasmaman/security/hos + +/datum/outfit/plasmaman/cargo + name = "Cargo Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/cargo + uniform = /obj/item/clothing/under/plasmaman/cargo + +/datum/outfit/plasmaman/mining + name = "Mining Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/mining + uniform = /obj/item/clothing/under/plasmaman/mining + +/datum/outfit/plasmaman/medical + name = "Medical Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/medical + uniform = /obj/item/clothing/under/plasmaman/medical + +/datum/outfit/plasmaman/cmo + name = "Chief Medical Officer Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/cmo + uniform = /obj/item/clothing/under/plasmaman/cmo + +/datum/outfit/plasmaman/viro + name = "Virology Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/viro + uniform = /obj/item/clothing/under/plasmaman/viro + +/datum/outfit/plasmaman/chemist + name = "Chemist Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/chemist + uniform = /obj/item/clothing/under/plasmaman/chemist + +/datum/outfit/plasmaman/genetics + name = "Genetics Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/genetics + uniform = /obj/item/clothing/under/plasmaman/genetics + +/datum/outfit/plasmaman/science + name = "Science Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/science + uniform = /obj/item/clothing/under/plasmaman/science + +/datum/outfit/plasmaman/rd + name = "Research Director Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/rd + uniform = /obj/item/clothing/under/plasmaman/rd + +/datum/outfit/plasmaman/robotics + name = "Robotics Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/robotics + uniform = /obj/item/clothing/under/plasmaman/robotics + +/datum/outfit/plasmaman/engineering + name = "Engineering Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/engineering + uniform = /obj/item/clothing/under/plasmaman/engineering + +/datum/outfit/plasmaman/ce + name = "Chief Engineer Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/engineering/ce + uniform = /obj/item/clothing/under/plasmaman/engineering/ce + +/datum/outfit/plasmaman/atmospherics + name = "Atmospherics Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/atmospherics + uniform = /obj/item/clothing/under/plasmaman/atmospherics + +/datum/outfit/plasmaman/mime + name = "Plasmamime" + + head = /obj/item/clothing/head/helmet/space/plasmaman/mime + uniform = /obj/item/clothing/under/plasmaman/mime + mask = /obj/item/clothing/mask/gas/mime + +/datum/outfit/plasmaman/clown + name = "Plasmaclown" + + head = /obj/item/clothing/head/helmet/space/plasmaman/clown + uniform = /obj/item/clothing/under/plasmaman/clown + mask = /obj/item/clothing/mask/gas/clown_hat \ No newline at end of file diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index 325c124867..6c961dc250 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -399,7 +399,7 @@ R.set_frequency(FREQ_CENTCOM) R.freqlock = TRUE - var/obj/item/implant/mindshield/L = new/obj/item/implant/mindshield(H)//Here you go Deuryn + var/obj/item/implant/mindshield/L = new //Here you go Deuryn L.implant(H, null, 1) @@ -426,7 +426,7 @@ /datum/outfit/debug //Debug objs plus hardsuit name = "Debug outfit" - uniform = /obj/item/clothing/under/patriotsuit + uniform = /obj/item/clothing/under/patriotsuit suit = /obj/item/clothing/suit/space/hardsuit/syndi/elite shoes = /obj/item/clothing/shoes/magboots/advance suit_store = /obj/item/tank/internals/oxygen diff --git a/code/modules/clothing/outfits/vr.dm b/code/modules/clothing/outfits/vr.dm index cd8930641f..cd8115ac7d 100644 --- a/code/modules/clothing/outfits/vr.dm +++ b/code/modules/clothing/outfits/vr.dm @@ -29,9 +29,9 @@ . = ..() var/obj/item/uplink/U = new /obj/item/uplink/nuclear_restricted(H, H.key, 80) H.equip_to_slot_or_del(U, SLOT_IN_BACKPACK) - var/obj/item/implant/weapons_auth/W = new/obj/item/implant/weapons_auth(H) + var/obj/item/implant/weapons_auth/W = new W.implant(H) - var/obj/item/implant/explosive/E = new/obj/item/implant/explosive(H) + var/obj/item/implant/explosive/E = new E.implant(H) H.faction |= ROLE_SYNDICATE H.update_icons() diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index 00cb2678cd..37ab2b2bf4 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -11,17 +11,19 @@ permeability_coefficient = 0.5 slowdown = SHOES_SLOWDOWN var/blood_state = BLOOD_STATE_NOT_BLOODY - var/list/bloody_shoes = list(BLOOD_STATE_HUMAN = 0,BLOOD_STATE_XENO = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0) + var/list/bloody_shoes = list(BLOOD_STATE_BLOOD = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0) var/offset = 0 var/equipped_before_drop = FALSE //CITADEL EDIT Enables digitigrade shoe styles var/adjusted = NORMAL_STYLE mutantrace_variation = MUTANTRACE_VARIATION + 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 /obj/item/clothing/shoes/ComponentInitialize() . = ..() - AddComponent(/datum/component/redirect, list(COMSIG_COMPONENT_CLEAN_ACT = CALLBACK(src, .proc/clean_blood))) + RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /obj/item/clothing/shoes/clean_blood) /obj/item/clothing/shoes/suicide_act(mob/living/carbon/user) if(rand(2)>1) @@ -42,22 +44,29 @@ playsound(user, 'sound/weapons/genhit2.ogg', 50, 1) return(BRUTELOSS) + +/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] + /obj/item/clothing/shoes/worn_overlays(isinhands = FALSE) . = list() if(!isinhands) var/bloody = FALSE - IF_HAS_BLOOD_DNA(src) + if(blood_DNA) bloody = TRUE else - bloody = bloody_shoes[BLOOD_STATE_HUMAN] + bloody = bloody_shoes[BLOOD_STATE_BLOOD] if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damagedshoe") if(bloody) if(adjusted == NORMAL_STYLE) - . += mutable_appearance('icons/effects/blood.dmi', "shoeblood") + . += mutable_appearance('icons/effects/blood.dmi', "shoeblood", color = blood_DNA_to_color()) else - . += mutable_appearance('modular_citadel/icons/mob/digishoes.dmi', "shoeblood") + . += mutable_appearance('modular_citadel/icons/mob/digishoes.dmi', "shoeblood", color = blood_DNA_to_color()) /obj/item/clothing/shoes/equipped(mob/user, slot) . = ..() @@ -93,14 +102,13 @@ var/mob/M = loc M.update_inv_shoes() -/obj/item/clothing/shoes/proc/clean_blood(datum/source, strength) - if(strength < CLEAN_STRENGTH_BLOOD) - return - bloody_shoes = list(BLOOD_STATE_HUMAN = 0,BLOOD_STATE_XENO = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0) +/obj/item/clothing/shoes/clean_blood(datum/source, strength) + . = ..() + bloody_shoes = list(BLOOD_STATE_BLOOD = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0) blood_state = BLOOD_STATE_NOT_BLOODY if(ismob(loc)) var/mob/M = loc M.update_inv_shoes() /obj/item/proc/negates_gravity() - return FALSE \ No newline at end of file + return FALSE diff --git a/code/modules/clothing/shoes/bananashoes.dm b/code/modules/clothing/shoes/bananashoes.dm index b634894805..d13e655d43 100644 --- a/code/modules/clothing/shoes/bananashoes.dm +++ b/code/modules/clothing/shoes/bananashoes.dm @@ -17,7 +17,7 @@ /obj/item/clothing/shoes/clown_shoes/banana_shoes/step_action() . = ..() - GET_COMPONENT(bananium, /datum/component/material_container) + var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container) if(on) if(bananium.amount(MAT_BANANIUM) < 100) on = !on @@ -30,7 +30,7 @@ bananium.use_amount_type(100, MAT_BANANIUM) /obj/item/clothing/shoes/clown_shoes/banana_shoes/attack_self(mob/user) - GET_COMPONENT(bananium, /datum/component/material_container) + var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container) var/sheet_amount = bananium.retrieve_all() if(sheet_amount) to_chat(user, "You retrieve [sheet_amount] sheets of bananium from the prototype shoes.") @@ -42,7 +42,7 @@ to_chat(user, "The shoes are [on ? "enabled" : "disabled"].") /obj/item/clothing/shoes/clown_shoes/banana_shoes/ui_action_click(mob/user) - GET_COMPONENT(bananium, /datum/component/material_container) + var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container) if(bananium.amount(MAT_BANANIUM)) on = !on update_icon() diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 4659de3e6a..080d9281cf 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -62,6 +62,16 @@ desc = "A pair of orange rubber boots, designed to prevent slipping on wet surfaces while also drying them." icon_state = "galoshes_dry" +/obj/item/clothing/shoes/sneakers/noslip + desc = "A pair of black shoes, they have the soles of galoshes making them unable to be slipped on a wet surface." + name = "black shoes" + icon_state = "black" + permeability_coefficient = 0.30 + clothing_flags = NOSLIP + strip_delay = 50 + equip_delay_other = 50 + resistance_flags = NONE + /obj/item/clothing/shoes/galoshes/dry/step_action() var/turf/open/t_loc = get_turf(src) SEND_SIGNAL(t_loc, COMSIG_TURF_MAKE_DRY, TURF_WET_WATER, TRUE, INFINITY) @@ -69,10 +79,8 @@ /obj/item/clothing/shoes/clown_shoes desc = "The prankster's standard-issue clowning shoes. Damn, they're huge!" name = "clown shoes" - icon_state = "clown" - item_state = "clown_shoes" + icon_state = "clown_shoes" slowdown = SHOES_SLOWDOWN+1 - item_color = "clown" pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes/clown /obj/item/clothing/shoes/clown_shoes/Initialize() @@ -98,7 +106,6 @@ name = "jackboots" desc = "Nanotrasen-issue Security combat boots for combat scenarios or combat situations. All combat, all the time." icon_state = "jackboots" - item_state = "jackboots" lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' item_color = "hosred" @@ -115,7 +122,6 @@ name = "winter boots" desc = "Boots lined with 'synthetic' animal fur." icon_state = "winterboots" - item_state = "winterboots" permeability_coefficient = 0.15 cold_protection = FEET|LEGS min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT @@ -127,7 +133,6 @@ name = "work boots" desc = "Nanotrasen-issue Engineering lace-up work boots for the especially blue-collar." icon_state = "workboots" - item_state = "jackboots" lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' permeability_coefficient = 0.15 @@ -145,7 +150,6 @@ name = "\improper Nar'Sien invoker boots" desc = "A pair of boots worn by the followers of Nar'Sie." icon_state = "cult" - item_state = "cult" item_color = "cult" cold_protection = FEET min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT @@ -178,7 +182,6 @@ name = "roman sandals" desc = "Sandals with buckled leather straps on it." icon_state = "roman" - item_state = "roman" strip_delay = 100 equip_delay_other = 100 permeability_coefficient = 0.9 @@ -187,14 +190,12 @@ name = "griffon boots" desc = "A pair of costume boots fashioned after bird talons." icon_state = "griffinboots" - item_state = "griffinboots" pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes /obj/item/clothing/shoes/bhop name = "jump boots" desc = "A specialized pair of combat boots with a built-in propulsion system for rapid foward movement." icon_state = "jetboots" - item_state = "jetboots" item_color = "hosred" resistance_flags = FIRE_PROOF pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes @@ -252,7 +253,6 @@ name = "Wheely-Heels" desc = "Uses patented retractable wheel technology. Never sacrifice speed for style - not that this provides much of either." //Thanks Fel icon_state = "wheelys" - item_state = "wheelys" actions_types = list(/datum/action/item_action/wheelys) var/wheelToggle = FALSE //False means wheels are not popped out var/obj/vehicle/ridden/scooter/wheelys/W @@ -291,7 +291,6 @@ name = "Kindle Kicks" desc = "They'll sure kindle something in you, and it's not childhood nostalgia..." icon_state = "kindleKicks" - item_state = "kindleKicks" actions_types = list(/datum/action/item_action/kindleKicks) var/lightCycle = 0 var/active = FALSE @@ -312,3 +311,25 @@ set_light(0) lightCycle = 0 active = FALSE + +// kevin is into feet +/obj/item/clothing/shoes/wraps + name = "gilded leg wraps" + desc = "Ankle coverings. These ones have a golden design." + icon_state = "gildedcuffs" + body_parts_covered = FALSE + +/obj/item/clothing/shoes/wraps/silver + name = "silver leg wraps" + desc = "Ankle coverings. Not made of real silver." + icon_state = "silvergildedcuffs" + +/obj/item/clothing/shoes/wraps/red + name = "red leg wraps" + desc = "Ankle coverings. Show off your style with these shiny red ones!" + icon_state = "redcuffs" + +/obj/item/clothing/shoes/wraps/blue + name = "blue leg wraps" + desc = "Ankle coverings. Hang ten, brother." + icon_state = "bluecuffs" \ No newline at end of file diff --git a/code/modules/clothing/shoes/vg_shoes.dm b/code/modules/clothing/shoes/vg_shoes.dm index 931c25b823..627a061181 100644 --- a/code/modules/clothing/shoes/vg_shoes.dm +++ b/code/modules/clothing/shoes/vg_shoes.dm @@ -5,7 +5,6 @@ icon_state = "leather" item_color = "leather" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/shoes/magboots/deathsquad @@ -14,7 +13,6 @@ icon_state = "DS-magboots0" magboot_state = "DS-magboots" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF mutantrace_variation = NO_MUTANTRACE_VARIATION @@ -23,7 +21,6 @@ name = "atmospherics magboots" icon_state = "atmosmagboots0" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' magboot_state = "atmosmagboots" resistance_flags = FIRE_PROOF mutantrace_variation = NO_MUTANTRACE_VARIATION @@ -33,7 +30,6 @@ desc = "Simon's Shoes." icon_state = "simonshoes" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/shoes/kneesocks @@ -41,7 +37,6 @@ desc = "A pair of girly knee-high socks." icon_state = "kneesock" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/shoes/jestershoes @@ -49,7 +44,6 @@ desc = "As worn by the clowns of old." icon_state = "jestershoes" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/shoes/aviatorboots @@ -57,7 +51,6 @@ desc = "Boots suitable for just about any occasion." icon_state = "aviator_boots" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/shoes/libertyshoes @@ -65,7 +58,6 @@ desc = "Freedom isn't free, neither were these shoes." icon_state = "libertyshoes" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/shoes/megaboots @@ -73,7 +65,6 @@ desc = "Large armored boots, very weak to large spikes." icon_state = "megaboots" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/shoes/protoboots @@ -81,7 +72,6 @@ desc = "Functionally identical to the DRN-001 model's boots, but in red." icon_state = "protoboots" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/shoes/megaxboots @@ -89,7 +79,6 @@ desc = "Regardless of how much stronger these boots are than the DRN-001 model's, they're still extremely easy to pierce with a large spike." icon_state = "megaxboots" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/shoes/joeboots @@ -97,7 +86,6 @@ desc = "Nearly identical to the Prototype's boots, except in black." icon_state = "joeboots" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/shoes/doomguy @@ -105,7 +93,6 @@ desc = "If you look closely, you might see skull fragments still buried in these boots." icon_state = "doom" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/shoes/rottenshoes @@ -113,7 +100,6 @@ desc = "These shoes seem perfect for sneaking around." icon_state = "rottenshoes" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/shoes/sandal/slippers @@ -121,7 +107,6 @@ icon_state = "slippers" desc = "For the wizard that puts comfort first. Who's going to laugh?" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/shoes/slippers_worn @@ -129,7 +114,6 @@ desc = "Fluffy..." icon_state = "slippers_worn" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/shoes/jackboots/neorussian @@ -137,5 +121,4 @@ desc = "Tovarish, no one will realize you stepped on a pile of shit if your pair already looks like shit." icon_state = "nr_boots" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm index 662a91c80c..117fbc49e0 100644 --- a/code/modules/clothing/spacesuits/_spacesuits.dm +++ b/code/modules/clothing/spacesuits/_spacesuits.dm @@ -4,7 +4,7 @@ name = "space helmet" icon_state = "spaceold" desc = "A special helmet with solar UV shielding to protect your eyes from harmful rays." - clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS + clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS | SNUG_FIT item_state = "spaceold" permeability_coefficient = 0.01 armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 50, "fire" = 80, "acid" = 70) @@ -22,6 +22,7 @@ resistance_flags = NONE dog_fashion = null mutantrace_variation = MUTANTRACE_VARIATION + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE /obj/item/clothing/suit/space name = "space suit" @@ -44,4 +45,5 @@ strip_delay = 80 equip_delay_other = 80 resistance_flags = NONE + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE //rated for cosmic radation :honk: tauric = TRUE //Citadel Add for tauric hardsuits diff --git a/code/modules/clothing/spacesuits/flightsuit.dm b/code/modules/clothing/spacesuits/flightsuit.dm index b105b72234..7ead462b1e 100644 --- a/code/modules/clothing/spacesuits/flightsuit.dm +++ b/code/modules/clothing/spacesuits/flightsuit.dm @@ -547,7 +547,7 @@ changeWearer() ..() -/obj/item/flightpack/item_action_slot_check(slot) +/obj/item/flightpack/item_action_slot_check(slot, mob/user, datum/action/A) if(slot == ITEM_SLOT_BACK) return TRUE @@ -574,7 +574,7 @@ momentum_speed_y = 0 momentum_speed = max(momentum_speed_x, momentum_speed_y) -/obj/item/flightpack/item_action_slot_check(slot) +/obj/item/flightpack/item_action_slot_check(slot, mob/user, datum/action/A) return slot == SLOT_BACK /obj/item/flightpack/proc/enable_stabilizers() @@ -730,7 +730,7 @@ if(!active) clothing_flags &= ~NOSLIP -/obj/item/clothing/shoes/flightshoes/item_action_slot_check(slot) +/obj/item/clothing/shoes/flightshoes/item_action_slot_check(slot, mob/user, datum/action/A) return slot == SLOT_SHOES /obj/item/clothing/shoes/flightshoes/proc/delink_suit() diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 2694497579..6e21a399ec 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -47,7 +47,7 @@ suit.RemoveHelmet() soundloop.stop(user) -/obj/item/clothing/head/helmet/space/hardsuit/item_action_slot_check(slot) +/obj/item/clothing/head/helmet/space/hardsuit/item_action_slot_check(slot, mob/user, datum/action/A) if(slot == SLOT_HEAD) return 1 @@ -158,7 +158,7 @@ var/datum/action/A = X A.Remove(user) -/obj/item/clothing/suit/space/hardsuit/item_action_slot_check(slot) +/obj/item/clothing/suit/space/hardsuit/item_action_slot_check(slot, mob/user, datum/action/A) if(slot == SLOT_WEAR_SUIT) //we only give the mob the ability to toggle the helmet if he's wearing the hardsuit. return 1 @@ -605,7 +605,6 @@ armor = list("melee" = 30, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 75) item_color = "ancient" resistance_flags = FIRE_PROOF - var/datum/component/mobhook /obj/item/clothing/suit/space/hardsuit/ancient name = "prototype RIG hardsuit" @@ -617,7 +616,7 @@ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ancient resistance_flags = FIRE_PROOF var/footstep = 1 - var/datum/component/mobhook + var/mob/listeningTo /obj/item/clothing/suit/space/hardsuit/ancient/mason name = "M.A.S.O.N RIG" @@ -674,20 +673,24 @@ /obj/item/clothing/suit/space/hardsuit/ancient/equipped(mob/user, slot) . = ..() - if (slot == SLOT_WEAR_SUIT) - if (mobhook && mobhook.parent != user) - QDEL_NULL(mobhook) - if (!mobhook) - mobhook = user.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED = CALLBACK(src, .proc/on_mob_move))) - else - QDEL_NULL(mobhook) + if(slot != SLOT_WEAR_SUIT) + if(listeningTo) + UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) + return + if(listeningTo == user) + return + if(listeningTo) + UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) + RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/on_mob_move) + listeningTo = user /obj/item/clothing/suit/space/hardsuit/ancient/dropped() . = ..() - QDEL_NULL(mobhook) + if(listeningTo) + UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) /obj/item/clothing/suit/space/hardsuit/ancient/Destroy() - QDEL_NULL(mobhook) // mobhook is not our component + listeningTo = null return ..() /////////////SHIELDED////////////////////////////////// @@ -864,3 +867,133 @@ strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT actions_types = list() + +/* + CYDONIAN ARMOR THAT IS RGB AND STUFF WOOOOOOOOOO +*/ + +/obj/item/clothing/head/helmet/space/hardsuit/lavaknight + name = "cydonian helmet" + desc = "A helmet designed with both form and function in mind, it protects the user against physical trauma and hazardous conditions while also having polychromic light strips." + icon_state = "knight_cydonia" + item_state = "knight_yellow" + item_color = null + max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT + resistance_flags = FIRE_PROOF | LAVA_PROOF + heat_protection = HEAD + armor = list(melee = 50, bullet = 10, laser = 10, energy = 10, bomb = 50, bio = 100, rad = 50, fire = 100, acid = 100) + 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) + var/energy_color = "#35FFF0" + var/obj/item/clothing/suit/space/hardsuit/lavaknight/linkedsuit = null + mutantrace_variation = NO_MUTANTRACE_VARIATION + +/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/Initialize() + . = ..() + if(istype(loc, /obj/item/clothing/suit/space/hardsuit/lavaknight)) + var/obj/item/clothing/suit/space/hardsuit/lavaknight/S = loc + energy_color = S.energy_color + update_icon() + +/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/attack_self(mob/user) + on = !on + + if(on) + set_light(brightness_on) + else + set_light(0) + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + +/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/update_icon() + var/mutable_appearance/helm_overlay = mutable_appearance(icon, "knight_cydonia_overlay") + + if(energy_color) + helm_overlay.color = energy_color + + cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other + + add_overlay(helm_overlay) + +/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/worn_overlays(isinhands = FALSE, icon_file) + . = ..() + if(!isinhands) + var/mutable_appearance/energy_overlay = mutable_appearance(icon_file, "knight_cydonia_overlay", ABOVE_LIGHTING_LAYER) + energy_overlay.plane = ABOVE_LIGHTING_LAYER + energy_overlay.color = energy_color + . += energy_overlay + +/obj/item/clothing/suit/space/hardsuit/lavaknight + icon_state = "knight_cydonia" + name = "cydonian armor" + desc = "A suit designed with both form and function in mind, it protects the user against physical trauma and hazardous conditions while also having polychromic light strips." + item_state = "swat_suit" + max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT + resistance_flags = FIRE_PROOF | LAVA_PROOF + armor = list(melee = 50, bullet = 10, laser = 10, energy = 10, bomb = 50, bio = 100, rad = 50, fire = 100, acid = 100) + 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/lavaknight + heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS + tauric = TRUE //Citadel Add for tauric hardsuits + + var/energy_color = "#35FFF0" + +/obj/item/clothing/suit/space/hardsuit/lavaknight/Initialize() + ..() + light_color = energy_color + set_light(1) + update_icon() + +/obj/item/clothing/suit/space/hardsuit/lavaknight/update_icon() + var/mutable_appearance/suit_overlay = mutable_appearance(icon, "knight_cydonia_overlay") + + if(energy_color) + suit_overlay.color = energy_color + + cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other + + add_overlay(suit_overlay) + +/obj/item/clothing/suit/space/hardsuit/lavaknight/worn_overlays(isinhands = FALSE, icon_file) + . = ..() + if(!isinhands) + var/mutable_appearance/energy_overlay + if(taurmode == SNEK_TAURIC) + energy_overlay = mutable_appearance('modular_citadel/icons/mob/taur_naga.dmi', "knight_cydonia_overlay", ABOVE_LIGHTING_LAYER) + else if(taurmode == PAW_TAURIC) + energy_overlay = mutable_appearance('modular_citadel/icons/mob/taur_canine.dmi', "knight_cydonia_overlay", ABOVE_LIGHTING_LAYER) + else + energy_overlay = mutable_appearance(icon_file, "knight_cydonia_overlay", ABOVE_LIGHTING_LAYER) + + energy_overlay.plane = ABOVE_LIGHTING_LAYER + energy_overlay.color = energy_color + . += energy_overlay + +/obj/item/clothing/suit/space/hardsuit/lavaknight/AltClick(mob/living/user) + if(user.incapacitated() || !istype(user)) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user)) + return + if(user.incapacitated() || !istype(user) || !in_range(src, user)) + return + + if(alert("Are you sure you want to recolor your armor stripes?", "Confirm Repaint", "Yes", "No") == "Yes") + var/energy_color_input = input(usr,"","Choose Energy Color",energy_color) as color|null + if(energy_color_input) + energy_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1) + user.update_inv_wear_suit() + if(helmet) + var/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/H = helmet + H.energy_color = energy_color + user.update_inv_head() + H.update_icon() + update_icon() + user.update_inv_wear_suit() + light_color = energy_color + update_light() + +/obj/item/clothing/suit/space/hardsuit/lavaknight/examine(mob/user) + ..() + to_chat(user, "Alt-click to recolor it.") diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index d1ee88d5a8..0b07aafa5d 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -12,7 +12,7 @@ var/next_extinguish = 0 var/extinguish_cooldown = 100 var/extinguishes_left = 10 - + mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/suit/space/eva/plasmaman/examine(mob/user) ..() @@ -45,12 +45,18 @@ resistance_flags = FIRE_PROOF var/brightness_on = 4 //luminosity when the light is on var/on = FALSE + var/light_overlay = "envirohelm-light" actions_types = list(/datum/action/item_action/toggle_helmet_light) + mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/head/helmet/space/plasmaman/attack_self(mob/user) + if(!light_overlay) + return on = !on - icon_state = "[initial(icon_state)][on ? "-light":""]" - item_state = icon_state + if(!on) + cut_overlay(light_overlay) + else + add_overlay(light_overlay) user.update_inv_head() //So the mob overlay updates if(on) @@ -61,3 +67,166 @@ for(var/X in actions) var/datum/action/A=X A.UpdateButtonIcon() + +/obj/item/clothing/head/helmet/space/plasmaman/worn_overlays(isinhands, icon_file) + . = ..() + if(!isinhands && on) + . += mutable_appearance(icon_file, light_overlay) + +/obj/item/clothing/head/helmet/space/plasmaman/security + name = "security plasma envirosuit helmet" + desc = "A plasmaman containment helmet designed for security officers, protecting them from being flashed and burning alive, along-side other undesirables." + icon_state = "security_envirohelm" + item_state = "security_envirohelm" + armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 100, "acid" = 75) + +/obj/item/clothing/head/helmet/space/plasmaman/security/warden + name = "warden's plasma envirosuit helmet" + desc = "A plasmaman containment helmet designed for the warden, a pair of white stripes being added to differeciate them from other members of security." + icon_state = "warden_envirohelm" + item_state = "warden_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/security/hos + name = "head of security's plasma envirosuit helmet" + desc = "A plasmaman containment helmet designed for the head of security, manacing black with red stripes, to differenciate them from other members of security." + icon_state = "hos_envirohelm" + item_state = "hos_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/medical + name = "medical's plasma envirosuit helmet" + desc = "An envriohelmet designed for plasmaman medical doctors, having two stripes down it's length to denote as much." + icon_state = "doctor_envirohelm" + item_state = "doctor_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/cmo + name = "chief medical officer's plasma envirosuit helmet" + desc = "A blue and white envriohelmet designed for the chief medical officer." + icon_state = "cmo_envirohelm" + item_state = "cmo_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/genetics + name = "geneticist's plasma envirosuit helmet" + desc = "A plasmaman envirohelmet designed for geneticists." + icon_state = "geneticist_envirohelm" + item_state = "geneticist_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/viro + name = "virology plasma envirosuit helmet" + desc = "The helmet worn by the safest people on the station, those who are completely immune to the monstrosities they create." + icon_state = "virologist_envirohelm" + item_state = "virologist_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/chemist + name = "chemistry plasma envirosuit helmet" + desc = "A plasmaman envirosuit designed for chemists, two orange stripes going down it's face." + icon_state = "chemist_envirohelm" + item_state = "chemist_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/science + name = "science plasma envirosuit helmet" + desc = "A plasmaman envirohelmet designed for scientists." + icon_state = "scientist_envirohelm" + item_state = "scientist_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/rd + name = "research director's plasma envirosuit helmet" + desc = "A sturdier plasmaman envirohelmet designed for research directors." + icon_state = "rd_envirohelm" + item_state = "rd_envirohelm" + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 100, "rad" = 0, "fire" = 100, "acid" = 75) + +/obj/item/clothing/head/helmet/space/plasmaman/robotics + name = "robotics plasma envirosuit helmet" + desc = "A plasmaman envirohelmet designed for roboticists." + icon_state = "roboticist_envirohelm" + item_state = "roboticist_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/engineering + name = "engineering plasma envirosuit helmet" + desc = "A space-worthy helmet specially designed for engineer plasmamen, the usual purple stripes being replaced by engineering's orange." + icon_state = "engineer_envirohelm" + item_state = "engineer_envirohelm" + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 10, "fire" = 100, "acid" = 75) + +/obj/item/clothing/head/helmet/space/plasmaman/engineering/ce + name = "chief engineer's plasma envirosuit helmet" + desc = "A space-worthy helmet specially designed for the chief engineer, white with gold stripes designed for high visibility." + icon_state = "ce_envirohelm" + item_state = "ce_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/atmospherics + name = "atmospherics plasma envirosuit helmet" + desc = "A space-worthy helmet specially designed for atmos technician plasmamen, the usual purple stripes being replaced by engineering's blue." + icon_state = "atmos_envirohelm" + item_state = "atmos_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/cargo + name = "cargo plasma envirosuit helmet" + desc = "An plasmaman envirohelmet designed for cargo techs and quartermasters." + icon_state = "cargo_envirohelm" + item_state = "cargo_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/mining + name = "mining plasma envirosuit helmet" + desc = "A khaki helmet given to plasmamen miners operating on lavaland." + icon_state = "explorer_envirohelm" + item_state = "explorer_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/chaplain + name = "chaplain's plasma envirosuit helmet" + desc = "An envirohelmet specially designed for only the most pious of plasmamen." + icon_state = "chap_envirohelm" + item_state = "chap_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/white + name = "white plasma envirosuit helmet" + desc = "A generic white envirohelm." + icon_state = "white_envirohelm" + item_state = "white_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/hop + name = "head of personell's plasma envirosuit helmet" + desc = "A finely tailored azure envirohelm designed for head of personell." + icon_state = "hop_envirohelm" + item_state = "hop_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/captain + name = "captain's plasma envirosuit helmet" + desc = "A blue and gold envirohelm designed for the station's captain, nonetheless. Made of superior materials to protect them from the station hazards and more." + icon_state = "captain_envirohelm" + item_state = "captain_envirohelm" + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 10, "fire" = 100, "acid" = 85) + +/obj/item/clothing/head/helmet/space/plasmaman/curator + name = "curator's plasma envirosuit helmet" + desc = "A slight modification on a tradiational voidsuit helmet, this helmet was Nano-Trasen's first solution to the *logistical problems* that come with employing plasmamen. Despite their limitations, these helmets still see use by historian and old-styled plasmamen alike." + icon_state = "prototype_envirohelm" + item_state = "prototype_envirohelm" + light_overlay = null + actions_types = list() + +/obj/item/clothing/head/helmet/space/plasmaman/botany + name = "botany plasma envirosuit helmet" + desc = "A green and blue envirohelmet designating it's wearer as a botanist. While not specially designed for it, it would protect against minor planet-related injuries." + icon_state = "botany_envirohelm" + item_state = "botany_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/janitor + name = "janitor's plasma envirosuit helmet" + desc = "A grey helmet bearing a pair of purple stripes, designating the wearer as a janitor." + icon_state = "janitor_envirohelm" + item_state = "janitor_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/mime + name = "mime envirosuit helmet" + desc = "The make-up is painted on, it's a miracle it doesn't chip. It's not very colourful." + icon_state = "mime_envirohelm" + item_state = "mime_envirohelm" + light_overlay = "mime_envirohelm-light" + +/obj/item/clothing/head/helmet/space/plasmaman/clown + name = "clown envirosuit helmet" + desc = "The make-up is painted on, it's a miracle it doesn't chip. 'HONK!'" + icon_state = "clown_envirohelm" + item_state = "clown_envirohelm" + light_overlay = "clown_envirohelm-light" diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm index cf411ef367..faec9e2f4c 100644 --- a/code/modules/clothing/suits/_suits.dm +++ b/code/modules/clothing/suits/_suits.dm @@ -5,6 +5,7 @@ allowed = list(/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) slot_flags = ITEM_SLOT_OCLOTHING + body_parts_covered = CHEST var/blood_overlay_type = "suit" var/togglename = null var/suittoggled = FALSE @@ -30,12 +31,12 @@ adjusted = NORMAL_STYLE if(("taur" in H.dna.species.mutant_bodyparts) && (H.dna.features["taur"] != "None")) - if(H.dna.features["taur"] in list("Naga", "Tentacle")) + if(H.dna.features["taur"] in GLOB.noodle_taurs) taurmode = SNEK_TAURIC if(tauric == TRUE) center = TRUE dimension_x = 64 - else if(H.dna.features["taur"] in list("Fox","Wolf","Otie","Drake","Lab","Shepherd","Husky","Eevee","Panther","Horse","Cow","Tiger","Deer")) + else if(H.dna.features["taur"] in GLOB.paw_taurs) taurmode = PAW_TAURIC if(tauric == TRUE) center = TRUE @@ -53,11 +54,11 @@ if(!isinhands) if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damaged[blood_overlay_type]") - IF_HAS_BLOOD_DNA(src) - if(taurmode >= SNEK_TAURIC) - . += mutable_appearance('modular_citadel/icons/mob/64x32_effects.dmi', "[blood_overlay_type]blood") + if(blood_DNA) + if(tauric && taurmode >= SNEK_TAURIC) + . += mutable_appearance('modular_citadel/icons/mob/64x32_effects.dmi', "[blood_overlay_type]blood", color = blood_DNA_to_color()) else - . += mutable_appearance('icons/effects/blood.dmi', "[blood_overlay_type]blood") + . += mutable_appearance('icons/effects/blood.dmi', "[blood_overlay_type]blood", color = blood_DNA_to_color()) var/mob/living/carbon/human/M = loc if(ishuman(M) && M.w_uniform) var/obj/item/clothing/under/U = M.w_uniform diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 0840288eee..19050dc36f 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -1,6 +1,5 @@ /obj/item/clothing/suit/armor allowed = null - body_parts_covered = CHEST cold_protection = CHEST|GROIN min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT heat_protection = CHEST|GROIN diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index 5d0a9b9914..369ddba7b9 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -4,7 +4,7 @@ icon_state = "bio" desc = "A hood that protects the head and face from biological contaminants." permeability_coefficient = 0.01 - clothing_flags = THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT + clothing_flags = THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | SNUG_FIT armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 60, "fire" = 30, "acid" = 100) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDEFACE|HIDESNOUT resistance_flags = ACID_PROOF diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm index c3276213e1..be81374868 100644 --- a/code/modules/clothing/suits/cloaks.dm +++ b/code/modules/clothing/suits/cloaks.dm @@ -7,7 +7,7 @@ icon_state = "qmcloak" item_state = "qmcloak" w_class = WEIGHT_CLASS_SMALL - body_parts_covered = CHEST|GROIN|LEGS|ARMS + body_parts_covered = CHEST|LEGS|ARMS /obj/item/clothing/head/cloakhood name = "cloak hood" @@ -62,13 +62,14 @@ 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) 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|GROIN|ARMS + body_parts_covered = CHEST|ARMS|LEGS /obj/item/clothing/head/hooded/cloakhood/goliath name = "goliath cloak hood" icon_state = "golhood" desc = "A protective & concealing hood." armor = list("melee" = 35, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) + clothing_flags = SNUG_FIT flags_inv = HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR /obj/item/clothing/suit/hooded/cloak/drake @@ -88,6 +89,7 @@ icon_state = "dragon" desc = "The skull of a dragon." armor = list("melee" = 70, "bullet" = 30, "laser" = 50, "energy" = 40, "bomb" = 70, "bio" = 60, "rad" = 50, "fire" = 100, "acid" = 100) + clothing_flags = SNUG_FIT heat_protection = HEAD max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index 36965afd07..4318839845 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -153,6 +153,7 @@ icon = 'icons/obj/clothing/belts.dmi' icon_state = "suspenders" blood_overlay_type = "armor" //it's the less thing that I can put here + body_parts_covered = NONE //Security /obj/item/clothing/suit/security/officer @@ -215,3 +216,4 @@ item_state = "techpriesthood" body_parts_covered = HEAD flags_inv = HIDEHAIR|HIDEEARS + mutantrace_variation = MUTANTRACE_VARIATION diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index ddffe5fe6e..bc885868c5 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -67,6 +67,7 @@ item_state = "death" flags_1 = CONDUCT_1 fire_resist = T0C+5200 + body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS|FEET flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT @@ -75,6 +76,7 @@ desc = "this pretty much looks ridiculous" //Needs no fixing icon_state = "justice" item_state = "justice" + body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS|FEET flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT @@ -100,14 +102,14 @@ desc = "A fancy purple apron for a stylish person." icon_state = "purplebartenderapron" item_state = "purplebartenderapron" - body_parts_covered = CHEST|GROIN|LEGS + body_parts_covered = CHEST /obj/item/clothing/suit/syndicatefake name = "black and red space suit replica" icon_state = "syndicate-black-red" item_state = "syndicate-black-red" desc = "A plastic replica of the Syndicate space suit. You'll look just like a real murderous Syndicate agent in this! This is a toy, it is not made for use in space!" - w_class = WEIGHT_CLASS_NORMAL + body_parts_covered = CHEST|ARMS|GROIN|LEGS|FEET|HANDS allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT resistance_flags = NONE @@ -154,7 +156,7 @@ icon_state = "owl_wings" item_state = "owl_wings" togglename = "wings" - body_parts_covered = ARMS|CHEST + body_parts_covered = ARMS actions_types = list(/datum/action/item_action/toggle_wings) /obj/item/clothing/suit/toggle/owlwings/Initialize() @@ -209,6 +211,7 @@ desc = "Your classic, non-racist poncho." icon_state = "classicponcho" item_state = "classicponcho" + body_parts_covered = CHEST|GROIN /obj/item/clothing/suit/poncho/green name = "green poncho" @@ -245,7 +248,7 @@ desc = "A costume made from 'synthetic' carp scales, it smells." icon_state = "carp_casual" item_state = "labcoat" - body_parts_covered = CHEST|GROIN|ARMS + body_parts_covered = CHEST|GROIN|ARMS|LEGS|FEET cold_protection = CHEST|GROIN|ARMS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT //Space carp like space, so you should too allowed = list(/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/gun/ballistic/automatic/speargun) @@ -265,9 +268,7 @@ desc = "A costume that looks like someone made a human-like corgi, it won't guarantee belly rubs." icon_state = "ian" item_state = "labcoat" - body_parts_covered = CHEST|GROIN|ARMS - //cold_protection = CHEST|GROIN|ARMS - //min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + body_parts_covered = CHEST|GROIN|ARMS|LEGS|FEET allowed = list() hoodtype = /obj/item/clothing/head/hooded/ian_hood dog_fashion = /datum/dog_fashion/back @@ -277,8 +278,6 @@ desc = "A hood that looks just like a corgi's head, it won't guarantee dog biscuits." icon_state = "ian" body_parts_covered = HEAD - //cold_protection = HEAD - //min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT flags_inv = HIDEHAIR|HIDEEARS /obj/item/clothing/suit/hooded/bee_costume // It's Hip! @@ -304,7 +303,7 @@ desc = "A horribly bloated suit made from human skins." icon_state = "lingspacesuit" item_state = "labcoat" - body_parts_covered = CHEST|GROIN|ARMS + body_parts_covered = CHEST|GROIN|ARMS|LEGS|FEET|HANDS allowed = list() actions_types = list(/datum/action/item_action/toggle_human_head) hoodtype = /obj/item/clothing/head/hooded/human_head @@ -325,6 +324,23 @@ item_state = "officertanjacket" body_parts_covered = CHEST|ARMS +/obj/item/clothing/suit/ran + name = "Shikigami costume" + desc = "A costume that looks like a certain shikigami, is super fluffy." + icon_state = "ran_suit" + item_state = "ran_suit" + body_parts_covered = CHEST|GROIN|LEGS + flags_inv = HIDEJUMPSUIT|HIDETAUR + heat_protection = CHEST|GROIN|LEGS //fluffy tails! +//2061 + +/obj/item/clothing/head/ran + name = "Shikigami hat" + desc = "A hat that looks like it keeps any fluffy ears contained super warm, has little charms over it." + icon_state = "ran_hat" + item_state = "ran_hat" + flags_inv = HIDEEARS + /* * Misc */ @@ -345,18 +361,21 @@ desc = "A worn out, curiously comfortable t-shirt with a picture of Ian. You wouldn't go so far as to say it feels like being hugged when you wear it, but it's pretty close. Good for sleeping in." icon_state = "ianshirt" item_state = "ianshirt" + body_parts_covered = CHEST|GROIN /obj/item/clothing/suit/nerdshirt name = "gamer shirt" desc = "A baggy shirt with vintage game character Phanic the Weasel. Why would anyone wear this?" icon_state = "nerdshirt" item_state = "nerdshirt" + body_parts_covered = CHEST|GROIN /obj/item/clothing/suit/vapeshirt //wearing this is asking to get beat. name = "Vape Naysh shirt" desc = "A cheap white T-shirt with a big tacky \"VN\" on the front, Why would you wear this unironically?" icon_state = "vapeshirt" item_state = "vapeshirt" + body_parts_covered = CHEST|GROIN /obj/item/clothing/suit/jacket name = "bomber jacket" @@ -364,7 +383,7 @@ icon_state = "bomberjacket" item_state = "brownjsuit" 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/radio) - body_parts_covered = CHEST|GROIN|ARMS + body_parts_covered = CHEST|ARMS cold_protection = CHEST|GROIN|ARMS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT @@ -389,6 +408,7 @@ desc = "A thick jacket with a rubbery, water-resistant shell." icon_state = "pufferjacket" item_state = "hostrench" + body_parts_covered = CHEST|GROIN|ARMS armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 0) /obj/item/clothing/suit/jacket/puffer/vest @@ -436,18 +456,21 @@ desc = "Looks like this belongs in a very old movie set." icon_state = "draculacoat" item_state = "draculacoat" + body_parts_covered = CHEST|ARMS /obj/item/clothing/suit/drfreeze_coat name = "doctor freeze's labcoat" desc = "A labcoat imbued with the power of features and freezes." icon_state = "drfreeze_coat" item_state = "drfreeze_coat" + body_parts_covered = CHEST|GROIN|ARMS /obj/item/clothing/suit/gothcoat name = "gothic coat" desc = "Perfect for those who want stalk in a corner of a bar." icon_state = "gothcoat" item_state = "gothcoat" + body_parts_covered = CHEST|ARMS|HAND_LEFT //peculiar /obj/item/clothing/suit/xenos name = "xenos suit" @@ -586,6 +609,7 @@ name = "spooky ghost" desc = "This is obviously just a bedsheet, but maybe try it on?" icon_state = "bedsheet" + body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS|HEAD user_vars_to_edit = list("name" = "Spooky Ghost", "real_name" = "Spooky Ghost" , "incorporeal_move" = INCORPOREAL_MOVE_BASIC, "appearance_flags" = KEEP_TOGETHER|TILE_BOUND, "alpha" = 150) alternate_worn_layer = ABOVE_BODY_FRONT_LAYER //so the bedsheet goes over everything but fire @@ -594,6 +618,7 @@ desc = "A big and clanky suit made of bronze that offers no protection and looks very unfashionable. Nice." icon = 'icons/obj/clothing/clockwork_garb.dmi' icon_state = "clockwork_cuirass_old" + body_parts_covered = CHEST|GROIN|LEGS armor = list("melee" = 5, "bullet" = 0, "laser" = -5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 20) /obj/item/clothing/suit/ghost_sheet @@ -606,4 +631,5 @@ throw_range = 2 w_class = WEIGHT_CLASS_TINY flags_inv = HIDEGLOVES|HIDEEARS|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR + body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS|HEAD alternate_worn_layer = UNDER_HEAD_LAYER diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index 5d534e00a7..cc983dbb0f 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -23,7 +23,7 @@ /obj/item/clothing/suit/hooded/ui_action_click() ToggleHood() -/obj/item/clothing/suit/hooded/item_action_slot_check(slot, mob/user) +/obj/item/clothing/suit/hooded/item_action_slot_check(slot, mob/user, datum/action/A) if(slot == SLOT_WEAR_SUIT || slot == SLOT_NECK) return 1 diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index d003a20167..b98d8207d9 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -58,7 +58,7 @@ name = "bomb hood" desc = "Use in case of bomb." icon_state = "bombsuit" - clothing_flags = THICKMATERIAL + clothing_flags = THICKMATERIAL | SNUG_FIT armor = list("melee" = 20, "bullet" = 0, "laser" = 20,"energy" = 10, "bomb" = 100, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50) flags_inv = HIDEFACE|HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT dynamic_hair_suffix = "" @@ -123,14 +123,14 @@ name = "radiation hood" icon_state = "rad" desc = "A hood with radiation protective properties. The label reads, 'Made with lead. Please do not consume insulation.'" - clothing_flags = THICKMATERIAL + clothing_flags = THICKMATERIAL|SNUG_FIT flags_inv = HIDEMASK|HIDEEARS|HIDEFACE|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 60, "rad" = 100, "fire" = 30, "acid" = 30) strip_delay = 60 equip_delay_other = 60 flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH resistance_flags = NONE - rad_flags = RAD_PROTECT_CONTENTS + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE mutantrace_variation = MUTANTRACE_VARIATION /obj/item/clothing/suit/radiation @@ -150,5 +150,5 @@ equip_delay_other = 60 flags_inv = HIDEJUMPSUIT|HIDETAUR resistance_flags = NONE - rad_flags = RAD_PROTECT_CONTENTS + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE tauric = TRUE //Citadel Add for tauric hardsuits diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index 9d1a47f231..93eb8181c7 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -7,6 +7,7 @@ armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 20, "bio" = 20, "rad" = 20, "fire" = 100, "acid" = 100) strip_delay = 50 equip_delay_other = 50 + clothing_flags = SNUG_FIT resistance_flags = FIRE_PROOF | ACID_PROOF dog_fashion = /datum/dog_fashion/head/blue_wizard diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index c2c3f19b9d..eda0e31e93 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -22,8 +22,8 @@ if(!isinhands) if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damageduniform") - IF_HAS_BLOOD_DNA(src) - . += mutable_appearance('icons/effects/blood.dmi', "uniformblood") + if(blood_DNA) + . += mutable_appearance('icons/effects/blood.dmi', "uniformblood", color = blood_DNA_to_color()) if(accessory_overlay) . += accessory_overlay diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index 878030bc5d..706f7edb0a 100644 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -12,7 +12,7 @@ var/datum/component/storage/detached_pockets /obj/item/clothing/accessory/proc/attach(obj/item/clothing/under/U, user) - GET_COMPONENT(storage, /datum/component/storage) + var/datum/component/storage/storage = GetComponent(/datum/component/storage) if(storage) if(SEND_SIGNAL(U, COMSIG_CONTAINS_STORAGE)) return FALSE @@ -355,6 +355,14 @@ above_suit = TRUE armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 20, "bio" = 20, "rad" = 5, "fire" = 0, "acid" = 25) +/obj/item/clothing/accessory/skullcodpiece/fake + name = "false codpiece" + desc = "A plastic ornament, intended to protect the important things in life. It's not very good at it." + icon_state = "skull" + item_color = "skull" + above_suit = TRUE + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + ///////////////////// //Synda Accessories// ///////////////////// diff --git a/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm b/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm new file mode 100644 index 0000000000..74181b05eb --- /dev/null +++ b/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm @@ -0,0 +1,100 @@ +/obj/item/clothing/under/plasmaman/cargo + name = "cargo plasma envirosuit" + desc = "A joint envirosuit used by plasmamen quartermasters and cargo techs alike, due to the logistical problems of differenciating the two with the length of their pant legs." + icon_state = "cargo_envirosuit" + item_state = "cargo_envirosuit" + item_color = "cargo_envirosuit" + +/obj/item/clothing/under/plasmaman/mining + name = "mining plasma envirosuit" + desc = "An air-tight khaki suit designed for operations on lavaland by plasmamen." + icon_state = "explorer_envirosuit" + item_state = "explorer_envirosuit" + item_color = "explorer_envirosuit" + + +/obj/item/clothing/under/plasmaman/chef + name = "chef's plasma envirosuit" + desc = "A white plasmaman envirosuit designed for cullinary practices. One might question why a member of a species that doesn't need to eat would become a chef." + icon_state = "chef_envirosuit" + item_state = "chef_envirosuit" + item_color = "chef_envirosuit" + +/obj/item/clothing/under/plasmaman/enviroslacks + name = "enviroslacks" + desc = "The pet project of a particularly posh plasmaman, this custom suit was quickly appropriated by Nano-Trasen for it's detectives, lawyers, and bar-tenders alike." + icon_state = "enviroslacks" + item_state = "enviroslacks" + item_color = "enviroslacks" + +/obj/item/clothing/under/plasmaman/chaplain + name = "chaplain's plasma envirosuit" + desc = "An envirosuit specially designed for only the most pious of plasmamen." + icon_state = "chap_envirosuit" + item_state = "chap_envirosuit" + item_color = "chap_envirosuit" + +/obj/item/clothing/under/plasmaman/curator + name = "curator's plasma envirosuit" + desc = "Made out of a modified voidsuit, this suit was Nano-Trasen's first solution to the *logistical problems* that come with employing plasmamen. Due to the modifications, the suit is no longer space-worthy. Despite their limitations, these suits are still in used by historian and old-styled plasmamen alike." + icon_state = "prototype_envirosuit" + item_state = "prototype_envirosuit" + item_color = "prototype_envirosuit" + +/obj/item/clothing/under/plasmaman/janitor + name = "janitor's plasma envirosuit" + desc = "A grey and purple envirosuit designated for plasmamen janitors." + icon_state = "janitor_envirosuit" + item_state = "janitor_envirosuit" + item_color = "janitor_envirosuit" + +/obj/item/clothing/under/plasmaman/botany + name = "botany envirosuit" + desc = "A green and blue envirosuit designed to protect plasmamen from minor plant-related injuries." + icon_state = "botany_envirosuit" + item_state = "botany_envirosuit" + item_color = "botany_envirosuit" + +/obj/item/clothing/under/plasmaman/hop + name = "head of personell's envirosuit" + desc = "A prestigious azure envirosuit designed for head of personell." + icon_state = "hop_envirosuit" + item_state = "hop_envirosuit" + item_color = "hop_envirosuit" + +/obj/item/clothing/under/plasmaman/captain + name = "captain's envirosuit" + desc = "An expensive piece of plasmaman envirosuit fashion. guaranteed to keep you cool while the station goes down in fierceful fires." + icon_state = "captain_envirosuit" + item_state = "captain_envirosuit" + item_color = "captain_envirosuit" + armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95) + +/obj/item/clothing/under/plasmaman/mime + name = "mime envirosuit" + desc = "It's not very colourful." + icon_state = "mime_envirosuit" + item_state = "mime_envirosuit" + item_color = "mime_envirosuit" + +/obj/item/clothing/under/plasmaman/clown + name = "clown envirosuit" + desc = "'HONK!'" + icon_state = "clown_envirosuit" + item_state = "clown_envirosuit" + item_color = "clown_envirosuit" + +/obj/item/clothing/under/plasmaman/clown/Extinguish(mob/living/carbon/human/H) + if(!istype(H)) + return + + if(H.on_fire) + if(extinguishes_left) + if(next_extinguish > world.time) + return + next_extinguish = world.time + extinguish_cooldown + extinguishes_left-- + H.visible_message("[H]'s suit spews out a tonne of space lube!","Your suit spews out a tonne of space lube!") + H.ExtinguishMob() + new /obj/effect/particle_effect/foam(loc) //Truely terrifying. + return FALSE \ No newline at end of file diff --git a/code/modules/clothing/under/jobs/Plasmaman/engineering.dm b/code/modules/clothing/under/jobs/Plasmaman/engineering.dm new file mode 100644 index 0000000000..1f381df4cf --- /dev/null +++ b/code/modules/clothing/under/jobs/Plasmaman/engineering.dm @@ -0,0 +1,21 @@ +/obj/item/clothing/under/plasmaman/engineering + name = "engineering plasma envirosuit" + desc = "An air-tight suit designed to be used by plasmamen exployed as engineers, the usual purple stripes being replaced by engineer's orange. It protects the user from fire and acid damage." + icon_state = "engineer_envirosuit" + item_state = "engineer_envirosuit" + item_color = "engineer_envirosuit" + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 10, "fire" = 95, "acid" = 95) + +/obj/item/clothing/under/plasmaman/engineering/ce + name = "chief engineer's plasma envirosuit" + desc = "An advanced air-tight suit designed to be used by plasmamen chief engineers, complete with ornamental widgets and gizmo. It protects the user from fire and acid damage." + icon_state = "ce_envirosuit" + item_state = "ce_envirosuit" + item_color = "ce_envirosuit" + +/obj/item/clothing/under/plasmaman/atmospherics + name = "atmospherics plasma envirosuit" + desc = "An air-tight suit designed to be used by plasmamen exployed as atmos technicians, the usual purple stripes being replaced by atmos's blue." + icon_state = "atmos_envirosuit" + item_state = "atmos_envirosuit" + item_color = "atmos_envirosuit" diff --git a/code/modules/clothing/under/jobs/Plasmaman/medsci.dm b/code/modules/clothing/under/jobs/Plasmaman/medsci.dm new file mode 100644 index 0000000000..6106d785a9 --- /dev/null +++ b/code/modules/clothing/under/jobs/Plasmaman/medsci.dm @@ -0,0 +1,56 @@ +/obj/item/clothing/under/plasmaman/medical + name = "medical plasma envirosuit" + desc = "A suit designed for the station's more plasma-based doctors." + icon_state = "doctor_envirosuit" + item_state = "doctor_envirosuit" + item_color = "doctor_envirosuit" + +/obj/item/clothing/under/plasmaman/cmo + name = "chief medical officer's plasma envirosuit" + desc = "A suit designed for the station's most plasma-based chief medical officer, but not for their cat." + icon_state = "cmo_envirosuit" + item_state = "cmo_envirosuit" + item_color = "cmo_envirosuit" + +/obj/item/clothing/under/plasmaman/science + name = "science plasma envirosuit" + desc = "A plasmaman envirosuit designed for scientists." + icon_state = "scientist_envirosuit" + item_state = "scientist_envirosuit" + item_color = "scientist_envirosuit" + +/obj/item/clothing/under/plasmaman/rd + name = "research direactor's plasma envirosuit" + desc = "A plasmaman envirosuit designed for the research director to aid them in their job of directing research into the right direction." + icon_state = "rd_envirosuit" + item_state = "rd_envirosuit" + item_color = "rd_envirosuit" + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95) + +/obj/item/clothing/under/plasmaman/robotics + name = "robotics plasma envirosuit" + desc = "A plasmaman envirosuit designed for roboticists." + icon_state = "roboticist_envirosuit" + item_state = "roboticist_envirosuit" + item_color = "roboticist_envirosuit" + +/obj/item/clothing/under/plasmaman/viro + name = "virology plasma envirosuit" + desc = "The suit worn by the safest people on the station, those who are completely immune to the monstrosities they create." + icon_state = "virologist_envirosuit" + item_state = "virologist_envirosuit" + item_color = "virologist_envirosuit" + +/obj/item/clothing/under/plasmaman/genetics + name = "genetics plasma envirosuit" + desc = "A plasmaman envirosuit designed for geneticists." + icon_state = "geneticist_envirosuit" + item_state = "geneticist_envirosuit" + item_color = "geneticist_envirosuit" + +/obj/item/clothing/under/plasmaman/chemist + name = "chemistry plasma envirosuit" + desc = "A plasmaman envirosuit designed for chemists." + icon_state = "chemist_envirosuit" + item_state = "chemist_envirosuit" + item_color = "chemist_envirosuit" diff --git a/code/modules/clothing/under/jobs/Plasmaman/security.dm b/code/modules/clothing/under/jobs/Plasmaman/security.dm new file mode 100644 index 0000000000..ff756e09fd --- /dev/null +++ b/code/modules/clothing/under/jobs/Plasmaman/security.dm @@ -0,0 +1,21 @@ +/obj/item/clothing/under/plasmaman/security + name = "security plasma envirosuit" + desc = "A plasmaman containment suit designed for security officers, offering a limited amount of extra protection." + icon_state = "security_envirosuit" + item_state = "security_envirosuit" + item_color = "security_envirosuit" + armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95) + +/obj/item/clothing/under/plasmaman/security/warden + name = "warden plasma envirosuit" + desc = "A plasmaman containment suit designed for the warden, white stripes being added to differeciate them from other members of security." + icon_state = "warden_envirosuit" + item_state = "warden_envirosuit" + item_color = "warden_envirosuit" + +/obj/item/clothing/under/plasmaman/security/hos + name = "security plasma envirosuit" + desc = "A slick black and red plasmaman containment suit designed for the head of security, also called the LAW." + icon_state = "hos_envirosuit" + item_state = "hos_envirosuit" + item_color = "hos_envirosuit" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 616c00b6c1..ec39f20b0b 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -589,6 +589,7 @@ item_state = "b_suit" item_color = "sailor" can_adjust = FALSE + /obj/item/clothing/under/plasmaman name = "plasma envirosuit" desc = "A special containment suit that allows plasma-based lifeforms to exist safely in an oxygenated environment, and automatically extinguishes them in a crisis. Despite being airtight, it's not spaceworthy." @@ -596,12 +597,15 @@ item_state = "plasmaman" item_color = "plasmaman" armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95) + slowdown = 1 body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS + mutantrace_variation = NO_MUTANTRACE_VARIATION can_adjust = FALSE strip_delay = 80 var/next_extinguish = 0 var/extinguish_cooldown = 100 var/extinguishes_left = 5 + /obj/item/clothing/under/plasmaman/examine(mob/user) ..() to_chat(user, "There are [extinguishes_left] extinguisher charges left in this suit.") @@ -618,6 +622,7 @@ H.ExtinguishMob() new /obj/effect/particle_effect/water(get_turf(H)) return 0 + /obj/item/clothing/under/plasmaman/attackby(obj/item/E, mob/user, params) ..() if (istype(E, /obj/item/extinguisher_refill)) @@ -631,11 +636,13 @@ return return return + /obj/item/extinguisher_refill name = "envirosuit extinguisher cartridge" desc = "A cartridge loaded with a compressed extinguisher mix, used to refill the automatic extinguisher on plasma envirosuits." icon_state = "plasmarefill" icon = 'icons/obj/device.dmi' + /obj/item/clothing/under/rank/security/navyblue/russian name = "\improper Russian officer's uniform" desc = "The latest in fashionable russian outfits." diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm index 9893edf248..4e3e1aa0cc 100644 --- a/code/modules/clothing/under/syndicate.dm +++ b/code/modules/clothing/under/syndicate.dm @@ -67,3 +67,14 @@ icon_state = "syndicate_combat" item_color = "syndicate_combat" can_adjust = FALSE + +/obj/item/clothing/under/syndicate/baseball + name = "major league, number unknown" + desc = "A major league outfit with the number faded number on the back. Seems rather robust for just a game" + icon_state = "syndicatebaseball" + item_state = "syndicatebaseball" + item_color = "syndicatebaseball" + has_sensor = NO_SENSORS + armor = list("melee" = 15, "bullet" = 5, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40) + alt_covers_chest = TRUE + diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index 73052acfe1..2987b52338 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -1,4 +1,3 @@ - /datum/crafting_recipe var/name = "" //in-game display name var/reqs[] = list() //type paths of items consumed associated with how many are needed @@ -9,931 +8,4 @@ var/chem_catalysts[] = list() //like tools but for reagents var/category = CAT_NONE //where it shows up in the crafting UI var/subcategory = CAT_NONE - var/always_availible = TRUE //Set to FALSE if it needs to be learned first. - -/datum/crafting_recipe/pin_removal - name = "Pin Removal" - result = /obj/item/gun - reqs = list(/obj/item/gun = 1) - parts = list(/obj/item/gun = 1) - tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WIRECUTTER) - time = 50 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/IED - name = "IED" - result = /obj/item/grenade/iedcasing - reqs = list(/datum/reagent/fuel = 50, - /obj/item/stack/cable_coil = 1, - /obj/item/assembly/igniter = 1, - /obj/item/reagent_containers/food/drinks/soda_cans = 1) - parts = list(/obj/item/reagent_containers/food/drinks/soda_cans = 1) - time = 15 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/lance - name = "Explosive Lance (Grenade)" - result = /obj/item/twohanded/spear - reqs = list(/obj/item/twohanded/spear = 1, - /obj/item/grenade = 1) - parts = list(/obj/item/twohanded/spear = 1, - /obj/item/grenade = 1) - time = 15 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/strobeshield - name = "Strobe Shield" - result = /obj/item/assembly/flash/shield - reqs = list(/obj/item/wallframe/flasher = 1, - /obj/item/assembly/flash/handheld = 1, - /obj/item/shield/riot = 1) - time = 40 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/makeshiftshield - name = "Makeshift Metal Shield" - result = /obj/item/shield/makeshift - reqs = list(/obj/item/stack/cable_coil = 30, - /obj/item/stack/sheet/metal = 10, - /obj/item/stack/sheet/cloth = 2, - /obj/item/stack/sheet/leather = 3) - tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WIRECUTTER) - time = 100 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/molotov - name = "Molotov" - result = /obj/item/reagent_containers/food/drinks/bottle/molotov - reqs = list(/obj/item/reagent_containers/rag = 1, - /obj/item/reagent_containers/food/drinks/bottle = 1) - parts = list(/obj/item/reagent_containers/food/drinks/bottle = 1) - time = 40 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/stunprod - name = "Stunprod" - result = /obj/item/melee/baton/cattleprod - reqs = list(/obj/item/restraints/handcuffs/cable = 1, - /obj/item/stack/rods = 1, - /obj/item/assembly/igniter = 1) - time = 40 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/teleprod - name = "Teleprod" - result = /obj/item/melee/baton/cattleprod/teleprod - reqs = list(/obj/item/restraints/handcuffs/cable = 1, - /obj/item/stack/rods = 1, - /obj/item/assembly/igniter = 1, - /obj/item/stack/ore/bluespace_crystal = 1) - time = 40 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/bola - name = "Bola" - result = /obj/item/restraints/legcuffs/bola - reqs = list(/obj/item/restraints/handcuffs/cable = 1, - /obj/item/stack/sheet/metal = 6) - time = 20//15 faster than crafting them by hand! - category= CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/tailclub - name = "Tail Club" - result = /obj/item/tailclub - reqs = list(/obj/item/organ/tail/lizard = 1, - /obj/item/stack/sheet/metal = 1) - time = 40 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/tailwhip - name = "Liz O' Nine Tails" - result = /obj/item/melee/chainofcommand/tailwhip - reqs = list(/obj/item/organ/tail/lizard = 1, - /obj/item/stack/cable_coil = 1) - time = 40 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/catwhip - name = "Cat O' Nine Tails" - result = /obj/item/melee/chainofcommand/tailwhip/kitty - reqs = list(/obj/item/organ/tail/cat = 1, - /obj/item/stack/cable_coil = 1) - time = 40 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/ed209 - name = "ED209" - result = /mob/living/simple_animal/bot/ed209 - reqs = list(/obj/item/robot_suit = 1, - /obj/item/clothing/head/helmet = 1, - /obj/item/clothing/suit/armor/vest = 1, - /obj/item/bodypart/l_leg/robot = 1, - /obj/item/bodypart/r_leg/robot = 1, - /obj/item/stack/sheet/metal = 1, - /obj/item/stack/cable_coil = 1, - /obj/item/gun/energy/e_gun/advtaser = 1, - /obj/item/stock_parts/cell = 1, - /obj/item/assembly/prox_sensor = 1) - tools = list(TOOL_WELDER, TOOL_SCREWDRIVER) - time = 60 - category = CAT_ROBOT - -/datum/crafting_recipe/secbot - name = "Secbot" - result = /mob/living/simple_animal/bot/secbot - reqs = list(/obj/item/assembly/signaler = 1, - /obj/item/clothing/head/helmet/sec = 1, - /obj/item/melee/baton = 1, - /obj/item/assembly/prox_sensor = 1, - /obj/item/bodypart/r_arm/robot = 1) - tools = list(TOOL_WELDER) - time = 60 - category = CAT_ROBOT - -/datum/crafting_recipe/cleanbot - name = "Cleanbot" - result = /mob/living/simple_animal/bot/cleanbot - reqs = list(/obj/item/reagent_containers/glass/bucket = 1, - /obj/item/assembly/prox_sensor = 1, - /obj/item/bodypart/r_arm/robot = 1) - time = 40 - category = CAT_ROBOT - -/datum/crafting_recipe/floorbot - name = "Floorbot" - result = /mob/living/simple_animal/bot/floorbot - reqs = list(/obj/item/storage/toolbox/mechanical = 1, - /obj/item/stack/tile/plasteel = 1, - /obj/item/assembly/prox_sensor = 1, - /obj/item/bodypart/r_arm/robot = 1) - time = 40 - category = CAT_ROBOT - -/datum/crafting_recipe/medbot - name = "Medbot" - result = /mob/living/simple_animal/bot/medbot - reqs = list(/obj/item/healthanalyzer = 1, - /obj/item/storage/firstaid = 1, - /obj/item/assembly/prox_sensor = 1, - /obj/item/bodypart/r_arm/robot = 1) - time = 40 - category = CAT_ROBOT - -/datum/crafting_recipe/honkbot - name = "Honkbot" - result = /mob/living/simple_animal/bot/honkbot - reqs = list(/obj/item/storage/box/clown = 1, - /obj/item/bodypart/r_arm/robot = 1, - /obj/item/assembly/prox_sensor = 1, - /obj/item/bikehorn/ = 1) - time = 40 - category = CAT_ROBOT - -/datum/crafting_recipe/Firebot - name = "Firebot" - result = /mob/living/simple_animal/bot/firebot - reqs = list(/obj/item/extinguisher = 1, - /obj/item/bodypart/r_arm/robot = 1, - /obj/item/assembly/prox_sensor = 1, - /obj/item/clothing/head/hardhat/red = 1) - time = 40 - category = CAT_ROBOT - -/datum/crafting_recipe/potatos - name = "Potat-OS" - reqs = list(/obj/item/stack/cable_coil = 1, /obj/item/stack/rods = 1, /obj/item/reagent_containers/food/snacks/grown/potato = 1, /obj/item/aicard = 1 ) - result = /obj/item/aicard/potato - category = CAT_ROBOT - -/datum/crafting_recipe/improvised_pneumatic_cannon //Pretty easy to obtain but - name = "Pneumatic Cannon" - result = /obj/item/pneumatic_cannon/ghetto - tools = list(TOOL_WELDER, TOOL_WRENCH) - reqs = list(/obj/item/stack/sheet/metal = 4, - /obj/item/stack/packageWrap = 8, - /obj/item/pipe = 2) - time = 300 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/flamethrower - name = "Flamethrower" - result = /obj/item/flamethrower - reqs = list(/obj/item/weldingtool = 1, - /obj/item/assembly/igniter = 1, - /obj/item/stack/rods = 1) - parts = list(/obj/item/assembly/igniter = 1, - /obj/item/weldingtool = 1) - tools = list(TOOL_SCREWDRIVER) - time = 10 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/meteorslug - name = "Meteorslug Shell" - result = /obj/item/ammo_casing/shotgun/meteorslug - reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, - /obj/item/rcd_ammo = 1, - /obj/item/stock_parts/manipulator = 2) - tools = list(TOOL_SCREWDRIVER) - time = 5 - category = CAT_WEAPONRY - subcategory = CAT_AMMO - -/datum/crafting_recipe/pulseslug - name = "Pulse Slug Shell" - result = /obj/item/ammo_casing/shotgun/pulseslug - reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, - /obj/item/stock_parts/capacitor/adv = 2, - /obj/item/stock_parts/micro_laser/ultra = 1) - tools = list(TOOL_SCREWDRIVER) - time = 5 - category = CAT_WEAPONRY - subcategory = CAT_AMMO - -/datum/crafting_recipe/dragonsbreath - name = "Dragonsbreath Shell" - result = /obj/item/ammo_casing/shotgun/dragonsbreath - reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, /datum/reagent/phosphorus = 5) - tools = list(TOOL_SCREWDRIVER) - time = 5 - category = CAT_WEAPONRY - subcategory = CAT_AMMO - -/datum/crafting_recipe/frag12 - name = "FRAG-12 Shell" - result = /obj/item/ammo_casing/shotgun/frag12 - reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, - /datum/reagent/glycerol = 5, - /datum/reagent/toxin/acid = 5, - /datum/reagent/toxin/acid/fluacid = 5) - tools = list(TOOL_SCREWDRIVER) - time = 5 - category = CAT_WEAPONRY - subcategory = CAT_AMMO - -/datum/crafting_recipe/ionslug - name = "Ion Scatter Shell" - result = /obj/item/ammo_casing/shotgun/ion - reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, - /obj/item/stock_parts/micro_laser/ultra = 1, - /obj/item/stock_parts/subspace/crystal = 1) - tools = list(TOOL_SCREWDRIVER) - time = 5 - category = CAT_WEAPONRY - subcategory = CAT_AMMO - -/datum/crafting_recipe/improvisedslug - name = "Improvised Shotgun Shell" - result = /obj/item/ammo_casing/shotgun/improvised - reqs = list(/obj/item/grenade/chem_grenade = 1, - /obj/item/stack/sheet/metal = 1, - /obj/item/stack/cable_coil = 1, - /datum/reagent/fuel = 10) - tools = list(TOOL_SCREWDRIVER) - time = 5 - category = CAT_WEAPONRY - subcategory = CAT_AMMO - -/datum/crafting_recipe/laserslug - name = "Scatter Laser Shell" - result = /obj/item/ammo_casing/shotgun/laserslug - reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, - /obj/item/stock_parts/capacitor/adv = 1, - /obj/item/stock_parts/micro_laser/high = 1) - tools = list(TOOL_SCREWDRIVER) - time = 5 - category = CAT_WEAPONRY - subcategory = CAT_AMMO - -/datum/crafting_recipe/ishotgun - name = "Improvised Shotgun" - result = /obj/item/gun/ballistic/revolver/doublebarrel/improvised - reqs = list(/obj/item/weaponcrafting/receiver = 1, - /obj/item/pipe = 1, - /obj/item/weaponcrafting/stock = 1, - /obj/item/stack/packageWrap = 5) - tools = list(TOOL_SCREWDRIVER) - time = 100 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/irifle - name = "Improvised Rifle(7.62mm)" - result = /obj/item/gun/ballistic/shotgun/boltaction/improvised - reqs = list(/obj/item/weaponcrafting/receiver = 1, - /obj/item/pipe = 2, - /obj/item/weaponcrafting/stock = 1, - /obj/item/stack/packageWrap = 5) - tools = list(TOOL_SCREWDRIVER) - time = 100 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/chainsaw - name = "Chainsaw" - result = /obj/item/twohanded/required/chainsaw - reqs = list(/obj/item/circular_saw = 1, - /obj/item/stack/cable_coil = 3, - /obj/item/stack/sheet/plasteel = 5) - tools = list(TOOL_WELDER) - time = 50 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/spear - name = "Spear" - result = /obj/item/twohanded/spear - reqs = list(/obj/item/restraints/handcuffs/cable = 1, - /obj/item/shard = 1, - /obj/item/stack/rods = 1) - parts = list(/obj/item/shard = 1) - time = 40 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/spooky_camera - name = "Camera Obscura" - result = /obj/item/camera/spooky - time = 15 - reqs = list(/obj/item/camera = 1, - /datum/reagent/water/holywater = 10) - parts = list(/obj/item/camera = 1) - category = CAT_MISC - -/datum/crafting_recipe/skateboard - name = "Skateboard" - result = /obj/vehicle/ridden/scooter/skateboard - time = 60 - reqs = list(/obj/item/stack/sheet/metal = 5, - /obj/item/stack/rods = 10) - category = CAT_MISC - -/datum/crafting_recipe/scooter - name = "Scooter" - result = /obj/vehicle/ridden/scooter - time = 65 - reqs = list(/obj/item/stack/sheet/metal = 5, - /obj/item/stack/rods = 12) - category = CAT_MISC - -/datum/crafting_recipe/mousetrap - name = "Mouse Trap" - result = /obj/item/assembly/mousetrap - time = 10 - reqs = list(/obj/item/stack/sheet/cardboard = 1, - /obj/item/stack/rods = 1) - category = CAT_MISC - -/datum/crafting_recipe/papersack - name = "Paper Sack" - result = /obj/item/storage/box/papersack - time = 10 - reqs = list(/obj/item/paper = 5) - category = CAT_MISC - -/datum/crafting_recipe/flashlight_eyes - name = "Flashlight Eyes" - result = /obj/item/organ/eyes/robotic/flashlight - time = 10 - reqs = list( - /obj/item/flashlight = 2, - /obj/item/restraints/handcuffs/cable = 1 - ) - category = CAT_MISC - -/datum/crafting_recipe/paperframes - name = "Paper Frames" - result = /obj/item/stack/sheet/paperframes/five - time = 10 - reqs = list(/obj/item/stack/sheet/mineral/wood = 5, /obj/item/paper = 20) - category = CAT_MISC - -/datum/crafting_recipe/naturalpaper - name = "Hand-Pressed Paper" - time = 30 - reqs = list(/datum/reagent/water = 50, /obj/item/stack/sheet/mineral/wood = 1) - tools = list(/obj/item/hatchet) - result = /obj/item/paper_bin/bundlenatural - category = CAT_MISC - -/datum/crafting_recipe/toysword - name = "Toy Sword" - reqs = list(/obj/item/light/bulb = 1, /obj/item/stack/cable_coil = 1, /obj/item/stack/sheet/plastic = 4) - result = /obj/item/toy/sword - category = CAT_MISC - -/datum/crafting_recipe/blackcarpet - name = "Black Carpet" - reqs = list(/obj/item/stack/tile/carpet = 50, /obj/item/toy/crayon/black = 1) - result = /obj/item/stack/tile/carpet/black/fifty - category = CAT_MISC - -/datum/crafting_recipe/showercurtain - name = "Shower Curtains" - reqs = list(/obj/item/stack/sheet/cloth = 2, /obj/item/stack/sheet/plastic = 2, /obj/item/stack/rods = 1) - result = /obj/structure/curtain - category = CAT_MISC - -/datum/crafting_recipe/extendohand - name = "Extendo-Hand" - reqs = list(/obj/item/bodypart/r_arm/robot = 1, /obj/item/clothing/gloves/boxing = 1) - result = /obj/item/extendohand - category = CAT_MISC - -/datum/crafting_recipe/bluespacehonker - name = "Bluespace Bike horn" - result = /obj/item/bikehorn/bluespacehonker - time = 10 - reqs = list(/obj/item/stack/ore/bluespace_crystal = 1, - /obj/item/toy/crayon/blue = 1, - /obj/item/bikehorn = 1) - category = CAT_MISC - -/datum/crafting_recipe/toyneb - name = "Non-Euplastic Blade" - reqs = list(/obj/item/light/tube = 1, /obj/item/stack/cable_coil = 1, /obj/item/stack/sheet/plastic = 4) - result = /obj/item/toy/sword/cx - category = CAT_MISC - -/datum/crafting_recipe/chemical_payload - name = "Chemical Payload (C4)" - result = /obj/item/bombcore/chemical - reqs = list( - /obj/item/stock_parts/matter_bin = 1, - /obj/item/grenade/plastic/c4 = 1, - /obj/item/grenade/chem_grenade = 2 - ) - parts = list(/obj/item/stock_parts/matter_bin = 1, /obj/item/grenade/chem_grenade = 2) - time = 30 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/chemical_payload2 - name = "Chemical Payload (Gibtonite)" - result = /obj/item/bombcore/chemical - reqs = list( - /obj/item/stock_parts/matter_bin = 1, - /obj/item/twohanded/required/gibtonite = 1, - /obj/item/grenade/chem_grenade = 2 - ) - parts = list(/obj/item/stock_parts/matter_bin = 1, /obj/item/grenade/chem_grenade = 2) - time = 50 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/bonearmor - name = "Bone Armor" - result = /obj/item/clothing/suit/armor/bone - time = 30 - reqs = list(/obj/item/stack/sheet/bone = 6) - category = CAT_PRIMAL - -/datum/crafting_recipe/bonetalisman - name = "Bone Talisman" - result = /obj/item/clothing/accessory/talisman - time = 20 - reqs = list(/obj/item/stack/sheet/bone = 2, - /obj/item/stack/sheet/sinew = 1) - category = CAT_PRIMAL - -/datum/crafting_recipe/bonecodpiece - name = "Skull Codpiece" - result = /obj/item/clothing/accessory/skullcodpiece - time = 20 - reqs = list(/obj/item/stack/sheet/bone = 2, - /obj/item/stack/sheet/animalhide/goliath_hide = 1) - category = CAT_PRIMAL - -/datum/crafting_recipe/bracers - name = "Bone Bracers" - result = /obj/item/clothing/gloves/bracer - time = 20 - reqs = list(/obj/item/stack/sheet/bone = 2, - /obj/item/stack/sheet/sinew = 1) - category = CAT_PRIMAL - -/datum/crafting_recipe/skullhelm - name = "Skull Helmet" - result = /obj/item/clothing/head/helmet/skull - time = 30 - reqs = list(/obj/item/stack/sheet/bone = 4) - category = CAT_PRIMAL - -/datum/crafting_recipe/goliathcloak - name = "Goliath Cloak" - result = /obj/item/clothing/suit/hooded/cloak/goliath - time = 50 - reqs = list(/obj/item/stack/sheet/leather = 2, - /obj/item/stack/sheet/sinew = 2, - /obj/item/stack/sheet/animalhide/goliath_hide = 2) //it takes 4 goliaths to make 1 cloak if the plates are skinned - category = CAT_PRIMAL - -/datum/crafting_recipe/drakecloak - name = "Ash Drake Armour" - result = /obj/item/clothing/suit/hooded/cloak/drake - time = 60 - reqs = list(/obj/item/stack/sheet/bone = 10, - /obj/item/stack/sheet/sinew = 2, - /obj/item/stack/sheet/animalhide/ashdrake = 5) - category = CAT_PRIMAL - -/datum/crafting_recipe/bonebag - name = "Bone Satchel" - result = /obj/item/storage/backpack/satchel/bone - time = 30 - reqs = list(/obj/item/stack/sheet/bone = 3, - /obj/item/stack/sheet/sinew = 2) - category = CAT_PRIMAL - -/datum/crafting_recipe/gold_horn - name = "Golden Bike Horn" - result = /obj/item/bikehorn/golden - time = 20 - reqs = list(/obj/item/stack/sheet/mineral/bananium = 5, - /obj/item/bikehorn = 1) - category = CAT_MISC - -/datum/crafting_recipe/bonedagger - name = "Bone Dagger" - result = /obj/item/kitchen/knife/combat/bone - time = 20 - reqs = list(/obj/item/stack/sheet/bone = 2) - category = CAT_PRIMAL - -/datum/crafting_recipe/bonespear - name = "Bone Spear" - result = /obj/item/twohanded/bonespear - time = 30 - reqs = list(/obj/item/stack/sheet/bone = 4, - /obj/item/stack/sheet/sinew = 1) - category = CAT_PRIMAL - -/datum/crafting_recipe/boneaxe - name = "Bone Axe" - result = /obj/item/twohanded/fireaxe/boneaxe - time = 50 - reqs = list(/obj/item/stack/sheet/bone = 6, - /obj/item/stack/sheet/sinew = 3) - category = CAT_PRIMAL - -/datum/crafting_recipe/bonfire - name = "Bonfire" - time = 60 - reqs = list(/obj/item/grown/log = 5) - result = /obj/structure/bonfire - category = CAT_PRIMAL - -/datum/crafting_recipe/headpike - name = "Spike Head (Glass Spear)" - time = 65 - reqs = list(/obj/item/twohanded/spear = 1, - /obj/item/bodypart/head = 1) - parts = list(/obj/item/bodypart/head = 1, - /obj/item/twohanded/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, - /obj/item/bodypart/head = 1) - parts = list(/obj/item/bodypart/head = 1, - /obj/item/twohanded/bonespear = 1) - result = /obj/structure/headpike/bone - category = CAT_PRIMAL - -/datum/crafting_recipe/smallcarton - name = "Small Carton" - result = /obj/item/reagent_containers/food/drinks/sillycup/smallcarton - time = 10 - reqs = list(/obj/item/stack/sheet/cardboard = 1) - category = CAT_MISC - -/datum/crafting_recipe/pressureplate - name = "Pressure Plate" - result = /obj/item/pressure_plate - time = 5 - reqs = list(/obj/item/stack/sheet/metal = 1, - /obj/item/stack/tile/plasteel = 1, - /obj/item/stack/cable_coil = 2, - /obj/item/assembly/igniter = 1) - category = CAT_MISC - - -/datum/crafting_recipe/wheelchair - name = "Wheelchair" - result = /obj/vehicle/ridden/wheelchair - reqs = list(/obj/item/stack/sheet/plasteel = 2, - /obj/item/stack/rods = 8) - time = 100 - category = CAT_MISC - -/datum/crafting_recipe/rcl - name = "Makeshift Rapid Cable Layer" - result = /obj/item/twohanded/rcl/ghetto - time = 40 - tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WRENCH) - reqs = list(/obj/item/stack/sheet/metal = 15) - category = CAT_MISC - -/datum/crafting_recipe/mummy - name = "Mummification Bandages (Mask)" - result = /obj/item/clothing/mask/mummy - time = 10 - tools = list(/obj/item/nullrod/egyptian) - reqs = list(/obj/item/stack/sheet/cloth = 2) - category = CAT_CLOTHING - -/datum/crafting_recipe/mummy/body - name = "Mummification Bandages (Body)" - result = /obj/item/clothing/under/mummy - reqs = list(/obj/item/stack/sheet/cloth = 5) - -/datum/crafting_recipe/guillotine - name = "Guillotine" - result = /obj/structure/guillotine - time = 150 // Building a functioning guillotine takes time - reqs = list(/obj/item/stack/sheet/plasteel = 3, - /obj/item/stack/sheet/mineral/wood = 20, - /obj/item/stack/cable_coil = 10) - tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER) - category = CAT_MISC - -/datum/crafting_recipe/femur_breaker - name = "Femur Breaker" - result = /obj/structure/femur_breaker - time = 150 - reqs = list(/obj/item/stack/sheet/metal = 20, - /obj/item/stack/cable_coil = 30) - tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER) - category = CAT_MISC - -/datum/crafting_recipe/lizardhat - name = "Lizard Cloche Hat" - result = /obj/item/clothing/head/lizard - time = 10 - reqs = list(/obj/item/organ/tail/lizard = 1) - category = CAT_CLOTHING - -/datum/crafting_recipe/lizardhat_alternate - name = "Lizard Cloche Hat" - result = /obj/item/clothing/head/lizard - time = 10 - reqs = list(/obj/item/stack/sheet/animalhide/lizard = 1) - category = CAT_CLOTHING - -/datum/crafting_recipe/kittyears - name = "Kitty Ears" - result = /obj/item/clothing/head/kitty/genuine - time = 10 - reqs = list(/obj/item/organ/tail/cat = 1, - /obj/item/organ/ears/cat = 1) - category = CAT_CLOTHING - -/datum/crafting_recipe/hudsunsec - name = "Security HUDsunglasses" - result = /obj/item/clothing/glasses/hud/security/sunglasses - time = 20 - tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) - reqs = list(/obj/item/clothing/glasses/hud/security = 1, - /obj/item/clothing/glasses/sunglasses = 1, - /obj/item/stack/cable_coil = 5) - category = CAT_CLOTHING - -/datum/crafting_recipe/hudsunsecremoval - name = "Security HUD removal" - result = /obj/item/clothing/glasses/sunglasses - time = 20 - tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) - reqs = list(/obj/item/clothing/glasses/hud/security/sunglasses = 1) - category = CAT_CLOTHING - -/datum/crafting_recipe/hudsunmed - name = "Medical HUDsunglasses" - result = /obj/item/clothing/glasses/hud/health/sunglasses - time = 20 - tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) - reqs = list(/obj/item/clothing/glasses/hud/health = 1, - /obj/item/clothing/glasses/sunglasses = 1, - /obj/item/stack/cable_coil = 5) - category = CAT_CLOTHING - -/datum/crafting_recipe/hudsunmedremoval - name = "Medical HUD removal" - result = /obj/item/clothing/glasses/sunglasses - time = 20 - tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) - reqs = list(/obj/item/clothing/glasses/hud/health/sunglasses = 1) - category = CAT_CLOTHING - -/datum/crafting_recipe/beergoggles - name = "Beer Goggles" - result = /obj/item/clothing/glasses/sunglasses/reagent - time = 20 - tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) - reqs = list(/obj/item/clothing/glasses/science = 1, - /obj/item/clothing/glasses/sunglasses = 1, - /obj/item/stack/cable_coil = 5) - category = CAT_CLOTHING - -/datum/crafting_recipe/beergogglesremoval - name = "Beer Goggles removal" - result = /obj/item/clothing/glasses/sunglasses - time = 20 - tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) - reqs = list(/obj/item/clothing/glasses/sunglasses/reagent = 1) - category = CAT_CLOTHING - -/datum/crafting_recipe/ghostsheet - name = "Ghost Sheet" - result = /obj/item/clothing/suit/ghost_sheet - time = 5 - tools = list(TOOL_WIRECUTTER) - reqs = list(/obj/item/bedsheet = 1) - category = CAT_CLOTHING - -/datum/crafting_recipe/briefcase - name = "Hand made Briefcase" - result = /obj/item/storage/briefcase/crafted - time = 35 - tools = list(TOOL_WIRECUTTER) - reqs = list(/obj/item/stack/sheet/cardboard = 1, - /obj/item/stack/sheet/cloth = 2, - /obj/item/stack/sheet/leather = 5) - category = CAT_CLOTHING - -/datum/crafting_recipe/aitater - name = "intelliTater" - result = /obj/item/aicard/aitater - time = 30 - reqs = list(/obj/item/aicard = 1, - /obj/item/reagent_containers/food/snacks/grown/potato = 1) - category = CAT_MISC - -/datum/crafting_recipe/paperwork - name = "Filed Paper Work" - result = /obj/item/folder/paperwork_correct - time = 60 //Takes time for people to file and complete paper work! - reqs = list(/obj/item/pen = 1, - /obj/item/folder/paperwork = 2) - category = CAT_MISC - -/datum/crafting_recipe/ghettojetpack - name = "Improvised Jetpack" - result = /obj/item/tank/jetpack/improvised - time = 30 - reqs = list(/obj/item/tank/internals/oxygen = 2, - /obj/item/extinguisher = 1, - /obj/item/pipe = 3, - /obj/item/stack/cable_coil = 30) - category = CAT_MISC - tools = list(TOOL_WRENCH, TOOL_WELDER, TOOL_WIRECUTTER) - -/datum/crafting_recipe/goldenbox - name = "Gold Plated Toolbox" - result = /obj/item/storage/toolbox/gold_fake - reqs = list(/obj/item/stack/sheet/cardboard = 1, //so we dont null items in crafting - /obj/item/stack/cable_coil = 10, - /obj/item/stack/sheet/mineral/gold = 1, - /obj/item/stock_parts/cell = 1, - /datum/reagent/water = 15) - time = 40 - category = CAT_MISC - -/datum/crafting_recipe/bronze_driver - name = "Bronze Plated Screwdriver" - result = /obj/item/screwdriver/bronze - reqs = list(/obj/item/screwdriver = 1, - /obj/item/stack/cable_coil = 10, - /obj/item/stack/tile/bronze = 1, - /datum/reagent/water = 15) - time = 40 - category = CAT_MISC - -/datum/crafting_recipe/bronze_welder - name = "Bronze Plated Welding Tool" - result = /obj/item/weldingtool/bronze - reqs = list(/obj/item/weldingtool = 1, - /obj/item/stack/cable_coil = 10, - /obj/item/stack/tile/bronze = 1, - /datum/reagent/water = 15) - time = 40 - category = CAT_MISC - -/datum/crafting_recipe/bronze_wirecutters - name = "Bronze Plated Wirecutters" - result = /obj/item/wirecutters/bronze - reqs = list(/obj/item/wirecutters = 1, - /obj/item/stack/cable_coil = 10, - /obj/item/stack/tile/bronze = 1, - /datum/reagent/water = 15) - time = 40 - category = CAT_MISC - -/datum/crafting_recipe/bronze_crowbar - name = "Bronze Plated Crowbar" - result = /obj/item/crowbar/bronze - reqs = list(/obj/item/crowbar = 1, - /obj/item/stack/cable_coil = 10, - /obj/item/stack/tile/bronze = 1, - /datum/reagent/water = 15) - time = 40 - category = CAT_MISC - -/datum/crafting_recipe/bronze_wrench - name = "Bronze Plated Wrench" - result = /obj/item/wrench/bronze - reqs = list(/obj/item/wrench = 1, - /obj/item/stack/cable_coil = 10, - /obj/item/stack/tile/bronze = 1, - /datum/reagent/water = 15) - time = 40 - category = CAT_MISC - -/datum/crafting_recipe/smartdart - name = "Medical smartdart" - result = /obj/item/reagent_containers/syringe/dart - reqs = list(/obj/item/stack/sheet/metal = 1, - /obj/item/stack/sheet/glass = 1, - /obj/item/stack/sheet/plastic = 1) - time = 10 - category = CAT_WEAPONRY - subcategory = CAT_AMMO - -/datum/crafting_recipe/medolier - name = "Medolier" - result = /obj/item/storage/belt/medolier - reqs = list(/obj/item/stack/sheet/metal = 2, - /obj/item/stack/sheet/cloth = 3, - /obj/item/stack/sheet/plastic = 4) - time = 30 - category = CAT_WEAPONRY - subcategory = CAT_AMMO - -/datum/crafting_recipe/smartdartgun - name = "Smart dartgun" - result = /obj/item/gun/syringe/dart - reqs = list(/obj/item/stack/sheet/metal = 15, - /obj/item/stack/sheet/glass = 10, - /obj/item/tank/internals = 1, - /obj/item/reagent_containers/glass/beaker = 1, - /obj/item/stack/sheet/plastic = 10, - /obj/item/stack/cable_coil = 2) - time = 150 //It's a gun - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/durathread_duffelbag - name = "Durathread Dufflebag" - result = /obj/item/storage/backpack/duffelbag/durathread - reqs = list(/obj/item/stack/sheet/durathread = 7, - /obj/item/stack/sheet/leather = 3) - time = 70 - category = CAT_CLOTHING - -/datum/crafting_recipe/durathread_toolbelt - name = "Durathread Toolbelt" - result = /obj/item/storage/belt/durathread - reqs = list(/obj/item/stack/sheet/durathread = 5, - /obj/item/stack/sheet/leather = 1) - time = 30 - category = CAT_CLOTHING - -/datum/crafting_recipe/durathread_bandolier - name = "Durathread Bandolier" - result = /obj/item/storage/belt/bandolier/durathread - reqs = list(/obj/item/stack/sheet/durathread = 6, - /obj/item/stack/sheet/leather = 2) - time = 50 - category = CAT_CLOTHING - - /datum/crafting_recipe/durathread_helmet - name = "Makeshift Durathread Helmet" - result = /obj/item/clothing/head/helmet/durathread - reqs = list(/obj/item/stack/sheet/durathread = 4, - /obj/item/stack/sheet/leather = 2) - time = 30 - category = CAT_CLOTHING - -/datum/crafting_recipe/durathread_vest - name = "Makeshift Durathread Armour" - result = /obj/item/clothing/suit/armor/vest/durathread - reqs = list(/obj/item/stack/sheet/durathread = 6, - /obj/item/stack/sheet/leather = 3) - time = 50 - category = CAT_CLOTHING - + var/always_availible = TRUE //Set to FALSE if it needs to be learned first. \ No newline at end of file diff --git a/code/modules/crafting/recipes/recipes_clothing.dm b/code/modules/crafting/recipes/recipes_clothing.dm new file mode 100644 index 0000000000..f48ee87316 --- /dev/null +++ b/code/modules/crafting/recipes/recipes_clothing.dm @@ -0,0 +1,160 @@ +/datum/crafting_recipe/mummy + name = "Mummification Bandages (Mask)" + result = /obj/item/clothing/mask/mummy + time = 10 + tools = list(/obj/item/nullrod/egyptian) + reqs = list(/obj/item/stack/sheet/cloth = 2) + category = CAT_CLOTHING + +/datum/crafting_recipe/mummy/body + name = "Mummification Bandages (Body)" + result = /obj/item/clothing/under/mummy + reqs = list(/obj/item/stack/sheet/cloth = 5) + +/datum/crafting_recipe/lizardhat + name = "Lizard Cloche Hat" + result = /obj/item/clothing/head/lizard + time = 10 + reqs = list(/obj/item/organ/tail/lizard = 1) + category = CAT_CLOTHING + +/datum/crafting_recipe/lizardhat_alternate + name = "Lizard Cloche Hat" + result = /obj/item/clothing/head/lizard + time = 10 + reqs = list(/obj/item/stack/sheet/animalhide/lizard = 1) + category = CAT_CLOTHING + +/datum/crafting_recipe/kittyears + name = "Kitty Ears" + result = /obj/item/clothing/head/kitty/genuine + time = 10 + reqs = list(/obj/item/organ/tail/cat = 1, + /obj/item/organ/ears/cat = 1) + category = CAT_CLOTHING + +/datum/crafting_recipe/hudsunsec + name = "Security HUDsunglasses" + result = /obj/item/clothing/glasses/hud/security/sunglasses + time = 20 + tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + reqs = list(/obj/item/clothing/glasses/hud/security = 1, + /obj/item/clothing/glasses/sunglasses = 1, + /obj/item/stack/cable_coil = 5) + category = CAT_CLOTHING + +/datum/crafting_recipe/hudsunsecremoval + name = "Security HUD removal" + result = /obj/item/clothing/glasses/sunglasses + time = 20 + tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + reqs = list(/obj/item/clothing/glasses/hud/security/sunglasses = 1) + category = CAT_CLOTHING + +/datum/crafting_recipe/hudsunmed + name = "Medical HUDsunglasses" + result = /obj/item/clothing/glasses/hud/health/sunglasses + time = 20 + tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + reqs = list(/obj/item/clothing/glasses/hud/health = 1, + /obj/item/clothing/glasses/sunglasses = 1, + /obj/item/stack/cable_coil = 5) + category = CAT_CLOTHING + +/datum/crafting_recipe/hudsunmedremoval + name = "Medical HUD removal" + result = /obj/item/clothing/glasses/sunglasses + time = 20 + tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + reqs = list(/obj/item/clothing/glasses/hud/health/sunglasses = 1) + category = CAT_CLOTHING + +/datum/crafting_recipe/beergoggles + name = "Beer Goggles" + result = /obj/item/clothing/glasses/sunglasses/reagent + time = 20 + tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + reqs = list(/obj/item/clothing/glasses/science = 1, + /obj/item/clothing/glasses/sunglasses = 1, + /obj/item/stack/cable_coil = 5) + category = CAT_CLOTHING + +/datum/crafting_recipe/beergogglesremoval + name = "Beer Goggles removal" + result = /obj/item/clothing/glasses/sunglasses + time = 20 + tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + reqs = list(/obj/item/clothing/glasses/sunglasses/reagent = 1) + category = CAT_CLOTHING + +/datum/crafting_recipe/ghostsheet + name = "Ghost Sheet" + result = /obj/item/clothing/suit/ghost_sheet + time = 5 + tools = list(TOOL_WIRECUTTER) + reqs = list(/obj/item/bedsheet = 1) + category = CAT_CLOTHING + +/datum/crafting_recipe/briefcase + name = "Hand made Briefcase" + result = /obj/item/storage/briefcase/crafted + time = 35 + tools = list(TOOL_WIRECUTTER) + reqs = list(/obj/item/stack/sheet/cardboard = 1, + /obj/item/stack/sheet/cloth = 2, + /obj/item/stack/sheet/leather = 5) + category = CAT_CLOTHING + +/datum/crafting_recipe/medolier + name = "Medolier" + result = /obj/item/storage/belt/medolier + reqs = list(/obj/item/stack/sheet/metal = 2, + /obj/item/stack/sheet/cloth = 3, + /obj/item/stack/sheet/plastic = 4) + time = 30 + category = CAT_CLOTHING + +/datum/crafting_recipe/durathread_duffelbag + name = "Durathread Dufflebag" + result = /obj/item/storage/backpack/duffelbag/durathread + reqs = list(/obj/item/stack/sheet/durathread = 7, + /obj/item/stack/sheet/leather = 3) + time = 70 + always_availible = TRUE + category = CAT_CLOTHING + +/datum/crafting_recipe/durathread_toolbelt + name = "Durathread Toolbelt" + result = /obj/item/storage/belt/durathread + reqs = list(/obj/item/stack/sheet/durathread = 5, + /obj/item/stack/sheet/leather = 2) + time = 30 + always_availible = TRUE + category = CAT_CLOTHING + +/datum/crafting_recipe/durathread_bandolier + name = "Durathread Bandolier" + result = /obj/item/storage/belt/bandolier/durathread + reqs = list(/obj/item/stack/sheet/durathread = 6, + /obj/item/stack/sheet/leather = 2) + time = 50 + always_availible = TRUE + category = CAT_CLOTHING + +/datum/crafting_recipe/durathread_helmet + name = "Makeshift Durathread Helmet" + result = /obj/item/clothing/head/helmet/durathread + reqs = list(/obj/item/stack/sheet/durathread = 4, + /obj/item/stack/sheet/leather = 2) + time = 30 + always_availible = TRUE + category = CAT_CLOTHING + +/datum/crafting_recipe/durathread_vest + name = "Makeshift Durathread Armour" + result = /obj/item/clothing/suit/armor/vest/durathread + reqs = list(/obj/item/stack/sheet/durathread = 6, + /obj/item/stack/sheet/leather = 3) + time = 50 + always_availible = TRUE + category = CAT_CLOTHING diff --git a/code/modules/crafting/recipes/recipes_misc.dm b/code/modules/crafting/recipes/recipes_misc.dm new file mode 100644 index 0000000000..f05c7bd94b --- /dev/null +++ b/code/modules/crafting/recipes/recipes_misc.dm @@ -0,0 +1,325 @@ +///////////////// +//Large Objects// +///////////////// + +/datum/crafting_recipe/showercurtain + name = "Shower Curtains" + reqs = list(/obj/item/stack/sheet/cloth = 2, + /obj/item/stack/sheet/plastic = 2, + /obj/item/stack/rods = 1) + result = /obj/structure/curtain + category = CAT_MISC + +/datum/crafting_recipe/guillotine + name = "Guillotine" + result = /obj/structure/guillotine + time = 150 // Building a functioning guillotine takes time + reqs = list(/obj/item/stack/sheet/plasteel = 3, + /obj/item/stack/sheet/mineral/wood = 20, + /obj/item/stack/cable_coil = 10) + tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER) + category = CAT_MISC + +/datum/crafting_recipe/femur_breaker + name = "Femur Breaker" + result = /obj/structure/femur_breaker + time = 150 + reqs = list(/obj/item/stack/sheet/metal = 20, + /obj/item/stack/cable_coil = 30) + tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER) + category = CAT_MISC + +/////////////////// +//Tools & Storage// +/////////////////// + +/datum/crafting_recipe/ghettojetpack + name = "Improvised Jetpack" + result = /obj/item/tank/jetpack/improvised + time = 30 + reqs = list(/obj/item/tank/internals/oxygen = 2, + /obj/item/extinguisher = 1, + /obj/item/pipe = 3, + /obj/item/stack/cable_coil = 30) + category = CAT_MISC + tools = list(TOOL_WRENCH, TOOL_WELDER, TOOL_WIRECUTTER) + +/datum/crafting_recipe/goldenbox + name = "Gold Plated Toolbox" + result = /obj/item/storage/toolbox/gold_fake + reqs = list(/obj/item/stack/sheet/cardboard = 1, //so we dont null items in crafting + /obj/item/stack/cable_coil = 10, + /obj/item/stack/sheet/mineral/gold = 1, + /obj/item/stock_parts/cell = 1, + /datum/reagent/water = 15) + time = 40 + category = CAT_MISC + +/datum/crafting_recipe/bronze_driver + name = "Bronze Plated Screwdriver" + result = /obj/item/screwdriver/bronze + reqs = list(/obj/item/screwdriver = 1, + /obj/item/stack/cable_coil = 10, + /obj/item/stack/tile/bronze = 1, + /datum/reagent/water = 15) + time = 40 + category = CAT_MISC + +/datum/crafting_recipe/bronze_welder + name = "Bronze Plated Welding Tool" + result = /obj/item/weldingtool/bronze + reqs = list(/obj/item/weldingtool = 1, + /obj/item/stack/cable_coil = 10, + /obj/item/stack/tile/bronze = 1, + /datum/reagent/water = 15) + time = 40 + category = CAT_MISC + +/datum/crafting_recipe/bronze_wirecutters + name = "Bronze Plated Wirecutters" + result = /obj/item/wirecutters/bronze + reqs = list(/obj/item/wirecutters = 1, + /obj/item/stack/cable_coil = 10, + /obj/item/stack/tile/bronze = 1, + /datum/reagent/water = 15) + time = 40 + category = CAT_MISC + +/datum/crafting_recipe/bronze_crowbar + name = "Bronze Plated Crowbar" + result = /obj/item/crowbar/bronze + reqs = list(/obj/item/crowbar = 1, + /obj/item/stack/cable_coil = 10, + /obj/item/stack/tile/bronze = 1, + /datum/reagent/water = 15) + time = 40 + category = CAT_MISC + +/datum/crafting_recipe/bronze_wrench + name = "Bronze Plated Wrench" + result = /obj/item/wrench/bronze + reqs = list(/obj/item/wrench = 1, + /obj/item/stack/cable_coil = 10, + /obj/item/stack/tile/bronze = 1, + /datum/reagent/water = 15) + time = 40 + category = CAT_MISC + +/datum/crafting_recipe/rcl + name = "Makeshift Rapid Cable Layer" + result = /obj/item/twohanded/rcl/ghetto + time = 40 + tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WRENCH) + reqs = list(/obj/item/stack/sheet/metal = 15) + category = CAT_MISC + +//////////// +//Vehicles// +//////////// + +/datum/crafting_recipe/wheelchair + name = "Wheelchair" + result = /obj/vehicle/ridden/wheelchair + reqs = list(/obj/item/stack/sheet/plasteel = 2, + /obj/item/stack/rods = 8) + time = 100 + category = CAT_MISC + +/datum/crafting_recipe/skateboard + name = "Skateboard" + result = /obj/vehicle/ridden/scooter/skateboard + time = 60 + reqs = list(/obj/item/stack/sheet/metal = 5, + /obj/item/stack/rods = 10) + category = CAT_MISC + +/datum/crafting_recipe/scooter + name = "Scooter" + result = /obj/vehicle/ridden/scooter + time = 65 + reqs = list(/obj/item/stack/sheet/metal = 5, + /obj/item/stack/rods = 12) + category = CAT_MISC + +///////// +//Toys/// +///////// + +/datum/crafting_recipe/toysword + name = "Toy Sword" + reqs = list(/obj/item/light/bulb = 1, /obj/item/stack/cable_coil = 1, /obj/item/stack/sheet/plastic = 4) + result = /obj/item/toy/sword + category = CAT_MISC + +/datum/crafting_recipe/extendohand + name = "Extendo-Hand" + reqs = list(/obj/item/bodypart/r_arm/robot = 1, /obj/item/clothing/gloves/boxing = 1) + result = /obj/item/extendohand + category = CAT_MISC + +/datum/crafting_recipe/toyneb + name = "Non-Euplastic Blade" + reqs = list(/obj/item/light/tube = 1, /obj/item/stack/cable_coil = 1, /obj/item/stack/sheet/plastic = 4) + result = /obj/item/toy/sword/cx + category = CAT_MISC + +//////////// +//Unsorted// +//////////// + +/datum/crafting_recipe/blackcarpet + name = "Black Carpet" + reqs = list(/obj/item/stack/tile/carpet = 50, /obj/item/toy/crayon/black = 1) + result = /obj/item/stack/tile/carpet/black/fifty + category = CAT_MISC + +/datum/crafting_recipe/paperframes + name = "Paper Frames" + result = /obj/item/stack/sheet/paperframes/five + time = 10 + reqs = list(/obj/item/stack/sheet/mineral/wood = 5, /obj/item/paper = 20) + category = CAT_MISC + +/datum/crafting_recipe/naturalpaper + name = "Hand-Pressed Paper" + time = 30 + reqs = list(/datum/reagent/water = 50, /obj/item/stack/sheet/mineral/wood = 1) + tools = list(/obj/item/hatchet) + result = /obj/item/paper_bin/bundlenatural + category = CAT_MISC + +/datum/crafting_recipe/bluespacehonker + name = "Bluespace Bike horn" + result = /obj/item/bikehorn/bluespacehonker + time = 10 + reqs = list(/obj/item/stack/ore/bluespace_crystal = 1, + /obj/item/toy/crayon/blue = 1, + /obj/item/bikehorn = 1) + category = CAT_MISC + +/datum/crafting_recipe/aitater + name = "intelliTater" + result = /obj/item/aicard/aitater + time = 30 + reqs = list(/obj/item/aicard = 1, + /obj/item/reagent_containers/food/snacks/grown/potato = 1) + category = CAT_MISC + +/datum/crafting_recipe/mousetrap + name = "Mouse Trap" + result = /obj/item/assembly/mousetrap + time = 10 + reqs = list(/obj/item/stack/sheet/cardboard = 1, + /obj/item/stack/rods = 1) + category = CAT_MISC + +/datum/crafting_recipe/papersack + name = "Paper Sack" + result = /obj/item/storage/box/papersack + time = 10 + reqs = list(/obj/item/paper = 5) + category = CAT_MISC + +/datum/crafting_recipe/flashlight_eyes + name = "Flashlight Eyes" + result = /obj/item/organ/eyes/robotic/flashlight + time = 10 + reqs = list( + /obj/item/flashlight = 2, + /obj/item/restraints/handcuffs/cable = 1 + ) + category = CAT_MISC + +/datum/crafting_recipe/smallcarton + name = "Small Carton" + result = /obj/item/reagent_containers/food/drinks/sillycup/smallcarton + time = 10 + reqs = list(/obj/item/stack/sheet/cardboard = 1) + category = CAT_MISC + +/datum/crafting_recipe/pressureplate + name = "Pressure Plate" + result = /obj/item/pressure_plate + time = 5 + reqs = list(/obj/item/stack/sheet/metal = 1, + /obj/item/stack/tile/plasteel = 1, + /obj/item/stack/cable_coil = 2, + /obj/item/assembly/igniter = 1) + category = CAT_MISC + +/datum/crafting_recipe/gold_horn + name = "Golden Bike Horn" + result = /obj/item/bikehorn/golden + time = 20 + reqs = list(/obj/item/stack/sheet/mineral/bananium = 5, + /obj/item/bikehorn = 1) + category = CAT_MISC + +/datum/crafting_recipe/spooky_camera + name = "Camera Obscura" + result = /obj/item/camera/spooky + time = 15 + reqs = list(/obj/item/camera = 1, + /datum/reagent/water/holywater = 10) + parts = list(/obj/item/camera = 1) + category = CAT_MISC + +/datum/crafting_recipe/paperwork + name = "Filed Paper Work" + result = /obj/item/folder/paperwork_correct + time = 10 //Takes time for people to file and complete paper work! + tools = list(/obj/item/pen) + reqs = list(/obj/item/folder/paperwork = 1) + category = CAT_MISC + +////////////// +//Banners///// +////////////// + +/datum/crafting_recipe/command_banner + name = "Command Banner" + result = /obj/item/banner/command/mundane + time = 40 + reqs = list(/obj/item/stack/rods = 2, + /obj/item/clothing/under/captainparade = 1) + category = CAT_MISC + +/datum/crafting_recipe/engineering_banner + name = "Engitopia Banner" + result = /obj/item/banner/engineering/mundane + time = 40 + reqs = list(/obj/item/stack/rods = 2, + /obj/item/clothing/under/rank/engineer = 1) + category = CAT_MISC + +/datum/crafting_recipe/cargo_banner + name = "Cargonia Banner" + result = /obj/item/banner/cargo/mundane + time = 40 + reqs = list(/obj/item/stack/rods = 2, + /obj/item/clothing/under/rank/cargotech = 1) + category = CAT_MISC + +/datum/crafting_recipe/science_banner + name = "Sciencia Banner" + result = /obj/item/banner/science/mundane + time = 40 + reqs = list(/obj/item/stack/rods = 2, + /obj/item/clothing/under/rank/scientist = 1) + category = CAT_MISC + +/datum/crafting_recipe/medical_banner + name = "Meditopia Banner" + result = /obj/item/banner/medical/mundane + time = 40 + reqs = list(/obj/item/stack/rods = 2, + /obj/item/clothing/under/rank/medical = 1) + category = CAT_MISC + +/datum/crafting_recipe/security_banner + name = "Securistan Banner" + result = /obj/item/banner/security/mundane + time = 40 + reqs = list(/obj/item/stack/rods = 2, + /obj/item/clothing/under/rank/security = 1) + category = CAT_MISC diff --git a/code/modules/crafting/recipes/recipes_primal.dm b/code/modules/crafting/recipes/recipes_primal.dm new file mode 100644 index 0000000000..1be479e4e1 --- /dev/null +++ b/code/modules/crafting/recipes/recipes_primal.dm @@ -0,0 +1,113 @@ +/datum/crafting_recipe/bonearmor + name = "Bone Armor" + result = /obj/item/clothing/suit/armor/bone + time = 30 + reqs = list(/obj/item/stack/sheet/bone = 6) + category = CAT_PRIMAL + +/datum/crafting_recipe/bonetalisman + name = "Bone Talisman" + result = /obj/item/clothing/accessory/talisman + time = 20 + reqs = list(/obj/item/stack/sheet/bone = 2, + /obj/item/stack/sheet/sinew = 1) + category = CAT_PRIMAL + +/datum/crafting_recipe/bonecodpiece + name = "Skull Codpiece" + result = /obj/item/clothing/accessory/skullcodpiece + time = 20 + reqs = list(/obj/item/stack/sheet/bone = 2, + /obj/item/stack/sheet/animalhide/goliath_hide = 1) + category = CAT_PRIMAL + +/datum/crafting_recipe/bracers + name = "Bone Bracers" + result = /obj/item/clothing/gloves/bracer + time = 20 + reqs = list(/obj/item/stack/sheet/bone = 2, + /obj/item/stack/sheet/sinew = 1) + category = CAT_PRIMAL + +/datum/crafting_recipe/skullhelm + name = "Skull Helmet" + result = /obj/item/clothing/head/helmet/skull + time = 30 + reqs = list(/obj/item/stack/sheet/bone = 4) + category = CAT_PRIMAL + +/datum/crafting_recipe/goliathcloak + name = "Goliath Cloak" + result = /obj/item/clothing/suit/hooded/cloak/goliath + time = 50 + reqs = list(/obj/item/stack/sheet/leather = 2, + /obj/item/stack/sheet/sinew = 2, + /obj/item/stack/sheet/animalhide/goliath_hide = 2) //it takes 4 goliaths to make 1 cloak if the plates are skinned + category = CAT_PRIMAL + +/datum/crafting_recipe/drakecloak + name = "Ash Drake Armour" + result = /obj/item/clothing/suit/hooded/cloak/drake + time = 60 + reqs = list(/obj/item/stack/sheet/bone = 10, + /obj/item/stack/sheet/sinew = 2, + /obj/item/stack/sheet/animalhide/ashdrake = 5) + category = CAT_PRIMAL + +/datum/crafting_recipe/bonebag + name = "Bone Satchel" + result = /obj/item/storage/backpack/satchel/bone + time = 30 + reqs = list(/obj/item/stack/sheet/bone = 3, + /obj/item/stack/sheet/sinew = 2) + category = CAT_PRIMAL + +/datum/crafting_recipe/bonedagger + name = "Bone Dagger" + result = /obj/item/kitchen/knife/combat/bone + time = 20 + reqs = list(/obj/item/stack/sheet/bone = 2) + category = CAT_PRIMAL + +/datum/crafting_recipe/bonespear + name = "Bone Spear" + result = /obj/item/twohanded/bonespear + time = 30 + reqs = list(/obj/item/stack/sheet/bone = 4, + /obj/item/stack/sheet/sinew = 1) + category = CAT_PRIMAL + +/datum/crafting_recipe/boneaxe + name = "Bone Axe" + result = /obj/item/twohanded/fireaxe/boneaxe + time = 50 + reqs = list(/obj/item/stack/sheet/bone = 6, + /obj/item/stack/sheet/sinew = 3) + category = CAT_PRIMAL + +/datum/crafting_recipe/bonfire + name = "Bonfire" + time = 60 + reqs = list(/obj/item/grown/log = 5) + result = /obj/structure/bonfire + category = CAT_PRIMAL + +/datum/crafting_recipe/headpike + name = "Spike Head (Glass Spear)" + time = 65 + reqs = list(/obj/item/twohanded/spear = 1, + /obj/item/bodypart/head = 1) + parts = list(/obj/item/bodypart/head = 1, + /obj/item/twohanded/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, + /obj/item/bodypart/head = 1) + parts = list(/obj/item/bodypart/head = 1, + /obj/item/twohanded/bonespear = 1) + result = /obj/structure/headpike/bone + category = CAT_PRIMAL \ No newline at end of file diff --git a/code/modules/crafting/recipes/recipes_robot.dm b/code/modules/crafting/recipes/recipes_robot.dm new file mode 100644 index 0000000000..ae5bca7779 --- /dev/null +++ b/code/modules/crafting/recipes/recipes_robot.dm @@ -0,0 +1,84 @@ + +/datum/crafting_recipe/ed209 + name = "ED209" + result = /mob/living/simple_animal/bot/ed209 + reqs = list(/obj/item/robot_suit = 1, + /obj/item/clothing/head/helmet = 1, + /obj/item/clothing/suit/armor/vest = 1, + /obj/item/bodypart/l_leg/robot = 1, + /obj/item/bodypart/r_leg/robot = 1, + /obj/item/stack/sheet/metal = 1, + /obj/item/stack/cable_coil = 1, + /obj/item/gun/energy/e_gun/advtaser = 1, + /obj/item/stock_parts/cell = 1, + /obj/item/assembly/prox_sensor = 1) + tools = list(TOOL_WELDER, TOOL_SCREWDRIVER) + time = 60 + category = CAT_ROBOT + +/datum/crafting_recipe/secbot + name = "Secbot" + result = /mob/living/simple_animal/bot/secbot + reqs = list(/obj/item/assembly/signaler = 1, + /obj/item/clothing/head/helmet/sec = 1, + /obj/item/melee/baton = 1, + /obj/item/assembly/prox_sensor = 1, + /obj/item/bodypart/r_arm/robot = 1) + tools = list(TOOL_WELDER) + time = 60 + category = CAT_ROBOT + +/datum/crafting_recipe/cleanbot + name = "Cleanbot" + result = /mob/living/simple_animal/bot/cleanbot + reqs = list(/obj/item/reagent_containers/glass/bucket = 1, + /obj/item/assembly/prox_sensor = 1, + /obj/item/bodypart/r_arm/robot = 1) + time = 40 + category = CAT_ROBOT + +/datum/crafting_recipe/floorbot + name = "Floorbot" + result = /mob/living/simple_animal/bot/floorbot + reqs = list(/obj/item/storage/toolbox/mechanical = 1, + /obj/item/stack/tile/plasteel = 1, + /obj/item/assembly/prox_sensor = 1, + /obj/item/bodypart/r_arm/robot = 1) + time = 40 + category = CAT_ROBOT + +/datum/crafting_recipe/medbot + name = "Medbot" + result = /mob/living/simple_animal/bot/medbot + reqs = list(/obj/item/healthanalyzer = 1, + /obj/item/storage/firstaid = 1, + /obj/item/assembly/prox_sensor = 1, + /obj/item/bodypart/r_arm/robot = 1) + time = 40 + category = CAT_ROBOT + +/datum/crafting_recipe/honkbot + name = "Honkbot" + result = /mob/living/simple_animal/bot/honkbot + reqs = list(/obj/item/storage/box/clown = 1, + /obj/item/bodypart/r_arm/robot = 1, + /obj/item/assembly/prox_sensor = 1, + /obj/item/bikehorn/ = 1) + time = 40 + category = CAT_ROBOT + +/datum/crafting_recipe/Firebot + name = "Firebot" + result = /mob/living/simple_animal/bot/firebot + reqs = list(/obj/item/extinguisher = 1, + /obj/item/bodypart/r_arm/robot = 1, + /obj/item/assembly/prox_sensor = 1, + /obj/item/clothing/head/hardhat/red = 1) + time = 40 + category = CAT_ROBOT + +/datum/crafting_recipe/potatos + name = "Potat-OS" + reqs = list(/obj/item/stack/cable_coil = 1, /obj/item/stack/rods = 1, /obj/item/reagent_containers/food/snacks/grown/potato = 1, /obj/item/aicard = 1 ) + result = /obj/item/aicard/potato + category = CAT_ROBOT \ No newline at end of file diff --git a/code/modules/crafting/recipes/recipes_weapon_and_ammo.dm b/code/modules/crafting/recipes/recipes_weapon_and_ammo.dm new file mode 100644 index 0000000000..6eb1c31b12 --- /dev/null +++ b/code/modules/crafting/recipes/recipes_weapon_and_ammo.dm @@ -0,0 +1,345 @@ +/datum/crafting_recipe/pin_removal + name = "Pin Removal" + result = /obj/item/gun + reqs = list(/obj/item/gun = 1) + parts = list(/obj/item/gun = 1) + tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + time = 50 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/datum/crafting_recipe/strobeshield + name = "Strobe Shield" + result = /obj/item/assembly/flash/shield + reqs = list(/obj/item/wallframe/flasher = 1, + /obj/item/assembly/flash/handheld = 1, + /obj/item/shield/riot = 1) + time = 40 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/datum/crafting_recipe/makeshiftshield + name = "Makeshift Metal Shield" + result = /obj/item/shield/makeshift + reqs = list(/obj/item/stack/cable_coil = 30, + /obj/item/stack/sheet/metal = 10, + /obj/item/stack/sheet/cloth = 2, + /obj/item/stack/sheet/leather = 3) + tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + time = 100 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/datum/crafting_recipe/spear + name = "Spear" + result = /obj/item/twohanded/spear + reqs = list(/obj/item/restraints/handcuffs/cable = 1, + /obj/item/shard = 1, + /obj/item/stack/rods = 1) + parts = list(/obj/item/shard = 1) + time = 40 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/datum/crafting_recipe/stunprod + name = "Stunprod" + result = /obj/item/melee/baton/cattleprod + reqs = list(/obj/item/restraints/handcuffs/cable = 1, + /obj/item/stack/rods = 1, + /obj/item/assembly/igniter = 1) + time = 40 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/datum/crafting_recipe/teleprod + name = "Teleprod" + result = /obj/item/melee/baton/cattleprod/teleprod + reqs = list(/obj/item/restraints/handcuffs/cable = 1, + /obj/item/stack/rods = 1, + /obj/item/assembly/igniter = 1, + /obj/item/stack/ore/bluespace_crystal = 1) + time = 40 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/datum/crafting_recipe/bola + name = "Bola" + result = /obj/item/restraints/legcuffs/bola + reqs = list(/obj/item/restraints/handcuffs/cable = 1, + /obj/item/stack/sheet/metal = 6) + time = 20//15 faster than crafting them by hand! + category= CAT_WEAPONRY + subcategory = CAT_WEAPON + +/datum/crafting_recipe/tailclub + name = "Tail Club" + result = /obj/item/tailclub + reqs = list(/obj/item/organ/tail/lizard = 1, + /obj/item/stack/sheet/metal = 1) + time = 40 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/datum/crafting_recipe/tailwhip + name = "Liz O' Nine Tails" + result = /obj/item/melee/chainofcommand/tailwhip + reqs = list(/obj/item/organ/tail/lizard = 1, + /obj/item/stack/cable_coil = 1) + time = 40 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/datum/crafting_recipe/catwhip + name = "Cat O' Nine Tails" + result = /obj/item/melee/chainofcommand/tailwhip/kitty + reqs = list(/obj/item/organ/tail/cat = 1, + /obj/item/stack/cable_coil = 1) + time = 40 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/datum/crafting_recipe/chainsaw + name = "Chainsaw" + result = /obj/item/twohanded/required/chainsaw + reqs = list(/obj/item/circular_saw = 1, + /obj/item/stack/cable_coil = 3, + /obj/item/stack/sheet/plasteel = 5) + tools = list(TOOL_WELDER) + time = 50 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +////////////////// +///BOMB CRAFTING// +////////////////// + +/datum/crafting_recipe/chemical_payload + name = "Chemical Payload (C4)" + result = /obj/item/bombcore/chemical + reqs = list( + /obj/item/stock_parts/matter_bin = 1, + /obj/item/grenade/plastic/c4 = 1, + /obj/item/grenade/chem_grenade = 2 + ) + parts = list(/obj/item/stock_parts/matter_bin = 1, /obj/item/grenade/chem_grenade = 2) + time = 30 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/datum/crafting_recipe/chemical_payload2 + name = "Chemical Payload (Gibtonite)" + result = /obj/item/bombcore/chemical + reqs = list( + /obj/item/stock_parts/matter_bin = 1, + /obj/item/twohanded/required/gibtonite = 1, + /obj/item/grenade/chem_grenade = 2 + ) + parts = list(/obj/item/stock_parts/matter_bin = 1, /obj/item/grenade/chem_grenade = 2) + time = 50 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/datum/crafting_recipe/molotov + name = "Molotov" + result = /obj/item/reagent_containers/food/drinks/bottle/molotov + reqs = list(/obj/item/reagent_containers/rag = 1, + /obj/item/reagent_containers/food/drinks/bottle = 1) + parts = list(/obj/item/reagent_containers/food/drinks/bottle = 1) + time = 40 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/datum/crafting_recipe/IED + name = "IED" + result = /obj/item/grenade/iedcasing + reqs = list(/datum/reagent/fuel = 50, + /obj/item/stack/cable_coil = 1, + /obj/item/assembly/igniter = 1, + /obj/item/reagent_containers/food/drinks/soda_cans = 1) + parts = list(/obj/item/reagent_containers/food/drinks/soda_cans = 1) + time = 15 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/datum/crafting_recipe/lance + name = "Explosive Lance (Grenade)" + result = /obj/item/twohanded/spear + reqs = list(/obj/item/twohanded/spear = 1, + /obj/item/grenade = 1) + parts = list(/obj/item/twohanded/spear = 1, + /obj/item/grenade = 1) + time = 15 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +////////////////// +///GUNS CRAFTING// +////////////////// + + +/datum/crafting_recipe/smartdartgun + name = "Smart dartgun" + result = /obj/item/gun/syringe/dart + reqs = list(/obj/item/stack/sheet/metal = 10, + /obj/item/stack/sheet/glass = 5, + /obj/item/tank/internals = 1, + /obj/item/reagent_containers/glass/beaker = 1, + /obj/item/stack/sheet/plastic = 5, + /obj/item/stack/cable_coil = 1) + time = 150 //It's a gun + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/datum/crafting_recipe/rapiddartgun + name = "Rapid Smart dartgun" + result = /obj/item/gun/syringe/dart/rapiddart + reqs = list( + /obj/item/gun/syringe/dart = 1, + /obj/item/stack/sheet/plastic = 5, + /obj/item/stack/cable_coil = 1, + /obj/item/reagent_containers/glass/beaker = 1 + ) + parts = list(/obj/item/reagent_containers/glass/beaker = 1) + time = 120 //Modifying your gun + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/datum/crafting_recipe/improvised_pneumatic_cannon + name = "Pneumatic Cannon" + result = /obj/item/pneumatic_cannon/ghetto + tools = list(TOOL_WELDER, TOOL_WRENCH) + reqs = list(/obj/item/stack/sheet/metal = 4, + /obj/item/stack/packageWrap = 8, + /obj/item/pipe = 2) + time = 300 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/datum/crafting_recipe/flamethrower //Gun* + name = "Flamethrower" + result = /obj/item/flamethrower + reqs = list(/obj/item/weldingtool = 1, + /obj/item/assembly/igniter = 1, + /obj/item/stack/rods = 1) + parts = list(/obj/item/assembly/igniter = 1, + /obj/item/weldingtool = 1) + tools = list(TOOL_SCREWDRIVER) + time = 10 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/datum/crafting_recipe/ishotgun + name = "Improvised Shotgun" + result = /obj/item/gun/ballistic/revolver/doublebarrel/improvised + reqs = list(/obj/item/weaponcrafting/receiver = 1, + /obj/item/pipe = 1, + /obj/item/weaponcrafting/stock = 1, + /obj/item/stack/packageWrap = 5) + tools = list(TOOL_SCREWDRIVER) + time = 100 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/datum/crafting_recipe/irifle + name = "Improvised Rifle(7.62mm)" + result = /obj/item/gun/ballistic/shotgun/boltaction/improvised + reqs = list(/obj/item/weaponcrafting/receiver = 1, + /obj/item/pipe = 2, + /obj/item/weaponcrafting/stock = 1, + /obj/item/stack/packageWrap = 5) + tools = list(TOOL_SCREWDRIVER) + time = 100 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +////////////////// +///AMMO CRAFTING// +////////////////// + +/datum/crafting_recipe/smartdart + name = "Medical smartdart" + result = /obj/item/reagent_containers/syringe/dart + reqs = list(/obj/item/stack/sheet/metal = 1, + /obj/item/stack/sheet/glass = 1, + /obj/item/stack/sheet/plastic = 1) + time = 10 + category = CAT_WEAPONRY + subcategory = CAT_AMMO + +/datum/crafting_recipe/meteorslug + name = "Meteorslug Shell" + result = /obj/item/ammo_casing/shotgun/meteorslug + reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, + /obj/item/rcd_ammo = 1, + /obj/item/stock_parts/manipulator = 2) + tools = list(TOOL_SCREWDRIVER) + time = 5 + category = CAT_WEAPONRY + subcategory = CAT_AMMO + +/datum/crafting_recipe/pulseslug + name = "Pulse Slug Shell" + result = /obj/item/ammo_casing/shotgun/pulseslug + reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, + /obj/item/stock_parts/capacitor/adv = 2, + /obj/item/stock_parts/micro_laser/ultra = 1) + tools = list(TOOL_SCREWDRIVER) + time = 5 + category = CAT_WEAPONRY + subcategory = CAT_AMMO + +/datum/crafting_recipe/dragonsbreath + name = "Dragonsbreath Shell" + result = /obj/item/ammo_casing/shotgun/dragonsbreath + reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, + /datum/reagent/phosphorus = 5) + tools = list(TOOL_SCREWDRIVER) + time = 5 + category = CAT_WEAPONRY + subcategory = CAT_AMMO + +/datum/crafting_recipe/frag12 + name = "FRAG-12 Shell" + result = /obj/item/ammo_casing/shotgun/frag12 + reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, + /datum/reagent/glycerol = 5, + /datum/reagent/toxin/acid = 5, + /datum/reagent/toxin/acid/fluacid = 5) + tools = list(TOOL_SCREWDRIVER) + time = 5 + category = CAT_WEAPONRY + subcategory = CAT_AMMO + +/datum/crafting_recipe/ionslug + name = "Ion Scatter Shell" + result = /obj/item/ammo_casing/shotgun/ion + reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, + /obj/item/stock_parts/micro_laser/ultra = 1, + /obj/item/stock_parts/subspace/crystal = 1) + tools = list(TOOL_SCREWDRIVER) + time = 5 + category = CAT_WEAPONRY + subcategory = CAT_AMMO + +/datum/crafting_recipe/improvisedslug + name = "Improvised Shotgun Shell" + result = /obj/item/ammo_casing/shotgun/improvised + reqs = list(/obj/item/grenade/chem_grenade = 1, + /obj/item/stack/sheet/metal = 1, + /obj/item/stack/cable_coil = 1, + /datum/reagent/fuel = 10) + tools = list(TOOL_SCREWDRIVER) + time = 5 + category = CAT_WEAPONRY + subcategory = CAT_AMMO + +/datum/crafting_recipe/laserslug + name = "Scatter Laser Shell" + result = /obj/item/ammo_casing/shotgun/laserslug + reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, + /obj/item/stock_parts/capacitor/adv = 1, + /obj/item/stock_parts/micro_laser/high = 1) + tools = list(TOOL_SCREWDRIVER) + time = 5 + category = CAT_WEAPONRY + subcategory = CAT_AMMO diff --git a/code/modules/detectivework/detective_work.dm b/code/modules/detectivework/detective_work.dm index c892bfeffc..1a2405b9c4 100644 --- a/code/modules/detectivework/detective_work.dm +++ b/code/modules/detectivework/detective_work.dm @@ -1,111 +1,107 @@ //CONTAINS: Suit fibers and Detective's Scanning Computer -/atom/proc/return_fingerprints() - GET_COMPONENT(D, /datum/component/forensics) - if(D) - . = D.fingerprints +/atom/proc/add_fibers(mob/living/carbon/human/M) + if(M.gloves && istype(M.gloves, /obj/item/clothing/)) + var/obj/item/clothing/gloves/G = M.gloves + if(G.transfer_blood > 1) //bloodied gloves transfer blood to touched objects + if(add_blood_DNA(G.blood_DNA)) //only reduces the bloodiness of our gloves if the item wasn't already bloody + G.transfer_blood-- + else if(M.bloody_hands > 1) + if(add_blood_DNA(M.blood_DNA, M.diseases)) + M.bloody_hands-- + if(!suit_fibers) + suit_fibers = list() + var/fibertext + var/item_multiplier = isitem(src)?1.2:1 + if(M.wear_suit) + fibertext = "Material from \a [M.wear_suit]." + if(prob(10*item_multiplier) && !(fibertext in suit_fibers)) + suit_fibers += fibertext + if(!(M.wear_suit.body_parts_covered & CHEST)) + if(M.w_uniform) + fibertext = "Fibers from \a [M.w_uniform]." + if(prob(12*item_multiplier) && !(fibertext in suit_fibers)) //Wearing a suit means less of the uniform exposed. + suit_fibers += fibertext + if(!(M.wear_suit.body_parts_covered & HANDS)) + if(M.gloves) + fibertext = "Material from a pair of [M.gloves.name]." + if(prob(20*item_multiplier) && !(fibertext in suit_fibers)) + suit_fibers += fibertext + else if(M.w_uniform) + fibertext = "Fibers from \a [M.w_uniform]." + if(prob(15*item_multiplier) && !(fibertext in suit_fibers)) + // "Added fibertext: [fibertext]" + suit_fibers += fibertext + if(M.gloves) + fibertext = "Material from a pair of [M.gloves.name]." + if(prob(20*item_multiplier) && !(fibertext in suit_fibers)) + suit_fibers += "Material from a pair of [M.gloves.name]." + else if(M.gloves) + fibertext = "Material from a pair of [M.gloves.name]." + if(prob(20*item_multiplier) && !(fibertext in suit_fibers)) + suit_fibers += "Material from a pair of [M.gloves.name]." -/atom/proc/return_hiddenprints() - GET_COMPONENT(D, /datum/component/forensics) - if(D) - . = D.hiddenprints -/atom/proc/return_blood_DNA() - GET_COMPONENT(D, /datum/component/forensics) - if(D) - . = D.blood_DNA +/atom/proc/add_hiddenprint(mob/living/M) + if(!M || !M.key) + return -/atom/proc/blood_DNA_length() - GET_COMPONENT(D, /datum/component/forensics) - if(D) - . = length(D.blood_DNA) + if(!fingerprintshidden) //Add the list if it does not exist + fingerprintshidden = list() -/atom/proc/return_fibers() - GET_COMPONENT(D, /datum/component/forensics) - if(D) - . = D.fibers + var/hasgloves = "" + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.gloves) + hasgloves = "(gloves)" + + var/current_time = TIME_STAMP("hh:mm:ss", FALSE) + if(!fingerprintshidden[M.key]) + fingerprintshidden[M.key] = "First: [M.real_name]\[[current_time]\][hasgloves]. Ckey: [M.ckey]" + else + var/laststamppos = findtext(fingerprintshidden[M.key], " Last: ") + if(laststamppos) + fingerprintshidden[M.key] = copytext(fingerprintshidden[M.key], 1, laststamppos) + fingerprintshidden[M.key] += " Last: [M.real_name]\[[current_time]\][hasgloves]. Ckey: [M.ckey]" + + fingerprintslast = M.ckey -/atom/proc/add_fingerprint_list(list/fingerprints) //ASSOC LIST FINGERPRINT = FINGERPRINT - if(length(fingerprints)) - . = AddComponent(/datum/component/forensics, fingerprints) //Set ignoregloves to add prints irrespective of the mob having gloves on. /atom/proc/add_fingerprint(mob/living/M, ignoregloves = FALSE) - var/datum/component/forensics/D = AddComponent(/datum/component/forensics) - . = D.add_fingerprint(M, ignoregloves) + if(!M || !M.key) + return -/atom/proc/add_fiber_list(list/fibertext) //ASSOC LIST FIBERTEXT = FIBERTEXT - if(length(fibertext)) - . = AddComponent(/datum/component/forensics, null, null, null, fibertext) + add_hiddenprint(M) -/atom/proc/add_fibers(mob/living/carbon/human/M) - var/old = 0 - if(M.gloves && istype(M.gloves, /obj/item/clothing)) - var/obj/item/clothing/gloves/G = M.gloves - old = length(G.return_blood_DNA()) - if(G.transfer_blood > 1) //bloodied gloves transfer blood to touched objects - if(add_blood_DNA(G.return_blood_DNA()) && length(G.return_blood_DNA()) > old) //only reduces the bloodiness of our gloves if the item wasn't already bloody - G.transfer_blood-- - else if(M.bloody_hands > 1) - old = length(M.return_blood_DNA()) - if(add_blood_DNA(M.return_blood_DNA()) && length(M.return_blood_DNA()) > old) - M.bloody_hands-- - var/datum/component/forensics/D = AddComponent(/datum/component/forensics) - . = D.add_fibers(M) + if(ishuman(M)) + var/mob/living/carbon/human/H = M -/atom/proc/add_hiddenprint_list(list/hiddenprints) //NOTE: THIS IS FOR ADMINISTRATION FINGERPRINTS, YOU MUST CUSTOM SET THIS TO INCLUDE CKEY/REAL NAMES! CHECK FORENSICS.DM - if(length(hiddenprints)) - . = AddComponent(/datum/component/forensics, null, hiddenprints) + add_fibers(H) -/atom/proc/add_hiddenprint(mob/living/M) - var/datum/component/forensics/D = AddComponent(/datum/component/forensics) - . = D.add_hiddenprint(M) + if(H.gloves) //Check if the gloves (if any) hide fingerprints + var/obj/item/clothing/gloves/G = H.gloves + if(G.transfer_prints) + ignoregloves = TRUE -/atom/proc/add_blood_DNA(list/dna) //ASSOC LIST DNA = BLOODTYPE - return FALSE + if(!ignoregloves) + H.gloves.add_fingerprint(H, TRUE) //ignoregloves = TRUE to avoid infinite loop. + return -/obj/add_blood_DNA(list/dna) - . = ..() - if(length(dna)) - . = AddComponent(/datum/component/forensics, null, null, dna) - -/obj/item/clothing/gloves/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) - . = ..() - transfer_blood = rand(2, 4) - -/turf/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) - var/obj/effect/decal/cleanable/blood/splatter/B = locate() in src - if(!B) - B = new /obj/effect/decal/cleanable/blood/splatter(src, diseases) - B.add_blood_DNA(blood_dna) //give blood info to the blood decal. - return TRUE //we bloodied the floor - -/mob/living/carbon/human/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) - if(wear_suit) - wear_suit.add_blood_DNA(blood_dna) - update_inv_wear_suit() - else if(w_uniform) - w_uniform.add_blood_DNA(blood_dna) - update_inv_w_uniform() - if(gloves) - var/obj/item/clothing/gloves/G = gloves - G.add_blood_DNA(blood_dna) - else if(length(blood_dna)) - AddComponent(/datum/component/forensics, null, null, blood_dna) - bloody_hands = rand(2, 4) - if(head) - head.add_blood_DNA(blood_dna) - update_inv_head() - else if(wear_mask) - wear_mask.add_blood_DNA(blood_dna) - update_inv_wear_mask() - if(wear_neck) - wear_neck.add_blood_DNA(blood_dna) - update_inv_neck() - update_inv_gloves() //handles bloody hands overlays and updating - return TRUE + LAZYINITLIST(fingerprints) //Add the list if it does not exist + var/full_print = md5(H.dna.uni_identity) + fingerprints[full_print] = full_print /atom/proc/transfer_fingerprints_to(atom/A) - A.add_fingerprint_list(return_fingerprints()) - A.add_hiddenprint_list(return_hiddenprints()) - A.fingerprintslast = fingerprintslast + // Make sure everything are lists. + LAZYINITLIST(A.fingerprints) + LAZYINITLIST(A.fingerprintshidden) + LAZYINITLIST(fingerprints) + LAZYINITLIST(fingerprintshidden) + + // Transfer + if(fingerprints) + A.fingerprints |= fingerprints.Copy() //detective + if(fingerprintshidden) + A.fingerprintshidden |= fingerprintshidden.Copy() //admin + A.fingerprintslast = fingerprintslast \ No newline at end of file diff --git a/code/modules/detectivework/evidence.dm b/code/modules/detectivework/evidence.dm index a3b17a4c1f..5b4a75a36c 100644 --- a/code/modules/detectivework/evidence.dm +++ b/code/modules/detectivework/evidence.dm @@ -16,7 +16,7 @@ /obj/item/evidencebag/attackby(obj/item/I, mob/user, params) if(evidencebagEquip(I, user)) - return 1 + return TRUE /obj/item/evidencebag/handle_atom_del(atom/A) cut_overlays() @@ -25,12 +25,12 @@ desc = initial(desc) /obj/item/evidencebag/proc/evidencebagEquip(obj/item/I, mob/user) - if(!istype(I) || I.anchored == 1) + if(!istype(I) || I.anchored == TRUE) return if(istype(I, /obj/item/evidencebag)) to_chat(user, "You find putting an evidence bag in another evidence bag to be slightly absurd.") - return 1 //now this is podracing + return TRUE //now this is podracing if(I.w_class > WEIGHT_CLASS_NORMAL) to_chat(user, "[I] won't fit in [src].") @@ -62,7 +62,7 @@ desc = "An evidence bag containing [I]. [I.desc]" I.forceMove(src) w_class = I.w_class - return 1 + return TRUE /obj/item/evidencebag/attack_self(mob/user) if(contents.len) diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm index fd7591db81..c578d5b4d4 100644 --- a/code/modules/detectivework/scanner.dm +++ b/code/modules/detectivework/scanner.dm @@ -14,7 +14,7 @@ flags_1 = CONDUCT_1 item_flags = NOBLUDGEON slot_flags = ITEM_SLOT_BELT - var/scanning = 0 + var/scanning = FALSE var/list/log = list() var/range = 8 var/view_check = TRUE @@ -30,7 +30,7 @@ /obj/item/detective_scanner/attack_self(mob/user) if(log.len && !scanning) - scanning = 1 + scanning = TRUE to_chat(user, "Printing report, please wait...") addtimer(CALLBACK(src, .proc/PrintReport), 100) else @@ -56,7 +56,7 @@ // Clear the logs log = list() - scanning = 0 + scanning = FALSE /obj/item/detective_scanner/afterattack(atom/A, mob/user, params) . = ..() @@ -70,7 +70,7 @@ if((get_dist(A, user) > range) || (!(A in view(range, user)) && view_check) || (loc != user)) return - scanning = 1 + scanning = TRUE user.visible_message("\The [user] points the [src.name] at \the [A] and performs a forensic scan.") to_chat(user, "You scan \the [A]. The scanner is now analysing the results...") @@ -80,14 +80,20 @@ //Make our lists var/list/fingerprints = list() - var/list/blood = A.return_blood_DNA() - var/list/fibers = A.return_fibers() + var/list/blood = list() + var/list/fibers = list() var/list/reagents = list() var/target_name = A.name // Start gathering + if(A.blood_DNA && A.blood_DNA.len) + blood = A.blood_DNA.Copy() + + if(A.suit_fibers && A.suit_fibers.len) + fibers = A.suit_fibers.Copy() + if(ishuman(A)) var/mob/living/carbon/human/H = A @@ -96,7 +102,8 @@ else if(!ismob(A)) - fingerprints = A.return_fingerprints() + if(A.fingerprints && A.fingerprints.len) + fingerprints = A.fingerprints.Copy() // Only get reagents from non-mobs. if(A.reagents && A.reagents.reagent_list.len) @@ -115,40 +122,40 @@ // We gathered everything. Create a fork and slowly display the results to the holder of the scanner. - var/found_something = 0 + var/found_something = FALSE add_log("[STATION_TIME_TIMESTAMP("hh:mm:ss")][get_timestamp()] - [target_name]", 0) // Fingerprints if(length(fingerprints)) - sleep(30) + sleep(3 SECONDS) add_log("Prints:") for(var/finger in fingerprints) add_log("[finger]") - found_something = 1 + found_something = TRUE // Blood if (length(blood)) - sleep(30) + sleep(3 SECONDS) add_log("Blood:") - found_something = 1 + found_something = TRUE for(var/B in blood) add_log("Type: [blood[B]] DNA: [B]") //Fibers if(length(fibers)) - sleep(30) + sleep(3 SECONDS) add_log("Fibers:") for(var/fiber in fibers) add_log("[fiber]") - found_something = 1 + found_something = TRUE //Reagents if(length(reagents)) - sleep(30) + sleep(3 SECONDS) add_log("Reagents:") for(var/R in reagents) add_log("Reagent: [R] Volume: [reagents[R]]") - found_something = 1 + found_something = TRUE // Get a new user var/mob/holder = null @@ -164,10 +171,10 @@ to_chat(holder, "You finish scanning \the [target_name].") add_log("---------------------------------------------------------", 0) - scanning = 0 + scanning = FALSE return -/obj/item/detective_scanner/proc/add_log(msg, broadcast = 1) +/obj/item/detective_scanner/proc/add_log(msg, broadcast = TRUE) if(scanning) if(broadcast && ismob(loc)) var/mob/M = loc @@ -207,4 +214,4 @@ return to_chat(user, "Scanner Report") for(var/iterLog in log) - to_chat(user, iterLog) + to_chat(user, iterLog) \ No newline at end of file diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm index c17918d733..43fb264002 100644 --- a/code/modules/events/blob.dm +++ b/code/modules/events/blob.dm @@ -4,6 +4,7 @@ weight = 10 max_occurrences = 1 + earliest_start = 60 MINUTES min_players = 40 gamemode_blacklist = list("blob") //Just in case a blob survives that long diff --git a/code/modules/events/holiday/halloween.dm b/code/modules/events/holiday/halloween.dm index 9b72020047..66495d833d 100644 --- a/code/modules/events/holiday/halloween.dm +++ b/code/modules/events/holiday/halloween.dm @@ -19,6 +19,7 @@ new /mob/living/simple_animal/parrot/Poly/ghost(Poly.loc) qdel(Poly) + /datum/round_event/spooky/announce(fake) priority_announce(pick("RATTLE ME BONES!","THE RIDE NEVER ENDS!", "A SKELETON POPS OUT!", "SPOOKY SCARY SKELETONS!", "CREWMEMBERS BEWARE, YOU'RE IN FOR A SCARE!") , "THE CALL IS COMING FROM INSIDE THE HOUSE") diff --git a/code/modules/events/holiday/xmas.dm b/code/modules/events/holiday/xmas.dm index a76c75dd43..5f9873c387 100644 --- a/code/modules/events/holiday/xmas.dm +++ b/code/modules/events/holiday/xmas.dm @@ -77,7 +77,7 @@ if(LAZYLEN(candidates)) var/mob/dead/observer/C = pick(candidates) santa = new /mob/living/carbon/human(pick(GLOB.blobstart)) - santa.key = C.key + C.transfer_ckey(santa, FALSE) santa.equipOutfit(/datum/outfit/santa) santa.update_icons() diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm index af22ae3b96..604e203cd6 100644 --- a/code/modules/events/meteor_wave.dm +++ b/code/modules/events/meteor_wave.dm @@ -1,5 +1,8 @@ // Normal strength +#define SINGULO_BEACON_DISTURBANCE 0.2 //singularity beacon also improve the odds of meteor waves and speed them up a little. +#define SINGULO_BEACON_MAX_DISTURBANCE 0.6 //maximum cap due to how meteor waves can be potentially round ending. + /datum/round_event_control/meteor_wave name = "Meteor Wave: Normal" typepath = /datum/round_event/meteor_wave @@ -18,6 +21,8 @@ /datum/round_event/meteor_wave/setup() announceWhen = 1 startWhen = rand(300, 600) //Yeah for SOME REASON this is measured in seconds and not deciseconds??? + if(GLOB.singularity_counter) + startWhen *= 1 - min(GLOB.singularity_counter * SINGULO_BEACON_DISTURBANCE, SINGULO_BEACON_MAX_DISTURBANCE) endWhen = startWhen + 60 @@ -27,8 +32,6 @@ determine_wave_type() /datum/round_event/meteor_wave/proc/determine_wave_type() - if(SSevents.holidays && SSevents.holidays[HALLOWEEN]) - wave_name = "halloween" if(!wave_name) wave_name = pickweight(list( "normal" = 50, @@ -40,7 +43,10 @@ if("threatening") wave_type = GLOB.meteors_threatening if("catastrophic") - wave_type = GLOB.meteors_catastrophic + if(SSevents.holidays && SSevents.holidays[HALLOWEEN]) + wave_type = GLOB.meteorsSPOOKY + else + wave_type = GLOB.meteors_catastrophic if("meaty") wave_type = GLOB.meteorsB if("space dust") @@ -52,7 +58,7 @@ kill() /datum/round_event/meteor_wave/announce(fake) - priority_announce("Meteors have been detected on collision course with the station. Estimated time until impact: [round(startWhen/60)] minutes.", "Meteor Alert", 'sound/ai/meteors.ogg') + priority_announce("Meteors have been detected on collision course with the station. Estimated time until impact: [round(startWhen/60)] minutes.[GLOB.singularity_counter ? " Warning: Anomalous gravity pulse detected, Syndicate technology interference likely." : ""]", "Meteor Alert", 'sound/ai/meteors.ogg') /datum/round_event/meteor_wave/tick() if(ISMULTIPLE(activeFor, 3)) @@ -79,3 +85,6 @@ /datum/round_event/meteor_wave/catastrophic wave_name = "catastrophic" + +#undef SINGULO_BEACON_DISTURBANCE +#undef SINGULO_BEACON_MAX_DISTURBANCE diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm index 55d8ce8b14..96b6cded58 100644 --- a/code/modules/events/sentience.dm +++ b/code/modules/events/sentience.dm @@ -48,7 +48,7 @@ spawned_animals++ - SA.key = SG.key + SG.transfer_ckey(SA, FALSE) SA.grant_all_languages(TRUE) diff --git a/code/modules/events/wizard/imposter.dm b/code/modules/events/wizard/imposter.dm index 1c8ef95baa..29704168e9 100644 --- a/code/modules/events/wizard/imposter.dm +++ b/code/modules/events/wizard/imposter.dm @@ -23,7 +23,7 @@ I.name = I.dna.real_name I.updateappearance(mutcolor_update=1) I.domutcheck() - I.key = C.key + C.transfer_ckey(I, FALSE) var/datum/antagonist/wizard/master = M.has_antag_datum(/datum/antagonist/wizard) if(!master.wiz_team) master.create_wiz_team() diff --git a/code/modules/events/wizard/magicarp.dm b/code/modules/events/wizard/magicarp.dm index ab23c30e00..57e2a2a051 100644 --- a/code/modules/events/wizard/magicarp.dm +++ b/code/modules/events/wizard/magicarp.dm @@ -36,10 +36,11 @@ projectilesound = 'sound/weapons/emitter.ogg' maxHealth = 50 health = 50 + gold_core_spawnable = NO_SPAWN var/allowed_projectile_types = list(/obj/item/projectile/magic/change, /obj/item/projectile/magic/animate, /obj/item/projectile/magic/resurrection, /obj/item/projectile/magic/death, /obj/item/projectile/magic/teleport, /obj/item/projectile/magic/door, /obj/item/projectile/magic/aoe/fireball, /obj/item/projectile/magic/spellblade, /obj/item/projectile/magic/arcane_barrage) - + /mob/living/simple_animal/hostile/carp/ranged/Initialize() projectiletype = pick(allowed_projectile_types) . = ..() diff --git a/code/modules/events/wizard/rpgloot.dm b/code/modules/events/wizard/rpgloot.dm index 420582ddab..3d560aefb8 100644 --- a/code/modules/events/wizard/rpgloot.dm +++ b/code/modules/events/wizard/rpgloot.dm @@ -13,7 +13,7 @@ if(istype(I, /obj/item/storage)) var/obj/item/storage/S = I - GET_COMPONENT_FROM(STR, /datum/component/storage, S) + var/datum/component/storage/STR = S.GetComponent(/datum/component/storage) if(prob(upgrade_scroll_chance) && S.contents.len < STR.max_items && !S.invisibility) var/obj/item/upgradescroll/scroll = new SEND_SIGNAL(S, COMSIG_TRY_STORAGE_INSERT, scroll, null, TRUE, TRUE) diff --git a/code/modules/fields/fields.dm b/code/modules/fields/fields.dm index 5e34c934d9..5b0b4bc1f8 100644 --- a/code/modules/fields/fields.dm +++ b/code/modules/fields/fields.dm @@ -283,7 +283,7 @@ var/field_type = /datum/proximity_monitor/advanced/debug var/operating = FALSE var/datum/proximity_monitor/advanced/current = null - var/datum/component/mobhook + var/mob/listeningTo /obj/item/multitool/field_debug/Initialize() . = ..() @@ -292,7 +292,7 @@ /obj/item/multitool/field_debug/Destroy() STOP_PROCESSING(SSobj, src) QDEL_NULL(current) - QDEL_NULL(mobhook) + listeningTo = null return ..() /obj/item/multitool/field_debug/proc/setup_debug_field() @@ -303,16 +303,20 @@ /obj/item/multitool/field_debug/attack_self(mob/user) operating = !operating to_chat(user, "You turn [src] [operating? "on":"off"].") - QDEL_NULL(mobhook) + UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) + listeningTo = null if(!istype(current) && operating) - mobhook = user.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED = CALLBACK(src, .proc/on_mob_move))) + RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/on_mob_move) + listeningTo = user setup_debug_field() else if(!operating) QDEL_NULL(current) /obj/item/multitool/field_debug/dropped() . = ..() - QDEL_NULL(mobhook) + if(listeningTo) + UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) + listeningTo = null /obj/item/multitool/field_debug/proc/on_mob_move() check_turf(get_turf(src)) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 88f72d27c3..bac2e0bb65 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -771,7 +771,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( ..() var/turf/source = random_far_turf() if(!sound_type) - sound_type = pick("airlock","airlock pry","console","explosion","far explosion","mech","glass","alarm","beepsky","mech","wall decon","door hack") + sound_type = pick("airlock","airlock pry","console","flash","explosion","far explosion","mech","glass","alarm","beepsky","mech","wall decon","door hack") feedback_details += "Type: [sound_type]" //Strange audio switch(sound_type) @@ -788,6 +788,8 @@ GLOBAL_LIST_INIT(hallucination_list, list( target.playsound_local(source,'sound/effects/explosion1.ogg', 50, 1) else target.playsound_local(source, 'sound/effects/explosion2.ogg', 50, 1) + if("flash") + target.playsound_local(source, 'sound/weapons/flash.ogg', 50, 1) if("far explosion") target.playsound_local(source, 'sound/effects/explosionfar.ogg', 50, 1) if("glass") @@ -1291,4 +1293,4 @@ GLOBAL_LIST_INIT(hallucination_list, list( H.hal_target = target H.preparePixelProjectile(target, start) H.fire() - qdel(src) \ No newline at end of file + qdel(src) diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm index 31e99535d1..1d0b626d98 100644 --- a/code/modules/food_and_drinks/food/condiment.dm +++ b/code/modules/food_and_drinks/food/condiment.dm @@ -16,6 +16,7 @@ //Possible_states has the reagent id as key and a list of, in order, the icon_state, the name and the desc as values. Used in the on_reagent_change(changetype) to change names, descs and sprites. var/list/possible_states = list( "ketchup" = list("ketchup", "ketchup bottle", "You feel more American already."), + "mustard" = list("mustard", "mustard bottle", "A spice mixed with enzymes and water."), "capsaicin" = list("hotsauce", "hotsauce bottle", "You can almost TASTE the stomach ulcers now!"), "enzyme" = list("enzyme", "universal enzyme bottle", "Used in cooking various dishes"), "soysauce" = list("soysauce", "soy sauce bottle", "A salty soy-based flavoring"), @@ -282,6 +283,12 @@ originalname = "ketchup" list_reagents = list("ketchup" = 10) +//Mustard +/obj/item/reagent_containers/food/condiment/pack/mustard + name = "mustard pack" + originalname = "mustard" + list_reagents = list("mustard" = 10) + //Hot sauce /obj/item/reagent_containers/food/condiment/pack/hotsauce name = "hotsauce pack" diff --git a/code/modules/food_and_drinks/food/snacks_cake.dm b/code/modules/food_and_drinks/food/snacks_cake.dm index d66cfdd667..98f80331a7 100644 --- a/code/modules/food_and_drinks/food/snacks_cake.dm +++ b/code/modules/food_and_drinks/food/snacks_cake.dm @@ -335,7 +335,7 @@ obj/item/reagent_containers/food/snacks/store/cake/pound_cake icon_state = "vanillacake" slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/vanilla_slice bonus_reagents = list("sugar" = 15, "vanilla" = 15) - tastes = list("caje" = 1, "sugar" = 1, "vanilla" = 10) + tastes = list("cake" = 1, "sugar" = 1, "vanilla" = 10) foodtype = GRAIN | SUGAR | DAIRY /obj/item/reagent_containers/food/snacks/cakeslice/vanilla_slice @@ -361,4 +361,21 @@ obj/item/reagent_containers/food/snacks/store/cake/pound_cake icon_state = "clowncake_slice" filling_color = "#00FFFF" tastes = list("cake" = 1, "sugar" = 1, "joy" = 10) - foodtype = GRAIN | SUGAR | DAIRY \ No newline at end of file + foodtype = GRAIN | SUGAR | DAIRY + +/obj/item/reagent_containers/food/snacks/store/cake/peach_cake + name = "peach cake" + desc = "A peach filled cake." + icon_state = "peachcake" + slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/peach_slice + bonus_reagents = list("sugar" = 5, "peachjuice" = 15) + tastes = list("cake" = 1, "sugar" = 1, "peachjuice" = 10) + foodtype = GRAIN | SUGAR | DAIRY + +/obj/item/reagent_containers/food/snacks/cakeslice/peach_slice + name = "peach cake slice" + desc = "A slice of peach cake." + icon_state = "peach_slice" + filling_color = "#00FFFF" + tastes = list("cake" = 1, "sugar" = 1, "peachjuice" = 10) + foodtype = GRAIN | SUGAR | DAIRY diff --git a/code/modules/food_and_drinks/food/snacks_frozen.dm b/code/modules/food_and_drinks/food/snacks_frozen.dm index c4f8ccf76b..3988909b30 100644 --- a/code/modules/food_and_drinks/food/snacks_frozen.dm +++ b/code/modules/food_and_drinks/food/snacks_frozen.dm @@ -28,6 +28,50 @@ tastes = list("ice cream" = 1, "banana" = 1, "a bad joke" = 1) foodtype = FRUIT | DAIRY | SUGAR +/obj/item/reagent_containers/food/snacks/banana_split + name = "banana split" + trash = /obj/item/reagent_containers/food/drinks/drinkingglass + desc = "A long glass dish filled with ice-cream, chocolate and a banana down the middle. A timeless classic by any standards." + icon_state = "banana_split" + bonus_reagents = list("nutriment" = 5, "vitamin" = 3) + list_reagents = list("nutriment" = 3, "banana" = 10, "vitamin" = 2) + filling_color = "#FFFACD" + tastes = list("ice cream" = 1, "banana" = 1, "charries" = 1) + foodtype = FRUIT | DAIRY | SUGAR + +/obj/item/reagent_containers/food/snacks/cola_float + name = "Root Beer Float" + trash = /obj/item/reagent_containers/food/drinks/drinkingglass + desc = "A glass filled with cream, soda and ice-cream with a cherry on top." + icon_state = "cola_float" + bonus_reagents = list("nutriment" = 3, "vitamin" = 1) + list_reagents = list("nutriment" = 3, "vitamin" = 2) + filling_color = "#FFFACD" + tastes = list("ice cream" = 1, "space coal" = 1, "cherries" = 1) + foodtype = FRUIT | DAIRY | SUGAR + +/obj/item/reagent_containers/food/snacks/charrie_float + name = "Cherry Shake" + trash = /obj/item/reagent_containers/food/drinks/drinkingglass + desc = "Cherries mixed with ice-cream, known for its filling tastes" + icon_state = "cherryshake" + bonus_reagents = list("nutriment" = 3, "vitamin" = 1) + list_reagents = list("nutriment" = 3, "vitamin" = 2, "cherryshake" = 15) + filling_color = "#FFFACD" + tastes = list("ice cream" = 1, "charries" = 1) + foodtype = FRUIT | DAIRY | SUGAR + +/obj/item/reagent_containers/food/snacks/bluecharrie_float + name = "Blue Cherry Shake" + trash = /obj/item/reagent_containers/food/drinks/drinkingglass + desc = "Cherries mixed with ice-cream, known for its filling tastes. This one is a exotic blue!" + icon_state = "bluecherryshake" + bonus_reagents = list("nutriment" = 3, "vitamin" = 1) + list_reagents = list("nutriment" = 3, "vitamin" = 2, "bluecherryshake" = 10) + filling_color = "#FFFACD" + tastes = list("ice cream" = 1, "blue cherries" = 1) + foodtype = FRUIT | DAIRY | SUGAR + /obj/item/reagent_containers/food/snacks/spacefreezy name = "space freezy" desc = "The best icecream in space." @@ -126,6 +170,22 @@ tastes = list("ice" = 1, "water" = 1, "berries" = 5) foodtype = FRUIT +/obj/item/reagent_containers/food/snacks/snowcones/peach + name = "peach flavored snowcone" + desc = "A peach flavord snowball in a paper cup." + icon_state = "peach_sc" + list_reagents = list("nutriment" = 1, "peachjuice" = 10) + tastes = list("ice" = 1, "water" = 1, " peach" = 5) + foodtype = FRUIT + +/obj/item/reagent_containers/food/snacks/snowcones/strawberry + name = "strawberry flavored snowcone" + desc = "A strawberry flavord snowball in a paper cup." + icon_state = "blue_sc" + list_reagents = list("nutriment" = 1, "berryjuice" = 10) + tastes = list("ice" = 1, "water" = 1, " strawberry" = 5) + foodtype = FRUIT + /obj/item/reagent_containers/food/snacks/snowcones/fruitsalad name = "mixed fruit flavored snowcone" desc = "A mix of different flavors dizzled on a snowball in a paper cup." diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm index cf99bd78d9..0b53ec8822 100644 --- a/code/modules/food_and_drinks/food/snacks_meat.dm +++ b/code/modules/food_and_drinks/food/snacks_meat.dm @@ -322,6 +322,14 @@ filling_color = "#800000" tastes = list("meat" = 1, "butter" = 1) +/obj/item/reagent_containers/food/snacks/corndog + name = "corndog plate" + desc = "A plate with two small corn dogs, with two dimples of ketchup and mustard to dip them in." + icon_state = "dorndog" + trash = /obj/item/trash/plate/alt + tastes = list("hotdog" = 2, "mustard and ketchup" = 1, "fryed bread" = 1) + bonus_reagents = list("nutriment" = 6, "vitamin" = 2, "mustard" = 5, "ketchup" = 5) + /obj/item/reagent_containers/food/snacks/kebab/rat name = "rat-kebab" desc = "Not so delicious rat meat, on a stick." diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm index c4b9451c7f..ad0824dd79 100644 --- a/code/modules/food_and_drinks/food/snacks_other.dm +++ b/code/modules/food_and_drinks/food/snacks_other.dm @@ -581,6 +581,14 @@ icon_state = "chocolatestrawberry" list_reagents = list("sugar" = 5, "nutriment" = 2) filling_color = "#ffdf26" - w_class = WEIGHT_CLASS_NORMAL tastes = list("strawberries" = 5, "chocolate" = 3) + foodtype = FRUIT | SUGAR + +/obj/item/reagent_containers/food/snacks/chocolatebanana + name = "Chocolate dipped banana" + desc = "A banana dipped in a bit of chocolate and held on a stick." + icon_state = "banana_coco" + list_reagents = list("sugar" = 5, "nutriment" = 3, "vitamin" = 1) + filling_color = "#ffdf26" + tastes = list("banana" = 5, "chocolate" = 3) foodtype = FRUIT | SUGAR \ No newline at end of file diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm index 9b87002738..b468b6b1d1 100644 --- a/code/modules/food_and_drinks/food/snacks_pastry.dm +++ b/code/modules/food_and_drinks/food/snacks_pastry.dm @@ -38,9 +38,7 @@ if(M.mind && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM) && !HAS_TRAIT(H, TRAIT_AGEUSIA)) to_chat(H,"I love this taste!") H.adjust_disgust(-5 + -2.5 * fraction) - GET_COMPONENT_FROM(mood, /datum/component/mood, H) - if(mood) - mood.add_event(null, "fav_food", /datum/mood_event/favorite_food) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "fav_food", /datum/mood_event/favorite_food) last_check_time = world.time return ..() diff --git a/code/modules/food_and_drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm index be6c11fd68..bc66d353e1 100644 --- a/code/modules/food_and_drinks/food/snacks_pie.dm +++ b/code/modules/food_and_drinks/food/snacks_pie.dm @@ -319,8 +319,16 @@ /obj/item/reagent_containers/food/snacks/pie/strawberrypie name = "strawberry pie" - desc = "A strawberry.pie." + desc = "A strawberry pie." icon_state = "strawberrypie" bonus_reagents = list("nutriment" = 6, "vitamin" = 6) tastes = list("strawberry" = 1, "pie" = 1) foodtype = GRAIN | FRUIT | SUGAR + +/obj/item/reagent_containers/food/snacks/pie/peachpie + name = "peach pie" + desc = "A pie with peach filling." + icon_state = "strawberrypie" + bonus_reagents = list("nutriment" = 5, "vitamin" = 6, "peachjuice" = 15) + tastes = list("peach" = 1, "pie" = 1) + foodtype = GRAIN | FRUIT diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm index 58d3ef69bb..0f901f2412 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm @@ -1,9 +1,13 @@ #define ICECREAM_VANILLA 1 #define ICECREAM_CHOCOLATE 2 #define ICECREAM_STRAWBERRY 3 -#define ICECREAM_BLUE 4 -#define CONE_WAFFLE 5 -#define CONE_CHOC 6 +#define ICECREAM_PEACH 4 +#define ICECREAM_GRAPE 5 +#define ICECREAM_BLUE 6 +#define CONE_WAFFLE 7 +#define CONE_CHOC 8 + + /obj/machinery/icecream_vat name = "ice cream vat" @@ -26,7 +30,9 @@ "cocoa" = 5, "vanilla" = 5, "berryjuice" = 5, - "singulo" = 5) + "singulo" = 5, + "peachjuice" = 5, + "grapejuice" = 5) /obj/machinery/icecream_vat/proc/get_ingredient_list(type) switch(type) @@ -34,6 +40,10 @@ return list("milk", "ice", "cocoa") if(ICECREAM_STRAWBERRY) return list("milk", "ice", "berryjuice") + if(ICECREAM_PEACH) + return list("milk", "ice", "peachjuice") + if(ICECREAM_GRAPE) + return list("milk", "ice", "grapejuice") if(ICECREAM_BLUE) return list("milk", "ice", "singulo") if(CONE_WAFFLE) @@ -50,6 +60,10 @@ return "chocolate" if(ICECREAM_STRAWBERRY) return "strawberry" + if(ICECREAM_PEACH) + return "peach" + if(ICECREAM_GRAPE) + return "grape" if(ICECREAM_BLUE) return "blue" if(CONE_WAFFLE) @@ -62,7 +76,7 @@ /obj/machinery/icecream_vat/Initialize() . = ..() - while(product_types.len < 6) + while(product_types.len < 8) product_types.Add(5) create_reagents(100, OPENCONTAINER | NO_REACT) for(var/reagent in icecream_vat_reagents) @@ -76,6 +90,8 @@ dat += "Vanilla ice cream: Select Make x5 [product_types[ICECREAM_VANILLA]] scoops left. (Ingredients: milk, ice)
" dat += "Strawberry ice cream: Select Make x5 [product_types[ICECREAM_STRAWBERRY]] dollops left. (Ingredients: milk, ice, berry juice)
" dat += "Chocolate ice cream: Select Make x5 [product_types[ICECREAM_CHOCOLATE]] dollops left. (Ingredients: milk, ice, coco powder)
" + dat += "Peach ice cream: Select Make x5 [product_types[ICECREAM_PEACH]] dollops left. (Ingredients: milk, ice, peach juice)
" + dat += "Grape ice cream: Select Make x5 [product_types[ICECREAM_GRAPE]] dollops left. (Ingredients: milk, ice, grape juice)
" dat += "Blue ice cream: Select Make x5 [product_types[ICECREAM_BLUE]] dollops left. (Ingredients: milk, ice, singulo)
" dat += "
CONES
" dat += "Waffle cones: Dispense Make x5 [product_types[CONE_WAFFLE]] cones left. (Ingredients: flour, sugar)
" @@ -207,6 +223,12 @@ if ("strawberry") desc = "A delicious [cone_type] cone filled with strawberry ice cream. Definitely not made with real strawberries." reagents.add_reagent("berryjuice", 2) + if ("peach") + desc = "A delicious [cone_type] cone filled with peach ice cream. Definitely made with real peaches!" + reagents.add_reagent("peachjuice", 2) + if ("grape") + desc = "A delicious [cone_type] cone filled with grape ice cream. Surprisingly, made with real pink grape, likely not real sugarcanes used." + reagents.add_reagent("grapejuice", 2) if ("blue") desc = "A delicious [cone_type] cone filled with blue ice cream. Made with real... blue?" reagents.add_reagent("singulo", 2) @@ -228,6 +250,8 @@ #undef ICECREAM_VANILLA #undef ICECREAM_CHOCOLATE #undef ICECREAM_STRAWBERRY +#undef ICECREAM_PEACH +#undef ICECREAM_GRAPE #undef ICECREAM_BLUE #undef CONE_WAFFLE #undef CONE_CHOC diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index 483055cb0d..ceb7a01ede 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -144,6 +144,13 @@ else O.forceMove(src) return TRUE + +///Really simple proc, just moves the object "O" into the hands of mob "M" if able, done so I could modify the proc a little for the organ fridge +/obj/machinery/smartfridge/proc/dispense(obj/item/O, var/mob/M) + if(!M.put_in_hands(O)) + O.forceMove(drop_location()) + adjust_item_drop_location(O) + /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) @@ -197,9 +204,7 @@ if(desired == 1 && Adjacent(usr) && !issilicon(usr)) for(var/obj/item/O in src) if(O.name == params["name"]) - if(!usr.put_in_hands(O)) - O.forceMove(drop_location()) - adjust_item_drop_location(O) + dispense(O, usr) break if (visible_contents) update_icon() @@ -209,8 +214,7 @@ if(desired <= 0) break if(O.name == params["name"]) - O.forceMove(drop_location()) - adjust_item_drop_location(O) + dispense(O, usr) desired-- if (visible_contents) update_icon() @@ -378,6 +382,44 @@ /obj/machinery/smartfridge/extract/preloaded initial_contents = list(/obj/item/slime_scanner = 2) +// ------------------------- You think you're better than Chem, huh? +// Organ Surgery Smartfridge +// ------------------------- Just wait till Tamiorgans +/obj/machinery/smartfridge/organ + name = "smart organ storage" + desc = "A refrigerated storage unit for organ storage." + max_n_of_items = 20 //vastly lower to prevent processing too long + var/repair_rate = 0 + +/obj/machinery/smartfridge/organ/accept_check(obj/item/O) + if(istype(O, /obj/item/organ)) + return TRUE + return FALSE + +/obj/machinery/smartfridge/organ/load(obj/item/O) + . = ..() + if(!.) //if the item loads, clear can_decompose + return + var/obj/item/organ/organ = O + organ.organ_flags |= ORGAN_FROZEN + +/obj/machinery/smartfridge/organ/RefreshParts() + for(var/obj/item/stock_parts/matter_bin/B in component_parts) + max_n_of_items = 20 * B.rating + repair_rate = max(0, STANDARD_ORGAN_HEALING * (B.rating - 1)) + +/obj/machinery/smartfridge/organ/process() + for(var/organ in contents) + var/obj/item/organ/O = organ + if(!istype(O)) + return + O.applyOrganDamage(-repair_rate) + +/obj/machinery/smartfridge/organ/Exited(obj/item/organ/AM, atom/newLoc) + . = ..() + if(istype(AM)) + AM.organ_flags &= ~ORGAN_FROZEN + // ----------------------------- // Chemistry Medical Smartfridge // ----------------------------- diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm index 8d63d68878..c83048e4b1 100644 --- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm +++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm @@ -397,13 +397,16 @@ FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics FermiExplode = FALSE //If the chemical explodes in a special way PurityMin = 0 //The minimum purity something has to be above, otherwise it explodes. + clear_conversion = REACTION_CLEAR_INVERSE +/* /datum/chemical_reaction/neurotoxin/FermiFinish(datum/reagents/holder, var/atom/my_atom) var/datum/reagent/consumable/ethanol/neurotoxin/Nt = locate(/datum/reagent/consumable/ethanol/neurotoxin) in my_atom.reagents.reagent_list var/cached_volume = Nt.volume if(Nt.purity < 0.5) holder.remove_reagent(src.id, cached_volume) holder.add_reagent("neuroweak", cached_volume) +*/ /datum/chemical_reaction/neurotoxin/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH)//reduced size volume = volume/10 @@ -481,18 +484,6 @@ results = list("vanillapudding" = 20) required_reagents = list("vanilla" = 5, "milk" = 5, "eggyolk" = 5) -/datum/chemical_reaction/cherryshake - name = "Cherry Shake" - id = "cherryshake" - results = list("cherryshake" = 3) - required_reagents = list("cherryjelly" = 1, "ice" = 1, "cream" = 1) - -/datum/chemical_reaction/bluecherryshake - name = "Blue Cherry Shake" - id = "bluecherryshake" - results = list("bluecherryshake" = 3) - required_reagents = list("bluecherryjelly" = 1, "ice" = 1, "cream" = 1) - /datum/chemical_reaction/drunkenblumpkin name = "Drunken Blumpkin" id = "drunkenblumpkin" @@ -828,10 +819,10 @@ id = "catnip_tea" results = list("catnip_tea" = 3) required_reagents = list("tea" = 5, "catnip" = 2) - + /datum/chemical_reaction/commander_and_chief - name = "Commander and Chief" - id = "commander_and_chief" - results = list("commander_and_chief" = 50) + name = "Commander and Chief" + id = "commander_and_chief" + results = list("commander_and_chief" = 50) required_reagents = list("alliescocktail" = 50, "champagne" = 20, "doctorsdelight" = 10, "quintuple_sec" = 10, "screwdrivercocktail" = 10) - mix_message = "When your powers combine, I am Captain Pl-..." + mix_message = "When your powers combine, I am Captain Pl-..." diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm index e26d15dbd3..284affe2ec 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm @@ -169,6 +169,15 @@ result = /obj/item/reagent_containers/food/snacks/store/cake/vanilla_cake subcategory = CAT_CAKE +/datum/crafting_recipe/food/peachcake + name = "Peach cake" + reqs = list( + /obj/item/reagent_containers/food/snacks/store/cake/plain = 1, + /obj/item/reagent_containers/food/snacks/grown/peach = 5 + ) + result = /obj/item/reagent_containers/food/snacks/store/cake/peach_cake + subcategory = CAT_CAKE + /datum/crafting_recipe/food/cak name = "Living cat/cake hybrid" reqs = list( diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm index 73b09df68d..8f4c5d05f1 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm @@ -42,6 +42,52 @@ result = /obj/item/reagent_containers/food/snacks/honkdae subcategory = CAT_ICE +/datum/crafting_recipe/food/banana_split + name = "Banana Split" + always_availible = FALSE + reqs = list( + /obj/item/reagent_containers/food/snacks/icecream = 3, + /obj/item/reagent_containers/food/snacks/grown/banana = 1, + /obj/item/reagent_containers/food/snacks/grown/cherries = 1, + /obj/item/reagent_containers/food/snacks/chocolatebar = 1 + ) + result = /obj/item/reagent_containers/food/snacks/banana_split + subcategory = CAT_ICE + +/datum/crafting_recipe/food/root_float + name = "Cola Float" + always_availible = FALSE + reqs = list( + /obj/item/reagent_containers/food/snacks/icecream = 1, + /obj/item/reagent_containers/food/snacks/grown/cherries = 1, + /datum/reagent/consumable/space_cola = 10, + /obj/item/reagent_containers/food/drinks/drinkingglass = 1 + ) + result = /obj/item/reagent_containers/food/snacks/cola_float + subcategory = CAT_ICE + +/datum/crafting_recipe/food/charrie_float + name = "Cherry Shake" + always_availible = FALSE + reqs = list( + /obj/item/reagent_containers/food/snacks/icecream = 1, + /obj/item/reagent_containers/food/snacks/grown/cherries = 3, + /obj/item/reagent_containers/food/drinks/drinkingglass = 1 + ) + result = /obj/item/reagent_containers/food/snacks/charrie_float + subcategory = CAT_ICE + +/datum/crafting_recipe/food/bluecharrie_float + name = "Blue Cherry Shake" + always_availible = FALSE + reqs = list( + /obj/item/reagent_containers/food/snacks/icecream = 1, + /obj/item/reagent_containers/food/snacks/grown/bluecherries = 3, + /obj/item/reagent_containers/food/drinks/drinkingglass = 1 + ) + result = /obj/item/reagent_containers/food/snacks/bluecharrie_float + subcategory = CAT_ICE + //////////////////////////SNOW CONES/////////////////////// /datum/crafting_recipe/food/flaverless_sc @@ -232,6 +278,28 @@ result = /obj/item/reagent_containers/food/snacks/snowcones/honey subcategory = CAT_ICE +/datum/crafting_recipe/food/peach_sc + name = "Peach snowcone" + reqs = list( + /obj/item/reagent_containers/food/drinks/sillycup = 1, + /datum/reagent/water = 5, + /datum/reagent/consumable/ice = 15, + /obj/item/reagent_containers/food/snacks/grown/peach = 1 + ) + result = /obj/item/reagent_containers/food/snacks/snowcones/peach + subcategory = CAT_ICE + +/datum/crafting_recipe/food/strawberry_sc + name = "Strawberry snowcone" + reqs = list( + /obj/item/reagent_containers/food/drinks/sillycup = 1, + /datum/reagent/water = 5, + /datum/reagent/consumable/ice = 15, + /obj/item/reagent_containers/food/snacks/grown/strawberry = 2 + ) + result = /obj/item/reagent_containers/food/snacks/snowcones/strawberry + subcategory = CAT_ICE + /datum/crafting_recipe/food/honey_sc name = "Rainbow snowcone" 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 7eff2820c5..d17ccf585e 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm @@ -128,6 +128,18 @@ result = /obj/item/reagent_containers/food/snacks/pigblanket subcategory = CAT_MEAT +/datum/crafting_recipe/food/corndog + name = "Corndog meal" + reqs = list( + /obj/item/stack/rods = 1, + /obj/item/reagent_containers/food/snacks/meat/cutlet = 1, + /obj/item/reagent_containers/food/snacks/bun = 1, + /datum/reagent/consumable/mustard = 5, + /datum/reagent/consumable/ketchup = 5 + ) + result = /obj/item/reagent_containers/food/snacks/corndog + subcategory = CAT_MEAT + /datum/crafting_recipe/food/ratkebab name = "Rat Kebab" reqs = list( diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm index 81824dc4b8..30c265e237 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm @@ -214,4 +214,13 @@ /obj/item/slime_extract = 1 ) result = /obj/item/reagent_containers/food/snacks/pie/cocolavatart + subcategory = CAT_PIE + +/datum/crafting_recipe/food/peachpie + name = "Peach Pie" + reqs = list( + /obj/item/reagent_containers/food/snacks/pie/plain = 1, + /obj/item/reagent_containers/food/snacks/grown/peach = 3 + ) + result = /obj/item/reagent_containers/food/snacks/pie/peachpie subcategory = CAT_PIE \ No newline at end of file diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm index 082f20f524..c273690571 100644 --- a/code/modules/goonchat/browserOutput.dm +++ b/code/modules/goonchat/browserOutput.dm @@ -82,11 +82,13 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico if("setMusicVolume") data = setMusicVolume(arglist(params)) - if("swaptodarkmode") - swaptodarkmode() + 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("swaptolightmode") - swaptolightmode() if(data) ehjax_send(data = data) @@ -160,7 +162,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico var/list/row = src.connectionHistory[i] if (!row || row.len < 3 || (!row["ckey"] || !row["compid"] || !row["ip"])) //Passed malformed history object return - if (world.IsBanned(row["ckey"], row["compid"], row["ip"], real_bans_only=TRUE)) + if (world.IsBanned(row["ckey"], row["ip"], row["compid"], real_bans_only=TRUE)) found = row break @@ -181,8 +183,8 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico 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(target, message, handle_whitespace=TRUE) - if(!target) +/proc/to_chat_immediate(target, message, handle_whitespace=TRUE) + 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 @@ -204,7 +206,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico message = replacetext(message, "\proper", "") if(handle_whitespace) message = replacetext(message, "\n", "
") - message = replacetext(message, "\t", "[GLOB.TAB][GLOB.TAB]") + message = replacetext(message, "\t", "[FOURSPACES][FOURSPACES]") if(islist(target)) // Do the double-encoding outside the loop to save nanoseconds @@ -247,6 +249,11 @@ 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) + if(Master.current_runlevel == RUNLEVEL_INIT || !SSchat?.initialized) + to_chat_immediate(target, message, handle_whitespace) + return + SSchat.queue(target, message, handle_whitespace) /datum/chatOutput/proc/swaptolightmode() //Dark mode light mode stuff. Yell at KMC if this breaks! (See darkmode.dm for documentation) owner.force_white_theme() diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css index 7b942494f4..d6918d58aa 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput.css +++ b/code/modules/goonchat/browserassets/css/browserOutput.css @@ -7,20 +7,16 @@ html, body { padding: 0; margin: 0; height: 100%; - color: #f0f0f0; + color: #000000; } body { - background: #171717; + background: #E0E0E0; /*CIT CHANGE - darkens chatbox a lil*/ font-family: Verdana, sans-serif; - font-size: 9pt; - font-color: #f0f0f0; + font-size: 13px; line-height: 1.2; overflow-x: hidden; overflow-y: scroll; - word-wrap: break-word; - scrollbar-face-color:#1A1A1A; - scrollbar-track-color:#171717; - scrollbar-highlight-color:#171717; + word-wrap: break-word; } em { @@ -60,9 +56,9 @@ img.icon { border-radius: 10px; } -a {color: #397ea5;} -a.visited {color: #7c00e6;} -a:visited {color: #7c00e6;} +a {color: #0000ff;} +a.visited {color: #ff00ff;} +a:visited {color: #ff00ff;} a.popt {text-decoration: none;} /***************************************** @@ -93,21 +89,21 @@ a.popt {text-decoration: none;} bottom: 0; right: 0; padding: 8px; - background: #202020; + background: #d0d0d0; text-decoration: none; font-variant: small-caps; font-size: 1.1em; font-weight: bold; - color: #a4bad6; + color: #333; } -#newMessages:hover {background: #171717;} +#newMessages:hover {background: #ccc;} #newMessages i {vertical-align: middle; padding-left: 3px;} #ping { position: fixed; top: 0; right: 115px; width: 45px; - background: #202020; + background: #d0d0d0; height: 30px; padding: 8px 0 2px 0; } @@ -124,19 +120,19 @@ a.popt {text-decoration: none;} right: 0; } #userBar .subCell { - background: #202020; + background: #d0d0d0; height: 30px; padding: 5px 0; display: block; - color: #a4bad6; + color: #333; text-decoration: none; line-height: 28px; - border-top: 1px solid #171717; + border-top: 1px solid #b4b4b4; } -#userBar .subCell:hover {background: #202020;} +#userBar .subCell:hover {background: #ccc;} #userBar .toggle { width: 40px; - background: #202020; + background: #ccc; border-top: 0; float: right; text-align: center; @@ -172,7 +168,7 @@ a.popt {text-decoration: none;} position: fixed; top: 50%; left: 50%; - background: #ddd; + background: #d0d0d0; } .popup .close { position: absolute; @@ -189,7 +185,7 @@ a.popt {text-decoration: none;} .popup .close:hover {background: #999;} .popup .head { background: #999; - color: #ddd; + color: #d0d0d0; padding: 0 10px; height: 30px; line-height: 30px; @@ -200,7 +196,7 @@ a.popt {text-decoration: none;} } .popup input {border: 1px solid #999; background: #fff; margin: 0; padding: 5px; outline: none; color: #333;} .popup input[type=text]:hover, .popup input[type=text]:active, .popup input[type=text]:focus {border-color: green;} -.popup input[type=submit] {padding: 5px 10px; background: #999; color: #ddd; text-transform: uppercase; font-size: 0.9em; font-weight: bold;} +.popup input[type=submit] {padding: 5px 10px; background: #999; color: #d0d0d0; text-transform: uppercase; font-size: 0.9em; font-weight: bold;} .popup input[type=submit]:hover, .popup input[type=submit]:focus, .popup input[type=submit]:active {background: #aaa; cursor: pointer;} .changeFont {padding: 10px;} @@ -214,7 +210,7 @@ a.popt {text-decoration: none;} /* ADMIN CONTEXT MENU */ .contextMenu { - background-color: #ddd; + background-color: #d0d0d0; position: fixed; margin: 2px; width: 150px; @@ -246,9 +242,9 @@ a.popt {text-decoration: none;} ******************************************/ /* MOTD */ -.motd {color: #a4bad6; font-family: Verdana, sans-serif;} -.motd h1, .motd h2, .motd h3, .motd h4, .motd h5, .motd h6 {color: #a4bad6; text-decoration: underline;} -.motd a, .motd a:link, .motd a:visited, .motd a:active, .motd a:hover {color: #a4bad6;} +.motd {color: #638500; font-family: Verdana, sans-serif;} +.motd h1, .motd h2, .motd h3, .motd h4, .motd h5, .motd h6 {color: #638500; text-decoration: underline;} +.motd a, .motd a:link, .motd a:visited, .motd a:active, .motd a:hover {color: #638500;} /* ADD HERE FOR BOLD */ .bold, .name, .prefix, .ooc, .looc, .adminooc, .admin, .medal, .yell {font-weight: bold;} @@ -259,151 +255,153 @@ a.popt {text-decoration: none;} /* OUTPUT COLORS */ .highlight {background: yellow;} -h1, h2, h3, h4, h5, h6 {color: #a4bad6;font-family: Georgia, Verdana, sans-serif;} -h1.alert, h2.alert {color: #a4bad6;} +h1, h2, h3, h4, h5, h6 {color: #0000ff;font-family: Georgia, Verdana, sans-serif;} +h1.alert, h2.alert {color: #000000;} em {font-style: normal; font-weight: bold;} -.ooc {color: #cca300; font-weight: bold;} -.antagooc {color: #ce254f; font-weight: bold;} +.ooc {color: #002eb8; font-weight: bold;} +.looc {color: #6699CC; font-weight: bold;} +.antagooc {color: #b8002e; font-weight: bold;} .adminobserverooc {color: #0099cc; font-weight: bold;} -.adminooc {color: #3d5bc3; font-weight: bold;} +.adminooc {color: #700038; font-weight: bold;} -.adminsay {color: #ff4500; font-weight: bold;} -.admin {color: #5975da; font-weight: bold;} +.adminsay {color: #FF4500} +.admin {color: #386aff; font-weight: bold;} .name { font-weight: bold;} .say {} -.deadsay {color: #e2c1ff;} +.deadsay {color: #5c00e6;} .binarysay {color: #20c20e; background-color: #000000; display: block;} .binarysay a {color: #00ff00;} .binarysay a:active, .binarysay a:visited {color: #88ff88;} -.radio {color: #1ecc43;} -.sciradio {color: #c68cfa;} -.comradio {color: #5177ff;} -.secradio {color: #dd3535;} -.medradio {color: #57b8f0;} -.engradio {color: #f37746;} -.suppradio {color: #b88646;} -.servradio {color: #6ca729;} -.syndradio {color: #8f4a4b;} -.centcomradio {color: #2681a5;} -.aiprivradio {color: #d65d95;} -.redteamradio {color: #ff4444;} -.blueteamradio {color: #3434fd;} +.radio {color: #008000;} +.sciradio {color: #993399;} +.comradio {color: #948f02;} +.secradio {color: #a30000;} +.medradio {color: #337296;} +.engradio {color: #fb5613;} +.suppradio {color: #a8732b;} +.servradio {color: #6eaa2c;} +.syndradio {color: #6d3f40;} +.centcomradio {color: #686868;} +.aiprivradio {color: #ff00ff;} +.redteamradio {color: #ff0000;} +.blueteamradio {color: #0000ff;} .yell { font-weight: bold;} -.alert {color: #d82020;} -h1.alert, h2.alert {color: #99aab5;} +.alert {color: #ff0000;} +h1.alert, h2.alert {color: #000000;} .emote { font-style: italic;} .selecteddna {color: #ffffff; background-color: #001B1B} -.attack {color: #e01c1c;} -.disarm {color: #b42525;} -.passive {color: #a00f0f;} +.attack {color: #ff0000;} +.disarm {color: #990000;} +.passive {color: #660000;} -.userdanger {color: #c51e1e; font-weight: bold; font-size: 24px;} -.danger {color: #c51e1e;} -.warning {color: #c51e1e; font-style: italic;} +.userdanger {color: #ff0000; font-weight: bold; font-size: 185%;} +.danger {color: #ff0000;} +.warning {color: #ff0000; font-style: italic;} .alertwarning {color: #FF0000; font-weight: bold} -.boldwarning {color: #c51e1e; font-style: italic; font-weight: bold} -.announce {color: #c51e1e; font-weight: bold;} -.boldannounce {color: #c51e1e; font-weight: bold;} -.greenannounce {color: #059223; font-weight: bold;} +.boldwarning {color: #ff0000; font-style: italic; font-weight: bold} +.announce {color: #228b22; font-weight: bold;} +.boldannounce {color: #ff0000; font-weight: bold;} +.greenannounce {color: #00ff00; font-weight: bold;} .rose {color: #ff5050;} -.info {color: #6685f5;} -.notice {color: #6685f5;} -.boldnotice {color: #6685f5; font-weight: bold;} -.adminnotice {color: #6685f5;} +.info {color: #0000CC;} +.notice {color: #000099;} +.boldnotice {color: #000099; font-weight: bold;} +.adminnotice {color: #0000ff;} .adminhelp {color: #ff0000; font-weight: bold;} -.unconscious {color: #a4bad6; font-weight: bold;} +.unconscious {color: #0000ff; font-weight: bold;} .suicide {color: #ff5050; font-style: italic;} -.red {color: #FF0000} -.pink {color: #ff70c1;} -.blue {color: #215cff} -.green {color: #059223;} -.nicegreen {color: #059223;} +.green {color: #03ff39;} +.red {color: #FF0000;} +.pink {color: #FF69Bf;} +.blue {color: #0000FF;} +.nicegreen {color: #14a833;} .userlove {color: #FF1493; font-style: italic; font-weight: bold; text-shadow: 0 0 6px #ff6dbc;} .love {color: #ff006a; font-style: italic; text-shadow: 0 0 6px #ff6d6d;} -.shadowling {color: #8e8a99;} -.cult {color: #aa1c1c;} +.shadowling {color: #3b2769;} +.cult {color: #960000;} -.cultitalic {color: #aa1c1c; font-style: italic;} -.cultbold {color: #aa1c1c; font-style: italic; font-weight: bold;} -.cultboldtalic {color: #aa1c1c; font-weight: bold; font-size: 24px;} +.cultitalic {color: #960000; font-style: italic;} +.cultbold {color: #960000; font-style: italic; font-weight: bold;} +.cultboldtalic {color: #960000; font-weight: bold; font-size: 185%;} -.cultlarge {color: #aa1c1c; font-weight: bold; font-size: 24px;} -.narsie {color: #aa1c1c; font-weight: bold; font-size: 120px;} -.narsiesmall {color: #aa1c1c; font-weight: bold; font-size: 48px;} -.colossus {color: #7F282A; font-size: 40px;} -.hierophant {color: #b441ee; font-weight: bold; font-style: italic;} -.hierophant_warning {color: #c56bf1; font-style: italic;} -.purple {color: #9956d3;} -.holoparasite {color: #88809c;} +.cultlarge {color: #960000; font-weight: bold; font-size: 185%;} +.narsie {color: #960000; font-weight: bold; font-size: 925%;} +.narsiesmall {color: #960000; font-weight: bold; font-size: 370%;} +.colossus {color: #7F282A; font-size: 310%;} +.hierophant {color: #660099; font-weight: bold; font-style: italic;} +.hierophant_warning {color: #660099; font-style: italic;} +.purple {color: #5e2d79;} +.holoparasite {color: #35333a;} .revennotice {color: #1d2953;} .revenboldnotice {color: #1d2953; font-weight: bold;} -.revenbignotice {color: #1d2953; font-weight: bold; font-size: 24px;} +.revenbignotice {color: #1d2953; font-weight: bold; font-size: 185%;} .revenminor {color: #823abb} .revenwarning {color: #760fbb; font-style: italic;} -.revendanger {color: #760fbb; font-weight: bold; font-size: 24px;} -.umbra {color: #7c00e6;} -.umbra_emphasis {color: #7c00e6; font-weight: bold; font-style: italic;} -.umbra_large {color: #7c00e6; font-size: 24px; font-weight: bold; font-style: italic;} +.revendanger {color: #760fbb; font-weight: bold; font-size: 185%;} +.umbra {color: #5000A0;} +.umbra_emphasis {color: #5000A0; font-weight: bold; font-style: italic;} +.umbra_large {color: #5000A0; font-size: 185%; font-weight: bold; font-style: italic;} -.deconversion_message {color: #a947ff; font-size: 24px; font-style: italic;} +.deconversion_message {color: #5000A0; font-size: 185%; font-style: italic;} .brass {color: #BE8700;} .heavy_brass {color: #BE8700; font-weight: bold; font-style: italic;} -.large_brass {color: #BE8700; font-size: 24px;} -.big_brass {color: #BE8700; font-size: 24px; font-weight: bold; font-style: italic;} -.ratvar {color: #BE8700; font-size: 48px; font-weight: bold; font-style: italic;} +.large_brass {color: #BE8700; font-size: 185%;} +.big_brass {color: #BE8700; font-size: 185%; font-weight: bold; font-style: italic;} +.ratvar {color: #BE8700; font-size: 370%; font-weight: bold; font-style: italic;} .alloy {color: #42474D;} .heavy_alloy {color: #42474D; font-weight: bold; font-style: italic;} -.nezbere_large {color: #42474D; font-size: 24px; font-weight: bold; font-style: italic;} +.nezbere_large {color: #42474D; font-size: 185%; font-weight: bold; font-style: italic;} .nezbere {color: #42474D; font-weight: bold; font-style: italic;} .nezbere_small {color: #42474D;} -.sevtug_large {color: #AF0AAF; font-size: 24px; font-weight: bold; font-style: italic;} +.sevtug_large {color: #AF0AAF; font-size: 185%; font-weight: bold; font-style: italic;} .sevtug {color: #AF0AAF; font-weight: bold; font-style: italic;} .sevtug_small {color: #AF0AAF;} -.inathneq_large {color: #1E8CE1; font-size: 24px; font-weight: bold; font-style: italic;} +.inathneq_large {color: #1E8CE1; font-size: 185%; font-weight: bold; font-style: italic;} .inathneq {color: #1E8CE1; font-weight: bold; font-style: italic;} .inathneq_small {color: #1E8CE1;} -.nzcrentr_large {color: #DAAA18; font-size: 24px; font-weight: bold; font-style: italic;} +.nzcrentr_large {color: #DAAA18; font-size: 185%; font-weight: bold; font-style: italic;} .nzcrentr {color: #DAAA18; font-weight: bold; font-style: italic;} .nzcrentr_small {color: #DAAA18;} -.neovgre_large {color: #6E001A; font-size: 24px; font-weight: bold; font-style: italic;} +.neovgre_large {color: #6E001A; font-size: 185%; font-weight: bold; font-style: italic;} .neovgre {color: #6E001A; font-weight: bold; font-style: italic;} .neovgre_small {color: #6E001A;} -.newscaster {color: #c05d5d;} -.ghostalert {color: #6600ff; font-style: italic; font-weight: bold;} +.newscaster {color: #800000;} +.ghostalert {color: #5c00e6; font-style: italic; font-weight: bold;} -.alien {color: #855d85;} -.noticealien {color: #059223;} -.alertalien {color: #059223; font-weight: bold;} -.changeling {color: #059223; font-style: italic;} +.alien {color: #543354;} +.noticealien {color: #00c000;} +.alertalien {color: #00c000; font-weight: bold;} +.changeling {color: #800080; font-style: italic;} -.spider {color: #8800ff;} +.spider {color: #4d004d; font-weight: bold; font-size: 185%;} -.interface {color: #750e75;} +.interface {color: #330033;} .sans {font-family: "Comic Sans MS", cursive, sans-serif;} .papyrus {font-family: "Papyrus", cursive, sans-serif;} .robot {font-family: "Courier New", cursive, sans-serif;} -.command_headset {font-weight: bold; font-size: 24px;} -.small {font-size: 8px;} -.big {font-size: 24px;} -.reallybig {font-size: 32px;} -.extremelybig {font-size: 40px;} -.greentext {color: #059223; font-size: 24px;} -.redtext {color: #c51e1e; font-size: 24px;} -.clown {color: #ff70c1; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} +.command_headset {font-weight: bold; font-size: 160%;} +.small {font-size: 60%;} +.big {font-size: 185%;} +.reallybig {font-size: 245%;} +.extremelybig {font-size: 310%;} +.greentext {color: #00FF00; font-size: 185%;} +.redtext {color: #FF0000; font-size: 185%;} +.clown {color: #FF69Bf; font-size: 160%; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} .his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} +.spooky {color: #FF6100;} .velvet {color: #660015; font-weight: bold; animation: velvet 5000ms infinite;} @keyframes velvet { 0% { color: #400020; } @@ -433,21 +431,21 @@ h1.alert, h2.alert {color: #99aab5;} .icon {height: 1em; width: auto;} .memo {color: #638500; text-align: center;} -.memoedit {text-align: center; font-size: 16px;} -.abductor {color: #c204c2; font-style: italic;} -.mind_control {color: #df3da9; font-size: 3; font-weight: bold; font-style: italic;} +.memoedit {text-align: center; font-size: 125%;} +.abductor {color: #800080; font-style: italic;} +.mind_control {color: #A00D6F; font-size: 100%; font-weight: bold; font-style: italic;} .slime {color: #00CED1;} .drone {color: #848482;} .monkey {color: #975032;} .swarmer {color: #2C75FF;} .resonate {color: #298F85;} -.monkeyhive {color: #a56408;} -.monkeylead {color: #af6805; font-size: 2;} +.monkeyhive {color: #774704;} +.monkeylead {color: #774704; font-size: 125%;} .connectionClosed, .fatalError {background: red; color: white; padding: 5px;} .connectionClosed.restored {background: green;} -.internal.boldnshit {color: #3d5bc3; font-weight: bold;} +.internal.boldnshit {color: #000099; font-weight: bold;} /* HELPER CLASSES */ .text-normal {font-weight: normal; font-style: normal;} diff --git a/code/modules/goonchat/browserassets/css/browserOutput_dark.css b/code/modules/goonchat/browserassets/css/browserOutput_dark.css new file mode 100644 index 0000000000..3377bcf72c --- /dev/null +++ b/code/modules/goonchat/browserassets/css/browserOutput_dark.css @@ -0,0 +1,159 @@ +html, body {color: #E0E0E0;} +body { + background: #171717; + font-color: #E0E0E0; + scrollbar-face-color:#1A1A1A; + scrollbar-track-color:#171717; + scrollbar-highlight-color:#171717; +} + +a {color: #397ea5;} +a.visited {color: #7c00e6;} +a:visited {color: #7c00e6;} + +#newMessages { + background: #242424; + color: #E0E0E0; +} +#newMessages:hover {background: #272727;} + +#ping {background: #272727;} + +#userBar .subCell { + background: #272727; + color: #E0E0E0; + border-top: 1px solid #171717; +} +#userBar .subCell:hover {background: #272727;} +#userBar .toggle {background: #272727;} + +/* MOTD */ +.motd {color: #E0E0E0;} +.motd h1, .motd h2, .motd h3, .motd h4, .motd h5, .motd h6 {color: #E0E0E0;} +.motd a, .motd a:link, .motd a:visited, .motd a:active, .motd a:hover {color: #E0E0E0;} + +h1, h2, h3, h4, h5, h6 {color: #E0E0E0;} +h1.alert, h2.alert {color: #E0E0E0;} + +.ooc {color: #cca300;} +.looc {color: #d8b555;} +.antagooc {color: #ce254f;} +.adminobserverooc {color: #0099cc;} +.adminooc {color: #3d5bc3;} + +.admin {color: #5975da;} + +.deadsay {color: #e2c1ff;} +.radio {color: #1ecc43;} +.sciradio {color: #c68cfa;} +.comradio {color: #5177ff;} +.secradio {color: #dd3535;} +.medradio {color: #57b8f0;} +.engradio {color: #f37746;} +.suppradio {color: #b88646;} +.servradio {color: #6ca729;} +.syndradio {color: #8f4a4b;} +.centcomradio {color: #2681a5;} +.aiprivradio {color: #d65d95;} +.redteamradio {color: #ff4444;} +.blueteamradio {color: #3434fd;} + +.alert {color: #d82020;} +h1.alert, h2.alert {color: #99aab5;} + +.attack {color: #e01c1c;} +.disarm {color: #b42525;} +.passive {color: #a00f0f;} + +.userdanger {color: #c51e1e;} +.danger {color: #c51e1e;} +.warning {color: #c51e1e;} +.alertwarning {color: #c51e1e;} +.boldwarning {color: #c51e1e;} +.announce {color: #c51e1e;} +.boldannounce {color: #c51e1e;} +.greenannounce {color: #059223;} +.info {color: #6685f5;} +.notice {color: #6685f5;} +.boldnotice {color: #6685f5;} +.adminnotice {color: #6685f5;} +.adminhelp {color: #ff0000;} +.unconscious {color: #E0E0E0;} +.red {color: #FF0000;} +.pink {color: #ff70c1;} +.blue {color: #215cff;} +.green {color: #059223;} +.nicegreen {color: #059223;} +.userlove {color: #ff42a6; text-shadow: 0 0 6px #82365e;} +.love {color: #ff4591; text-shadow: 0 0 6px #994449;} +.shadowling {color: #8e8a99;} +.cult {color: #aa1c1c;} + +.cultitalic {color: #aa1c1c;} +.cultbold {color: #aa1c1c;} +.cultboldtalic {color: #aa1c1c;} + +.cultlarge {color: #aa1c1c;} +.narsie {color: #aa1c1c;} +.narsiesmall {color: #aa1c1c;} +.hierophant {color: #b441ee;} +.hierophant_warning {color: #c56bf1;} +.purple {color: #9956d3;} +.holoparasite {color: #88809c;} + +.revennotice {color: #3645aa;} +.revenboldnotice {color: #3645aa;} +.revenbignotice {color: #3645aa;} +.revenminor {color: #823ddd;} +.revenwarning {color: #8911d9;} +.revendanger {color: #8911d9;} +.umbra {color: #7c00e6;} +.umbra_emphasis {color: #7c00e6;} +.umbra_large {color: #7c00e6;} + +.deconversion_message {color: #a947ff;} + +.alloy {color: #545b64;} +.heavy_alloy {color: #545b64;} +.nezbere_large {color: #545b64;} +.nezbere {color: #545b64;} +.nezbere_small {color: #545b64;} +.inathneq_large {color: #1d7dc7;} +.inathneq {color: #1d7dc7;} +.inathneq_small {color: #1d7dc7;} +.neovgre_large {color: #7c0622;} +.neovgre {color: #7c0622;} +.neovgre_small {color: #7c0622;} + +.newscaster {color: #c05d5d;} +.ghostalert {color: #6600ff;} + +.alien {color: #855d85;} +.noticealien {color: #059223;} +.alertalien {color: #059223;} +.changeling {color: #059223;} + +.spider {color: #8800ff;} + +.interface {color: #750e75;} + +.greentext {color: #059223;} +.redtext {color: #c51e1e;} +.clown {color: #ff70c1;} +.velvet {color: #660015;} +@keyframes velvet { + 0% { color: #890020; } + 40% { color: #c51e1e; } + 50% { color: #FF8888; } + 60% { color: #c51e1e; } + 100% { color: #890020; } +} + +.abductor {color: #c204c2;} +.mind_control {color: #df3da9;} +.drone {color: #979795;} + +.monkeyhive {color: #a56408;} +.monkeylead {color: #af6805;} + +.internal.boldnshit {color: #3d5bc3;} diff --git a/code/modules/goonchat/browserassets/css/browserOutput_light.css b/code/modules/goonchat/browserassets/css/browserOutput_light.css new file mode 100644 index 0000000000..b7036c74d8 --- /dev/null +++ b/code/modules/goonchat/browserassets/css/browserOutput_light.css @@ -0,0 +1,14 @@ +body {background: #F1F1F1;} + +#newMessages {background: #ddd;} +#ping {background: #ddd;} + +#userBar .subCell {background: #ddd;} + +/* POPUPS */ +.popup {background: #ddd;} +.popup .head {color: #ddd;} +.popup input[type=submit] {color: #ddd;} + +/* ADMIN CONTEXT MENU */ +.contextMenu {background-color: #ddd;} diff --git a/code/modules/goonchat/browserassets/css/browserOutput_white.css b/code/modules/goonchat/browserassets/css/browserOutput_white.css deleted file mode 100644 index e21185449b..0000000000 --- a/code/modules/goonchat/browserassets/css/browserOutput_white.css +++ /dev/null @@ -1,426 +0,0 @@ -/***************************************** -* -* GLOBAL STYLES -* -******************************************/ -html, body { - padding: 0; - margin: 0; - height: 100%; - color: #000000; -} -body { - background: #fff; - font-family: Verdana, sans-serif; - font-size: 9pt; - line-height: 1.2; - overflow-x: hidden; - overflow-y: scroll; - word-wrap: break-word; -} - -em { - font-style: normal; - font-weight: bold; -} - -img { - margin: 0; - padding: 0; - line-height: 1; - -ms-interpolation-mode: nearest-neighbor; - image-rendering: pixelated; -} -img.icon { - height: 1em; - min-height: 16px; - width: auto; - vertical-align: bottom; -} - - -.r:before { /* "repeated" badge class for combined messages */ - content: 'x'; -} -.r { - display: inline-block; - min-width: 0.5em; - font-size: 0.7em; - padding: 0.2em 0.3em; - line-height: 1; - color: white; - text-align: center; - white-space: nowrap; - vertical-align: middle; - background-color: crimson; - border-radius: 10px; -} - -a {color: #0000ff;} -a.visited {color: #ff00ff;} -a:visited {color: #ff00ff;} -a.popt {text-decoration: none;} - -/***************************************** -* -* OUTPUT NOT RELATED TO ACTUAL MESSAGES -* -******************************************/ -#loading { - position: fixed; - width: 300px; - height: 150px; - text-align: center; - left: 50%; - top: 50%; - margin: -75px 0 0 -150px; -} -#loading i {display: block; padding-bottom: 3px;} - -#messages { - font-size: 13px; - padding: 3px; - margin: 0; - word-wrap: break-word; -} -#newMessages { - position: fixed; - display: block; - bottom: 0; - right: 0; - padding: 8px; - background: #ddd; - text-decoration: none; - font-variant: small-caps; - font-size: 1.1em; - font-weight: bold; - color: #333; -} -#newMessages:hover {background: #ccc;} -#newMessages i {vertical-align: middle; padding-left: 3px;} -#ping { - position: fixed; - top: 0; - right: 115px; - width: 45px; - background: #ddd; - height: 30px; - padding: 8px 0 2px 0; -} -#ping i {display: block; text-align: center;} -#ping .ms { - display: block; - text-align: center; - font-size: 8pt; - padding-top: 2px; -} -#userBar { - position: fixed; - top: 0; - right: 0; -} -#userBar .subCell { - background: #ddd; - height: 30px; - padding: 5px 0; - display: block; - color: #333; - text-decoration: none; - line-height: 28px; - border-top: 1px solid #b4b4b4; -} -#userBar .subCell:hover {background: #ccc;} -#userBar .toggle { - width: 40px; - background: #ccc; - border-top: 0; - float: right; - text-align: center; -} -#userBar .sub {clear: both; display: none; width: 160px;} -#userBar .sub.scroll {overflow-y: scroll;} -#userBar .sub.subCell {padding: 3px 0 3px 8px; line-height: 30px; font-size: 0.9em; clear: both;} -#userBar .sub span { - display: block; - line-height: 30px; - float: left; -} -#userBar .sub i { - display: block; - padding: 0 5px; - font-size: 1.1em; - width: 22px; - text-align: center; - line-height: 30px; - float: right; -} -#userBar .sub input { - position: absolute; - padding: 7px 5px; - width: 121px; - line-height: 30px; - float: left; -} -#userBar .topCell {border-top: 0;} - -/* POPUPS */ -.popup { - position: fixed; - top: 50%; - left: 50%; - background: #ddd; -} -.popup .close { - position: absolute; - background: #aaa; - top: 0; - right: 0; - color: #333; - text-decoration: none; - z-index: 2; - padding: 0 10px; - height: 30px; - line-height: 30px; -} -.popup .close:hover {background: #999;} -.popup .head { - background: #999; - color: #ddd; - padding: 0 10px; - height: 30px; - line-height: 30px; - text-transform: uppercase; - font-size: 0.9em; - font-weight: bold; - border-bottom: 2px solid green; -} -.popup input {border: 1px solid #999; background: #fff; margin: 0; padding: 5px; outline: none; color: #333;} -.popup input[type=text]:hover, .popup input[type=text]:active, .popup input[type=text]:focus {border-color: green;} -.popup input[type=submit] {padding: 5px 10px; background: #999; color: #ddd; text-transform: uppercase; font-size: 0.9em; font-weight: bold;} -.popup input[type=submit]:hover, .popup input[type=submit]:focus, .popup input[type=submit]:active {background: #aaa; cursor: pointer;} - -.changeFont {padding: 10px;} -.changeFont a {display: block; text-decoration: none; padding: 3px; color: #333;} -.changeFont a:hover {background: #ccc;} - -.highlightPopup {padding: 10px; text-align: center;} -.highlightPopup input[type=text] {display: block; width: 215px; text-align: left; margin-top: 5px;} -.highlightPopup input.highlightColor {background-color: #FFFF00;} -.highlightPopup input.highlightTermSubmit {margin-top: 5px;} - -/* ADMIN CONTEXT MENU */ -.contextMenu { - background-color: #ddd; - position: fixed; - margin: 2px; - width: 150px; -} -.contextMenu a { - display: block; - padding: 2px 5px; - text-decoration: none; - color: #333; -} - -.contextMenu a:hover { - background-color: #ccc; -} - -/* ADMIN FILTER MESSAGES MENU */ -.filterMessages {padding: 5px;} -.filterMessages div {padding: 2px 0;} -.filterMessages input {} -.filterMessages label {} - -.icon-stack {height: 1em; line-height: 1em; width: 1em; vertical-align: middle; margin-top: -2px;} - - -/***************************************** -* -* OUTPUT ACTUALLY RELATED TO MESSAGES -* -******************************************/ - -/* MOTD */ -.motd {color: #638500; font-family: Verdana, sans-serif;} -.motd h1, .motd h2, .motd h3, .motd h4, .motd h5, .motd h6 {color: #638500; text-decoration: underline;} -.motd a, .motd a:link, .motd a:visited, .motd a:active, .motd a:hover {color: #638500;} - -/* ADD HERE FOR BOLD */ -.bold, .name, .prefix, .ooc, .looc, .adminooc, .admin, .medal, .yell {font-weight: bold;} - -/* ADD HERE FOR ITALIC */ -.italic, .italics, .emote {font-style: italic;} - -/* OUTPUT COLORS */ -.highlight {background: yellow;} - -h1, h2, h3, h4, h5, h6 {color: #0000ff;font-family: Georgia, Verdana, sans-serif;} -h1.alert, h2.alert {color: #000000;} - -em {font-style: normal; font-weight: bold;} - -.ooc {color: #002eb8; font-weight: bold;} -.antagooc {color: #b8002e; font-weight: bold;} -.adminobserverooc {color: #0099cc; font-weight: bold;} -.adminooc {color: #700038; font-weight: bold;} - -.adminsay {color: #ff4500; font-weight: bold;} -.admin {color: #4473ff; font-weight: bold;} - -.name { font-weight: bold;} - -.say {} -.deadsay {color: #5c00e6;} -.binarysay {color: #20c20e; background-color: #000000; display: block;} -.binarysay a {color: #00ff00;} -.binarysay a:active, .binarysay a:visited {color: #88ff88;} -.radio {color: #008000;} -.sciradio {color: #993399;} -.comradio {color: #948f02;} -.secradio {color: #a30000;} -.medradio {color: #337296;} -.engradio {color: #fb5613;} -.suppradio {color: #a8732b;} -.servradio {color: #6eaa2c;} -.syndradio {color: #6d3f40;} -.centcomradio {color: #686868;} -.aiprivradio {color: #ff00ff;} -.redteamradio {color: #ff0000;} -.blueteamradio {color: #0000ff;} - -.yell { font-weight: bold;} - -.alert {color: #ff0000;} -h1.alert, h2.alert {color: #000000;} - -.emote { font-style: italic;} -.selecteddna {color: #ffffff; background-color: #001B1B} - -.attack {color: #ff0000;} -.disarm {color: #990000;} -.passive {color: #660000;} - -.userdanger {color: #ff0000; font-weight: bold; font-size: 24px;} -.danger {color: #ff0000;} -.warning {color: #ff0000; font-style: italic;} -.alertwarning {color: #FF0000; font-weight: bold} -.boldwarning {color: #ff0000; font-style: italic; font-weight: bold} -.announce {color: #228b22; font-weight: bold;} -.boldannounce {color: #ff0000; font-weight: bold;} -.greenannounce {color: #00ff00; font-weight: bold;} -.rose {color: #ff5050;} -.info {color: #0000CC;} -.notice {color: #000099;} -.boldnotice {color: #000099; font-weight: bold;} -.adminnotice {color: #0000ff;} -.adminhelp {color: #ff0000; font-weight: bold;} -.unconscious {color: #0000ff; font-weight: bold;} -.suicide {color: #ff5050; font-style: italic;} -.green {color: #03ff39;} -.red {color: #FF0000} -.pink {color: #FF69Bf;} -.blue {color: #0000FF} -.nicegreen {color: #14a833;} -.userlove {color: #FF1493; font-style: italic; font-weight: bold; text-shadow: 0 0 6px #ff6dbc;} -.love {color: #ff006a; font-style: italic; text-shadow: 0 0 6px #ff6d6d;} -.shadowling {color: #3b2769;} -.cult {color: #960000;} - -.cultitalic {color: #960000; font-style: italic;} -.cultbold {color: #960000; font-style: italic; font-weight: bold;} -.cultboldtalic {color: #960000; font-weight: bold; font-size: 24px;} - -.cultlarge {color: #960000; font-weight: bold; font-size: 24px;} -.narsie {color: #960000; font-weight: bold; font-size: 120px;} -.narsiesmall {color: #960000; font-weight: bold; font-size: 48px;} -.colossus {color: #7F282A; font-size: 40px;} -.hierophant {color: #660099; font-weight: bold; font-style: italic;} -.hierophant_warning {color: #660099; font-style: italic;} -.purple {color: #5e2d79;} -.holoparasite {color: #35333a;} - -.revennotice {color: #1d2953;} -.revenboldnotice {color: #1d2953; font-weight: bold;} -.revenbignotice {color: #1d2953; font-weight: bold; font-size: 24px;} -.revenminor {color: #823abb} -.revenwarning {color: #760fbb; font-style: italic;} -.revendanger {color: #760fbb; font-weight: bold; font-size: 24px;} -.umbra {color: #5000A0;} -.umbra_emphasis {color: #5000A0; font-weight: bold; font-style: italic;} -.umbra_large {color: #5000A0; font-size: 24px; font-weight: bold; font-style: italic;} - -.deconversion_message {color: #5000A0; font-size: 24px; font-style: italic;} - -.brass {color: #BE8700;} -.heavy_brass {color: #BE8700; font-weight: bold; font-style: italic;} -.large_brass {color: #BE8700; font-size: 24px;} -.big_brass {color: #BE8700; font-size: 24px; font-weight: bold; font-style: italic;} -.ratvar {color: #BE8700; font-size: 48px; font-weight: bold; font-style: italic;} -.alloy {color: #42474D;} -.heavy_alloy {color: #42474D; font-weight: bold; font-style: italic;} -.nezbere_large {color: #42474D; font-size: 24px; font-weight: bold; font-style: italic;} -.nezbere {color: #42474D; font-weight: bold; font-style: italic;} -.nezbere_small {color: #42474D;} -.sevtug_large {color: #AF0AAF; font-size: 24px; font-weight: bold; font-style: italic;} -.sevtug {color: #AF0AAF; font-weight: bold; font-style: italic;} -.sevtug_small {color: #AF0AAF;} -.inathneq_large {color: #1E8CE1; font-size: 24px; font-weight: bold; font-style: italic;} -.inathneq {color: #1E8CE1; font-weight: bold; font-style: italic;} -.inathneq_small {color: #1E8CE1;} -.nzcrentr_large {color: #DAAA18; font-size: 24px; font-weight: bold; font-style: italic;} -.nzcrentr {color: #DAAA18; font-weight: bold; font-style: italic;} -.nzcrentr_small {color: #DAAA18;} -.neovgre_large {color: #6E001A; font-size: 24px; font-weight: bold; font-style: italic;} -.neovgre {color: #6E001A; font-weight: bold; font-style: italic;} -.neovgre_small {color: #6E001A;} - -.newscaster {color: #800000;} -.ghostalert {color: #5c00e6; font-style: italic; font-weight: bold;} - -.alien {color: #543354;} -.noticealien {color: #00c000;} -.alertalien {color: #00c000; font-weight: bold;} -.changeling {color: #800080; font-style: italic;} - -.spider {color: #4d004d;} - -.interface {color: #330033;} - -.sans {font-family: "Comic Sans MS", cursive, sans-serif;} -.papyrus {font-family: "Papyrus", cursive, sans-serif;} -.robot {font-family: "Courier New", cursive, sans-serif;} - -.command_headset {font-weight: bold; font-size: 24px;} -.small {font-size: 8px;} -.big {font-size: 24px;} -.reallybig {font-size: 32px;} -.extremelybig {font-size: 40px;} -.greentext {color: #00FF00; font-size: 24px;} -.redtext {color: #FF0000; font-size: 24px;} -.clown {color: #FF69Bf; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} -.his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} - -.icon {height: 1em; width: auto;} - -.memo {color: #638500; text-align: center;} -.memoedit {text-align: center; font-size: 16px;} -.abductor {color: #800080; font-style: italic;} -.mind_control {color: #A00D6F; font-size: 3; font-weight: bold; font-style: italic;} -.slime {color: #00CED1;} -.drone {color: #848482;} -.monkey {color: #975032;} -.swarmer {color: #2C75FF;} -.resonate {color: #298F85;} - -.monkeyhive {color: #774704;} -.monkeylead {color: #774704; font-size: 2;} - -.connectionClosed, .fatalError {background: red; color: white; padding: 5px;} -.connectionClosed.restored {background: green;} -.internal.boldnshit {color: blue; font-weight: bold;} - -/* HELPER CLASSES */ -.text-normal {font-weight: normal; font-style: normal;} -.hidden {display: none; visibility: hidden;} - diff --git a/code/modules/goonchat/browserassets/html/browserOutput.html b/code/modules/goonchat/browserassets/html/browserOutput.html index 9c6d462a85..68da251702 100644 --- a/code/modules/goonchat/browserassets/html/browserOutput.html +++ b/code/modules/goonchat/browserassets/html/browserOutput.html @@ -5,8 +5,9 @@ - + + @@ -29,7 +30,7 @@ --ms
- +
diff --git a/code/modules/goonchat/browserassets/js/browserOutput.js b/code/modules/goonchat/browserassets/js/browserOutput.js index 93a498fd06..abd05d29ed 100644 --- a/code/modules/goonchat/browserassets/js/browserOutput.js +++ b/code/modules/goonchat/browserassets/js/browserOutput.js @@ -35,7 +35,7 @@ var opts = { 'wasd': false, //Is the user in wasd mode? 'priorChatHeight': 0, //Thing for height-resizing detection 'restarting': false, //Is the round restarting? - 'darkmode':false, //Are we using darkmode? If not WHY ARE YOU LIVING IN 2009??? + 'colorPreset': 0, // index in the color presets list. //Options menu 'selectedSubLoop': null, //Contains the interval loop for closing the selected sub menu @@ -73,6 +73,14 @@ var opts = { }; +// Array of names for chat display color presets. +// If not set to normal, a CSS file `browserOutput_${name}.css` will be added to the head. +var colorPresets = [ + 'normal', + 'light', + 'dark' +] + function clamp(val, min, max) { return Math.max(min, Math.min(val, max)) } @@ -96,6 +104,12 @@ if (typeof String.prototype.trim !== 'function') { }; } +function updateColorPreset() { + var el = $("#colorPresetLink")[0]; + el.href = "browserOutput_"+colorPresets[opts.colorPreset]+".css"; + runByond('?_src_=chat&proc=colorPresetPost&preset='+colorPresets[opts.colorPreset]); +} + // Linkify the contents of a node, within its parent. function linkify(parent, insertBefore, text) { var start = 0; @@ -395,19 +409,6 @@ 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}; @@ -615,7 +616,7 @@ $(function() { 'shighlightColor': getCookie('highlightcolor'), 'smusicVolume': getCookie('musicVolume'), 'smessagecombining': getCookie('messagecombining'), - 'sdarkmode': getCookie('darkmode'), + 'scolorPreset': getCookie('colorpreset'), }; if (savedConfig.sfontSize) { @@ -626,9 +627,6 @@ $(function() { $("body").css('line-height', savedConfig.slineHeight); internalOutput('Loaded line height setting of: '+savedConfig.slineHeight+'', 'internal'); } - if(savedConfig.sdarkmode == 'true'){ - swap(); - } if (savedConfig.spingDisabled) { if (savedConfig.spingDisabled == 'true') { opts.pingDisabled = true; @@ -654,6 +652,13 @@ $(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); @@ -839,9 +844,6 @@ $(function() { $('#toggleOptions').click(function(e) { handleToggleClick($subOptions, $(this)); }); - $('#darkmodetoggle').click(function(e) { - swap(); - }); $('#toggleAudio').click(function(e) { handleToggleClick($subAudio, $(this)); }); @@ -913,7 +915,7 @@ $(function() { $.ajax({ type: 'GET', - url: 'browserOutput_white.css', + url: 'browserOutput.css', success: function(styleData) { var blob = new Blob(['Chat Log', $messages.html(), '']); @@ -992,6 +994,13 @@ $(function() { opts.messageCount = 0; }); + $('#changeColorPreset').click(function() { + opts.colorPreset = (opts.colorPreset+1) % colorPresets.length; + updateColorPreset(); + setCookie('colorpreset', opts.colorPreset, 365); + internalOutput('Changed color preset to: '+colorPresets[opts.colorPreset]); + }); + $('#musicVolumeSpan').hover(function() { $('#musicVolumeText').addClass('hidden'); $('#musicVolume').removeClass('hidden'); diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm index 829cb55312..f2d7fa1526 100644 --- a/code/modules/holiday/easter.dm +++ b/code/modules/holiday/easter.dm @@ -68,7 +68,7 @@ /obj/item/storage/bag/easterbasket/Initialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.can_hold = typecacheof(list(/obj/item/reagent_containers/food/snacks/egg, /obj/item/reagent_containers/food/snacks/chocolateegg, /obj/item/reagent_containers/food/snacks/boiledegg)) /obj/item/storage/bag/easterbasket/proc/countEggs() diff --git a/code/modules/holiday/halloween/bartholomew.dm b/code/modules/holiday/halloween/bartholomew.dm new file mode 100644 index 0000000000..aa119dca84 --- /dev/null +++ b/code/modules/holiday/halloween/bartholomew.dm @@ -0,0 +1,158 @@ +/obj/effect/landmark/barthpot + name = "barthpot" + +/obj/item/barthpot + name = "Bartholomew" + icon = 'icons/obj/halloween_items.dmi' + icon_state = "barthpot" + anchored = TRUE + var/items_list = list() + speech_span = "spooky" + var/active = TRUE + +/obj/item/barthpot/Destroy() + var/obj/item/barthpot/n = new src(loc) + n.items_list = items_list + ..() + + +/obj/item/barthpot/attackby(obj/item/I, mob/user, params) + if(!active) + say("Meow!") + return + + for(var/I2 in items_list) + if(istype(I, I2)) + qdel(I) + new /obj/item/reagent_containers/food/snacks/special_candy(loc) + to_chat(user, "You add the [I.name] to the pot and watch as it melts into the mixture, a candy crystalising in it's wake.") + say("Hooray! Thank you!") + items_list -= I2 + return + say("It doesn't seem like that's magical enough!") + +/obj/item/barthpot/attack_hand(mob/user) + if(!active) + say("Meow!") + return + say("Hello there, I'm Bartholomew, Jacqueline's Familiar.") + sleep(20) + + say("I'm currently seeking items to put into my pot, if we get the right items, it should crystalise into a magic candy!") + if(!iscarbon(user)) + say("Though... I'm not sure you can help me.") + + var/message = "From what I can tell, " + if(LAZYLEN(items_list) < 5) + generate_items() + for(var/I2 in items_list) + if(!I2) + items_list -= I2 + continue + var/obj/item/I3 = new I2 + message += "a [I3.name], " + message += "currently seem to have the most magic potential." + sleep(15) + say("[message]") + sleep(15) + //To help people find her + for(var/mob/living/simple_animal/jacq/J in GLOB.simple_animals[1]) + var/turf/L1 = J.loc + if(!L1) //Incase someone uh.. puts her in a locker + return + var/area/L2 = L1.loc + if(L2) + say("Also, it seems that Jacqueline is currently at the [L2], if you're looking for her too.") + +/obj/item/barthpot/proc/generate_items() + var/length = LAZYLEN(items_list) + var/rand_items = list(/obj/item/bodybag = 1, + /obj/item/clothing/glasses/meson = 2, + /obj/item/clothing/glasses/sunglasses = 1, + /obj/item/clothing/gloves/color/fyellow = 1, + /obj/item/clothing/head/hardhat = 1, + /obj/item/clothing/head/hardhat/red = 1, + /obj/item/clothing/head/that = 1, + /obj/item/clothing/head/ushanka = 1, + /obj/item/clothing/head/welding = 1, + /obj/item/clothing/mask/gas = 10, + /obj/item/clothing/suit/hazardvest = 1, + /obj/item/clothing/suit/hooded/flashsuit = 1, + /obj/item/assembly/prox_sensor = 4, + /obj/item/assembly/timer = 3, + /obj/item/flashlight = 6, + /obj/item/flashlight/pen = 1, + /obj/item/flashlight/glowstick = 4, + /obj/item/multitool = 2, + /obj/item/radio = 2, + /obj/item/t_scanner = 5, + /obj/item/airlock_painter = 1, + /obj/item/stack/cable_coil = 6, + /obj/item/stack/medical/bruise_pack = 1, + /obj/item/stack/rods = 3, + /obj/item/stack/sheet/cardboard = 2, + /obj/item/stack/sheet/metal = 1, + /obj/item/stack/sheet/mineral/plasma = 1, + /obj/item/stack/sheet/rglass = 1, + /obj/item/coin = 1, + /obj/item/crowbar = 4, + /obj/item/extinguisher = 3, + /obj/item/hand_labeler = 1, + /obj/item/paper = 6, + /obj/item/pen = 5, + /obj/item/reagent_containers/spray/pestspray = 1, + /obj/item/reagent_containers/rag = 3, + /obj/item/stock_parts/cell = 3, + /obj/item/storage/belt/utility = 2, + /obj/item/storage/box = 4, + /obj/item/reagent_containers/food/drinks/sillycup = 1, + /obj/item/storage/box/donkpockets = 1, + /obj/item/storage/box/lights/mixed = 1, + /obj/item/storage/box/hug/medical = 1, + /obj/item/storage/fancy/cigarettes = 1, + /obj/item/storage/toolbox = 1, + /obj/item/screwdriver = 3, + /obj/item/tank/internals/emergency_oxygen = 2, + /obj/item/vending_refill/cola = 1, + /obj/item/weldingtool = 3, + /obj/item/wirecutters = 2, + /obj/item/wrench = 4, + /obj/item/weaponcrafting/receiver = 1, + /obj/item/geiger_counter = 3, + /obj/item/reagent_containers/food/snacks/grown/citrus/orange = 5, + /obj/item/assembly/infra = 1, + /obj/item/assembly/igniter = 2, + /obj/item/assembly/signaler = 2, + /obj/item/assembly/mousetrap = 5, + /obj/item/reagent_containers/syringe = 5, + /obj/item/clothing/gloves = 8, + /obj/item/storage/toolbox = 2, + /obj/item/reagent_containers/pill = 2, + /obj/item/clothing/shoes = 8, + /obj/item/clothing/head = 3, + /obj/item/reagent_containers/food/snacks = 3, + /obj/item/reagent_containers/syringe/dart = 2, + /obj/item/reagent_containers/food/drinks/soda_cans = 5) + if(length >= 5) + return TRUE + //var/metalist = pickweight(GLOB.maintenance_loot) + for(var/i = length, i <= 5, i+=1) + var/obj/item = pickweight(rand_items) + if(!item) + i-=1 + continue + for(var/obj/item_dupe in items_list) //No duplicates + if(item_dupe == item) + i-=1 + continue + items_list += item + return TRUE + +/obj/item/pinpointer/jacq + name = "The Jacq-Tracq" + desc = "A handheld tracking device that locks onto witchy signals." + +/obj/item/pinpointer/jacq/attack_self(mob/living/user) + for(var/mob/living/simple_animal/jacq/J in GLOB.simple_animals[1]) + target = J + ..() diff --git a/code/modules/holiday/halloween.dm b/code/modules/holiday/halloween/halloween.dm similarity index 92% rename from code/modules/holiday/halloween.dm rename to code/modules/holiday/halloween/halloween.dm index a27db8dd38..5635994a7a 100644 --- a/code/modules/holiday/halloween.dm +++ b/code/modules/holiday/halloween/halloween.dm @@ -5,19 +5,27 @@ //spooky recipes -/datum/recipe/sugarcookie/spookyskull - reagents = list("flour" = 5, "sugar" = 5, "milk" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/egg, +/datum/crafting_recipe/food/sugarcookie/spookyskull + time = 15 + name = "Sugar cookie" + reqs = list( + /datum/reagent/consumable/sugar = 5, + /obj/item/reagent_containers/food/snacks/pastrybase = 1 ) result = /obj/item/reagent_containers/food/snacks/sugarcookie/spookyskull + subcategory = CAT_PASTRY -/datum/recipe/sugarcookie/spookycoffin - reagents = list("flour" = 5, "sugar" = 5, "coffee" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/egg, +/datum/crafting_recipe/food/sugarcookie/spookycoffin + time = 15 + name = "Sugar cookie" + reqs = list( + /datum/reagent/consumable/sugar = 5, + /datum/reagent/consumable/coffee = 5, + /obj/item/reagent_containers/food/snacks/pastrybase = 1 ) result = /obj/item/reagent_containers/food/snacks/sugarcookie/spookycoffin + subcategory = CAT_PASTRY + ////////////////////////////// //Spookoween trapped closets// @@ -34,12 +42,12 @@ var/trapped = 0 var/mob/trapped_mob -/obj/structure/closet/initialize() +/obj/structure/closet/Initialize() ..() if(prob(30)) set_spooky_trap() -/obj/structure/closet/dump_contents() +/obj/structure/closet/dump_contents(var/override = TRUE) ..() trigger_spooky_trap() @@ -256,6 +264,7 @@ desc = "A standard miniature energy crossbow that uses a hard-light projector to transform bolts into candy corn. Happy Halloween!" category = "Holiday" item = /obj/item/gun/energy/kinetic_accelerator/crossbow/halloween + cost = 12 surplus = 0 /datum/uplink_item/device_tools/emag/hack_o_lantern diff --git a/code/modules/holiday/halloween/jacqueen.dm b/code/modules/holiday/halloween/jacqueen.dm new file mode 100644 index 0000000000..ed9254c295 --- /dev/null +++ b/code/modules/holiday/halloween/jacqueen.dm @@ -0,0 +1,482 @@ +//Conversation +#define JACQ_HELLO (1<<0) +#define JACQ_CANDIES (1<<1) +#define JACQ_HEAD (1<<2) +#define JACQ_FAR (1<<3) +#define JACQ_WITCH (1<<4) +#define JACQ_EXPELL (1<<5) +#define JACQ_DATE (1<<6) + +/////// EVENT +/datum/round_event_control/jacqueen + name = "Jacqueline's visit" + holidayID = "jacqueen" + typepath = /datum/round_event/jacqueen + weight = -1 //forces it to be called, regardless of weight + max_occurrences = 1 + earliest_start = 0 MINUTES + +/datum/round_event/jacqueen/start() + ..() + + for(var/mob/living/carbon/human/H in GLOB.carbon_list) + playsound(H, 'sound/spookoween/ahaha.ogg', 100, 0.25) + + for(var/obj/effect/landmark/barthpot/bp in GLOB.landmarks_list) + new /obj/item/barthpot(bp.loc) + new /mob/living/simple_animal/jacq(bp.loc) + +/////// MOBS + +//Whacha doing in here like? Yae wan tae ruin ta magicks? +/mob/living/simple_animal/jacq + name = "Jacqueline the Pumpqueen" + real_name = "Jacqueline" + icon = 'icons/obj/halloween_items.dmi' + icon_state = "jacqueline" + maxHealth = 25 + health = 25 + density = FALSE + speech_span = "spooky" + friendly = "pets" + response_help = "chats with" + light_range = 3 + light_color = "#ff9842" + var/last_poof + var/progression = list() //Keep track of where people are in the story. + var/active = TRUE //Turn this to false to keep normal mob behavour + var/cached_z + +/mob/living/simple_animal/jacq/Initialize() + ..() + cached_z = z + poof() + +/mob/living/simple_animal/jacq/Life() + ..() + if(!ckey) + if((last_poof+3 MINUTES) < world.realtime) + poof() + +/mob/living/simple_animal/jacq/Destroy() //I.e invincible + visible_message("[src] cackles, \"You'll nae get rid a me that easily!\"") + playsound(loc, 'sound/spookoween/ahaha.ogg', 100, 0.25) + var/mob/living/simple_animal/jacq/Jacq = new src.type(loc) + Jacq.progression = progression + ..() + +/mob/living/simple_animal/jacq/death() //What is alive may never die + visible_message("[src] cackles, \"You'll nae get rid a me that easily!\"") + playsound(loc, 'sound/spookoween/ahaha.ogg', 100, 0.25) + health = 25 + poof() + +/mob/living/simple_animal/jacq/attack_hand(mob/living/carbon/human/M) + if(!active) + say("Hello there [gender_check(M)]!") + return ..() + if(!ckey) + canmove = FALSE + chit_chat(M) + canmove = TRUE + ..() + +/mob/living/simple_animal/jacq/attack_paw(mob/living/carbon/monkey/M) + if(!active) + say("Hello there [gender_check(M)]!") + return ..() + if(!ckey) + canmove = FALSE + chit_chat(M) + canmove = TRUE + ..() + +/mob/living/simple_animal/jacq/proc/poof() + last_poof = world.realtime + var/datum/reagents/R = new/datum/reagents(100)//Hey, just in case. + var/datum/effect_system/smoke_spread/chem/s = new() + R.add_reagent("secretcatchem", (10)) + s.set_up(R, 0, loc) + s.start() + visible_message("[src] disappears in a puff of smoke!") + canmove = TRUE + health = 25 + + var/hp_list = list() + for(var/obj/machinery/holopad/hp in world) + hp_list += hp + + var/nono_areas = list("AI ") + + for(var/i = 0, i <= 6, i+=1) //Attempts a jump 6 times. + var/obj/machinery/holopad/hp = pick(hp_list) + if(forceMove(pick(hp.loc))) + + var/jacq_please_no = FALSE + for(var/no_area in nono_areas) + var/turf/L1 = hp.loc + if(!L1) //Incase the area isn't a turf (i.e. in a locker) + continue + var/area/L2 = L1.loc + if(L2) + if(findtext(L2.name, no_area)) + jacq_please_no = TRUE + + if(jacq_please_no) + i-=1 + continue + + //Try to go to populated areas + var/list/seen = viewers(8, get_turf(src)) + for(var/victim in seen) + if(ishuman(victim)) + if(z == cached_z) + return TRUE + + + return FALSE + +/mob/living/simple_animal/jacq/proc/gender_check(mob/living/carbon/C) + var/gender = "lamb" + if(C) + if(C.gender == MALE) + gender = "laddie" + if(C.gender == FEMALE) + gender = "lassie" + return gender + +//Ye wee bugger, gerrout of it. Ye've nae tae enjoy reading the code fer mae secrets like. +/mob/living/simple_animal/jacq/proc/chit_chat(mob/living/carbon/C) + //Very important + var/gender = gender_check(C) + if(C) + if(C.gender == MALE) + gender = "laddie" + if(C.gender == FEMALE) + gender = "lassie" + + if(!progression["[C.real_name]"] || !(progression["[C.real_name]"] & JACQ_HELLO)) + visible_message("[src] smiles ominously at [C], \"Well halo there [gender]! Ah'm Jacqueline, tae great Pumpqueen, great tae meet ye.\"") + sleep(20) + visible_message("[src] continues, \"Ah'm sure yae well stunned, but ah've got nae taem fer that. Ah'm after the candies around this station. If yae get mae enoof o the wee buggers, Ah'll give ye a treat, or if yae feeling bold, Ah ken trick ye instead.\" giving [C] a wide grin.") + if(!progression["[C.real_name]"]) + progression["[C.real_name]"] = NONE //TO MAKE SURE THAT THE LIST ENTRY EXISTS. + + progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_HELLO + + var/choices = list("Trick", "Treat", "How do I get candies?") + var/choice = input(C, "Trick or Treat?", "Trick or Treat?") in choices + switch(choice) + if("Trick") + trick(C) + return + if("Treat") + if(check_candies(C)) + treat(C, gender) + else + visible_message("[src] raises an eyebrow, \"You've nae got any candies Ah want! They're the orange round ones, now bugger off an go get em first.\"") + return + if("How do I get candies?") + visible_message("[src] says, \"Gae find my familiar; Bartholomew. Ee's tendin the cauldron which ken bring oot t' magic energy in items scattered aroond. Knowing him, ee's probably gone tae somewhere with books.\"") + return + +/mob/living/simple_animal/jacq/proc/treat(mob/living/carbon/C, gender) + visible_message("[src] gives off a glowing smile, \"What ken Ah offer ye? I can magic up an object, a potion or a plushie fer ye.\"") + var/choices_reward = list("Object - 3 candies", "Potion - 2 candies", "Jacqueline Tracker - 2 candies", "Plushie - 1 candy", "Can I get to know you instead?", "Become a pumpkinhead dullahan (perma) - 4 candies") + var/choice_reward = input(usr, "Trick or Treat?", "Trick or Treat?") in choices_reward + + //rewards + switch(choice_reward) + if("Become a pumpkinhead dullahan (perma) - 4 candies") + if(!take_candies(C, 4)) + visible_message("[src] raises an eyebrown, \"It's 4 candies for that [gender]! Thems the rules!\"") + return + visible_message("[src] waves their arms around, \"Off comes your head, a pumpkin taking it's stead!\"") + C.reagents.add_reagent("pumpkinmutationtoxin", 5) + sleep(20) + poof() + return + + if("Object - 3 candies") + if(!take_candies(C, 3)) + visible_message("[src] raises an eyebrown, \"It's 3 candies per trinket [gender]! Thems the rules!\"") + return + + var/new_obj = pick(subtypesof(/obj)) + //for(var/item in blacklist) + // if(new_obj == item) + // panic() + var/reward = new new_obj(C.loc) + C.put_in_hands(reward) + visible_message("[src] waves her hands, magicking up a [reward] from thin air, \"There ye are [gender], enjoy! \"") + sleep(20) + poof() + return + if("Potion - 2 candies") + if(!take_candies(C, 2)) + visible_message("[src] raises an eyebrow, \"It's 2 candies per potion [gender]! Thems the rules!\"") + return + + var/reward = new /obj/item/reagent_containers/potion_container(C.loc) + C.put_in_hands(reward) + visible_message("[src] waves her hands, magicking up a [reward] from thin air, \"There ye are [gender], enjoy! \"") + sleep(20) + poof() + return + if("Plushie - 1 candy") + if(!take_candies(C, 1)) + visible_message("[src] raises an eyebrow, \"It's 1 candy per plushie [gender]! Thems the rules!\"") + return + + new /obj/item/toy/plush/random(C.loc) + visible_message("[src] waves her hands, magicking up a plushie from thin air, \"There ye are [gender], enjoy! \"") + sleep(20) + poof() + return + if("Jacqueline Tracker - 2 candies") + if(!take_candies(C, 2)) + visible_message("[src] raises an eyebrow, \"It's 1 candy per plushie [gender]! Thems the rules!\"") + return + new /obj/item/pinpointer/jacq(C.loc) + visible_message("[src] waves her hands, magicking up a tracker from thin air, \"Feels weird to magic up a tracker fer meself but, here ye are [gender], enjoy! \"") + sleep(20) + poof() + return + + //chitchats! + if("Can I get to know you instead?") + var/choices = list() + //Figure out where the C is in the story + if(!progression["[C.real_name]"]) //I really don't want to get here withoot a hello, but just to be safe + progression["[C.real_name]"] = NONE + if(!(progression["[C.real_name]"] & JACQ_FAR)) + if(progression["[C.real_name]"] & JACQ_CANDIES) + choices += "You really came all this way for candy?" + else + choices += "Why do you want the candies?" + if(!(progression["[C.real_name]"] & JACQ_HEAD)) + choices += "What is that on your head?" + if(!(progression["[C.real_name]"] & JACQ_EXPELL)) + if(progression["[C.real_name]"] & JACQ_WITCH) + choices += "So you got ex-spell-ed?" + else + choices += "Are you a witch?" + + //for Kepler, delete this, or just delete the whole story aspect if you want. + //If fully completed + /* + if(progression["[C.real_name]"] & JACQ_FAR)//Damnit this is a pain + if(progression["[C.real_name]"] & JACQ_EXPELL) //I give up + if(progression["[C.real_name]"] & JACQ_HEAD) //This is only an event thing + choices += "Can I take you out on a date?" + */ + if(progression["[C.real_name]"] == 63)//Damnit this is a pain + choices += "Can I take you out on a date?" + + //If you've nothing to ask + if(!LAZYLEN(choices)) + visible_message("[src] sighs, \"Ah'm all questioned oot fer noo, [gender].\"") + return + //Otherwise, lets go! + visible_message("[src] says, \"A question? Sure, it'll cost you a candy though!\"") + choices += "Nevermind" + //Candies for chitchats + var/choice = input(C, "What do you want to ask?", "What do you want to ask?") in choices + if(!take_candies(C, 1)) + visible_message("[src] raises an eyebrow, \"It's a candy per question [gender]! Thems the rules!\"") + return + //Talking + switch(choice) + if("Why do you want the candies?") + visible_message("[src] says, \"Ave ye tried them? They're full of all sorts of reagents. Ah'm after them so ah ken magic em up an hopefully find rare stuff fer me brews. Honestly it's a lot easier magicking up tatt fer ye lot than runnin aroond on me own like. I'd ask me familiars but most a my familiars are funny fellows 'n constantly bugger off on adventures when given simple objectives like; Go grab me a tea cake or watch over me cauldron. Ah mean, ye might run into Bartholomew my cat. Ee's supposed tae be tending my cauldron, but I've nae idea where ee's got tae.\"") + progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_CANDIES + sleep(30) + + if("You really came all this way for candy?") + visible_message("[src] l ooks tae the side sheepishly, \"Aye, well, tae be honest, Ah'm here tae see me sis, but dunnae let her knew that. She's an alchemist too like, but she dunnae use a caldron like mae, she buggered off like tae her posh ivory tower tae learn bloody chemistry instead!\" [src] scowls, \"She's tae black sheep o' the family too, so we dunnae see eye tae eye sometimes on alchemy. Ah mean, she puts moles in her brews! Ye dunnae put moles in yer brews! Yae threw your brews at tae wee bastards an blew em up!\" [src] sighs, \"But she's a heart o gold so.. Ah wanted tae see her an check up oon her, make sure she's okay.\"") + progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_FAR + sleep(30) + + if("What is that on your head?") + visible_message("[src] pats the pumpkin atop her head, \"This thing? This ain't nae ordinary pumpkin! Me Ma grew this monster ooer a year o love, dedication an hard work. Honestly it felt like she loved this thing more than any of us, which Ah knew ain't true an it's not like she was hartless or anything but.. well, we had a falling oot when Ah got back home with all me stuff in tow. An all she had done is sent me owl after owl over t' last year aboot this bloody pumpkin and ah had enough. So ah took it, an put it on me head. You know, as ye do. Ah am the great Pumpqueen after all, Ah deserve this.\"") + progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_HEAD + sleep(30) + + if("Are you a witch?") + visible_message("[src] grumbles, \"If ye must know, Ah got kicked oot of the witch academy fer being too much of a \"loose cannon\". A bloody loose cannon? Nae they were just pissed off Ah had the brass tae proclaim myself as the Pumpqueen! And also maybe the time Ah went and blew up one of the towers by trying tae make a huge batch of astrogen might've had something tae do with it. Ah mean it would've worked fine if the cauldrons weren't so shite and were actually upgraded by the faculty. So technically no, I'm not a witch.\"") + progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_WITCH + sleep(30) + + if("So you got ex-spell-ed?") + visible_message("[src] Gives you a blank look at the pun, before continuing, \"Not quite, Ah know Ah ken get back into the academy, it's only an explosion, they happen all the time, but, tae be fair it's my fault that things came tae their explosive climax. You don't know what it's like when you're after a witch doctorate, everyone else is doing well, everyone's making new spells and the like, and I'm just good at making explosions really, or fireworks. So, Ah did something Ah knew was dangerous, because Ah had tae do something tae stand oot, but Ah know this life ain't fer me, Ah don't want tae be locked up in dusty towers, grinding reagent after reagent together, trying tae find new reactions, some of the wizards in there haven't left fer years. Ah want tae live, Ah want tae fly around on a broom, turn people into cats fer a day and disappear cackling! That's what got me into witchcraft!\" she throws her arms up in the arm, spinning the pumpkin upon her head slightly. She carefully spins it back to face you, giving oot a soft sigh, \"Ah know my mother's obsession with this dumb thing on my head is just her trying tae fill the void of me and my sis moving oot, and it really shouldn't be on my head. And Ah know that I'm really here tae get help from my sis.. She's the sensible one, and she gives good hugs.\"") + sleep(30) + visible_message("[src] says, \"Thanks [C], Ah guess Ah didn't realise Ah needed someone tae talk tae but, I'm glad ye spent all your candies talking tae me. Funny how things seem much worse in yer head.\"") + progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_EXPELL + sleep(30) + + if("Can I take you out on a date?") + visible_message("[src] blushes, \"...You want tae ask me oot on a date? Me? After all that nonsense Ah just said? It seems a waste of a candy honestly.\"") + //progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_DATE + visible_message("[src] looks to the side, deep in thought.") + dating_start(C, gender) + + if("Nevermind") + visible_message("[src] shrugs, \"Suit yerself then, here's your candy back.\"") + new /obj/item/reagent_containers/food/snacks/special_candy(loc) + + +/mob/living/simple_animal/jacq/proc/trick(mob/living/carbon/C, gender) + var/option + if(ishuman(C)) + option = rand(1,6) + else + option = rand(1,5) + switch(option) + if(1) + visible_message("[src] waves their arms around, \"Hocus pocus, making friends is now your focus!\"") + var/message = pick("make a tasty sandwich for", "compose a poem for", "aquire a nice outfit to give to", "strike up a conversation about pumpkins with", "write a letter and deliver it to", "give a nice hat to") + var/mob/living/L2 = pick(GLOB.player_list) + message += " [L2.name]." + to_chat(C, " You feel an overwhelming desire to [message]") + if(2) + visible_message("[src] waves their arms around, \"If only you had a better upbringing, your ears are now full of my singing!\"") + var/client/C2 = C.client + C2.chatOutput.sendMusic("https://puu.sh/ExBbv.mp4", 1)//I hope this works! + if(3) + visible_message("[src] waves their arms around, \"You're cute little bumpkin, On your head is a pumpkin!\"") + if(C.head) + var/obj/item/W = C.head + C.dropItemToGround(W, TRUE) + var/jaqc_latern = new /obj/item/clothing/head/hardhat/pumpkinhead/jaqc + C.equip_to_slot(jaqc_latern, SLOT_HEAD, 1, 1) + if(4) + visible_message("[src] waves their arms around, \"In your body there's something amiss, you'll find it's a chem made by my sis!\"") + C.reagents.add_reagent("eigenstate", 30) + if(5) + visible_message("[src] waves their arms around, \"A new familiar for me, and you'll see it's thee!\"") + C.reagents.add_reagent("secretcatchem", 30) + if(6) + visible_message("[src] waves their arms around, \"While you may not be a ghost, for this sheet you'll always be it's host.\"") + var/mob/living/carbon/human/H = C + if(H.wear_suit) + var/obj/item/W = H.wear_suit + H.dropItemToGround(W, TRUE) + var/ghost = new /obj/item/clothing/suit/ghost_sheet/sticky + H.equip_to_slot(ghost, SLOT_WEAR_SUIT, 1, 1) + poof() + +//Blame Fel +/mob/living/simple_animal/jacq/proc/dating_start(mob/living/carbon/C, gender) + var/candies = pollGhostCandidates("Do you want to go on a date with [C] as Jacqueline the great pumpqueen?") + //sleep(30) //If the poll doesn't autopause. + if(candies) + candies = shuffle(candies)//Shake those ghosts up! + for(var/mob/dead/observer/C2 in candies) + if(C2.key && C2) + key = C2.key + message_admins("[C2]/[C2.key] has agreed to go on a date with [C] as Jacqueline.") + log_game("HALLOWEEN: [C2]/[C2.key] has agreed to go on a date with [C] as Jacqueline") + to_chat(src, "You are Jacqueline the great pumpqueen, witch Extraordinaire! You're a very Scottish lass with a kind heart, but also a little crazy. You also blew up the wizarding school and you're suspended for a while, so you visited the station before heading home. On your head lies the prize pumpkin of your Mother's pumpkin patch. You're currently on a date with [C] and well, I didn't think anyone would get this far. Please be good so I can do events like this in the future. ") + return + else + candies =- C2 + visible_message("[src] looks to the side, \"Look, Ah like ye but, Ah don't think Ah can right now. If ye can't tell, the stations covered in volatile candies, I've a few other laddies and lassies running after me treats, and tae top it all off, I've the gods breathing down me neck, watching every treat Ah make fer the lot of yous.\" she sighs, \"But that's not a no, right? That's.. just a nae right noo.\"") + sleep(20) + visible_message("[src] takes off the pumpkin on her head, a rich blush on her cheeks. She leans over planting a kiss upon your forehead quickly befere popping the pumpkin back on her head.") + sleep(10) + visible_message("[src] waves their arms around, \"There, that aught tae be worth a candy.\"") + sleep(20) + poof() + +/obj/item/clothing/head/hardhat/pumpkinhead/jaqc + name = "Jacq o' latern" + desc = "A jacqueline o' lantern! You can't seem to get rid of it." + icon_state = "hardhat0_pumpkin_j" + item_state = "hardhat0_pumpkin_j" + item_color = "pumpkin_j" + brightness_on = 4 + +/obj/item/clothing/head/hardhat/pumpkinhead/jaqc/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, GLUED_ITEM_TRAIT) + +/obj/item/clothing/suit/ghost_sheet/sticky + +/obj/item/clothing/suit/ghost_sheet/sticky/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, GLUED_ITEM_TRAIT) + +/obj/item/clothing/suit/ghost_sheet/sticky/attack_hand(mob/user) + if(iscarbon(user)) + to_chat(user, "Boooooo~!") + return + else + ..() + +/obj/item/clothing/suit/ghost_sheet/sticky/attack_hand(mob/user) + if(iscarbon(user)) + to_chat(user, "Boooooo~!") + return + else + ..() + +/datum/reagent/mutationtoxin/pumpkinhead + name = "Pumpkin head mutation toxin" + id = "pumpkinmutationtoxin" + race = /datum/species/dullahan/pumpkin + mutationtext = "The pain subsides. You feel your head roll off your shoulders... and you smell pumpkin." + //I couldn't get the replace head sprite with a pumpkin to work so, it is what it is. + +/mob/living/simple_animal/jacq/proc/check_candies(mob/living/carbon/C) + var/invs = C.get_contents() + var/candy_count = 0 + for(var/item in invs) + if(istype(item, /obj/item/reagent_containers/food/snacks/special_candy)) + candy_count++ + return candy_count + +/mob/living/simple_animal/jacq/proc/take_candies(mob/living/carbon/C, candy_amount = 1) + var/inv = C.get_contents() + var/candies = list() + for(var/item in inv) + if(istype(item, /obj/item/reagent_containers/food/snacks/special_candy)) + candies += item + if(LAZYLEN(candies) == candy_amount) + break + if(LAZYLEN(candies) == candy_amount) //I know it's a double check but eh, to be safe. + for(var/candy in candies) + qdel(candy) + return TRUE + return FALSE + +//Potions +/obj/item/reagent_containers/potion_container + name = "potion" + icon = 'icons/obj/halloween_items.dmi' + icon_state = "jacq_potion" + desc = "A potion with a strange concoction within. Be careful, as if it's thrown it explodes in a puff of smoke like Jacqueline." + +/obj/item/reagent_containers/potion_container/Initialize() + .=..() + var/R = get_random_reagent_id() + reagents.add_reagent(R, 30) + name = "[R] Potion" + +/obj/item/reagent_containers/potion_container/throw_impact(atom/target) + ..() + sleep(20) + var/datum/effect_system/smoke_spread/chem/s = new() + s.set_up(src.reagents, 3, src.loc) + s.start() + qdel(src) + +//Candies +/obj/item/reagent_containers/food/snacks/special_candy + name = "Magic candy" + icon = 'icons/obj/halloween_items.dmi' + icon_state = "jacq_candy" + desc = "A candy with strange magic within. Be careful, as the magic isn't always helpful." + +/obj/item/reagent_containers/food/snacks/special_candy/Initialize() + .=..() + reagents.add_reagent(get_random_reagent_id(), 5) diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm index 7d1e25235d..9d075857a7 100644 --- a/code/modules/holiday/holidays.dm +++ b/code/modules/holiday/holidays.dm @@ -333,6 +333,16 @@ /datum/holiday/halloween/getStationPrefix() return pick("Bone-Rattling","Mr. Bones' Own","2SPOOKY","Spooky","Scary","Skeletons") +/datum/holiday/jacqueen //Subset of halloween + name = "jacqueen" + begin_day = 27 + begin_month = OCTOBER + end_day = 2 + end_month = NOVEMBER + +/datum/holiday/jacqueen/greet() + return "Jacqueline the great Pumpqueen has come to visit!" + /datum/holiday/vegan name = "Vegan Day" begin_day = 1 diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm index 6cc11afdf5..889706744a 100644 --- a/code/modules/holodeck/computer.dm +++ b/code/modules/holodeck/computer.dm @@ -111,6 +111,11 @@ if(A) load_program(A) if("safety") + if(!issilicon(usr) && !IsAdminGhost(usr)) + var/msg = "[key_name(usr)] attempted to emag the holodeck using a href they shouldn't have!" + message_admins(msg) + log_admin(msg) + return obj_flags ^= EMAGGED if((obj_flags & EMAGGED) && program && emag_programs[program.name]) emergency_shutdown() diff --git a/code/modules/hydroponics/beekeeping/beekeeper_suit.dm b/code/modules/hydroponics/beekeeping/beekeeper_suit.dm index 7fa1a0dd2c..fd9f879f5e 100644 --- a/code/modules/hydroponics/beekeeping/beekeeper_suit.dm +++ b/code/modules/hydroponics/beekeeping/beekeeper_suit.dm @@ -4,7 +4,7 @@ desc = "Keeps the lil buzzing buggers out of your eyes." icon_state = "beekeeper" item_state = "beekeeper" - clothing_flags = THICKMATERIAL + clothing_flags = THICKMATERIAL | SNUG_FIT /obj/item/clothing/suit/beekeeper_suit diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm index f1aea5706a..af5919969c 100644 --- a/code/modules/hydroponics/grown/flowers.dm +++ b/code/modules/hydroponics/grown/flowers.dm @@ -37,7 +37,7 @@ species = "lily" plantname = "Lily Plants" product = /obj/item/reagent_containers/food/snacks/grown/poppy/lily - mutatelist = list() + mutatelist = list(/obj/item/seeds/bee_balm) /obj/item/reagent_containers/food/snacks/grown/poppy/lily seed = /obj/item/seeds/poppy/lily @@ -221,3 +221,61 @@ if(!user.gloves) to_chat(user, "The [name] burns your bare hand!") user.adjustFireLoss(rand(1, 5)) + +// Beebalm +/obj/item/seeds/bee_balm + name = "pack of Bee Balm seeds" + desc = "These seeds grow into Bee Balms." + icon_state = "seed-bee_balm" + species = "bee_balm" + plantname = "Bee Balm Buds" + product = /obj/item/reagent_containers/food/snacks/grown/bee_balm + endurance = 10 + maturation = 8 + yield = 3 + potency = 30 + growthstages = 3 + 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 + reagents_add = list("spaceacillin" = 0.1, "sterilizine" = 0.05) + +/obj/item/reagent_containers/food/snacks/grown/bee_balm + seed = /obj/item/seeds/bee_balm + name = "bee balm" + desc = "A flower used for medical antiseptic in history." + icon_state = "bee_balm" + filling_color = "#FF6347" + bitesize_mod = 8 + tastes = list("strong antiseptic " = 1) + foodtype = GROSS + +// Beebalm +/obj/item/seeds/bee_balm/honey + name = "pack of Honey Balm seeds" + desc = "These seeds grow into Honey Balms." + icon_state = "seed-bee_balmalt" + species = "seed-bee_balm_alt" + plantname = "Honey Balm Pods" + product = /obj/item/reagent_containers/food/snacks/grown/bee_balm/honey + endurance = 1 + maturation = 10 + yield = 1 + potency = 1 + growthstages = 3 + growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi' + icon_grow = "bee_balmalt-grow" + icon_dead = "bee_balmalt-dead" + reagents_add = list("honey" = 0.1, "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 + name = "honey balm" + desc = "A large honey filled pod of a flower." + icon_state = "bee_balmalt" + filling_color = "#FF6347" + bitesize_mod = 8 + tastes = list("wax" = 1) + foodtype = SUGAR \ No newline at end of file diff --git a/code/modules/hydroponics/grown/melon.dm b/code/modules/hydroponics/grown/melon.dm index 29691c3289..eb463e5f6d 100644 --- a/code/modules/hydroponics/grown/melon.dm +++ b/code/modules/hydroponics/grown/melon.dm @@ -58,6 +58,7 @@ wine_power = 70 //Water to wine, baby. wine_flavor = "divinity" -/obj/item/reagent_containers/food/snacks/grown/holymelon/Initialize() - . = ..() - AddComponent(/datum/component/anti_magic, TRUE, TRUE) //deliver us from evil o melon god + +// /obj/item/reagent_containers/food/snacks/grown/holymelon/Initialize() +// . = ..() +// AddComponent(/datum/component/anti_magic, TRUE, TRUE) //deliver us from evil o melon god diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm index 107a6a94f9..0902052a11 100644 --- a/code/modules/hydroponics/grown/misc.dm +++ b/code/modules/hydroponics/grown/misc.dm @@ -1,7 +1,7 @@ // Starthistle /obj/item/seeds/starthistle name = "pack of starthistle seeds" - desc = "A robust species of weed that often springs up in-between the cracks of spaceship parking lots." + desc = "A robust species of weed that often springs up in-between the cracks of spaceship parking lots. Grind down these seeds for a substitution for mustardgrind." icon_state = "seed-starthistle" species = "starthistle" plantname = "Starthistle" @@ -9,9 +9,10 @@ endurance = 50 // damm pesky weeds maturation = 5 production = 1 - yield = 2 + yield = 6 potency = 10 growthstages = 3 + grind_results = list("mustardgrind" = 1) growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi' genes = list(/datum/plant_gene/trait/plant_type/weed_hardy) mutatelist = list(/obj/item/seeds/harebell) diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm index ffa9e2e21d..d9bea64411 100644 --- a/code/modules/hydroponics/seed_extractor.dm +++ b/code/modules/hydroponics/seed_extractor.dm @@ -174,7 +174,7 @@ to_chat(usr, "\The [src] is full.") return FALSE - GET_COMPONENT_FROM(STR, /datum/component/storage, O.loc) + var/datum/component/storage/STR = O.loc.GetComponent(/datum/component/storage) if(STR) if(!STR.remove_from_storage(O,src)) return FALSE diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index b258a15972..b7feedd312 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -893,7 +893,7 @@ return FALSE var/ignore_bags = get_pin_data(IC_INPUT, 1) if(ignore_bags) - GET_COMPONENT_FROM(STR, /datum/component/storage, A) + var/datum/component/storage/STR = A.GetComponent(/datum/component/storage) if(STR) return FALSE set_pin_data(IC_OUTPUT, 1, WEAKREF(A)) @@ -1104,7 +1104,7 @@ /obj/item/integrated_circuit/input/matscan/do_work() var/atom/movable/H = get_pin_data_as_type(IC_INPUT, 1, /atom/movable) var/turf/T = get_turf(src) - GET_COMPONENT_FROM(mt, /datum/component/material_container, H) + var/datum/component/material_container/mt = H.GetComponent(/datum/component/material_container) if(!mt) //Invalid input return if(H in view(T)) // This is a camera. It can't examine thngs,that it can't see. diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm index 682e76a46e..81961c2d9c 100644 --- a/code/modules/integrated_electronics/subtypes/manipulation.dm +++ b/code/modules/integrated_electronics/subtypes/manipulation.dm @@ -411,7 +411,7 @@ .=..() /obj/item/integrated_circuit/manipulation/matman/proc/AfterMaterialInsert(type_inserted, id_inserted, amount_inserted) - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) set_pin_data(IC_OUTPUT, 2, materials.total_amount) for(var/I in 1 to mtypes.len) var/datum/material/M = materials.materials[mtypes[I]] @@ -423,7 +423,7 @@ return TRUE /obj/item/integrated_circuit/manipulation/matman/do_work(ord) - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) var/atom/movable/H = get_pin_data_as_type(IC_INPUT, 1, /atom/movable) if(!check_target(H)) activate_pin(4) @@ -441,7 +441,7 @@ else activate_pin(4) if(2) - GET_COMPONENT_FROM(mt, /datum/component/material_container, H) + var/datum/component/material_container/mt = H.GetComponent(/datum/component/material_container) var/suc for(var/I in 1 to mtypes.len) var/datum/material/M = materials.materials[mtypes[I]] @@ -467,7 +467,7 @@ activate_pin(6) /obj/item/integrated_circuit/manipulation/matman/Destroy() - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) materials.retrieve_all() .=..() @@ -509,14 +509,14 @@ if(!container || !istype(container,/obj/item/storage) || !Adjacent(container)) return - GET_COMPONENT_FROM(STR, /datum/component/storage, container) + var/datum/component/storage/STR = container.GetComponent(/datum/component/storage) if(!STR) return STR.attackby(src, target_obj) else - GET_COMPONENT_FROM(STR, /datum/component/storage, target_obj.loc) + var/datum/component/storage/STR = target_obj.loc.GetComponent(/datum/component/storage) if(!STR) return diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm index e88a80514a..2119baf1a5 100644 --- a/code/modules/jobs/access.dm +++ b/code/modules/jobs/access.dm @@ -1,368 +1,372 @@ - -//returns TRUE if this mob has sufficient access to use this object -/obj/proc/allowed(mob/M) - //check if it doesn't require any access at all - if(src.check_access(null)) - return TRUE - if(issilicon(M)) - if(ispAI(M)) - return FALSE - return TRUE //AI can do whatever it wants - if(IsAdminGhost(M)) - //Access can't stop the abuse - return TRUE - else if(istype(M) && SEND_SIGNAL(M, COMSIG_MOB_ALLOWED, src)) - return TRUE - else if(ishuman(M)) - var/mob/living/carbon/human/H = M - //if they are holding or wearing a card that has access, that works - if(check_access(H.get_active_held_item()) || src.check_access(H.wear_id)) - return TRUE - else if(ismonkey(M) || isalienadult(M)) - var/mob/living/carbon/george = M - //they can only hold things :( - if(check_access(george.get_active_held_item())) - return TRUE - else if(isanimal(M)) - var/mob/living/simple_animal/A = M - if(check_access(A.get_active_held_item()) || check_access(A.access_card)) - return TRUE - return FALSE - -/obj/item/proc/GetAccess() - return list() - -/obj/item/proc/GetID() - return null - -/obj/proc/text2access(access_text) - . = list() - if(!access_text) - return - var/list/split = splittext(access_text,";") - for(var/x in split) - var/n = text2num(x) - if(n) - . += n - -//Call this before using req_access or req_one_access directly -/obj/proc/gen_access() - //These generations have been moved out of /obj/New() because they were slowing down the creation of objects that never even used the access system. - if(!req_access) - req_access = list() - for(var/a in text2access(req_access_txt)) - req_access += a - if(!req_one_access) - req_one_access = list() - for(var/b in text2access(req_one_access_txt)) - req_one_access += b - -// Check if an item has access to this object -/obj/proc/check_access(obj/item/I) - return check_access_list(I ? I.GetAccess() : null) - -/obj/proc/check_access_list(list/access_list) - gen_access() - - if(!islist(req_access)) //something's very wrong - return TRUE - - if(!req_access.len && !length(req_one_access)) - return TRUE - - if(!length(access_list) || !islist(access_list)) - return FALSE - - for(var/req in req_access) - if(!(req in access_list)) //doesn't have this access - return FALSE - - if(length(req_one_access)) - for(var/req in req_one_access) - if(req in access_list) //has an access from the single access list - return TRUE - return FALSE - return TRUE - -/obj/proc/check_access_ntnet(datum/netdata/data) - return check_access_list(data.passkey) - -/proc/get_centcom_access(job) - switch(job) - if("VIP Guest") - return list(ACCESS_CENT_GENERAL) - if("Custodian") - return list(ACCESS_CENT_GENERAL, ACCESS_CENT_LIVING, ACCESS_CENT_STORAGE) - if("Thunderdome Overseer") - return list(ACCESS_CENT_GENERAL, ACCESS_CENT_THUNDER) - if("CentCom Official") - return list(ACCESS_CENT_GENERAL, ACCESS_CENT_LIVING) - if("Medical Officer") - return list(ACCESS_CENT_GENERAL, ACCESS_CENT_LIVING, ACCESS_CENT_MEDICAL) - if("Death Commando") - return list(ACCESS_CENT_GENERAL, ACCESS_CENT_SPECOPS, ACCESS_CENT_LIVING, ACCESS_CENT_STORAGE) - if("Research Officer") - return list(ACCESS_CENT_GENERAL, ACCESS_CENT_SPECOPS, ACCESS_CENT_MEDICAL, ACCESS_CENT_TELEPORTER, ACCESS_CENT_STORAGE) - if("Special Ops Officer") - return list(ACCESS_CENT_GENERAL, ACCESS_CENT_THUNDER, ACCESS_CENT_SPECOPS, ACCESS_CENT_LIVING, ACCESS_CENT_STORAGE) - if("Admiral") - return get_all_centcom_access() - if("CentCom Commander") - return get_all_centcom_access() - if("Emergency Response Team Commander") - return get_ert_access("commander") - if("Security Response Officer") - return get_ert_access("sec") - if("Engineer Response Officer") - return get_ert_access("eng") - if("Medical Response Officer") - return get_ert_access("med") - if("CentCom Bartender") - return list(ACCESS_CENT_GENERAL, ACCESS_CENT_LIVING, ACCESS_CENT_BAR) - -/proc/get_all_accesses() - return list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_FORENSICS_LOCKERS, ACCESS_COURT, - ACCESS_MEDICAL, ACCESS_GENETICS, ACCESS_MORGUE, ACCESS_RD, - ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_CHEMISTRY, ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_MAINT_TUNNELS, - ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, - ACCESS_TELEPORTER, ACCESS_EVA, ACCESS_HEADS, ACCESS_CAPTAIN, ACCESS_ALL_PERSONAL_LOCKERS, - ACCESS_TECH_STORAGE, ACCESS_CHAPEL_OFFICE, ACCESS_ATMOSPHERICS, ACCESS_KITCHEN, - ACCESS_BAR, ACCESS_JANITOR, ACCESS_CREMATORIUM, ACCESS_ROBOTICS, ACCESS_CARGO, ACCESS_CONSTRUCTION, - ACCESS_HYDROPONICS, ACCESS_LIBRARY, ACCESS_LAWYER, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_QM, ACCESS_SURGERY, - ACCESS_THEATRE, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_MAILSORTING, ACCESS_WEAPONS, - ACCESS_VAULT, ACCESS_MINING_STATION, ACCESS_XENOBIOLOGY, ACCESS_CE, ACCESS_HOP, ACCESS_HOS, ACCESS_RC_ANNOUNCE, - ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, ACCESS_MINISAT, ACCESS_NETWORK, ACCESS_CLONING) - -/proc/get_all_centcom_access() - return list(ACCESS_CENT_GENERAL, ACCESS_CENT_THUNDER, ACCESS_CENT_SPECOPS, ACCESS_CENT_MEDICAL, ACCESS_CENT_LIVING, ACCESS_CENT_STORAGE, ACCESS_CENT_TELEPORTER, ACCESS_CENT_CAPTAIN) - -/proc/get_ert_access(class) - switch(class) - if("commander") - return get_all_centcom_access() - if("sec") - return list(ACCESS_CENT_GENERAL, ACCESS_CENT_SPECOPS, ACCESS_CENT_LIVING) - if("eng") - return list(ACCESS_CENT_GENERAL, ACCESS_CENT_SPECOPS, ACCESS_CENT_LIVING, ACCESS_CENT_STORAGE) - if("med") - return list(ACCESS_CENT_GENERAL, ACCESS_CENT_SPECOPS, ACCESS_CENT_MEDICAL, ACCESS_CENT_LIVING) - -/proc/get_all_syndicate_access() - return list(ACCESS_SYNDICATE, ACCESS_SYNDICATE) - -/proc/get_region_accesses(code) - switch(code) - if(0) - return get_all_accesses() - if(1) //station general - return list(ACCESS_KITCHEN,ACCESS_BAR, ACCESS_HYDROPONICS, ACCESS_JANITOR, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_LIBRARY, ACCESS_THEATRE, ACCESS_LAWYER) - if(2) //security - return list(ACCESS_SEC_DOORS, ACCESS_WEAPONS, ACCESS_SECURITY, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_FORENSICS_LOCKERS, ACCESS_COURT, ACCESS_HOS) - if(3) //medbay - return list(ACCESS_MEDICAL, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_SURGERY, ACCESS_CMO) - if(4) //research - return list(ACCESS_RESEARCH, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_GENETICS, ACCESS_ROBOTICS, ACCESS_XENOBIOLOGY, ACCESS_MINISAT, ACCESS_RD, ACCESS_NETWORK) - if(5) //engineering and maintenance - return list(ACCESS_CONSTRUCTION, ACCESS_MAINT_TUNNELS, ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_TECH_STORAGE, ACCESS_ATMOSPHERICS, ACCESS_TCOMSAT, ACCESS_MINISAT, ACCESS_CE) - if(6) //supply - return list(ACCESS_MAILSORTING, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_CARGO, ACCESS_QM, ACCESS_VAULT) - if(7) //command - return list(ACCESS_HEADS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_TELEPORTER, ACCESS_EVA, ACCESS_GATEWAY, ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_HOP, ACCESS_CAPTAIN, ACCESS_VAULT) - -/proc/get_region_accesses_name(code) - switch(code) - if(0) - return "All" - if(1) //station general - return "General" - if(2) //security - return "Security" - if(3) //medbay - return "Medbay" - if(4) //research - return "Research" - if(5) //engineering and maintenance - return "Engineering" - if(6) //supply - return "Supply" - if(7) //command - return "Command" - -/proc/get_access_desc(A) - switch(A) - if(ACCESS_CARGO) - return "Cargo Bay" - if(ACCESS_CARGO_BOT) - return "Delivery Chutes" - if(ACCESS_SECURITY) - return "Security" - if(ACCESS_BRIG) - return "Holding Cells" - if(ACCESS_COURT) - return "Courtroom" - if(ACCESS_FORENSICS_LOCKERS) - return "Forensics" - if(ACCESS_MEDICAL) - return "Medical" - if(ACCESS_GENETICS) - return "Genetics Lab" - if(ACCESS_MORGUE) - return "Morgue" - if(ACCESS_TOX) - return "R&D Lab" - if(ACCESS_TOX_STORAGE) - return "Toxins Lab" - if(ACCESS_CHEMISTRY) - return "Chemistry Lab" - if(ACCESS_RD) - return "RD Office" - if(ACCESS_BAR) - return "Bar" - if(ACCESS_JANITOR) - return "Custodial Closet" - if(ACCESS_ENGINE) - return "Engineering" - if(ACCESS_ENGINE_EQUIP) - return "Power and Engineering Equipment" - if(ACCESS_MAINT_TUNNELS) - return "Maintenance" - if(ACCESS_EXTERNAL_AIRLOCKS) - return "External Airlocks" - if(ACCESS_EMERGENCY_STORAGE) - return "Emergency Storage" - if(ACCESS_CHANGE_IDS) - return "ID Console" - if(ACCESS_AI_UPLOAD) - return "AI Chambers" - if(ACCESS_TELEPORTER) - return "Teleporter" - if(ACCESS_EVA) - return "EVA" - if(ACCESS_HEADS) - return "Bridge" - if(ACCESS_CAPTAIN) - return "Captain" - if(ACCESS_ALL_PERSONAL_LOCKERS) - return "Personal Lockers" - if(ACCESS_CHAPEL_OFFICE) - return "Chapel Office" - if(ACCESS_TECH_STORAGE) - return "Technical Storage" - if(ACCESS_ATMOSPHERICS) - return "Atmospherics" - if(ACCESS_CREMATORIUM) - return "Crematorium" - if(ACCESS_ARMORY) - return "Armory" - if(ACCESS_CONSTRUCTION) - return "Construction" - if(ACCESS_KITCHEN) - return "Kitchen" - if(ACCESS_HYDROPONICS) - return "Hydroponics" - if(ACCESS_LIBRARY) - return "Library" - if(ACCESS_LAWYER) - return "Law Office" - if(ACCESS_ROBOTICS) - return "Robotics" - if(ACCESS_VIROLOGY) - return "Virology" - if(ACCESS_CMO) - return "CMO Office" - if(ACCESS_QM) - return "Quartermaster" - if(ACCESS_SURGERY) - return "Surgery" - if(ACCESS_THEATRE) - return "Theatre" - if(ACCESS_MANUFACTURING) - return "Manufacturing" - if(ACCESS_RESEARCH) - return "Science" - if(ACCESS_MINING) - return "Mining" - if(ACCESS_MINING_OFFICE) - return "Mining Office" - if(ACCESS_MAILSORTING) - return "Cargo Office" - if(ACCESS_MINT) - return "Mint" - if(ACCESS_MINT_VAULT) - return "Mint Vault" - if(ACCESS_VAULT) - return "Main Vault" - if(ACCESS_MINING_STATION) - return "Mining EVA" - if(ACCESS_XENOBIOLOGY) - return "Xenobiology Lab" - if(ACCESS_HOP) - return "HoP Office" - if(ACCESS_HOS) - return "HoS Office" - if(ACCESS_CE) - return "CE Office" - if(ACCESS_RC_ANNOUNCE) - return "RC Announcements" - if(ACCESS_KEYCARD_AUTH) - return "Keycode Auth." - if(ACCESS_TCOMSAT) - return "Telecommunications" - if(ACCESS_GATEWAY) - return "Gateway" - if(ACCESS_SEC_DOORS) - return "Brig" - if(ACCESS_MINERAL_STOREROOM) - return "Mineral Storage" - if(ACCESS_MINISAT) - return "AI Satellite" - if(ACCESS_WEAPONS) - return "Weapon Permit" - if(ACCESS_NETWORK) - return "Network Access" - if(ACCESS_CLONING) - return "Cloning Room" - -/proc/get_centcom_access_desc(A) - switch(A) - if(ACCESS_CENT_GENERAL) - return "Code Grey" - if(ACCESS_CENT_THUNDER) - return "Code Yellow" - if(ACCESS_CENT_STORAGE) - return "Code Orange" - if(ACCESS_CENT_LIVING) - return "Code Green" - if(ACCESS_CENT_MEDICAL) - return "Code White" - if(ACCESS_CENT_TELEPORTER) - return "Code Blue" - if(ACCESS_CENT_SPECOPS) - return "Code Black" - if(ACCESS_CENT_CAPTAIN) - return "Code Gold" - if(ACCESS_CENT_BAR) - return "Code Scotch" - -/proc/get_all_jobs() - return list("Assistant", "Captain", "Head of Personnel", "Bartender", "Cook", "Botanist", "Quartermaster", "Cargo Technician", - "Shaft Miner", "Clown", "Mime", "Janitor", "Curator", "Lawyer", "Chaplain", "Chief Engineer", "Station Engineer", - "Atmospheric Technician", "Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Virologist", - "Research Director", "Scientist", "Roboticist", "Head of Security", "Warden", "Detective", "Security Officer") - -/proc/get_all_job_icons() //For all existing HUD icons - return get_all_jobs() + list("Prisoner") - -/proc/get_all_centcom_jobs() - return list("VIP Guest","Custodian","Thunderdome Overseer","CentCom Official","Medical Officer","Death Commando","Research Officer","Special Ops Officer","Admiral","CentCom Commander","Emergency Response Team Commander","Security Response Officer","Engineer Response Officer", "Medical Response Officer","CentCom Bartender") - -/obj/item/proc/GetJobName() //Used in secHUD icon generation - var/obj/item/card/id/I = GetID() - if(!I) - return - var/jobName = I.assignment - if(jobName in get_all_job_icons()) //Check if the job has a hud icon - return jobName - if(jobName in get_all_centcom_jobs()) //Return with the NT logo if it is a CentCom job - return "CentCom" - return "Unknown" //Return unknown if none of the above apply + +//returns TRUE if this mob has sufficient access to use this object +/obj/proc/allowed(mob/M) + //check if it doesn't require any access at all + if(src.check_access(null)) + return TRUE + if(issilicon(M)) + if(ispAI(M)) + return FALSE + return TRUE //AI can do whatever it wants + if(IsAdminGhost(M)) + //Access can't stop the abuse + return TRUE + else if(istype(M) && SEND_SIGNAL(M, COMSIG_MOB_ALLOWED, src)) + return TRUE + else if(ishuman(M)) + var/mob/living/carbon/human/H = M + //if they are holding or wearing a card that has access, that works + if(check_access(H.get_active_held_item()) || src.check_access(H.wear_id)) + return TRUE + else if(ismonkey(M) || isalienadult(M)) + var/mob/living/carbon/george = M + //they can only hold things :( + if(check_access(george.get_active_held_item())) + return TRUE + else if(isanimal(M)) + var/mob/living/simple_animal/A = M + if(check_access(A.get_active_held_item()) || check_access(A.access_card)) + return TRUE + return FALSE + +/obj/item/proc/GetAccess() + return list() + +/obj/item/proc/GetID() + return null + +/obj/proc/text2access(access_text) + . = list() + if(!access_text) + return + var/list/split = splittext(access_text,";") + for(var/x in split) + var/n = text2num(x) + if(n) + . += n + +//Call this before using req_access or req_one_access directly +/obj/proc/gen_access() + //These generations have been moved out of /obj/New() because they were slowing down the creation of objects that never even used the access system. + if(!req_access) + req_access = list() + for(var/a in text2access(req_access_txt)) + req_access += a + if(!req_one_access) + req_one_access = list() + for(var/b in text2access(req_one_access_txt)) + req_one_access += b + +// Check if an item has access to this object +/obj/proc/check_access(obj/item/I) + return check_access_list(I ? I.GetAccess() : null) + +/obj/proc/check_access_list(list/access_list) + gen_access() + + if(!islist(req_access)) //something's very wrong + return TRUE + + if(!req_access.len && !length(req_one_access)) + return TRUE + + if(!length(access_list) || !islist(access_list)) + return FALSE + + for(var/req in req_access) + if(!(req in access_list)) //doesn't have this access + return FALSE + + if(length(req_one_access)) + for(var/req in req_one_access) + if(req in access_list) //has an access from the single access list + return TRUE + return FALSE + return TRUE + +/obj/proc/check_access_ntnet(datum/netdata/data) + return check_access_list(data.passkey) + +/proc/get_centcom_access(job) + switch(job) + if("VIP Guest") + return list(ACCESS_CENT_GENERAL) + if("Custodian") + return list(ACCESS_CENT_GENERAL, ACCESS_CENT_LIVING, ACCESS_CENT_STORAGE) + if("Thunderdome Overseer") + return list(ACCESS_CENT_GENERAL, ACCESS_CENT_THUNDER) + if("CentCom Official") + return list(ACCESS_CENT_GENERAL, ACCESS_CENT_LIVING) + if("Medical Officer") + return list(ACCESS_CENT_GENERAL, ACCESS_CENT_LIVING, ACCESS_CENT_MEDICAL) + if("Death Commando") + return list(ACCESS_CENT_GENERAL, ACCESS_CENT_SPECOPS, ACCESS_CENT_LIVING, ACCESS_CENT_STORAGE) + if("Research Officer") + return list(ACCESS_CENT_GENERAL, ACCESS_CENT_SPECOPS, ACCESS_CENT_MEDICAL, ACCESS_CENT_TELEPORTER, ACCESS_CENT_STORAGE) + if("Special Ops Officer") + return list(ACCESS_CENT_GENERAL, ACCESS_CENT_THUNDER, ACCESS_CENT_SPECOPS, ACCESS_CENT_LIVING, ACCESS_CENT_STORAGE) + if("Admiral") + return get_all_centcom_access() + if("CentCom Commander") + return get_all_centcom_access() + if("Emergency Response Team Commander") + return get_ert_access("commander") + if("Security Response Officer") + return get_ert_access("sec") + if("Engineer Response Officer") + return get_ert_access("eng") + if("Medical Response Officer") + return get_ert_access("med") + if("CentCom Bartender") + return list(ACCESS_CENT_GENERAL, ACCESS_CENT_LIVING, ACCESS_CENT_BAR) + +/proc/get_all_accesses() + return list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_FORENSICS_LOCKERS, ACCESS_COURT, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, + ACCESS_MEDICAL, ACCESS_GENETICS, ACCESS_MORGUE, ACCESS_RD, + ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_CHEMISTRY, ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_MAINT_TUNNELS, + ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, + ACCESS_TELEPORTER, ACCESS_EVA, ACCESS_HEADS, ACCESS_CAPTAIN, ACCESS_ALL_PERSONAL_LOCKERS, + ACCESS_TECH_STORAGE, ACCESS_CHAPEL_OFFICE, ACCESS_ATMOSPHERICS, ACCESS_KITCHEN, + ACCESS_BAR, ACCESS_JANITOR, ACCESS_CREMATORIUM, ACCESS_ROBOTICS, ACCESS_CARGO, ACCESS_CONSTRUCTION, + ACCESS_HYDROPONICS, ACCESS_LIBRARY, ACCESS_LAWYER, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_QM, ACCESS_SURGERY, + ACCESS_THEATRE, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_MAILSORTING, ACCESS_WEAPONS, + ACCESS_VAULT, ACCESS_MINING_STATION, ACCESS_XENOBIOLOGY, ACCESS_CE, ACCESS_HOP, ACCESS_HOS, ACCESS_RC_ANNOUNCE, + ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, ACCESS_MINISAT, ACCESS_NETWORK, ACCESS_CLONING) + +/proc/get_all_centcom_access() + return list(ACCESS_CENT_GENERAL, ACCESS_CENT_THUNDER, ACCESS_CENT_SPECOPS, ACCESS_CENT_MEDICAL, ACCESS_CENT_LIVING, ACCESS_CENT_STORAGE, ACCESS_CENT_TELEPORTER, ACCESS_CENT_CAPTAIN) + +/proc/get_ert_access(class) + switch(class) + if("commander") + return get_all_centcom_access() + if("sec") + return list(ACCESS_CENT_GENERAL, ACCESS_CENT_SPECOPS, ACCESS_CENT_LIVING) + if("eng") + return list(ACCESS_CENT_GENERAL, ACCESS_CENT_SPECOPS, ACCESS_CENT_LIVING, ACCESS_CENT_STORAGE) + if("med") + return list(ACCESS_CENT_GENERAL, ACCESS_CENT_SPECOPS, ACCESS_CENT_MEDICAL, ACCESS_CENT_LIVING) + +/proc/get_all_syndicate_access() + return list(ACCESS_SYNDICATE, ACCESS_SYNDICATE) + +/proc/get_region_accesses(code) + switch(code) + if(0) + return get_all_accesses() + if(1) //station general + return list(ACCESS_KITCHEN,ACCESS_BAR, ACCESS_HYDROPONICS, ACCESS_JANITOR, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_LIBRARY, ACCESS_THEATRE, ACCESS_LAWYER) + if(2) //security + return list(ACCESS_SEC_DOORS, ACCESS_WEAPONS, ACCESS_SECURITY, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_FORENSICS_LOCKERS, ACCESS_COURT, ACCESS_HOS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP,) + if(3) //medbay + return list(ACCESS_MEDICAL, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_SURGERY, ACCESS_CMO) + if(4) //research + return list(ACCESS_RESEARCH, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_GENETICS, ACCESS_ROBOTICS, ACCESS_XENOBIOLOGY, ACCESS_MINISAT, ACCESS_RD, ACCESS_NETWORK) + if(5) //engineering and maintenance + return list(ACCESS_CONSTRUCTION, ACCESS_MAINT_TUNNELS, ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_TECH_STORAGE, ACCESS_ATMOSPHERICS, ACCESS_TCOMSAT, ACCESS_MINISAT, ACCESS_CE) + if(6) //supply + return list(ACCESS_MAILSORTING, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_CARGO, ACCESS_QM, ACCESS_VAULT) + if(7) //command + return list(ACCESS_HEADS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_TELEPORTER, ACCESS_EVA, ACCESS_GATEWAY, ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_HOP, ACCESS_CAPTAIN, ACCESS_VAULT) + +/proc/get_region_accesses_name(code) + switch(code) + if(0) + return "All" + if(1) //station general + return "General" + if(2) //security + return "Security" + if(3) //medbay + return "Medbay" + if(4) //research + return "Research" + if(5) //engineering and maintenance + return "Engineering" + if(6) //supply + return "Supply" + if(7) //command + return "Command" + +/proc/get_access_desc(A) + switch(A) + if(ACCESS_CARGO) + return "Cargo Bay" + if(ACCESS_CARGO_BOT) + return "Delivery Chutes" + if(ACCESS_SECURITY) + return "Security Equipment" + if(ACCESS_BRIG) + return "Holding Cells and Prisoner Management" + if(ACCESS_COURT) + return "Courtroom" + if(ACCESS_FORENSICS_LOCKERS) + return "Forensics Lockers" + if(ACCESS_MEDICAL) + return "Medical" + if(ACCESS_GENETICS) + return "Genetics Lab" + if(ACCESS_MORGUE) + return "Morgue" + if(ACCESS_TOX) + return "R&D Lab" + if(ACCESS_TOX_STORAGE) + return "Toxins Lab" + if(ACCESS_CHEMISTRY) + return "Chemistry Lab" + if(ACCESS_RD) + return "RD Office" + if(ACCESS_BAR) + return "Bar" + if(ACCESS_JANITOR) + return "Custodial Closet" + if(ACCESS_ENGINE) + return "Engineering" + if(ACCESS_ENGINE_EQUIP) + return "Power and Engineering Equipment" + if(ACCESS_MAINT_TUNNELS) + return "Maintenance" + if(ACCESS_EXTERNAL_AIRLOCKS) + return "External Airlocks" + if(ACCESS_EMERGENCY_STORAGE) + return "Emergency Storage" + if(ACCESS_CHANGE_IDS) + return "ID Console" + if(ACCESS_AI_UPLOAD) + return "AI Chambers" + if(ACCESS_TELEPORTER) + return "Teleporter" + if(ACCESS_EVA) + return "EVA" + if(ACCESS_HEADS) + return "Bridge and Command Equipment" + if(ACCESS_CAPTAIN) + return "Captain" + if(ACCESS_ALL_PERSONAL_LOCKERS) + return "Personal Lockers" + if(ACCESS_CHAPEL_OFFICE) + return "Chapel Office" + if(ACCESS_TECH_STORAGE) + return "Technical Storage" + if(ACCESS_ATMOSPHERICS) + return "Atmospherics" + if(ACCESS_CREMATORIUM) + return "Crematorium" + if(ACCESS_ARMORY) + return "Armory" + if(ACCESS_CONSTRUCTION) + return "Construction" + if(ACCESS_KITCHEN) + return "Kitchen" + if(ACCESS_HYDROPONICS) + return "Hydroponics" + if(ACCESS_LIBRARY) + return "Library" + if(ACCESS_LAWYER) + return "Law Office" + if(ACCESS_ROBOTICS) + return "Robotics" + if(ACCESS_VIROLOGY) + return "Virology" + if(ACCESS_CMO) + return "CMO Office" + if(ACCESS_QM) + return "Quartermaster" + if(ACCESS_SURGERY) + return "Surgery" + if(ACCESS_THEATRE) + return "Theatre" + if(ACCESS_MANUFACTURING) + return "Manufacturing" + if(ACCESS_RESEARCH) + return "Science" + if(ACCESS_MINING) + return "Mining" + if(ACCESS_MINING_OFFICE) + return "Mining Office" + if(ACCESS_MAILSORTING) + return "Cargo Office" + if(ACCESS_MINT) + return "Mint" + if(ACCESS_MINT_VAULT) + return "Mint Vault" + if(ACCESS_VAULT) + return "Main Vault" + if(ACCESS_MINING_STATION) + return "Mining EVA" + if(ACCESS_XENOBIOLOGY) + return "Xenobiology Lab" + if(ACCESS_HOP) + return "HoP Office" + if(ACCESS_HOS) + return "HoS Office" + if(ACCESS_CE) + return "CE Office" + if(ACCESS_RC_ANNOUNCE) + return "RC Announcements" + if(ACCESS_KEYCARD_AUTH) + return "Keycode Auth." + if(ACCESS_TCOMSAT) + return "Telecommunications" + if(ACCESS_GATEWAY) + return "Gateway" + if(ACCESS_SEC_DOORS) + return "Security SubDepartment Doors" + if(ACCESS_ENTER_GENPOP) + return "Prison Turnstile Entrance" + if(ACCESS_LEAVE_GENPOP) + return "Prison Turnstile Exit" + if(ACCESS_MINERAL_STOREROOM) + return "Mineral Storage" + if(ACCESS_MINISAT) + return "AI Satellite" + if(ACCESS_WEAPONS) + return "Weapon Permit" + if(ACCESS_NETWORK) + return "Network Access" + if(ACCESS_CLONING) + return "Cloning Room" + +/proc/get_centcom_access_desc(A) + switch(A) + if(ACCESS_CENT_GENERAL) + return "Code Grey" + if(ACCESS_CENT_THUNDER) + return "Code Yellow" + if(ACCESS_CENT_STORAGE) + return "Code Orange" + if(ACCESS_CENT_LIVING) + return "Code Green" + if(ACCESS_CENT_MEDICAL) + return "Code White" + if(ACCESS_CENT_TELEPORTER) + return "Code Blue" + if(ACCESS_CENT_SPECOPS) + return "Code Black" + if(ACCESS_CENT_CAPTAIN) + return "Code Gold" + if(ACCESS_CENT_BAR) + return "Code Scotch" + +/proc/get_all_jobs() + return list("Assistant", "Captain", "Head of Personnel", "Bartender", "Cook", "Botanist", "Quartermaster", "Cargo Technician", + "Shaft Miner", "Clown", "Mime", "Janitor", "Curator", "Lawyer", "Chaplain", "Chief Engineer", "Station Engineer", + "Atmospheric Technician", "Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Virologist", + "Research Director", "Scientist", "Roboticist", "Head of Security", "Warden", "Detective", "Security Officer") + +/proc/get_all_job_icons() //For all existing HUD icons + return get_all_jobs() + list("Prisoner") + +/proc/get_all_centcom_jobs() + return list("VIP Guest","Custodian","Thunderdome Overseer","CentCom Official","Medical Officer","Death Commando","Research Officer","Special Ops Officer","Admiral","CentCom Commander","Emergency Response Team Commander","Security Response Officer","Engineer Response Officer", "Medical Response Officer","CentCom Bartender") + +/obj/item/proc/GetJobName() //Used in secHUD icon generation + var/obj/item/card/id/I = GetID() + if(!I) + return + var/jobName = I.assignment + if(jobName in get_all_job_icons()) //Check if the job has a hud icon + return jobName + if(jobName in get_all_centcom_jobs()) //Return with the NT logo if it is a CentCom job + return "CentCom" + return "Unknown" //Return unknown if none of the above apply diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index 2eeffa8b7a..a52b8589c3 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -61,6 +61,9 @@ var/display_order = JOB_DISPLAY_ORDER_DEFAULT + //If a job complies with dresscodes, loadout items will not be equipped instead of the job's outfit, instead placing the items into the player's backpack. + var/dresscodecompliant = TRUE + //Only override this proc //H is usually a human unless an /equip override transformed it /datum/job/proc/after_spawn(mob/living/H, mob/M, latejoin = FALSE) diff --git a/code/modules/jobs/job_types/assistant.dm b/code/modules/jobs/job_types/assistant.dm index c04560f849..da8c2aa3b9 100644 --- a/code/modules/jobs/job_types/assistant.dm +++ b/code/modules/jobs/job_types/assistant.dm @@ -15,6 +15,7 @@ Assistant outfit = /datum/outfit/job/assistant antag_rep = 7 display_order = JOB_DISPLAY_ORDER_ASSISTANT + dresscodecompliant = FALSE /datum/job/assistant/get_access() if(CONFIG_GET(flag/assistants_have_maint_access) || !CONFIG_GET(flag/jobs_have_minimal_access)) //Config has assistant maint access set diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm index 93775beca9..300fcc7109 100644 --- a/code/modules/jobs/job_types/atmospheric_technician.dm +++ b/code/modules/jobs/job_types/atmospheric_technician.dm @@ -15,7 +15,8 @@ access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_MINERAL_STOREROOM) - minimal_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS, ACCESS_CONSTRUCTION, ACCESS_MINERAL_STOREROOM) + minimal_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ENGINE, + ACCESS_ENGINE_EQUIP, ACCESS_EMERGENCY_STORAGE, ACCESS_CONSTRUCTION, ACCESS_MINERAL_STOREROOM) display_order = JOB_DISPLAY_ORDER_ATMOSPHERIC_TECHNICIAN /datum/outfit/job/atmos diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index 7e832d6975..c6342e2154 100644 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -10,9 +10,9 @@ supervisors = "Nanotrasen officials and Space law" selection_color = "#aac1ee" req_admin_notify = 1 - minimal_player_age = 14 + minimal_player_age = 20 exp_requirements = 180 - exp_type = EXP_TYPE_CREW + exp_type = EXP_TYPE_COMMAND exp_type_department = EXP_TYPE_COMMAND outfit = /datum/outfit/job/captain @@ -63,4 +63,4 @@ mask = /obj/item/clothing/mask/gas/sechailer suit = /obj/item/clothing/suit/space/hardsuit/captain - suit_store = /obj/item/tank/internals/oxygen + suit_store = /obj/item/tank/internals/oxygen \ No newline at end of file diff --git a/code/modules/jobs/job_types/cargo_technician.dm b/code/modules/jobs/job_types/cargo_technician.dm index 3ceb29bae2..d6fbe5551f 100644 --- a/code/modules/jobs/job_types/cargo_technician.dm +++ b/code/modules/jobs/job_types/cargo_technician.dm @@ -11,7 +11,8 @@ outfit = /datum/outfit/job/cargo_tech - access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM) + access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_MINING, + ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_CARGO, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM) display_order = JOB_DISPLAY_ORDER_CARGO_TECHNICIAN diff --git a/code/modules/jobs/job_types/chaplain.dm b/code/modules/jobs/job_types/chaplain.dm index f6648fdf86..97b1edc8c2 100644 --- a/code/modules/jobs/job_types/chaplain.dm +++ b/code/modules/jobs/job_types/chaplain.dm @@ -72,7 +72,7 @@ B.name = "Fluorescent Incandescence" if("lol", "wtf", "gay", "penis", "ass", "poo", "badmin", "shitmin", "deadmin", "cock", "cocks", "meme", "memes") B.name = pick("Woodys Got Wood: The Aftermath", "War of the Cocks", "Sweet Bro and Hella Jef: Expanded Edition","F.A.T.A.L. Rulebook") - H.adjustBrainLoss(100) // starts off retarded as fuck + H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 100) // starts off retarded as fuck if("monkeyism","apism","gorillism","primatism") B.name = pick("Going Bananas", "Bananas Out For Harambe") if("mormonism") @@ -118,4 +118,4 @@ uniform = /obj/item/clothing/under/rank/chaplain backpack_contents = list(/obj/item/camera/spooky = 1) backpack = /obj/item/storage/backpack/cultpack - satchel = /obj/item/storage/backpack/cultpack \ No newline at end of file + satchel = /obj/item/storage/backpack/cultpack diff --git a/code/modules/jobs/job_types/chemist.dm b/code/modules/jobs/job_types/chemist.dm index a915d261ed..4614feba8d 100644 --- a/code/modules/jobs/job_types/chemist.dm +++ b/code/modules/jobs/job_types/chemist.dm @@ -32,5 +32,7 @@ satchel = /obj/item/storage/backpack/satchel/chem duffelbag = /obj/item/storage/backpack/duffelbag/med + backpack_contents = list(/obj/item/storage/hypospraykit/regular) + chameleon_extras = /obj/item/gun/syringe diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index da3f281267..f6505a4e2a 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -11,7 +11,7 @@ supervisors = "the captain" selection_color = "#ee7400" req_admin_notify = 1 - minimal_player_age = 7 + minimal_player_age = 10 exp_requirements = 180 exp_type = EXP_TYPE_CREW exp_type_department = EXP_TYPE_ENGINEERING diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm index 4c7249f048..69eead70f7 100644 --- a/code/modules/jobs/job_types/chief_medical_officer.dm +++ b/code/modules/jobs/job_types/chief_medical_officer.dm @@ -11,7 +11,7 @@ supervisors = "the captain" selection_color = "#509ed1" req_admin_notify = 1 - minimal_player_age = 7 + minimal_player_age = 10 exp_requirements = 180 exp_type = EXP_TYPE_CREW exp_type_department = EXP_TYPE_MEDICAL diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm index e320ce20b4..2b757872d9 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -11,7 +11,7 @@ supervisors = "the captain" selection_color = "#3a8529" req_admin_notify = 1 - minimal_player_age = 10 + minimal_player_age = 20 exp_requirements = 180 exp_type = EXP_TYPE_CREW exp_type_department = EXP_TYPE_SERVICE @@ -21,13 +21,13 @@ access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MEDICAL, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_EVA, ACCESS_HEADS, ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_MAINT_TUNNELS, ACCESS_BAR, ACCESS_JANITOR, ACCESS_CONSTRUCTION, ACCESS_MORGUE, - ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_CARGO, ACCESS_MAILSORTING, ACCESS_QM, ACCESS_HYDROPONICS, ACCESS_LAWYER, + ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_HYDROPONICS, ACCESS_LAWYER, ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_VAULT, ACCESS_MINING_STATION, ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MEDICAL, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_EVA, ACCESS_HEADS, ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_MAINT_TUNNELS, ACCESS_BAR, ACCESS_JANITOR, ACCESS_CONSTRUCTION, ACCESS_MORGUE, - ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_CARGO, ACCESS_MAILSORTING, ACCESS_QM, ACCESS_HYDROPONICS, ACCESS_LAWYER, + ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_HYDROPONICS, ACCESS_LAWYER, ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_VAULT, ACCESS_MINING_STATION, ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM) diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index f6b5dbd3ef..c190d88bc7 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -11,7 +11,7 @@ supervisors = "the captain" selection_color = "#b90000" req_admin_notify = 1 - minimal_player_age = 14 + minimal_player_age = 10 exp_requirements = 300 exp_type = EXP_TYPE_CREW exp_type_department = EXP_TYPE_SECURITY @@ -19,11 +19,11 @@ outfit = /datum/outfit/job/hos mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) - access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, + access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING, ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM) - minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, + minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING, ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM) diff --git a/code/modules/jobs/job_types/medical_doctor.dm b/code/modules/jobs/job_types/medical_doctor.dm index 19fa1c7158..2a8814f29c 100644 --- a/code/modules/jobs/job_types/medical_doctor.dm +++ b/code/modules/jobs/job_types/medical_doctor.dm @@ -32,4 +32,6 @@ satchel = /obj/item/storage/backpack/satchel/med duffelbag = /obj/item/storage/backpack/duffelbag/med + backpack_contents = list(/obj/item/storage/hypospraykit/regular) + chameleon_extras = /obj/item/gun/syringe diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm index 49a93026ba..ad57d05cdc 100644 --- a/code/modules/jobs/job_types/quartermaster.dm +++ b/code/modules/jobs/job_types/quartermaster.dm @@ -11,17 +11,19 @@ supervisors = "the captain" selection_color = "#a06121" req_admin_notify = 1 - minimal_player_age = 7 + minimal_player_age = 10 exp_requirements = 180 exp_type = EXP_TYPE_CREW exp_type_department = EXP_TYPE_SUPPLY outfit = /datum/outfit/job/quartermaster - access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, - ACCESS_MINERAL_STOREROOM, ACCESS_VAULT) - minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_QM, ACCESS_MINING, - ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_VAULT) + access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, + ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_KEYCARD_AUTH, ACCESS_RC_ANNOUNCE, + ACCESS_SEC_DOORS, ACCESS_HEADS) + minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, + ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_KEYCARD_AUTH, ACCESS_RC_ANNOUNCE, + ACCESS_SEC_DOORS, ACCESS_HEADS) display_order = JOB_DISPLAY_ORDER_QUARTERMASTER blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) @@ -31,11 +33,13 @@ jobtype = /datum/job/qm belt = /obj/item/pda/quartermaster - ears = /obj/item/radio/headset/headset_cargo + ears = /obj/item/radio/headset/heads/qm uniform = /obj/item/clothing/under/rank/cargo shoes = /obj/item/clothing/shoes/sneakers/brown glasses = /obj/item/clothing/glasses/sunglasses l_hand = /obj/item/clipboard + id = /obj/item/card/id/silver + backpack_contents = list(/obj/item/melee/classic_baton/telescopic = 1, /obj/item/modular_computer/tablet/preset/advanced = 1) chameleon_extras = /obj/item/stamp/qm diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm index 5368ceee64..a90c5cea6c 100644 --- a/code/modules/jobs/job_types/research_director.dm +++ b/code/modules/jobs/job_types/research_director.dm @@ -11,7 +11,7 @@ supervisors = "the captain" selection_color = "#7544cc" req_admin_notify = 1 - minimal_player_age = 7 + minimal_player_age = 10 exp_type_department = EXP_TYPE_SCIENCE exp_requirements = 180 exp_type = EXP_TYPE_CREW diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index 4f12d6a19c..ae50f71c0c 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -15,8 +15,8 @@ outfit = /datum/outfit/job/security - access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM) - minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) // See /datum/job/officer/get_access() + access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM) + minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_MINERAL_STOREROOM) // See /datum/job/officer/get_access() mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index ef16d8e53f..771fc02862 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -13,7 +13,8 @@ outfit = /datum/outfit/job/miner - access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM) + 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) display_order = JOB_DISPLAY_ORDER_SHAFT_MINER @@ -47,7 +48,7 @@ name = "Shaft Miner (Asteroid)" uniform = /obj/item/clothing/under/rank/miner shoes = /obj/item/clothing/shoes/workboots - + /datum/outfit/job/miner/equipped name = "Shaft Miner (Lavaland + Equipment)" suit = /obj/item/clothing/suit/hooded/explorer/standard diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm index a5c16ab5cf..9c529f45f3 100644 --- a/code/modules/jobs/job_types/warden.dm +++ b/code/modules/jobs/job_types/warden.dm @@ -15,8 +15,8 @@ outfit = /datum/outfit/job/warden - access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM) - minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) // See /datum/job/warden/get_access() + access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM) + minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_MINERAL_STOREROOM) // See /datum/job/warden/get_access() mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) @@ -42,7 +42,7 @@ glasses = /obj/item/clothing/glasses/hud/security/sunglasses r_pocket = /obj/item/assembly/flash/handheld l_pocket = /obj/item/restraints/handcuffs - suit_store = /obj/item/gun/energy/e_gun/advtaser + suit_store = /obj/item/gun/energy/pumpaction/defender backpack_contents = list(/obj/item/melee/baton/loaded=1) backpack = /obj/item/storage/backpack/security diff --git a/code/modules/library/lib_codex_gigas.dm b/code/modules/library/lib_codex_gigas.dm index d3d95db974..57bf37d528 100644 --- a/code/modules/library/lib_codex_gigas.dm +++ b/code/modules/library/lib_codex_gigas.dm @@ -50,8 +50,8 @@ if(U.job in list("Curator")) // the curator is both faster, and more accurate than normal crew members at research speed = 100 correctness = 100 - correctness -= U.getBrainLoss() *0.5 //Brain damage makes researching hard. - speed += U.getBrainLoss() * 3 + correctness -= U.getOrganLoss(ORGAN_SLOT_BRAIN) *0.5 //Brain damage makes researching hard. + speed += U.getOrganLoss(ORGAN_SLOT_BRAIN) * 3 if(do_after(user, speed, 0, user)) var/usedName = devilName if(!prob(correctness)) diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index ee563f3100..7dc4fd17b9 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -78,7 +78,7 @@ state = 0 if(2) - GET_COMPONENT_FROM(STR, /datum/component/storage, I) + var/datum/component/storage/STR = I.GetComponent(/datum/component/storage) if(is_type_in_list(I, allowed_books)) if(!user.transferItemToLoc(I, src)) return diff --git a/code/modules/lighting/lighting_object.dm b/code/modules/lighting/lighting_object.dm index c0c5a411e7..9ceb341f91 100644 --- a/code/modules/lighting/lighting_object.dm +++ b/code/modules/lighting/lighting_object.dm @@ -5,7 +5,7 @@ icon = LIGHTING_ICON icon_state = "transparent" - color = LIGHTING_BASE_MATRIX + color = null //we manually set color in init instead plane = LIGHTING_PLANE mouse_opacity = MOUSE_OPACITY_TRANSPARENT layer = LIGHTING_LAYER @@ -17,6 +17,9 @@ /atom/movable/lighting_object/Initialize(mapload) . = ..() verbs.Cut() + //We avoid setting this in the base as if we do then the parent atom handling will add_atom_color it and that + //is totally unsuitable for this object, as we are always changing its colour manually + color = LIGHTING_BASE_MATRIX myturf = loc if (myturf.lighting_object) diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index 7a875ccf9f..e2459d780a 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -213,4 +213,4 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) if(!ispath(disease_type,/datum/disease)) CRASH("Wrong disease type passed in.") var/datum/disease/D = new disease_type() - return list(component_type,D) \ No newline at end of file + return list(component_type,D) diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm index 4a0faf69f5..f98f0755c8 100644 --- a/code/modules/mining/abandoned_crates.dm +++ b/code/modules/mining/abandoned_crates.dm @@ -169,6 +169,7 @@ locked = FALSE cut_overlays() add_overlay("securecrateg") + tamperproof = 0 // set explosion chance to zero, so we dont accidently hit it with a multitool and instantly die else if (input == null || sanitycheck == null || length(input) != codelen) to_chat(user, "You leave the crate alone.") else @@ -213,6 +214,12 @@ return return ..() +/obj/structure/closet/secure/loot/dive_into(mob/living/user) + if(!locked) + return ..() + to_chat(user, "That seems like a stupid idea.") + return FALSE + /obj/structure/closet/crate/secure/loot/emag_act(mob/user) . = SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT) if(!locked) @@ -227,4 +234,6 @@ ..() /obj/structure/closet/crate/secure/loot/deconstruct(disassembled = TRUE) + if(!locked && disassembled) + return ..() boom() diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm index 23ec02976d..559ffc0673 100644 --- a/code/modules/mining/equipment/explorer_gear.dm +++ b/code/modules/mining/equipment/explorer_gear.dm @@ -11,6 +11,7 @@ heat_protection = CHEST|GROIN|LEGS|ARMS 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 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) resistance_flags = FIRE_PROOF tauric = TRUE //Citadel Add for tauric hardsuits @@ -129,7 +130,7 @@ /obj/item/clothing/suit/hooded/explorer/seva name = "SEVA Suit" - desc = "A fire-proof suit for exploring hot environments." + desc = "A fire-proof suit for exploring hot environments. Its design and material make it easier for a Goliath to keep their grip on the wearer." icon_state = "seva" item_state = "seva" w_class = WEIGHT_CLASS_BULKY @@ -141,7 +142,7 @@ /obj/item/clothing/head/hooded/explorer/seva name = "SEVA Hood" - desc = "A fire-proof hood for exploring hot environments." + desc = "A fire-proof hood for exploring hot environments. Its design and material make it easier for a Goliath to keep their grip on the wearer." icon_state = "seva" item_state = "seva" max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT @@ -159,7 +160,7 @@ /obj/item/clothing/suit/hooded/explorer/exo name = "Exo-suit" - desc = "A robust suit for exploring dangerous environments." + desc = "A robust suit for fighting dangerous animals. Its design and material make it harder for a Goliath to keep their grip on the wearer." icon_state = "exo" item_state = "exo" w_class = WEIGHT_CLASS_BULKY @@ -170,7 +171,7 @@ /obj/item/clothing/head/hooded/explorer/exo name = "Exo-hood" - desc = "A robust helmet for exploring dangerous environments." + desc = "A robust helmet for fighting dangerous animals. Its design and material make it harder for a Goliath to keep their grip on the wearer." icon_state = "exo" item_state = "exo" armor = list("melee" = 65, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 60, "bio" = 25, "rad" = 10, "fire" = 0, "acid" = 0) diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index b4afaac17f..ab8aa3e2fd 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -1,50 +1,51 @@ /*********************Mining Hammer****************/ -/obj/item/twohanded/required/kinetic_crusher +/obj/item/twohanded/kinetic_crusher icon = 'icons/obj/mining.dmi' - icon_state = "mining_hammer1" - item_state = "mining_hammer1" + icon_state = "crusher" + item_state = "crusher0" lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi' name = "proto-kinetic crusher" desc = "An early design of the proto-kinetic accelerator, it is little more than an combination of various mining tools cobbled together, forming a high-tech club. \ While it is an effective mining tool, it did little to aid any but the most skilled and/or suicidal miners against local fauna." - force = 20 //As much as a bone spear, but this is significantly more annoying to carry around due to requiring the use of both hands at all times + force = 0 //You can't hit stuff unless wielded w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK - force_unwielded = 20 //It's never not wielded so these are the same + force_unwielded = 0 force_wielded = 20 throwforce = 5 throw_speed = 4 - light_range = 7 - light_power = 2 armour_penetration = 10 materials = list(MAT_METAL=1150, MAT_GLASS=2075) hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("smashed", "crushed", "cleaved", "chopped", "pulped") sharpness = IS_SHARP + actions_types = list(/datum/action/item_action/toggle_light) var/list/trophies = list() var/charged = TRUE var/charge_time = 15 var/detonation_damage = 50 var/backstab_bonus = 30 + var/light_on = FALSE + var/brightness_on = 7 -/obj/item/twohanded/required/kinetic_crusher/Initialize() +/obj/item/twohanded/kinetic_crusher/Initialize() . = ..() AddComponent(/datum/component/butchering, 60, 110) //technically it's huge and bulky, but this provides an incentive to use it -/obj/item/twohanded/required/kinetic_crusher/Destroy() +/obj/item/twohanded/kinetic_crusher/Destroy() QDEL_LIST(trophies) return ..() -/obj/item/twohanded/required/kinetic_crusher/examine(mob/living/user) +/obj/item/twohanded/kinetic_crusher/examine(mob/living/user) ..() - to_chat(user, "Mark a large creature with the destabilizing force, then hit them in melee to do [force + detonation_damage] damage.") - to_chat(user, "Does [force + detonation_damage + backstab_bonus] damage if the target is backstabbed, instead of [force + detonation_damage].") + to_chat(user, "Mark a large creature with the destabilizing force, then hit them in melee to do [force_wielded + detonation_damage] damage.") + to_chat(user, "Does [force_wielded + detonation_damage + backstab_bonus] damage if the target is backstabbed, instead of [force_wielded + detonation_damage].") for(var/t in trophies) var/obj/item/crusher_trophy/T = t to_chat(user, "It has \a [T] attached, which causes [T.effect_desc()].") -/obj/item/twohanded/required/kinetic_crusher/attackby(obj/item/I, mob/living/user) +/obj/item/twohanded/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.") @@ -60,7 +61,11 @@ else return ..() -/obj/item/twohanded/required/kinetic_crusher/attack(mob/living/target, mob/living/carbon/user) +/obj/item/twohanded/kinetic_crusher/attack(mob/living/target, mob/living/carbon/user) + if(!wielded) + to_chat(user, "[src] is too heavy to use with one hand. You fumble and drop everything.") + user.drop_all_held_items() + return var/datum/status_effect/crusher_damage/C = target.has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING) var/target_health = target.health ..() @@ -71,11 +76,13 @@ 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/required/kinetic_crusher/afterattack(atom/target, mob/living/user, proximity_flag, clickparams) +/obj/item/twohanded/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 T.add_to(src, user) + if(!wielded) + return if(!proximity_flag && charged)//Mark a target, or mine a tile. var/turf/proj_turf = user.loc if(!isturf(proj_turf)) @@ -90,7 +97,7 @@ playsound(user, 'sound/weapons/plasma_cutter.ogg', 100, 1) D.fire() charged = FALSE - icon_state = "mining_hammer1_uncharged" + update_icon() addtimer(CALLBACK(src, .proc/Recharge), charge_time) return if(proximity_flag && isliving(target)) @@ -122,12 +129,37 @@ 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/required/kinetic_crusher/proc/Recharge() +/obj/item/twohanded/kinetic_crusher/proc/Recharge() if(!charged) charged = TRUE - icon_state = "mining_hammer1" + update_icon() playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1) +/obj/item/twohanded/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) + if(light_on) + set_light(brightness_on) + else + set_light(0) + +/obj/item/twohanded/kinetic_crusher/update_icon() + ..() + cut_overlays() + if(!charged) + add_overlay("[icon_state]_uncharged") + if(light_on) + add_overlay("[icon_state]_lit") + spawn(1) + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + item_state = "crusher[wielded]" + //destablizing force /obj/item/projectile/destabilizer name = "destabilizing force" @@ -138,7 +170,7 @@ flag = "bomb" range = 6 log_override = TRUE - var/obj/item/twohanded/required/kinetic_crusher/hammer_synced + var/obj/item/twohanded/kinetic_crusher/hammer_synced /obj/item/projectile/destabilizer/Destroy() hammer_synced = null @@ -177,12 +209,12 @@ return "errors" /obj/item/crusher_trophy/attackby(obj/item/A, mob/living/user) - if(istype(A, /obj/item/twohanded/required/kinetic_crusher)) + if(istype(A, /obj/item/twohanded/kinetic_crusher)) add_to(A, user) else ..() -/obj/item/crusher_trophy/proc/add_to(obj/item/twohanded/required/kinetic_crusher/H, mob/living/user) +/obj/item/crusher_trophy/proc/add_to(obj/item/twohanded/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)) @@ -194,7 +226,7 @@ to_chat(user, "You attach [src] to [H].") return TRUE -/obj/item/crusher_trophy/proc/remove_from(obj/item/twohanded/required/kinetic_crusher/H, mob/living/user) +/obj/item/crusher_trophy/proc/remove_from(obj/item/twohanded/kinetic_crusher/H, mob/living/user) forceMove(get_turf(H)) H.trophies -= src return TRUE @@ -281,12 +313,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/required/kinetic_crusher/H, mob/living/user) +/obj/item/crusher_trophy/legion_skull/add_to(obj/item/twohanded/kinetic_crusher/H, mob/living/user) . = ..() if(.) H.charge_time -= bonus_value -/obj/item/crusher_trophy/legion_skull/remove_from(obj/item/twohanded/required/kinetic_crusher/H, mob/living/user) +/obj/item/crusher_trophy/legion_skull/remove_from(obj/item/twohanded/kinetic_crusher/H, mob/living/user) . = ..() if(.) H.charge_time += bonus_value @@ -339,7 +371,7 @@ /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/required/kinetic_crusher/H, mob/living/user) +/obj/item/crusher_trophy/demon_claws/add_to(obj/item/twohanded/kinetic_crusher/H, mob/living/user) . = ..() if(.) H.force += bonus_value * 0.2 @@ -347,7 +379,7 @@ H.force_wielded += bonus_value * 0.2 H.detonation_damage += bonus_value * 0.8 -/obj/item/crusher_trophy/demon_claws/remove_from(obj/item/twohanded/required/kinetic_crusher/H, mob/living/user) +/obj/item/crusher_trophy/demon_claws/remove_from(obj/item/twohanded/kinetic_crusher/H, mob/living/user) . = ..() if(.) H.force -= bonus_value * 0.2 diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 5990c70813..9b9d6dd3bb 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -205,7 +205,7 @@ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF var/mob/living/carbon/human/active_owner -/obj/item/clothing/neck/necklace/memento_mori/item_action_slot_check(slot) +/obj/item/clothing/neck/necklace/memento_mori/item_action_slot_check(slot, mob/user, datum/action/A) return slot == SLOT_NECK /obj/item/clothing/neck/necklace/memento_mori/dropped(mob/user) @@ -796,21 +796,21 @@ /obj/item/melee/ghost_sword/proc/ghost_check() var/list/mob/dead/observer/current_spirits = list() - + recursive_orbit_collect(src, current_spirits) recursive_orbit_collect(loc, current_spirits) //anything holding us - + for(var/i in spirits - current_spirits) var/mob/dead/observer/G = i G.invisibility = GLOB.observer_default_invisibility - + for(var/i in current_spirits) var/mob/dead/observer/G = i G.invisibility = 0 - + spirits = current_spirits return length(spirits) - + /obj/item/melee/ghost_sword/attack(mob/living/target, mob/living/carbon/human/user) force = 0 var/ghost_counter = ghost_check() diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index a004a6ae0d..4d8624864e 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -95,7 +95,7 @@ process_ore(AM) /obj/machinery/mineral/processing_unit/proc/process_ore(obj/item/stack/ore/O) - GET_COMPONENT(materials, /datum/component/material_container) + 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)) unload_mineral(O) @@ -107,7 +107,7 @@ /obj/machinery/mineral/processing_unit/proc/get_machine_data() var/dat = "Smelter control console

" - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) for(var/mat_id in materials.materials) var/datum/material/M = materials.materials[mat_id] dat += "[M.name]: [M.amount] cm³" @@ -152,7 +152,7 @@ CONSOLE.updateUsrDialog() /obj/machinery/mineral/processing_unit/proc/smelt_ore() - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) var/datum/material/mat = materials.materials[selected_material] if(mat) var/sheets_to_remove = (mat.amount >= (MINERAL_MATERIAL_AMOUNT * SMELT_AMOUNT) ) ? SMELT_AMOUNT : round(mat.amount / MINERAL_MATERIAL_AMOUNT) @@ -175,7 +175,7 @@ on = FALSE return - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) materials.use_amount(alloy.materials, amount) generate_mineral(alloy.build_path) @@ -186,7 +186,7 @@ var/build_amount = SMELT_AMOUNT - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) for(var/mat_id in D.materials) var/M = D.materials[mat_id] @@ -204,7 +204,7 @@ unload_mineral(O) /obj/machinery/mineral/processing_unit/on_deconstruction() - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) materials.retrieve_all() ..() diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm index 8fdc50d2ac..c42f1b9f4e 100644 --- a/code/modules/mining/machine_silo.dm +++ b/code/modules/mining/machine_silo.dm @@ -34,13 +34,13 @@ GLOBAL_LIST_EMPTY(silo_access_logs) var/datum/component/remote_materials/mats = C mats.disconnect_from(src) - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) materials.retrieve_all() return ..() /obj/machinery/ore_silo/proc/remote_attackby(obj/machinery/M, mob/user, obj/item/stack/I) - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) // stolen from /datum/component/material_container/proc/OnAttackBy if(user.a_intent != INTENT_HELP) return @@ -71,7 +71,7 @@ GLOBAL_LIST_EMPTY(silo_access_logs) popup.open() /obj/machinery/ore_silo/proc/generate_ui() - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) var/list/ui = list("Ore Silo

Stored Material:

") var/any = FALSE for(var/M in materials.materials) @@ -149,7 +149,7 @@ GLOBAL_LIST_EMPTY(silo_access_logs) return TRUE else if(href_list["ejectsheet"]) var/eject_sheet = href_list["ejectsheet"] - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) var/count = materials.retrieve_sheets(text2num(href_list["eject_amt"]), eject_sheet, drop_location()) var/list/matlist = list() matlist[eject_sheet] = MINERAL_MATERIAL_AMOUNT diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index 38d2e3e100..5a48538161 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -30,7 +30,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/required/kinetic_crusher, 750), + new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/twohanded/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), @@ -172,7 +172,7 @@ new /obj/item/stack/marker_beacon/thirty(drop_location) if("Crusher Kit") new /obj/item/extinguisher/mini(drop_location) - new /obj/item/twohanded/required/kinetic_crusher(drop_location) + new /obj/item/twohanded/kinetic_crusher(drop_location) if("Mining Conscription Kit") new /obj/item/storage/backpack/duffelbag/mining_conscript(drop_location) diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index 15ff372c47..997b117b25 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -49,7 +49,7 @@ toggle_mode_action.Grant(src) var/datum/action/innate/minedrone/dump_ore/dump_ore_action = new() dump_ore_action.Grant(src) - var/obj/item/implant/radio/mining/imp = new(src) + var/obj/item/implant/radio/mining/imp = new imp.implant(src) access_card = new /obj/item/card/id(src) diff --git a/code/modules/mining/mint.dm b/code/modules/mining/mint.dm index 6b03be610d..8204977058 100644 --- a/code/modules/mining/mint.dm +++ b/code/modules/mining/mint.dm @@ -22,7 +22,7 @@ if(!T) return - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) for(var/obj/item/stack/sheet/O in T) materials.insert_stack(O, O.amount) @@ -32,7 +32,7 @@ return var/dat = "Coin Press
" - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) for(var/mat_id in materials.materials) var/datum/material/M = materials.materials[mat_id] if(!M.amount && chosen != mat_id) @@ -65,7 +65,7 @@ if(processing==1) to_chat(usr, "The machine is processing.") return - GET_COMPONENT(materials, /datum/component/material_container) + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) if(href_list["choose"]) if(materials.materials[href_list["choose"]]) chosen = href_list["choose"] diff --git a/code/modules/mining/money_bag.dm b/code/modules/mining/money_bag.dm index f567bd1daf..fd5997d3c4 100644 --- a/code/modules/mining/money_bag.dm +++ b/code/modules/mining/money_bag.dm @@ -11,7 +11,7 @@ /obj/item/storage/bag/money/Initialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_w_class = WEIGHT_CLASS_NORMAL STR.max_items = 40 STR.max_combined_w_class = 40 diff --git a/code/modules/mob/camera/camera.dm b/code/modules/mob/camera/camera.dm index c780d57810..ee89167f29 100644 --- a/code/modules/mob/camera/camera.dm +++ b/code/modules/mob/camera/camera.dm @@ -30,5 +30,8 @@ loc = destination Moved(oldloc, NONE, TRUE) +/mob/camera/canUseStorage() + return FALSE + /mob/camera/emote(act, m_type=1, message = null, intentional = FALSE) return diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index 381dc131e7..35dbe0828f 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -20,6 +20,9 @@ INITIALIZE_IMMEDIATE(/mob/dead) set_focus(src) return INITIALIZE_HINT_NORMAL +/mob/dead/canUseStorage() + return FALSE + /mob/dead/dust(just_ash, drop_items, force) //ghosts can't be vaporised. return diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 1cd32d43ac..4d253a4693 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -1,623 +1,633 @@ -#define LINKIFY_READY(string, value) "[string]" - -/mob/dead/new_player - var/ready = 0 - var/spawning = 0//Referenced when you want to delete the new_player later on in the code. - - flags_1 = NONE - - invisibility = INVISIBILITY_ABSTRACT - - density = FALSE - stat = DEAD - canmove = FALSE - - anchored = TRUE // don't get pushed around - - var/mob/living/new_character //for instant transfer once the round is set up - - //Used to make sure someone doesn't get spammed with messages if they're ineligible for roles - var/ineligible_for_roles = FALSE - -/mob/dead/new_player/Initialize() - if(client && SSticker.state == GAME_STATE_STARTUP) - var/obj/screen/splash/S = new(client, TRUE, TRUE) - S.Fade(TRUE) - - if(length(GLOB.newplayer_start)) - forceMove(pick(GLOB.newplayer_start)) - else - forceMove(locate(1,1,1)) - - ComponentInitialize() - - . = ..() - -/mob/dead/new_player/prepare_huds() - return - -/mob/dead/new_player/proc/new_player_panel() - var/output = "

Welcome, [client ? client.prefs.real_name : "Unknown User"]

" - output += "

Setup Character

" - - if(SSticker.current_state <= GAME_STATE_PREGAME) - switch(ready) - if(PLAYER_NOT_READY) - output += "

\[ [LINKIFY_READY("Ready", PLAYER_READY_TO_PLAY)] | Not Ready | [LINKIFY_READY("Observe", PLAYER_READY_TO_OBSERVE)] \]

" - if(PLAYER_READY_TO_PLAY) - output += "

\[ Ready | [LINKIFY_READY("Not Ready", PLAYER_NOT_READY)] | [LINKIFY_READY("Observe", PLAYER_READY_TO_OBSERVE)] \]

" - if(PLAYER_READY_TO_OBSERVE) - output += "

\[ [LINKIFY_READY("Ready", PLAYER_READY_TO_PLAY)] | [LINKIFY_READY("Not Ready", PLAYER_NOT_READY)] | Observe \]

" - else - output += "

View the Crew Manifest

" - output += "

Join Game!

" - output += "

[LINKIFY_READY("Observe", PLAYER_READY_TO_OBSERVE)]

" - - if(!IsGuestKey(src.key)) - if (SSdbcore.Connect()) - var/isadmin = 0 - if(src.client && src.client.holder) - isadmin = 1 - var/datum/DBQuery/query_get_new_polls = SSdbcore.NewQuery("SELECT id FROM [format_table_name("poll_question")] WHERE [(isadmin ? "" : "adminonly = false AND")] Now() BETWEEN starttime AND endtime AND id NOT IN (SELECT pollid FROM [format_table_name("poll_vote")] WHERE ckey = \"[sanitizeSQL(ckey)]\") AND id NOT IN (SELECT pollid FROM [format_table_name("poll_textreply")] WHERE ckey = \"[sanitizeSQL(ckey)]\")") - var/rs = REF(src) - if(query_get_new_polls.Execute()) - var/newpoll = 0 - if(query_get_new_polls.NextRow()) - newpoll = 1 - - if(newpoll) - output += "

Show Player Polls (NEW!)

" - else - output += "

Show Player Polls

" - qdel(query_get_new_polls) - if(QDELETED(src)) - return - - output += "
" - - //src << browse(output,"window=playersetup;size=210x240;can_close=0") - var/datum/browser/popup = new(src, "playersetup", "
New Player Options
", 250, 265) - popup.set_window_options("can_close=0") - popup.set_content(output) - popup.open(FALSE) - -/mob/dead/new_player/Topic(href, href_list[]) - if(src != usr) - return 0 - - if(!client) - return 0 - - //Determines Relevent Population Cap - var/relevant_cap - var/hpc = CONFIG_GET(number/hard_popcap) - var/epc = CONFIG_GET(number/extreme_popcap) - if(hpc && epc) - relevant_cap = min(hpc, epc) - else - relevant_cap = max(hpc, epc) - - if(href_list["show_preferences"]) - client.prefs.ShowChoices(src) - return 1 - - if(href_list["ready"]) - var/tready = text2num(href_list["ready"]) - //Avoid updating ready if we're after PREGAME (they should use latejoin instead) - //This is likely not an actual issue but I don't have time to prove that this - //no longer is required - if(SSticker.current_state <= GAME_STATE_PREGAME) - ready = tready - //if it's post initialisation and they're trying to observe we do the needful - if(!SSticker.current_state < GAME_STATE_PREGAME && tready == PLAYER_READY_TO_OBSERVE) - ready = tready - make_me_an_observer() - return - - if(href_list["refresh"]) - src << browse(null, "window=playersetup") //closes the player setup window - new_player_panel() - - if(href_list["late_join"]) - if(!SSticker || !SSticker.IsRoundInProgress()) - to_chat(usr, "The round is either not ready, or has already finished...") - return - - if(href_list["late_join"] == "override") - LateChoices() - return - - if(SSticker.queued_players.len || (relevant_cap && living_player_count() >= relevant_cap && !(ckey(key) in GLOB.admin_datums))) - to_chat(usr, "[CONFIG_GET(string/hard_popcap_message)]") - - var/queue_position = SSticker.queued_players.Find(usr) - if(queue_position == 1) - to_chat(usr, "You are next in line to join the game. You will be notified when a slot opens up.") - else if(queue_position) - to_chat(usr, "There are [queue_position-1] players in front of you in the queue to join the game.") - else - SSticker.queued_players += usr - to_chat(usr, "You have been added to the queue to join the game. Your position in queue is [SSticker.queued_players.len].") - return - LateChoices() - - if(href_list["manifest"]) - ViewManifest() - - if(href_list["SelectedJob"]) - - if(!GLOB.enter_allowed) - to_chat(usr, "There is an administrative lock on entering the game!") - return - - if(SSticker.queued_players.len && !(ckey(key) in GLOB.admin_datums)) - if((living_player_count() >= relevant_cap) || (src != SSticker.queued_players[1])) - to_chat(usr, "Server is full.") - return - - AttemptLateSpawn(href_list["SelectedJob"]) - return - - if(href_list["JoinAsGhostRole"]) - if(!GLOB.enter_allowed) - to_chat(usr, " There is an administrative lock on entering the game!") - - if(SSticker.queued_players.len && !(ckey(key) in GLOB.admin_datums)) - if((living_player_count() >= relevant_cap) || (src != SSticker.queued_players[1])) - to_chat(usr, "Server is full.") - return - - var/obj/effect/mob_spawn/MS = pick(GLOB.mob_spawners[href_list["JoinAsGhostRole"]]) - if(MS.attack_ghost(src, latejoinercalling = TRUE)) - SSticker.queued_players -= src - SSticker.queue_delay = 4 - qdel(src) - - if(!ready && href_list["preference"]) - if(client) - client.prefs.process_link(src, href_list) - else if(!href_list["late_join"]) - new_player_panel() - - if(href_list["showpoll"]) - handle_player_polling() - return - - if(href_list["pollid"]) - var/pollid = href_list["pollid"] - if(istext(pollid)) - pollid = text2num(pollid) - if(isnum(pollid) && ISINTEGER(pollid)) - src.poll_player(pollid) - return - - if(href_list["votepollid"] && href_list["votetype"]) - var/pollid = text2num(href_list["votepollid"]) - var/votetype = href_list["votetype"] - //lets take data from the user to decide what kind of poll this is, without validating it - //what could go wrong - switch(votetype) - if(POLLTYPE_OPTION) - var/optionid = text2num(href_list["voteoptionid"]) - if(vote_on_poll(pollid, optionid)) - to_chat(usr, "Vote successful.") - else - to_chat(usr, "Vote failed, please try again or contact an administrator.") - if(POLLTYPE_TEXT) - var/replytext = href_list["replytext"] - if(log_text_poll_reply(pollid, replytext)) - to_chat(usr, "Feedback logging successful.") - else - to_chat(usr, "Feedback logging failed, please try again or contact an administrator.") - if(POLLTYPE_RATING) - var/id_min = text2num(href_list["minid"]) - var/id_max = text2num(href_list["maxid"]) - - if( (id_max - id_min) > 100 ) //Basic exploit prevention - //(protip, this stops no exploits) - to_chat(usr, "The option ID difference is too big. Please contact administration or the database admin.") - return - - for(var/optionid = id_min; optionid <= id_max; optionid++) - if(!isnull(href_list["o[optionid]"])) //Test if this optionid was replied to - var/rating - if(href_list["o[optionid]"] == "abstain") - rating = null - else - rating = text2num(href_list["o[optionid]"]) - if(!isnum(rating) || !ISINTEGER(rating)) - return - - if(!vote_on_numval_poll(pollid, optionid, rating)) - to_chat(usr, "Vote failed, please try again or contact an administrator.") - return - to_chat(usr, "Vote successful.") - if(POLLTYPE_MULTI) - var/id_min = text2num(href_list["minoptionid"]) - var/id_max = text2num(href_list["maxoptionid"]) - - if( (id_max - id_min) > 100 ) //Basic exploit prevention - to_chat(usr, "The option ID difference is too big. Please contact administration or the database admin.") - return - - for(var/optionid = id_min; optionid <= id_max; optionid++) - if(!isnull(href_list["option_[optionid]"])) //Test if this optionid was selected - var/i = vote_on_multi_poll(pollid, optionid) - switch(i) - if(0) - continue - if(1) - to_chat(usr, "Vote failed, please try again or contact an administrator.") - return - if(2) - to_chat(usr, "Maximum replies reached.") - break - to_chat(usr, "Vote successful.") - if(POLLTYPE_IRV) - if (!href_list["IRVdata"]) - to_chat(src, "No ordering data found. Please try again or contact an administrator.") - return - var/list/votelist = splittext(href_list["IRVdata"], ",") - if (!vote_on_irv_poll(pollid, votelist)) - to_chat(src, "Vote failed, please try again or contact an administrator.") - return - to_chat(src, "Vote successful.") - -//When you cop out of the round (NB: this HAS A SLEEP FOR PLAYER INPUT IN IT) -/mob/dead/new_player/proc/make_me_an_observer() - if(QDELETED(src) || !src.client) - ready = PLAYER_NOT_READY - return FALSE - - var/this_is_like_playing_right = alert(src,"Are you sure you wish to observe? You will not be able to play this round!","Player Setup","Yes","No") - - if(QDELETED(src) || !src.client || this_is_like_playing_right != "Yes") - ready = PLAYER_NOT_READY - src << browse(null, "window=playersetup") //closes the player setup window - new_player_panel() - return FALSE - - var/mob/dead/observer/observer = new() - spawning = TRUE - - observer.started_as_observer = TRUE - close_spawn_windows() - var/obj/effect/landmark/observer_start/O = locate(/obj/effect/landmark/observer_start) in GLOB.landmarks_list - to_chat(src, "Now teleporting.") - if (O) - observer.forceMove(O.loc) - else - to_chat(src, "Teleporting failed. Ahelp an admin please") - stack_trace("There's no freaking observer landmark available on this map or you're making observers before the map is initialised") - observer.key = key - observer.client = client - observer.set_ghost_appearance() - if(observer.client && observer.client.prefs) - observer.real_name = observer.client.prefs.real_name - observer.name = observer.real_name - observer.update_icon() - observer.stop_sound_channel(CHANNEL_LOBBYMUSIC) - QDEL_NULL(mind) - qdel(src) - return TRUE - -/proc/get_job_unavailable_error_message(retval, jobtitle) - switch(retval) - if(JOB_AVAILABLE) - return "[jobtitle] is available." - if(JOB_UNAVAILABLE_GENERIC) - return "[jobtitle] is unavailable." - if(JOB_UNAVAILABLE_BANNED) - return "You are currently banned from [jobtitle]." - if(JOB_UNAVAILABLE_PLAYTIME) - return "You do not have enough relevant playtime for [jobtitle]." - if(JOB_UNAVAILABLE_ACCOUNTAGE) - return "Your account is not old enough for [jobtitle]." - if(JOB_UNAVAILABLE_SLOTFULL) - return "[jobtitle] is already filled to capacity." - return "Error: Unknown job availability." - -/mob/dead/new_player/proc/IsJobUnavailable(rank, latejoin = FALSE) - var/datum/job/job = SSjob.GetJob(rank) - if(!job) - return JOB_UNAVAILABLE_GENERIC - if((job.current_positions >= job.total_positions) && job.total_positions != -1) - if(job.title == "Assistant") - if(isnum(client.player_age) && client.player_age <= 14) //Newbies can always be assistants - return JOB_AVAILABLE - for(var/datum/job/J in SSjob.occupations) - if(J && J.current_positions < J.total_positions && J.title != job.title) - return JOB_UNAVAILABLE_SLOTFULL - else - return JOB_UNAVAILABLE_SLOTFULL - if(jobban_isbanned(src,rank)) - return JOB_UNAVAILABLE_BANNED - if(QDELETED(src)) - return JOB_UNAVAILABLE_GENERIC - if(!job.player_old_enough(client)) - return JOB_UNAVAILABLE_ACCOUNTAGE - if(job.required_playtime_remaining(client)) - return JOB_UNAVAILABLE_PLAYTIME - if(latejoin && !job.special_check_latejoin(client)) - return JOB_UNAVAILABLE_GENERIC - return JOB_AVAILABLE - -/mob/dead/new_player/proc/AttemptLateSpawn(rank) - var/error = IsJobUnavailable(rank) - if(error != JOB_AVAILABLE) - alert(src, get_job_unavailable_error_message(error, rank)) - return FALSE - - if(SSticker.late_join_disabled) - alert(src, "An administrator has disabled late join spawning.") - return FALSE - - var/arrivals_docked = TRUE - if(SSshuttle.arrivals) - close_spawn_windows() //In case we get held up - if(SSshuttle.arrivals.damaged && CONFIG_GET(flag/arrivals_shuttle_require_safe_latejoin)) - src << alert("The arrivals shuttle is currently malfunctioning! You cannot join.") - return FALSE - - if(CONFIG_GET(flag/arrivals_shuttle_require_undocked)) - SSshuttle.arrivals.RequireUndocked(src) - arrivals_docked = SSshuttle.arrivals.mode != SHUTTLE_CALL - - //Remove the player from the join queue if he was in one and reset the timer - SSticker.queued_players -= src - SSticker.queue_delay = 4 - - SSjob.AssignRole(src, rank, 1) - - var/mob/living/character = create_character(TRUE) //creates the human and transfers vars and mind - var/equip = SSjob.EquipRank(character, rank, TRUE) - if(isliving(equip)) //Borgs get borged in the equip, so we need to make sure we handle the new mob. - character = equip - - var/datum/job/job = SSjob.GetJob(rank) - - if(job && !job.override_latejoin_spawn(character)) - SSjob.SendToLateJoin(character) - if(!arrivals_docked) - var/obj/screen/splash/Spl = new(character.client, TRUE) - Spl.Fade(TRUE) - character.playsound_local(get_turf(character), 'sound/voice/ApproachingTG.ogg', 25) - - character.update_parallax_teleport() - - SSticker.minds += character.mind - - var/mob/living/carbon/human/humanc - if(ishuman(character)) - humanc = character //Let's retypecast the var to be human, - - if(humanc) //These procs all expect humans - GLOB.data_core.manifest_inject(humanc) - if(SSshuttle.arrivals) - SSshuttle.arrivals.QueueAnnounce(humanc, rank) - else - AnnounceArrival(humanc, rank) - AddEmploymentContract(humanc) - if(GLOB.highlander) - to_chat(humanc, "THERE CAN BE ONLY ONE!!!") - humanc.make_scottish() - - if(GLOB.summon_guns_triggered) - give_guns(humanc) - if(GLOB.summon_magic_triggered) - give_magic(humanc) - - GLOB.joined_player_list += character.ckey - GLOB.latejoiners += character - - if(CONFIG_GET(flag/allow_latejoin_antagonists) && humanc) //Borgs aren't allowed to be antags. Will need to be tweaked if we get true latejoin ais. - if(SSshuttle.emergency) - switch(SSshuttle.emergency.mode) - if(SHUTTLE_RECALL, SHUTTLE_IDLE) - SSticker.mode.make_antag_chance(humanc) - if(SHUTTLE_CALL) - if(SSshuttle.emergency.timeLeft(1) > initial(SSshuttle.emergencyCallTime)*0.5) - SSticker.mode.make_antag_chance(humanc) - - if(humanc && CONFIG_GET(flag/roundstart_traits)) - SSquirks.AssignQuirks(humanc, humanc.client, TRUE, FALSE, job, FALSE) - - log_manifest(character.mind.key,character.mind,character,latejoin = TRUE) - -/mob/dead/new_player/proc/AddEmploymentContract(mob/living/carbon/human/employee) - //TODO: figure out a way to exclude wizards/nukeops/demons from this. - for(var/C in GLOB.employmentCabinets) - var/obj/structure/filingcabinet/employment/employmentCabinet = C - if(!employmentCabinet.virgin) - employmentCabinet.addFile(employee) - - -/mob/dead/new_player/proc/LateChoices() - - var/level = "green" - switch(GLOB.security_level) - if(SEC_LEVEL_GREEN) - level = "green" - if(SEC_LEVEL_BLUE) - level = "blue" - if(SEC_LEVEL_AMBER) - level = "amber" - if(SEC_LEVEL_RED) - level = "red" - if(SEC_LEVEL_DELTA) - level = "delta" - - var/dat = "
Round Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]
Alert Level: [capitalize(level)]
" - if(SSshuttle.emergency) - switch(SSshuttle.emergency.mode) - if(SHUTTLE_ESCAPE) - dat += "
The station has been evacuated.

" - if(SHUTTLE_CALL) - if(!SSshuttle.canRecall()) - dat += "
The station is currently undergoing evacuation procedures.

" - for(var/datum/job/prioritized_job in SSjob.prioritized_jobs) - if(prioritized_job.current_positions >= prioritized_job.total_positions) - SSjob.prioritized_jobs -= prioritized_job - dat += "
" - var/column_counter = 0 - var/free_space = 0 - for(var/list/category in list(GLOB.command_positions) + list(GLOB.supply_positions) + list(GLOB.engineering_positions) + list(GLOB.nonhuman_positions - "pAI") + list(GLOB.civilian_positions) + list(GLOB.medical_positions) + list(GLOB.science_positions) + list(GLOB.security_positions)) - var/cat_color = "fff" //random default - if(SSjob.name_occupations && SSjob.name_occupations[category[1]]) - cat_color = SSjob.name_occupations[category[1]].selection_color //use the color of the first job in the category (the department head) as the category color - else - cat_color = SSjob.occupations[category[1]].selection_color - dat += "
" - dat += "[SSjob.name_occupations[category[1]].exp_type_department]" - - var/list/dept_dat = list() - for(var/job in category) - var/datum/job/job_datum = SSjob.name_occupations[job] - if(job_datum && IsJobUnavailable(job_datum.title, TRUE) == JOB_AVAILABLE) - var/command_bold = "" - if(job in GLOB.command_positions) - command_bold = " command" - if(job_datum in SSjob.prioritized_jobs) - dept_dat += "[job_datum.title] ([job_datum.current_positions])" - else - dept_dat += "[job_datum.title] ([job_datum.current_positions])" - if(!dept_dat.len) - dept_dat += "No positions open." - dat += jointext(dept_dat, "") - dat += "

" - column_counter++ - if(free_space <=4) - free_space++ - if(column_counter > 0 && (column_counter % 3 == 0)) - dat += "
" - if(free_space >= 5 && (free_space % 5 == 0) && (column_counter % 3 != 0)) - free_space = 0 - column_counter = 0 - dat += "" - - dat += "
" - - var/available_ghosts = 0 - for(var/spawner in GLOB.mob_spawners) - if(!LAZYLEN(spawner)) - continue - var/obj/effect/mob_spawn/S = pick(GLOB.mob_spawners[spawner]) - if(!istype(S) || !S.can_latejoin()) - continue - available_ghosts++ - break - - if(!available_ghosts) - dat += "
There are currently no open ghost spawners.
" - else - var/list/categorizedJobs = list("Ghost Role" = list(jobs = list(), titles = GLOB.mob_spawners, color = "#ffffff")) - for(var/spawner in GLOB.mob_spawners) - if(!LAZYLEN(spawner)) - continue - var/obj/effect/mob_spawn/S = pick(GLOB.mob_spawners[spawner]) - if(!istype(S) || !S.can_latejoin()) - continue - categorizedJobs["Ghost Role"]["jobs"] += spawner - - dat += "
" - for(var/jobcat in categorizedJobs) - if(!length(categorizedJobs[jobcat]["jobs"])) - continue - var/color = categorizedJobs[jobcat]["color"] - dat += "
" - dat += "[jobcat]" - for(var/spawner in categorizedJobs[jobcat]["jobs"]) - dat += "[spawner]" - - dat += "

" - dat += "
" - dat += "
" - - var/datum/browser/popup = new(src, "latechoices", "Choose Profession", 720, 600) - popup.add_stylesheet("playeroptions", 'html/browser/playeroptions.css') - popup.set_content(jointext(dat, "")) - popup.open(FALSE) // FALSE is passed to open so that it doesn't use the onclose() proc - -/mob/dead/new_player/proc/create_character(transfer_after) - spawning = 1 - close_spawn_windows() - - var/mob/living/carbon/human/H = new(loc) - - var/frn = CONFIG_GET(flag/force_random_names) - if(!frn) - frn = jobban_isbanned(src, "appearance") - if(QDELETED(src)) - return - if(frn) - client.prefs.random_character() - client.prefs.real_name = client.prefs.pref_species.random_name(gender,1) - 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 - - H.name = real_name - - . = H - new_character = . - if(transfer_after) - transfer_character() - -/mob/dead/new_player/proc/transfer_character() - . = new_character - if(.) - new_character.key = key //Manually transfer the key to log them in - new_character.stop_sound_channel(CHANNEL_LOBBYMUSIC) - new_character = null - qdel(src) - -/mob/dead/new_player/proc/ViewManifest() - var/dat = "" - dat += "

Crew Manifest

" - dat += GLOB.data_core.get_manifest(OOC = 1) - - src << browse(dat, "window=manifest;size=387x420;can_close=1") - -/mob/dead/new_player/Move() - return 0 - - -/mob/dead/new_player/proc/close_spawn_windows() - - src << browse(null, "window=latechoices") //closes late choices window - src << browse(null, "window=playersetup") //closes the player setup window - src << browse(null, "window=preferences") //closes job selection - src << browse(null, "window=mob_occupation") - src << browse(null, "window=latechoices") //closes late job selection - -/* Used to make sure that a player has a valid job preference setup, used to knock players out of eligibility for anything if their prefs don't make sense. - A "valid job preference setup" in this situation means at least having one job set to low, or not having "return to lobby" enabled - Prevents "antag rolling" by setting antag prefs on, all jobs to never, and "return to lobby if preferences not availible" - Doing so would previously allow you to roll for antag, then send you back to lobby if you didn't get an antag role - This also does some admin notification and logging as well, as well as some extra logic to make sure things don't go wrong -*/ - -/mob/dead/new_player/proc/check_preferences() - if(!client) - return FALSE //Not sure how this would get run without the mob having a client, but let's just be safe. - if(client.prefs.joblessrole != RETURNTOLOBBY) - return TRUE - // If they have antags enabled, they're potentially doing this on purpose instead of by accident. Notify admins if so. - var/has_antags = FALSE - if(client.prefs.be_special.len > 0) - has_antags = TRUE - if(client.prefs.job_preferences.len == 0) - if(!ineligible_for_roles) - to_chat(src, "You have no jobs enabled, along with return to lobby if job is unavailable. This makes you ineligible for any round start role, please update your job preferences.") - ineligible_for_roles = TRUE - ready = PLAYER_NOT_READY - if(has_antags) - log_admin("[src.ckey] just got booted back to lobby with no jobs, but antags enabled.") - message_admins("[src.ckey] just got booted back to lobby with no jobs enabled, but antag rolling enabled. Likely antag rolling abuse.") - - return FALSE //This is the only case someone should actually be completely blocked from antag rolling as well - return TRUE +#define LINKIFY_READY(string, value) "[string]" + +/mob/dead/new_player + var/ready = 0 + var/spawning = 0//Referenced when you want to delete the new_player later on in the code. + + flags_1 = NONE + + invisibility = INVISIBILITY_ABSTRACT + + density = FALSE + stat = DEAD + canmove = FALSE + + anchored = TRUE // don't get pushed around + + var/mob/living/new_character //for instant transfer once the round is set up + + //Used to make sure someone doesn't get spammed with messages if they're ineligible for roles + var/ineligible_for_roles = FALSE + +/mob/dead/new_player/Initialize() + if(client && SSticker.state == GAME_STATE_STARTUP) + var/obj/screen/splash/S = new(client, TRUE, TRUE) + S.Fade(TRUE) + + if(length(GLOB.newplayer_start)) + forceMove(pick(GLOB.newplayer_start)) + else + forceMove(locate(1,1,1)) + + ComponentInitialize() + + . = ..() + +/mob/dead/new_player/prepare_huds() + return + +/mob/dead/new_player/proc/new_player_panel() + var/output = "

Welcome, [client ? client.prefs.real_name : "Unknown User"]

" + output += "

Setup Character

" + + if(SSticker.current_state <= GAME_STATE_PREGAME) + switch(ready) + if(PLAYER_NOT_READY) + output += "

\[ [LINKIFY_READY("Ready", PLAYER_READY_TO_PLAY)] | Not Ready | [LINKIFY_READY("Observe", PLAYER_READY_TO_OBSERVE)] \]

" + if(PLAYER_READY_TO_PLAY) + output += "

\[ Ready | [LINKIFY_READY("Not Ready", PLAYER_NOT_READY)] | [LINKIFY_READY("Observe", PLAYER_READY_TO_OBSERVE)] \]

" + if(PLAYER_READY_TO_OBSERVE) + output += "

\[ [LINKIFY_READY("Ready", PLAYER_READY_TO_PLAY)] | [LINKIFY_READY("Not Ready", PLAYER_NOT_READY)] | Observe \]

" + else + output += "

View the Crew Manifest

" + output += "

Join Game!

" + output += "

[LINKIFY_READY("Observe", PLAYER_READY_TO_OBSERVE)]

" + + if(!IsGuestKey(src.key)) + if (SSdbcore.Connect()) + var/isadmin = 0 + if(src.client && src.client.holder) + isadmin = 1 + var/datum/DBQuery/query_get_new_polls = SSdbcore.NewQuery("SELECT id FROM [format_table_name("poll_question")] WHERE [(isadmin ? "" : "adminonly = false AND")] Now() BETWEEN starttime AND endtime AND id NOT IN (SELECT pollid FROM [format_table_name("poll_vote")] WHERE ckey = \"[sanitizeSQL(ckey)]\") AND id NOT IN (SELECT pollid FROM [format_table_name("poll_textreply")] WHERE ckey = \"[sanitizeSQL(ckey)]\")") + var/rs = REF(src) + if(query_get_new_polls.Execute()) + var/newpoll = 0 + if(query_get_new_polls.NextRow()) + newpoll = 1 + + if(newpoll) + output += "

Show Player Polls (NEW!)

" + else + output += "

Show Player Polls

" + qdel(query_get_new_polls) + if(QDELETED(src)) + return + + output += "
" + + //src << browse(output,"window=playersetup;size=210x240;can_close=0") + var/datum/browser/popup = new(src, "playersetup", "
New Player Options
", 250, 265) + popup.set_window_options("can_close=0") + popup.set_content(output) + popup.open(FALSE) + +/mob/dead/new_player/Topic(href, href_list[]) + if(src != usr) + return 0 + + if(!client) + return 0 + + //Determines Relevent Population Cap + var/relevant_cap + var/hpc = CONFIG_GET(number/hard_popcap) + var/epc = CONFIG_GET(number/extreme_popcap) + if(hpc && epc) + relevant_cap = min(hpc, epc) + else + relevant_cap = max(hpc, epc) + + if(href_list["show_preferences"]) + client.prefs.ShowChoices(src) + return 1 + + if(href_list["ready"]) + var/tready = text2num(href_list["ready"]) + //Avoid updating ready if we're after PREGAME (they should use latejoin instead) + //This is likely not an actual issue but I don't have time to prove that this + //no longer is required + if(SSticker.current_state <= GAME_STATE_PREGAME) + ready = tready + //if it's post initialisation and they're trying to observe we do the needful + if(!SSticker.current_state < GAME_STATE_PREGAME && tready == PLAYER_READY_TO_OBSERVE) + ready = tready + make_me_an_observer() + return + + if(href_list["refresh"]) + src << browse(null, "window=playersetup") //closes the player setup window + new_player_panel() + + if(href_list["late_join"]) + if(!SSticker || !SSticker.IsRoundInProgress()) + to_chat(usr, "The round is either not ready, or has already finished...") + return + + if(href_list["late_join"] == "override") + LateChoices() + return + + if(SSticker.queued_players.len || (relevant_cap && living_player_count() >= relevant_cap && !(ckey(key) in GLOB.admin_datums))) + to_chat(usr, "[CONFIG_GET(string/hard_popcap_message)]") + + var/queue_position = SSticker.queued_players.Find(usr) + if(queue_position == 1) + to_chat(usr, "You are next in line to join the game. You will be notified when a slot opens up.") + else if(queue_position) + to_chat(usr, "There are [queue_position-1] players in front of you in the queue to join the game.") + else + SSticker.queued_players += usr + to_chat(usr, "You have been added to the queue to join the game. Your position in queue is [SSticker.queued_players.len].") + return + LateChoices() + + if(href_list["manifest"]) + ViewManifest() + + if(href_list["SelectedJob"]) + if(!SSticker || !SSticker.IsRoundInProgress()) + var/msg = "[key_name(usr)] attempted to join the round using a href that shouldn't be available at this moment!" + log_admin(msg) + message_admins(msg) + to_chat(usr, "The round is either not ready, or has already finished...") + return + + if(!GLOB.enter_allowed) + to_chat(usr, "There is an administrative lock on entering the game!") + return + + if(SSticker.queued_players.len && !(ckey(key) in GLOB.admin_datums)) + if((living_player_count() >= relevant_cap) || (src != SSticker.queued_players[1])) + to_chat(usr, "Server is full.") + return + + AttemptLateSpawn(href_list["SelectedJob"]) + return + + if(href_list["JoinAsGhostRole"]) + if(!GLOB.enter_allowed) + to_chat(usr, " There is an administrative lock on entering the game!") + + if(SSticker.queued_players.len && !(ckey(key) in GLOB.admin_datums)) + if((living_player_count() >= relevant_cap) || (src != SSticker.queued_players[1])) + to_chat(usr, "Server is full.") + return + + var/obj/effect/mob_spawn/MS = pick(GLOB.mob_spawners[href_list["JoinAsGhostRole"]]) + if(MS.attack_ghost(src, latejoinercalling = TRUE)) + SSticker.queued_players -= src + SSticker.queue_delay = 4 + qdel(src) + + if(!ready && href_list["preference"]) + if(client) + client.prefs.process_link(src, href_list) + else if(!href_list["late_join"]) + new_player_panel() + + if(href_list["showpoll"]) + handle_player_polling() + return + + if(href_list["pollid"]) + var/pollid = href_list["pollid"] + if(istext(pollid)) + pollid = text2num(pollid) + if(isnum(pollid) && ISINTEGER(pollid)) + src.poll_player(pollid) + return + + if(href_list["votepollid"] && href_list["votetype"]) + var/pollid = text2num(href_list["votepollid"]) + var/votetype = href_list["votetype"] + //lets take data from the user to decide what kind of poll this is, without validating it + //what could go wrong + switch(votetype) + if(POLLTYPE_OPTION) + var/optionid = text2num(href_list["voteoptionid"]) + if(vote_on_poll(pollid, optionid)) + to_chat(usr, "Vote successful.") + else + to_chat(usr, "Vote failed, please try again or contact an administrator.") + if(POLLTYPE_TEXT) + var/replytext = href_list["replytext"] + if(log_text_poll_reply(pollid, replytext)) + to_chat(usr, "Feedback logging successful.") + else + to_chat(usr, "Feedback logging failed, please try again or contact an administrator.") + if(POLLTYPE_RATING) + var/id_min = text2num(href_list["minid"]) + var/id_max = text2num(href_list["maxid"]) + + if( (id_max - id_min) > 100 ) //Basic exploit prevention + //(protip, this stops no exploits) + to_chat(usr, "The option ID difference is too big. Please contact administration or the database admin.") + return + + for(var/optionid = id_min; optionid <= id_max; optionid++) + if(!isnull(href_list["o[optionid]"])) //Test if this optionid was replied to + var/rating + if(href_list["o[optionid]"] == "abstain") + rating = null + else + rating = text2num(href_list["o[optionid]"]) + if(!isnum(rating) || !ISINTEGER(rating)) + return + + if(!vote_on_numval_poll(pollid, optionid, rating)) + to_chat(usr, "Vote failed, please try again or contact an administrator.") + return + to_chat(usr, "Vote successful.") + if(POLLTYPE_MULTI) + var/id_min = text2num(href_list["minoptionid"]) + var/id_max = text2num(href_list["maxoptionid"]) + + if( (id_max - id_min) > 100 ) //Basic exploit prevention + to_chat(usr, "The option ID difference is too big. Please contact administration or the database admin.") + return + + for(var/optionid = id_min; optionid <= id_max; optionid++) + if(!isnull(href_list["option_[optionid]"])) //Test if this optionid was selected + var/i = vote_on_multi_poll(pollid, optionid) + switch(i) + if(0) + continue + if(1) + to_chat(usr, "Vote failed, please try again or contact an administrator.") + return + if(2) + to_chat(usr, "Maximum replies reached.") + break + to_chat(usr, "Vote successful.") + if(POLLTYPE_IRV) + if (!href_list["IRVdata"]) + to_chat(src, "No ordering data found. Please try again or contact an administrator.") + return + var/list/votelist = splittext(href_list["IRVdata"], ",") + if (!vote_on_irv_poll(pollid, votelist)) + to_chat(src, "Vote failed, please try again or contact an administrator.") + return + to_chat(src, "Vote successful.") + +//When you cop out of the round (NB: this HAS A SLEEP FOR PLAYER INPUT IN IT) +/mob/dead/new_player/proc/make_me_an_observer() + if(QDELETED(src) || !src.client) + ready = PLAYER_NOT_READY + return FALSE + + var/this_is_like_playing_right = alert(src,"Are you sure you wish to observe? You will not be able to play this round!","Player Setup","Yes","No") + + if(QDELETED(src) || !src.client || this_is_like_playing_right != "Yes") + ready = PLAYER_NOT_READY + src << browse(null, "window=playersetup") //closes the player setup window + new_player_panel() + return FALSE + + var/mob/dead/observer/observer = new() + spawning = TRUE + + observer.started_as_observer = TRUE + close_spawn_windows() + var/obj/effect/landmark/observer_start/O = locate(/obj/effect/landmark/observer_start) in GLOB.landmarks_list + to_chat(src, "Now teleporting.") + if (O) + observer.forceMove(O.loc) + else + to_chat(src, "Teleporting failed. Ahelp an admin please") + stack_trace("There's no freaking observer landmark available on this map or you're making observers before the map is initialised") + transfer_ckey(observer, FALSE) + observer.client = client + observer.set_ghost_appearance() + if(observer.client && observer.client.prefs) + observer.real_name = observer.client.prefs.real_name + observer.name = observer.real_name + observer.update_icon() + observer.stop_sound_channel(CHANNEL_LOBBYMUSIC) + QDEL_NULL(mind) + qdel(src) + return TRUE + +/proc/get_job_unavailable_error_message(retval, jobtitle) + switch(retval) + if(JOB_AVAILABLE) + return "[jobtitle] is available." + if(JOB_UNAVAILABLE_GENERIC) + return "[jobtitle] is unavailable." + if(JOB_UNAVAILABLE_BANNED) + return "You are currently banned from [jobtitle]." + if(JOB_UNAVAILABLE_PLAYTIME) + return "You do not have enough relevant playtime for [jobtitle]." + if(JOB_UNAVAILABLE_ACCOUNTAGE) + return "Your account is not old enough for [jobtitle]." + if(JOB_UNAVAILABLE_SLOTFULL) + return "[jobtitle] is already filled to capacity." + if(JOB_UNAVAILABLE_SPECIESLOCK) + return "Your species cannot play as a [jobtitle]." + return "Error: Unknown job availability." + +/mob/dead/new_player/proc/IsJobUnavailable(rank, latejoin = FALSE) + var/datum/job/job = SSjob.GetJob(rank) + if(!job) + return JOB_UNAVAILABLE_GENERIC + if((job.current_positions >= job.total_positions) && job.total_positions != -1) + if(job.title == "Assistant") + if(isnum(client.player_age) && client.player_age <= 14) //Newbies can always be assistants + return JOB_AVAILABLE + for(var/datum/job/J in SSjob.occupations) + if(J && J.current_positions < J.total_positions && J.title != job.title) + return JOB_UNAVAILABLE_SLOTFULL + else + return JOB_UNAVAILABLE_SLOTFULL + if(jobban_isbanned(src,rank)) + return JOB_UNAVAILABLE_BANNED + if(QDELETED(src)) + return JOB_UNAVAILABLE_GENERIC + if(!job.player_old_enough(client)) + return JOB_UNAVAILABLE_ACCOUNTAGE + if(job.required_playtime_remaining(client)) + return JOB_UNAVAILABLE_PLAYTIME + if(latejoin && !job.special_check_latejoin(client)) + return JOB_UNAVAILABLE_GENERIC + if(!client.prefs.pref_species.qualifies_for_rank(rank, client.prefs.features)) + return JOB_UNAVAILABLE_SPECIESLOCK + return JOB_AVAILABLE + +/mob/dead/new_player/proc/AttemptLateSpawn(rank) + var/error = IsJobUnavailable(rank) + if(error != JOB_AVAILABLE) + alert(src, get_job_unavailable_error_message(error, rank)) + return FALSE + + if(SSticker.late_join_disabled) + alert(src, "An administrator has disabled late join spawning.") + return FALSE + + var/arrivals_docked = TRUE + if(SSshuttle.arrivals) + close_spawn_windows() //In case we get held up + if(SSshuttle.arrivals.damaged && CONFIG_GET(flag/arrivals_shuttle_require_safe_latejoin)) + src << alert("The arrivals shuttle is currently malfunctioning! You cannot join.") + return FALSE + + if(CONFIG_GET(flag/arrivals_shuttle_require_undocked)) + SSshuttle.arrivals.RequireUndocked(src) + arrivals_docked = SSshuttle.arrivals.mode != SHUTTLE_CALL + + //Remove the player from the join queue if he was in one and reset the timer + SSticker.queued_players -= src + SSticker.queue_delay = 4 + + SSjob.AssignRole(src, rank, 1) + + var/mob/living/character = create_character(TRUE) //creates the human and transfers vars and mind + var/equip = SSjob.EquipRank(character, rank, TRUE) + if(isliving(equip)) //Borgs get borged in the equip, so we need to make sure we handle the new mob. + character = equip + + var/datum/job/job = SSjob.GetJob(rank) + + if(job && !job.override_latejoin_spawn(character)) + SSjob.SendToLateJoin(character) + if(!arrivals_docked) + var/obj/screen/splash/Spl = new(character.client, TRUE) + Spl.Fade(TRUE) + character.playsound_local(get_turf(character), 'sound/voice/ApproachingTG.ogg', 25) + + character.update_parallax_teleport() + + SSticker.minds += character.mind + + var/mob/living/carbon/human/humanc + if(ishuman(character)) + humanc = character //Let's retypecast the var to be human, + + if(humanc) //These procs all expect humans + GLOB.data_core.manifest_inject(humanc) + if(SSshuttle.arrivals) + SSshuttle.arrivals.QueueAnnounce(humanc, rank) + else + AnnounceArrival(humanc, rank) + AddEmploymentContract(humanc) + if(GLOB.highlander) + to_chat(humanc, "THERE CAN BE ONLY ONE!!!") + humanc.make_scottish() + + if(GLOB.summon_guns_triggered) + give_guns(humanc) + if(GLOB.summon_magic_triggered) + give_magic(humanc) + + GLOB.joined_player_list += character.ckey + GLOB.latejoiners += character + + if(CONFIG_GET(flag/allow_latejoin_antagonists) && humanc) //Borgs aren't allowed to be antags. Will need to be tweaked if we get true latejoin ais. + if(SSshuttle.emergency) + switch(SSshuttle.emergency.mode) + if(SHUTTLE_RECALL, SHUTTLE_IDLE) + SSticker.mode.make_antag_chance(humanc) + if(SHUTTLE_CALL) + if(SSshuttle.emergency.timeLeft(1) > initial(SSshuttle.emergencyCallTime)*0.5) + SSticker.mode.make_antag_chance(humanc) + + if(humanc && CONFIG_GET(flag/roundstart_traits)) + SSquirks.AssignQuirks(humanc, humanc.client, TRUE, FALSE, job, FALSE) + + log_manifest(character.mind.key,character.mind,character,latejoin = TRUE) + +/mob/dead/new_player/proc/AddEmploymentContract(mob/living/carbon/human/employee) + //TODO: figure out a way to exclude wizards/nukeops/demons from this. + for(var/C in GLOB.employmentCabinets) + var/obj/structure/filingcabinet/employment/employmentCabinet = C + if(!employmentCabinet.virgin) + employmentCabinet.addFile(employee) + + +/mob/dead/new_player/proc/LateChoices() + + var/level = "green" + switch(GLOB.security_level) + if(SEC_LEVEL_GREEN) + level = "green" + if(SEC_LEVEL_BLUE) + level = "blue" + if(SEC_LEVEL_AMBER) + level = "amber" + if(SEC_LEVEL_RED) + level = "red" + if(SEC_LEVEL_DELTA) + level = "delta" + + var/dat = "
Round Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]
Alert Level: [capitalize(level)]
" + if(SSshuttle.emergency) + switch(SSshuttle.emergency.mode) + if(SHUTTLE_ESCAPE) + dat += "
The station has been evacuated.

" + if(SHUTTLE_CALL) + if(!SSshuttle.canRecall()) + dat += "
The station is currently undergoing evacuation procedures.

" + for(var/datum/job/prioritized_job in SSjob.prioritized_jobs) + if(prioritized_job.current_positions >= prioritized_job.total_positions) + SSjob.prioritized_jobs -= prioritized_job + dat += "
" + var/column_counter = 0 + var/free_space = 0 + for(var/list/category in list(GLOB.command_positions) + list(GLOB.supply_positions) + list(GLOB.engineering_positions) + list(GLOB.nonhuman_positions - "pAI") + list(GLOB.civilian_positions) + list(GLOB.medical_positions) + list(GLOB.science_positions) + list(GLOB.security_positions)) + var/cat_color = "fff" //random default + if(SSjob.name_occupations && SSjob.name_occupations[category[1]]) + cat_color = SSjob.name_occupations[category[1]].selection_color //use the color of the first job in the category (the department head) as the category color + else + cat_color = SSjob.occupations[category[1]].selection_color + dat += "
" + dat += "[SSjob.name_occupations[category[1]].exp_type_department]" + + var/list/dept_dat = list() + for(var/job in category) + var/datum/job/job_datum = SSjob.name_occupations[job] + if(job_datum && IsJobUnavailable(job_datum.title, TRUE) == JOB_AVAILABLE) + var/command_bold = "" + if(job in GLOB.command_positions) + command_bold = " command" + if(job_datum in SSjob.prioritized_jobs) + dept_dat += "[job_datum.title] ([job_datum.current_positions])" + else + dept_dat += "[job_datum.title] ([job_datum.current_positions])" + if(!dept_dat.len) + dept_dat += "No positions open." + dat += jointext(dept_dat, "") + dat += "

" + column_counter++ + if(free_space <=4) + free_space++ + if(column_counter > 0 && (column_counter % 3 == 0)) + dat += "
" + if(free_space >= 5 && (free_space % 5 == 0) && (column_counter % 3 != 0)) + free_space = 0 + column_counter = 0 + dat += "" + + dat += "
" + + var/available_ghosts = 0 + for(var/spawner in GLOB.mob_spawners) + if(!LAZYLEN(spawner)) + continue + var/obj/effect/mob_spawn/S = pick(GLOB.mob_spawners[spawner]) + if(!istype(S) || !S.can_latejoin()) + continue + available_ghosts++ + break + + if(!available_ghosts) + dat += "
There are currently no open ghost spawners.
" + else + var/list/categorizedJobs = list("Ghost Role" = list(jobs = list(), titles = GLOB.mob_spawners, color = "#ffffff")) + for(var/spawner in GLOB.mob_spawners) + if(!LAZYLEN(spawner)) + continue + var/obj/effect/mob_spawn/S = pick(GLOB.mob_spawners[spawner]) + if(!istype(S) || !S.can_latejoin()) + continue + categorizedJobs["Ghost Role"]["jobs"] += spawner + + dat += "
" + for(var/jobcat in categorizedJobs) + if(!length(categorizedJobs[jobcat]["jobs"])) + continue + var/color = categorizedJobs[jobcat]["color"] + dat += "
" + dat += "[jobcat]" + for(var/spawner in categorizedJobs[jobcat]["jobs"]) + dat += "[spawner]" + + dat += "

" + dat += "
" + dat += "" + + var/datum/browser/popup = new(src, "latechoices", "Choose Profession", 720, 600) + popup.add_stylesheet("playeroptions", 'html/browser/playeroptions.css') + popup.set_content(jointext(dat, "")) + popup.open(FALSE) // FALSE is passed to open so that it doesn't use the onclose() proc + +/mob/dead/new_player/proc/create_character(transfer_after) + spawning = 1 + close_spawn_windows() + + var/mob/living/carbon/human/H = new(loc) + + var/frn = CONFIG_GET(flag/force_random_names) + if(!frn) + frn = jobban_isbanned(src, "appearance") + if(QDELETED(src)) + return + if(frn) + client.prefs.random_character() + client.prefs.real_name = client.prefs.pref_species.random_name(gender,1) + 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 + + H.name = real_name + + . = H + new_character = . + if(transfer_after) + transfer_character() + +/mob/dead/new_player/proc/transfer_character() + . = new_character + if(.) + new_character.key = key //Manually transfer the key to log them in + new_character.stop_sound_channel(CHANNEL_LOBBYMUSIC) + new_character = null + qdel(src) + +/mob/dead/new_player/proc/ViewManifest() + var/dat = "" + dat += "

Crew Manifest

" + dat += GLOB.data_core.get_manifest(OOC = 1) + + src << browse(dat, "window=manifest;size=387x420;can_close=1") + +/mob/dead/new_player/Move() + return 0 + + +/mob/dead/new_player/proc/close_spawn_windows() + + src << browse(null, "window=latechoices") //closes late choices window + src << browse(null, "window=playersetup") //closes the player setup window + src << browse(null, "window=preferences") //closes job selection + src << browse(null, "window=mob_occupation") + src << browse(null, "window=latechoices") //closes late job selection + +/* Used to make sure that a player has a valid job preference setup, used to knock players out of eligibility for anything if their prefs don't make sense. + A "valid job preference setup" in this situation means at least having one job set to low, or not having "return to lobby" enabled + Prevents "antag rolling" by setting antag prefs on, all jobs to never, and "return to lobby if preferences not availible" + Doing so would previously allow you to roll for antag, then send you back to lobby if you didn't get an antag role + This also does some admin notification and logging as well, as well as some extra logic to make sure things don't go wrong +*/ + +/mob/dead/new_player/proc/check_preferences() + if(!client) + return FALSE //Not sure how this would get run without the mob having a client, but let's just be safe. + if(client.prefs.joblessrole != RETURNTOLOBBY) + return TRUE + // If they have antags enabled, they're potentially doing this on purpose instead of by accident. Notify admins if so. + var/has_antags = FALSE + if(client.prefs.be_special.len > 0) + has_antags = TRUE + if(client.prefs.job_preferences.len == 0) + if(!ineligible_for_roles) + to_chat(src, "You have no jobs enabled, along with return to lobby if job is unavailable. This makes you ineligible for any round start role, please update your job preferences.") + ineligible_for_roles = TRUE + ready = PLAYER_NOT_READY + if(has_antags) + log_admin("[src.ckey] just got booted back to lobby with no jobs, but antags enabled.") + message_admins("[src.ckey] just got booted back to lobby with no jobs enabled, but antag rolling enabled. Likely antag rolling abuse.") + + return FALSE //This is the only case someone should actually be completely blocked from antag rolling as well + return TRUE diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm index 994d082585..d54b8256a9 100644 --- a/code/modules/mob/dead/new_player/preferences_setup.dm +++ b/code/modules/mob/dead/new_player/preferences_setup.dm @@ -17,6 +17,8 @@ hair_color = random_short_color() facial_hair_color = hair_color eye_color = random_eye_color() + horn_color = "85615a" + wing_color = "fff" if(!pref_species) var/rando_race = pick(GLOB.roundstart_races) pref_species = new rando_race() diff --git a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm index 2f1d48cfa7..156cc304a6 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm @@ -54,6 +54,10 @@ name = "Redpanda" icon_state = "redpanda" +/datum/sprite_accessory/mam_body_markings/bat + name = "Bat" + icon_state = "bat" + /datum/sprite_accessory/mam_body_markings/bee name = "Bee" icon_state = "bee" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm index 1496ca030a..ca1253feb1 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm @@ -176,6 +176,10 @@ name = "Axolotl" icon_state = "axolotl" +/datum/sprite_accessory/mam_ears/bat + name = "Bat" + icon_state = "bat" + /datum/sprite_accessory/mam_ears/bear name = "Bear" icon_state = "bear" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm index 7252f85324..be2ab152a8 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm @@ -194,6 +194,10 @@ name = "Mammal, Short ALT" icon_state = "scanidalt" +/datum/sprite_accessory/mam_snouts/scanidalt2 + name = "Mammal, Short ALT 2" + icon_state = "scanidalt2" + /datum/sprite_accessory/mam_snouts/wolf name = "Mammal, Thick" icon_state = "wolf" @@ -306,6 +310,10 @@ name = "Mammal, Short ALT (Top)" icon_state = "fscanidalt" +/datum/sprite_accessory/mam_snouts/fscanidalt2 + name = "Mammal, Short ALT 2 (Top)" + icon_state = "fscanidalt2" + /datum/sprite_accessory/mam_snouts/fwolf name = "Mammal, Thick (Top)" icon_state = "fwolf" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm index 6042d97247..33b174afa4 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm @@ -114,6 +114,26 @@ icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED +/datum/sprite_accessory/mam_tails/batl + name = "Bat (Long)" + icon = 'modular_citadel/icons/mob/mam_tails.dmi' + icon_state = "batl" + +/datum/sprite_accessory/mam_tails_animated/batl + name = "Bat (Long)" + icon = 'modular_citadel/icons/mob/mam_tails.dmi' + icon_state = "batl" + +/datum/sprite_accessory/mam_tails/bats + name = "Bat (Short)" + icon = 'modular_citadel/icons/mob/mam_tails.dmi' + icon_state = "bats" + +/datum/sprite_accessory/mam_tails_animated/bats + name = "Bat (Short)" + icon = 'modular_citadel/icons/mob/mam_tails.dmi' + icon_state = "bats" + /datum/sprite_accessory/tails/human/bee name = "Bee" icon_state = "bee" @@ -469,6 +489,22 @@ name = "Axolotl" icon_state = "axolotl" +/datum/sprite_accessory/mam_tails/batl + name = "Bat (Long)" + icon_state = "batl" + +/datum/sprite_accessory/mam_tails_animated/batl + name = "Bat (Long)" + icon_state = "batl" + +/datum/sprite_accessory/mam_tails/bats + name = "Bat (Short)" + icon_state = "bats" + +/datum/sprite_accessory/mam_tails_animated/bats + name = "Bat (Short)" + icon_state = "bats" + /datum/sprite_accessory/mam_tails/bee name = "Bee" icon_state = "bee" @@ -558,7 +594,7 @@ /datum/sprite_accessory/mam_tails_animated/horse name = "Horse" - icon_state = "Horse" + icon_state = "horse" color_src = HAIR /datum/sprite_accessory/mam_tails/husky diff --git a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm index dc0e0222bf..46a123c6bb 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm @@ -27,39 +27,141 @@ dimension_y = 34 locked = TRUE +// Decorative wings + +/datum/sprite_accessory/deco_wings + icon = 'icons/mob/wings.dmi' + color_src = WINGCOLOR + +/datum/sprite_accessory/deco_wings/none + name = "None" + icon_state = "none" + +/datum/sprite_accessory/deco_wings/angel + name = "Angel" + icon_state = "angel" + color_src = 0 + dimension_x = 46 + center = TRUE + dimension_y = 34 + +/datum/sprite_accessory/deco_wings/bat + name = "Bat" + icon_state = "bat" + +/datum/sprite_accessory/deco_wings/bee + name = "Bee" + icon_state = "bee" + +/datum/sprite_accessory/deco_wings/fairy + name = "Fairy" + icon_state = "fairy" + +/datum/sprite_accessory/deco_wings/feathery + name = "Feathery" + icon_state = "feathery" + +/datum/sprite_accessory/deco_wings/atlas + name = "Atlas" + icon_state = "atlas" + +/datum/sprite_accessory/deco_wings/deathhead + name = "Deathshead" + icon_state = "deathhead" + +/datum/sprite_accessory/deco_wings/firewatch + name = "Firewatch" + icon_state = "firewatch" + +/datum/sprite_accessory/deco_wings/gothic + name = "Gothic" + icon_state = "gothic" + +/datum/sprite_accessory/deco_wings/lovers + name = "Lovers" + icon_state = "lovers" + +/datum/sprite_accessory/deco_wings/luna + name = "Luna" + icon_state = "luna" + +/datum/sprite_accessory/deco_wings/monarch + name = "Monarch" + icon_state = "monarch" + +/datum/sprite_accessory/deco_wings/moonfly + name = "Moon Fly" + icon_state = "moonfly" + +/datum/sprite_accessory/deco_wings/plain + name = "Plain" + icon_state = "plain" + +/datum/sprite_accessory/deco_wings/poison + name = "Poison" + icon_state = "poison" + +/datum/sprite_accessory/deco_wings/punished + name = "Burnt Off" + icon_state = "punished" + +/datum/sprite_accessory/deco_wings/ragged + name = "Ragged" + icon_state = "ragged" + +/datum/sprite_accessory/deco_wings/reddish + name = "Reddish" + icon_state = "redish" + +/datum/sprite_accessory/deco_wings/royal + name = "Royal" + icon_state = "royal" + +/datum/sprite_accessory/deco_wings/snow + name = "Snow" + icon_state = "snow" + +/datum/sprite_accessory/deco_wings/whitefly + name = "White Fly" + icon_state = "whitefly" + //INSECT WINGS /datum/sprite_accessory/insect_wings icon = 'icons/mob/wings.dmi' - color_src = null + color_src = WINGCOLOR /datum/sprite_accessory/insect_wings/none name = "None" icon_state = "none" -/datum/sprite_accessory/insect_wings/plain - name = "Plain" - icon_state = "plain" +/datum/sprite_accessory/insect_wings/bat + name = "Bat" + icon_state = "bat" -/datum/sprite_accessory/insect_wings/monarch - name = "Monarch" - icon_state = "monarch" +/datum/sprite_accessory/insect_wings/bee + name = "Bee" + icon_state = "bee" -/datum/sprite_accessory/insect_wings/luna - name = "Luna" - icon_state = "luna" +/datum/sprite_accessory/insect_wings/fairy + name = "Fairy" + icon_state = "fairy" + +/datum/sprite_accessory/insect_wings/feathery + name = "Feathery" + icon_state = "feathery" /datum/sprite_accessory/insect_wings/atlas name = "Atlas" icon_state = "atlas" -/datum/sprite_accessory/insect_wings/reddish - name = "Reddish" - icon_state = "redish" +/datum/sprite_accessory/insect_wings/deathhead + name = "Deathshead" + icon_state = "deathhead" -/datum/sprite_accessory/insect_wings/royal - name = "Royal" - icon_state = "royal" +/datum/sprite_accessory/insect_wings/firewatch + name = "Firewatch" + icon_state = "firewatch" /datum/sprite_accessory/insect_wings/gothic name = "Gothic" @@ -69,76 +171,46 @@ name = "Lovers" icon_state = "lovers" -/datum/sprite_accessory/insect_wings/whitefly - name = "White Fly" - icon_state = "whitefly" +/datum/sprite_accessory/insect_wings/luna + name = "Luna" + icon_state = "luna" -/datum/sprite_accessory/insect_wings/punished - name = "Burnt Off" - icon_state = "punished" - locked = TRUE - -/datum/sprite_accessory/insect_wings/firewatch - name = "Firewatch" - icon_state = "firewatch" - -/datum/sprite_accessory/insect_wings/deathhead - name = "Deathshead" - icon_state = "deathhead" - -/datum/sprite_accessory/insect_wings/poison - name = "Poison" - icon_state = "poison" - -/datum/sprite_accessory/insect_wings/ragged - name = "Ragged" - icon_state = "ragged" +/datum/sprite_accessory/insect_wings/monarch + name = "Monarch" + icon_state = "monarch" /datum/sprite_accessory/insect_wings/moonfly name = "Moon Fly" icon_state = "moonfly" +/datum/sprite_accessory/insect_wings/plain + name = "Plain" + icon_state = "plain" + +/datum/sprite_accessory/insect_wings/poison + name = "Poison" + icon_state = "poison" + +/datum/sprite_accessory/insect_wings/punished + name = "Burnt Off" + icon_state = "punished" + +/datum/sprite_accessory/insect_wings/ragged + name = "Ragged" + icon_state = "ragged" + +/datum/sprite_accessory/insect_wings/reddish + name = "Reddish" + icon_state = "redish" + +/datum/sprite_accessory/insect_wings/royal + name = "Royal" + icon_state = "royal" + /datum/sprite_accessory/insect_wings/snow name = "Snow" icon_state = "snow" -/datum/sprite_accessory/insect_wings/colored - name = "Colored (Hair)" - icon_state = "snowplain" - color_src = HAIR - -/datum/sprite_accessory/insect_fluff/colored1 - name = "Colored (Primary)" - icon_state = "snowplain" - color_src = MUTCOLORS - -/datum/sprite_accessory/insect_fluff/colored2 - name = "Colored (Secondary)" - icon_state = "snowplain" - color_src = MUTCOLORS2 - -/datum/sprite_accessory/insect_fluff/colored3 - name = "Colored (Tertiary)" - icon_state = "snowplain" - color_src = MUTCOLORS3 - -/datum/sprite_accessory/insect_wings/bee - name = "Bee" - icon_state = "bee" - -/datum/sprite_accessory/insect_wings/bee_color - name = "Bee (Hair colored)" - icon_state = "bee" - color_src = HAIR - -/datum/sprite_accessory/insect_wings/fairy - name = "Fairy" - icon_state = "fairy" - -/datum/sprite_accessory/insect_wings/bat - name = "Bat" - icon_state = "bat" - -/datum/sprite_accessory/insect_wings/feathery - name = "Feathery" - icon_state = "feathery" +/datum/sprite_accessory/insect_wings/whitefly + name = "White Fly" + icon_state = "whitefly" \ No newline at end of file diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index fefa032e4f..d599d55886 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -260,16 +260,16 @@ Transfer_mind is there to check if mob is being deleted/not going to have a body Works together with spawning an observer, noted above. */ -/mob/proc/ghostize(can_reenter_corpse = 1) - if(key) - if(!cmptext(copytext(key,1,2),"@")) // Skip aghosts. - stop_sound_channel(CHANNEL_HEARTBEAT) //Stop heartbeat sounds because You Are A Ghost Now - var/mob/dead/observer/ghost = new(src) // Transfer safety to observer spawning proc. - SStgui.on_transfer(src, ghost) // Transfer NanoUIs. - ghost.can_reenter_corpse = can_reenter_corpse - ghost.can_reenter_round = (can_reenter_corpse && !suiciding) - ghost.key = key - return ghost +/mob/proc/ghostize(can_reenter_corpse = TRUE, special = FALSE) + if(!key || cmptext(copytext(key,1,2),"@") || (!special && SEND_SIGNAL(src, COMSIG_MOB_GHOSTIZE, can_reenter_corpse, special) & COMPONENT_BLOCK_GHOSTING)) + return //mob has no key, is an aghost or some component hijacked. + stop_sound_channel(CHANNEL_HEARTBEAT) //Stop heartbeat sounds because You Are A Ghost Now + var/mob/dead/observer/ghost = new(src) // Transfer safety to observer spawning proc. + SStgui.on_transfer(src, ghost) // Transfer NanoUIs. + ghost.can_reenter_corpse = can_reenter_corpse + ghost.can_reenter_round = (can_reenter_corpse && !suiciding) + transfer_ckey(ghost, FALSE) + return ghost /* This is the proc mobs get to turn into a ghost. Forked from ghostize due to compatibility issues. @@ -280,6 +280,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set name = "Ghost" set desc = "Relinquish your life and enter the land of the dead." + if(SEND_SIGNAL(src, COMSIG_MOB_GHOSTIZE, (stat == DEAD) ? TRUE : FALSE, FALSE) & COMPONENT_BLOCK_GHOSTING) + return + // CITADEL EDIT if(istype(loc, /obj/machinery/cryopod)) var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you won't be able to re-enter this round! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body") @@ -306,6 +309,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set name = "Ghost" set desc = "Relinquish your life and enter the land of the dead." + if(SEND_SIGNAL(src, COMSIG_MOB_GHOSTIZE, FALSE, FALSE) & COMPONENT_BLOCK_GHOSTING) + return + var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you won't be able to re-enter this round! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body") if(response != "Ghost") return @@ -348,7 +354,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return client.change_view(CONFIG_GET(string/default_view)) SStgui.on_transfer(src, mind.current) // Transfer NanoUIs. - mind.current.key = key + transfer_ckey(mind.current, FALSE) return 1 /mob/dead/observer/proc/notify_cloning(var/message, var/sound, var/atom/source, flashwindow = TRUE) @@ -628,7 +634,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp to_chat(src, "Someone has taken this body while you were choosing!") return 0 - target.key = key + transfer_ckey(target, FALSE) target.faction = list("neutral") return 1 diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index 625a923fe1..41d3d4e158 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -40,7 +40,7 @@ if(iscyborg(user) && user.has_buckled_mobs()) var/mob/living/silicon/robot/R = user - GET_COMPONENT_FROM(riding_datum, /datum/component/riding, R) + var/datum/component/riding/riding_datum = R.GetComponent(/datum/component/riding) if(riding_datum) for(var/mob/M in R.buckled_mobs) riding_datum.force_dismount(M) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 9569d4826c..e77a91332e 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -158,7 +158,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 = 0) +/mob/proc/can_equip(obj/item/I, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE) return FALSE /mob/proc/can_put_in_hand(I, hand_index) @@ -468,3 +468,6 @@ bodyparts += BP hand_bodyparts[i] = BP ..() //Don't redraw hands until we have organs for them + +/mob/canReachInto(atom/user, atom/target, list/next, view_only, obj/item/tool) + return ..() && (user == src) diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index ca1a961a92..757aadaea1 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -2,6 +2,9 @@ BLOOD SYSTEM ****************************************************/ +#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) return @@ -30,6 +33,9 @@ bleed_rate = 0 return + if(bleed_rate <= 0) + bleed_rate = 0 + if(bodytemperature >= TCRYO && !(HAS_TRAIT(src, TRAIT_NOCLONE))) //cryosleep or husked people do not pump the blood. //Blood regeneration if there is some space @@ -80,6 +86,9 @@ var/obj/item/bodypart/BP = X var/brutedamage = BP.brute_dam + 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 @@ -87,7 +96,7 @@ 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 + bleed_rate = max(bleed_rate - 0.50, temp_bleed)//if no wounds, other bleed effects (heparin) naturally decreases if(bleed_rate && !bleedsuppress && !(HAS_TRAIT(src, TRAIT_FAKEDEATH))) bleed(bleed_rate) @@ -105,9 +114,11 @@ /mob/living/carbon/human/bleed(amt) amt *= physiology.bleed_mod if(!(NOBLOOD in dna.species.species_traits)) - ..() - - + .=..() + if(dna.species.exotic_blood && .) // Do we have exotic blood, and have we left any on the ground? + var/datum/reagent/R = GLOB.chemical_reagents_list[get_blood_id()] + if(istype(R) && isturf(loc)) + R.reaction_turf(get_turf(src), amt * EXOTIC_BLEED_MULTIPLIER) /mob/living/proc/restore_blood() blood_volume = initial(blood_volume) @@ -123,16 +134,16 @@ //Gets blood from mob to a container or other mob, preserving all data in it. /mob/living/proc/transfer_blood_to(atom/movable/AM, amount, forced) if(!blood_volume || !AM.reagents) - return 0 + return FALSE if(blood_volume < (BLOOD_VOLUME_BAD * blood_ratio) && !forced) - return 0 + return FALSE if(blood_volume < amount) amount = blood_volume var/blood_id = get_blood_id() if(!blood_id) - return 0 + return FALSE blood_volume -= amount @@ -141,29 +152,27 @@ if(iscarbon(AM)) var/mob/living/carbon/C = AM if(blood_id == C.get_blood_id())//both mobs have the same blood substance - if(blood_id == "blood") //normal blood + if(blood_id == "blood" || blood_id == "jellyblood") //normal blood if(blood_data["viruses"]) for(var/thing in blood_data["viruses"]) var/datum/disease/D = thing if((D.spread_flags & DISEASE_SPREAD_SPECIAL) || (D.spread_flags & DISEASE_SPREAD_NON_CONTAGIOUS)) continue C.ForceContractDisease(D) - if(!(blood_data["blood_type"] in get_safe_blood(C.dna.blood_type))) - C.reagents.add_reagent("toxin", amount * 0.5) - return 1 + //This used to inject oof ouch results, but since we add the reagent, and the reagent causes oof ouch on mob life... why double dip? C.blood_volume = min(C.blood_volume + round(amount, 0.1), BLOOD_VOLUME_MAXIMUM) - return 1 + return TRUE AM.reagents.add_reagent(blood_id, amount, blood_data, bodytemperature) - return 1 + return TRUE /mob/living/proc/get_blood_data(blood_id) return /mob/living/carbon/get_blood_data(blood_id) - if(blood_id == "blood") //actual blood reagent + if(blood_id == "blood" || blood_id == "jellyblood") //actual blood reagent var/blood_data = list() //set the blood data blood_data["donor"] = src @@ -174,6 +183,7 @@ blood_data["viruses"] += D.Copy() blood_data["blood_DNA"] = copytext(dna.unique_enzymes,1,0) + blood_data["bloodcolor"] = bloodtype_to_color(dna.blood_type) if(disease_resistances && disease_resistances.len) blood_data["resistances"] = disease_resistances.Copy() var/list/temp_chem = list() @@ -206,21 +216,6 @@ if(istype(ling)) blood_data["changeling_loudness"] = ling.loudfactor return blood_data - if(blood_id == "slimejelly") //Just so MKUltra works. Takes the minimum required data. Sishen is testing if this breaks stuff. - var/blood_data = list() - if(mind) - blood_data["mind"] = mind - else if(last_mind) - blood_data["mind"] = last_mind - if(ckey) - blood_data["ckey"] = ckey - else if(last_mind) - blood_data["ckey"] = ckey(last_mind.key) - blood_data["gender"] = gender - blood_data["real_name"] = real_name - return blood_data - - //get the id of the substance this mob use as blood. /mob/proc/get_blood_id() @@ -234,12 +229,15 @@ if(!(HAS_TRAIT(src, TRAIT_NOCLONE))) return "blood" -/mob/living/carbon/human/get_blood_id() - if(dna.species.exotic_blood) +/mob/living/carbon/get_blood_id() + if(isjellyperson(src)) + return "jellyblood" + if(dna?.species?.exotic_blood) return dna.species.exotic_blood else if((NOBLOOD in dna.species.species_traits) || (HAS_TRAIT(src, TRAIT_NOCLONE))) return - return "blood" + else + return "blood" // This is has more potential uses, and is probably faster than the old proc. /proc/get_safe_blood(bloodtype) @@ -248,16 +246,21 @@ return var/static/list/bloodtypes_safe = list( - "A-" = list("A-", "O-"), - "A+" = list("A-", "A+", "O-", "O+"), - "B-" = list("B-", "O-"), - "B+" = list("B-", "B+", "O-", "O+"), - "AB-" = list("A-", "B-", "O-", "AB-"), - "AB+" = list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+"), - "O-" = list("O-"), - "O+" = list("O-", "O+"), - "L" = list("L"), - "U" = list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+", "L", "U") + "A-" = list("A-", "O-", "SY"), + "A+" = list("A-", "A+", "O-", "O+", "SY"), + "B-" = list("B-", "O-", "SY"), + "B+" = list("B-", "B+", "O-", "O+", "SY"), + "AB-" = list("A-", "B-", "O-", "AB-", "SY"), + "AB+" = list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+", "SY"), + "O-" = list("O-","SY"), + "O+" = list("O-", "O+","SY"), + "L" = list("L","SY"), + "U" = list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+", "L", "U","SY"), + "HF" = list("HF", "SY"), + "X*" = list("X*", "SY"), + "SY" = list("SY"), + "GEL" = list("GEL","SY"), + "BUG" = list("BUG", "SY") ) var/safe = bloodtypes_safe[bloodtype] @@ -266,7 +269,7 @@ //to add a splatter of blood or other mob liquid. /mob/living/proc/add_splatter_floor(turf/T, small_drip) - if(get_blood_id() != "blood") + if(get_blood_id() == null) return if(!T) T = get_turf(src) @@ -280,24 +283,27 @@ drop.drips++ drop.add_overlay(pick(drop.random_icon_states)) drop.transfer_mob_blood_dna(src) + drop.update_icon() return else - temp_blood_DNA = drop.return_blood_DNA() //we transfer the dna from the drip to the splatter + temp_blood_DNA = list() + temp_blood_DNA |= drop.blood_DNA.Copy() //we transfer the dna from the drip to the splatter qdel(drop)//the drip is replaced by a bigger splatter else drop = new(T, get_static_viruses()) drop.transfer_mob_blood_dna(src) + drop.update_icon() return // Find a blood decal or create a new one. - var/obj/effect/decal/cleanable/blood/B = locate() in T + var/obj/effect/decal/cleanable/blood/splats/B = locate() in T if(!B) - B = new /obj/effect/decal/cleanable/blood/splatter(T, get_static_viruses()) - if (B.bloodiness < MAX_SHOE_BLOODINESS) //add more blood, up to a limit + B = new /obj/effect/decal/cleanable/blood/splats(T, get_static_viruses()) + if(B.bloodiness < MAX_SHOE_BLOODINESS) //add more blood, up to a limit B.bloodiness += BLOOD_AMOUNT_PER_DECAL B.transfer_mob_blood_dna(src) //give blood info to the blood decal. if(temp_blood_DNA) - B.add_blood_DNA(temp_blood_DNA) + B.blood_DNA |= temp_blood_DNA /mob/living/carbon/human/add_splatter_floor(turf/T, small_drip) if(!(NOBLOOD in dna.species.species_traits)) @@ -306,10 +312,10 @@ /mob/living/carbon/alien/add_splatter_floor(turf/T, small_drip) if(!T) T = get_turf(src) - var/obj/effect/decal/cleanable/xenoblood/B = locate() in T.contents + var/obj/effect/decal/cleanable/blood/splatter/B = locate() in T.contents if(!B) B = new(T) - B.add_blood_DNA(list("UNKNOWN DNA" = "X*")) + B.blood_DNA["UNKNOWN DNA"] = "X*" /mob/living/silicon/robot/add_splatter_floor(turf/T, small_drip) if(!T) @@ -318,6 +324,44 @@ if(!B) B = new(T) +/mob/living/proc/add_splash_floor(turf/T) + if(get_blood_id() == null) + return + if(!T) + T = get_turf(src) + + var/list/temp_blood_DNA + + // Find a blood decal or create a new one. + var/obj/effect/decal/cleanable/blood/B = locate() in T + if(!B) + B = new /obj/effect/decal/cleanable/blood/splatter(T, get_static_viruses()) + if(B.bloodiness < MAX_SHOE_BLOODINESS) //add more blood, up to a limit + B.bloodiness += BLOOD_AMOUNT_PER_DECAL + B.transfer_mob_blood_dna(src) //give blood info to the blood decal. + src.transfer_blood_to(B, 10) //very heavy bleeding, should logically leave larger pools + if(temp_blood_DNA) + B.blood_DNA |= temp_blood_DNA + +/mob/living/carbon/human/add_splash_floor(turf/T) + if(!(NOBLOOD in dna.species.species_traits)) + ..() + +/mob/living/carbon/alien/add_splash_floor(turf/T) + if(!T) + T = get_turf(src) + var/obj/effect/decal/cleanable/blood/splatter/B = locate() in T.contents + if(!B) + B = new(T) + B.blood_DNA["UNKNOWN DNA"] = "X*" + +/mob/living/silicon/robot/add_splash_floor(turf/T) + if(!T) + T = get_turf(src) + var/obj/effect/decal/cleanable/oil/B = locate() in T.contents + if(!B) + B = new(T) + //This is a terrible way of handling it. /mob/living/proc/ResetBloodVol() if(ishuman(src)) diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm index cc11c0e8bb..19500653d9 100644 --- a/code/modules/mob/living/bloodcrawl.dm +++ b/code/modules/mob/living/bloodcrawl.dm @@ -147,9 +147,9 @@ /mob/living/proc/exit_blood_effect(obj/effect/decal/cleanable/B) playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1) //Makes the mob have the color of the blood pool it came out of - var/newcolor = rgb(149, 10, 10) - if(istype(B, /obj/effect/decal/cleanable/xenoblood)) - newcolor = rgb(43, 186, 0) + var/newcolor = BLOOD_COLOR_HUMAN + if(istype(B, /obj/effect/decal/cleanable/blood/xeno)) + newcolor = BLOOD_COLOR_XENO add_atom_colour(newcolor, TEMPORARY_COLOUR_PRIORITY) // but only for a few seconds spawn(30) diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm index bacdc4524b..d84ba0d7a1 100644 --- a/code/modules/mob/living/brain/MMI.dm +++ b/code/modules/mob/living/brain/MMI.dm @@ -57,13 +57,14 @@ newbrain.brainmob = null brainmob.forceMove(src) brainmob.container = src - if(!newbrain.damaged_brain) // the brain organ hasn't been beaten to death. + if(!(newbrain.organ_flags & ORGAN_FAILING)) // the brain organ hasn't been beaten to death. brainmob.stat = CONSCIOUS //we manually revive the brain mob GLOB.dead_mob_list -= brainmob GLOB.alive_mob_list += brainmob brainmob.reset_perspective() brain = newbrain + brain.organ_flags |= ORGAN_FROZEN name = "Man-Machine Interface: [brainmob.real_name]" update_icon() @@ -100,6 +101,7 @@ user.put_in_hands(brain) //puts brain in the user's hand or otherwise drops it on the user's turf else brain.forceMove(get_turf(src)) + brain.organ_flags &= ~ORGAN_FROZEN brain = null //No more brain in here diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm index 97b29ca4e1..1b2944c1f6 100644 --- a/code/modules/mob/living/brain/brain.dm +++ b/code/modules/mob/living/brain/brain.dm @@ -10,7 +10,10 @@ /mob/living/brain/Initialize() . = ..() create_dna(src) - stored_dna.initialize_dna(random_blood_type()) + if(stored_dna.blood_type) + stored_dna.initialize_dna(stored_dna.blood_type) + else + stored_dna.initialize_dna(random_blood_type()) if(isturf(loc)) //not spawned in an MMI or brain organ (most likely adminspawned) var/obj/item/organ/brain/OB = new(loc) //we create a new brain organ for it. OB.brainmob = src @@ -21,6 +24,8 @@ if(!stored_dna.species) var/rando_race = pick(GLOB.roundstart_races) stored_dna.species = new rando_race() + if(stored_dna.species.exotic_bloodtype) + stored_dna.blood_type = stored_dna.species.exotic_bloodtype /mob/living/brain/Destroy() if(key) //If there is a mob connected to this thing. Have to check key twice to avoid false death reporting. diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index dafc6cf5e0..4192c2235b 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -7,11 +7,20 @@ layer = ABOVE_MOB_LAYER zone = BODY_ZONE_HEAD slot = ORGAN_SLOT_BRAIN - vital = TRUE + organ_flags = ORGAN_VITAL attack_verb = list("attacked", "slapped", "whacked") + ///The brain's organ variables are significantly more different than the other organs, with half the decay rate for balance reasons, and twice the maxHealth + decay_factor = STANDARD_ORGAN_DECAY / 4 //30 minutes of decaying to result in a fully damaged brain, since a fast decay rate would be unfun gameplay-wise + healing_factor = STANDARD_ORGAN_HEALING / 2 + + maxHealth = BRAIN_DAMAGE_DEATH + low_threshold = 45 + high_threshold = 120 var/mob/living/brain/brainmob = null - var/damaged_brain = FALSE //whether the brain organ is damaged. + var/brain_death = FALSE //if the brainmob was intentionally killed by attacking the brain after removal, or by severe braindamage var/decoy_override = FALSE //I apologize to the security players, and myself, who abused this, but this is going to go. + //two variables necessary for calculating whether we get a brain trauma or not + var/damage_delta = 0 var/list/datum/brain_trauma/traumas = list() @@ -34,7 +43,7 @@ if(brainmob.mind) brainmob.mind.transfer_to(C) else - C.key = brainmob.key + brainmob.transfer_ckey(C) QDEL_NULL(brainmob) @@ -90,22 +99,89 @@ if(brainmob) O.attack(brainmob, user) //Oh noooeeeee -/obj/item/organ/brain/examine(mob/user) - ..() + if(istype(O, /obj/item/organ_storage)) //BUG_PROBABLE_CAUSE + return //Borg organ bags shouldn't be killing brains - if(brainmob) - if(brainmob.client) - if(brainmob.health <= HEALTH_THRESHOLD_DEAD) - to_chat(user, "It's lifeless and severely damaged.") + if((organ_flags & ORGAN_FAILING) && O.is_drainable() && O.reagents.has_reagent("neurine")) //Neurine fixes dead brains + . = TRUE //don't do attack animation. + var/cached_Bdamage = brainmob?.health + var/datum/reagent/medicine/neurine/N = reagents.has_reagent("neurine") + var/datum/reagent/medicine/mannitol/M1 = reagents.has_reagent("mannitol") + + if(O.reagents.has_reagent("mannitol"))//Just a quick way to bolster the effects if someone mixes up a batch. + N.volume *= (M1.volume*0.5) + + if(!O.reagents.has_reagent("neurine", 10)) + to_chat(user, "There's not enough neurine in [O] to restore [src]!") + return + + user.visible_message("[user] starts to pour the contents of [O] onto [src].", "You start to slowly pour the contents of [O] onto [src].") + if(!do_after(user, 60, TRUE, src)) + to_chat(user, "You failed to pour [O] onto [src]!") + return + + user.visible_message("[user] pours the contents of [O] onto [src], causing it to reform its original shape and turn a slightly brighter shade of pink.", "You pour the contents of [O] onto [src], causing it to reform its original shape and turn a slightly brighter shade of pink.") + setOrganDamage((damage - (0.10 * maxHealth)*(N.volume/10))) //heals a small amount, and by using "setorgandamage", we clear the failing variable if that was up + O.reagents.clear_reagents() + + if(cached_Bdamage <= HEALTH_THRESHOLD_DEAD) //Fixing dead brains yeilds a trauma + if((cached_Bdamage <= HEALTH_THRESHOLD_DEAD) && (brainmob.health > HEALTH_THRESHOLD_DEAD)) + if(prob(80)) + gain_trauma_type(BRAIN_TRAUMA_MILD) + else if(prob(50)) + gain_trauma_type(BRAIN_TRAUMA_SEVERE) + else + gain_trauma_type(BRAIN_TRAUMA_SPECIAL) + return + + if((organ_flags & ORGAN_FAILING) && O.is_drainable() && O.reagents.has_reagent("mannitol")) //attempt to heal the brain + . = TRUE //don't do attack animation. + var/datum/reagent/medicine/mannitol/M = reagents.has_reagent("mannitol") + if(brain_death || brainmob?.health <= HEALTH_THRESHOLD_DEAD) //if the brain is fucked anyway, do nothing + to_chat(user, "[src] is far too damaged, you'll have to use neurine on it!") + return + + if(!O.reagents.has_reagent("mannitol", 10)) + to_chat(user, "There's not enough mannitol in [O] to restore [src]!") + return + + user.visible_message("[user] starts to pour the contents of [O] onto [src].", "You start to slowly pour the contents of [O] onto [src].") + if(!do_after(user, 60, TRUE, src)) + to_chat(user, "You failed to pour [O] onto [src]!") + return + + user.visible_message("[user] pours the contents of [O] onto [src], causing it to reform its original shape and turn a slightly brighter shade of pink.", "You pour the contents of [O] onto [src], causing it to reform its original shape and turn a slightly brighter shade of pink.") + setOrganDamage((damage - (0.05 * maxHealth)*(M.volume/10))) //heals a small amount, and by using "setorgandamage", we clear the failing variable if that was up + O.reagents.clear_reagents() + return + + + +/obj/item/organ/brain/examine(mob/user)//BUG_PROBABLE_CAUSE to_chats changed to . += + . = ..() + + if(user.suiciding) + . += "It's started turning slightly grey. They must not have been able to handle the stress of it all." + else if(brainmob) + if(brainmob.get_ghost(FALSE, TRUE)) + if(brain_death || brainmob.health <= HEALTH_THRESHOLD_DEAD) + . += "It's lifeless and severely damaged, only the strongest of chems will save it." + else if(organ_flags & ORGAN_FAILING) + . += "It seems to still have a bit of energy within it, but it's rather damaged... You may be able to restore it with some mannitol." else - to_chat(user, "You can feel the small spark of life still left in this one.") + . += "You can feel the small spark of life still left in this one." + else if(organ_flags & ORGAN_FAILING) + . += "It seems particularly lifeless and is rather damaged... You may be able to restore it with some mannitol incase it becomes functional again later." else - to_chat(user, "This one seems particularly lifeless. Perhaps it will regain some of its luster later.") + . += "This one seems particularly lifeless. Perhaps it will regain some of its luster later." else if(decoy_override) - to_chat(user, "This one seems particularly lifeless. Perhaps it will regain some of its luster later.") + if(organ_flags & ORGAN_FAILING) + . += "It seems particularly lifeless and is rather damaged... You may be able to restore it with some mannitol incase it becomes functional again later." + else + . += "This one seems particularly lifeless. Perhaps it will regain some of its luster later." else - to_chat(user, "This one is completely devoid of life.") + . += "This one is completely devoid of life." /obj/item/organ/brain/attack(mob/living/carbon/C, mob/user) if(!istype(C)) @@ -141,7 +217,7 @@ Insert(C) else ..() - +/* TO BE REMOVED, KEPT IN CASE OF BUGS /obj/item/organ/brain/proc/get_brain_damage() var/brain_damage_threshold = max_integrity * BRAIN_DAMAGE_INTEGRITY_MULTIPLIER var/offset_integrity = obj_integrity - (max_integrity - brain_damage_threshold) @@ -165,6 +241,56 @@ else if(adjusted_amount <= -DAMAGE_PRECISION) obj_integrity = min(max_integrity, obj_integrity-adjusted_amount) . = adjusted_amount +*/ + +/obj/item/organ/brain/on_life() + if(damage >= BRAIN_DAMAGE_DEATH) //rip + to_chat(owner, "The last spark of life in your brain fizzles out...") + owner.death() + brain_death = TRUE + return + ..() + +/obj/item/organ/brain/on_death() + if(damage <= BRAIN_DAMAGE_DEATH) //rip + brain_death = FALSE + ..() + + +/obj/item/organ/brain/applyOrganDamage(var/d, var/maximum = maxHealth) + ..() + + +/obj/item/organ/brain/check_damage_thresholds(mob/M) + . = ..() + //if we're not more injured than before, return without gambling for a trauma + if(damage <= prev_damage) + return + damage_delta = damage - prev_damage + if(damage > BRAIN_DAMAGE_MILD) + if(prob(damage_delta * (1 + max(0, (damage - BRAIN_DAMAGE_MILD)/100)))) //Base chance is the hit damage; for every point of damage past the threshold the chance is increased by 1% //learn how to do your bloody math properly goddamnit + gain_trauma_type(BRAIN_TRAUMA_MILD) + if(damage > BRAIN_DAMAGE_SEVERE) + if(prob(damage_delta * (1 + max(0, (damage - BRAIN_DAMAGE_SEVERE)/100)))) //Base chance is the hit damage; for every point of damage past the threshold the chance is increased by 1% + if(prob(20)) + gain_trauma_type(BRAIN_TRAUMA_SPECIAL) + else + gain_trauma_type(BRAIN_TRAUMA_SEVERE) + + if (owner) + if(owner.stat < UNCONSCIOUS) //conscious or soft-crit + var/brain_message + if(prev_damage < BRAIN_DAMAGE_MILD && damage >= BRAIN_DAMAGE_MILD) + brain_message = "You feel lightheaded." + else if(prev_damage < BRAIN_DAMAGE_SEVERE && damage >= BRAIN_DAMAGE_SEVERE) + brain_message = "You feel less in control of your thoughts." + else if(prev_damage < (BRAIN_DAMAGE_DEATH - 20) && damage >= (BRAIN_DAMAGE_DEATH - 20)) + brain_message = "You can feel your mind flickering on and off..." + + if(.) + . += "\n[brain_message]" + else + return brain_message /obj/item/organ/brain/Destroy() //copypasted from MMIs. if(brainmob) @@ -200,6 +326,10 @@ return FALSE if(!resilience) resilience = initial(trauma.resilience) + if(!owner) + return FALSE + if(owner.stat == DEAD) + return FALSE var/resilience_tier_count = 0 for(var/X in traumas) diff --git a/code/modules/mob/living/brain/life.dm b/code/modules/mob/living/brain/life.dm index 786bb0b55c..51be1f6971 100644 --- a/code/modules/mob/living/brain/life.dm +++ b/code/modules/mob/living/brain/life.dm @@ -20,7 +20,7 @@ else if(istype(loc, /obj/item/organ/brain)) BR = loc if(BR) - BR.damaged_brain = 1 //beaten to a pulp + BR.brain_death = TRUE /mob/living/brain/proc/handle_emp_damage() if(emp_damage) diff --git a/code/modules/mob/living/brain/posibrain.dm b/code/modules/mob/living/brain/posibrain.dm index 9e0bb0428b..8a70ccc4cb 100644 --- a/code/modules/mob/living/brain/posibrain.dm +++ b/code/modules/mob/living/brain/posibrain.dm @@ -92,6 +92,17 @@ GLOBAL_VAR(posibrain_notify_cooldown) if(posi_ask == "No" || QDELETED(src)) return transfer_personality(user) + latejoin_remove() + +/obj/item/mmi/posibrain/Destroy() + latejoin_remove() + return ..() + +/obj/item/mmi/posibrain/proc/latejoin_remove() + GLOB.poi_list -= src + LAZYREMOVE(GLOB.mob_spawners[name], src) + if(!LAZYLEN(GLOB.mob_spawners[name])) + GLOB.mob_spawners -= name /obj/item/mmi/posibrain/transfer_identity(mob/living/carbon/C) name = "[initial(name)] ([C])" @@ -163,6 +174,8 @@ GLOBAL_VAR(posibrain_notify_cooldown) brainmob.container = src if(autoping) ping_ghosts("created", TRUE) + GLOB.poi_list |= src + LAZYADD(GLOB.mob_spawners[name], src) /obj/item/mmi/posibrain/attackby(obj/item/O, mob/user) return diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index c8ece3f656..3ad7acfcdc 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -20,7 +20,7 @@ var/heat_protection = 0.5 var/leaping = 0 - gib_type = /obj/effect/decal/cleanable/xenoblood/xgibs + gib_type = /obj/effect/decal/cleanable/blood/gibs/xeno unique_name = 1 var/static/regex/alien_name_regex = new("alien (larva|sentinel|drone|hunter|praetorian|queen)( \\(\\d+\\))?") diff --git a/code/modules/mob/living/carbon/alien/death.dm b/code/modules/mob/living/carbon/alien/death.dm index ce2b4401e9..77300e1435 100644 --- a/code/modules/mob/living/carbon/alien/death.dm +++ b/code/modules/mob/living/carbon/alien/death.dm @@ -2,7 +2,7 @@ if(with_bodyparts) new /obj/effect/gibspawner/xeno(drop_location()) else - new /obj/effect/gibspawner/xenobodypartless(drop_location()) + new /obj/effect/gibspawner/xeno/bodypartless(drop_location()) /mob/living/carbon/alien/gib_animation() new /obj/effect/temp_visual/gib_animation(loc, "gibbed-a") diff --git a/code/modules/mob/living/carbon/alien/larva/death.dm b/code/modules/mob/living/carbon/alien/larva/death.dm index e16be71ccf..e7cf70f441 100644 --- a/code/modules/mob/living/carbon/alien/larva/death.dm +++ b/code/modules/mob/living/carbon/alien/larva/death.dm @@ -10,7 +10,7 @@ if(with_bodyparts) new /obj/effect/gibspawner/larva(drop_location()) else - new /obj/effect/gibspawner/larvabodypartless(drop_location()) + new /obj/effect/gibspawner/larva/bodypartless(drop_location()) /mob/living/carbon/alien/larva/gib_animation() new /obj/effect/temp_visual/gib_animation(loc, "gibbed-l") diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm index 155f203708..7b6962794a 100644 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ b/code/modules/mob/living/carbon/alien/organs.dm @@ -1,6 +1,7 @@ /obj/item/organ/alien icon_state = "xgibmid2" var/list/alien_powers = list() + organ_flags = ORGAN_NO_SPOIL /obj/item/organ/alien/Initialize() . = ..() @@ -88,6 +89,8 @@ owner.adjustFireLoss(-heal_amt) owner.adjustOxyLoss(-heal_amt) owner.adjustCloneLoss(-heal_amt) + if(owner.blood_volume && (owner.blood_volume < BLOOD_VOLUME_NORMAL)) + owner.blood_volume += 5 else owner.adjustPlasma(plasma_rate * 0.1) 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 1574305a83..0bfd23cbff 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -22,6 +22,7 @@ return S /obj/item/organ/body_egg/alien_embryo/on_life() + . = ..() switch(stage) if(2, 3) if(prob(2)) @@ -86,7 +87,7 @@ var/atom/xeno_loc = get_turf(owner) var/mob/living/carbon/alien/larva/new_xeno = new(xeno_loc) - new_xeno.key = ghost.key + 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.canmove = 0 //so we don't move during the bursting animation new_xeno.notransform = 1 @@ -110,7 +111,7 @@ else //When it is removed via surgery at a late stage, rather than forced. new_xeno.visible_message("[new_xeno] wriggles out of [owner]!", "You exit [owner], your previous host.") owner.adjustBruteLoss(40) - owner.cut_overlay(overlay) + owner.cut_overlay(overlay) qdel(src) @@ -118,19 +119,19 @@ Proc: AddInfectionImages(C) Des: Adds the infection image to all aliens for this embryo ----------------------------------------*/ -/obj/item/organ/body_egg/alien_embryo/AddInfectionImages() +/obj/item/organ/body_egg/alien_embryo/AddInfectionImages(mob/living/carbon/C) for(var/mob/living/carbon/alien/alien in GLOB.player_list) if(alien.client) - var/I = image('icons/mob/alien.dmi', loc = owner, icon_state = "infected[stage]") + var/I = image('icons/mob/alien.dmi', loc = C, icon_state = "infected[stage]") alien.client.images += I /*---------------------------------------- Proc: RemoveInfectionImage(C) Des: Removes all images from the mob infected by this embryo ----------------------------------------*/ -/obj/item/organ/body_egg/alien_embryo/RemoveInfectionImages() +/obj/item/organ/body_egg/alien_embryo/RemoveInfectionImages(mob/living/carbon/C) for(var/mob/living/carbon/alien/alien in GLOB.player_list) if(alien.client) for(var/image/I in alien.client.images) - if(dd_hasprefix_case(I.icon_state, "infected") && I.loc == owner) + if(dd_hasprefix_case(I.icon_state, "infected") && I.loc == C) qdel(I) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 9acecea545..88aa5f86d0 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -271,9 +271,13 @@ if(restrained()) changeNext_move(CLICK_CD_BREAKOUT) last_special = world.time + CLICK_CD_BREAKOUT + var/buckle_cd = 600 + if(handcuffed) + var/obj/item/restraints/O = src.get_item_by_slot(SLOT_HANDCUFFED) + buckle_cd = O.breakouttime visible_message("[src] attempts to unbuckle [p_them()]self!", \ - "You attempt to unbuckle yourself... (This will take around one minute and you need to stay still.)") - if(do_after(src, 600, 0, target = src)) + "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)) if(!buckled) return buckled.user_unbuckle_mob(src,src) @@ -801,7 +805,8 @@ drop_all_held_items() stop_pulling() throw_alert("handcuffed", /obj/screen/alert/restrained/handcuffed, new_master = src.handcuffed) - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "handcuffed", /datum/mood_event/handcuffed) + if(handcuffed.demoralize_criminals) + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "handcuffed", /datum/mood_event/handcuffed) else clear_alert("handcuffed") SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "handcuffed") @@ -814,7 +819,7 @@ reagents.clear_reagents() var/obj/item/organ/brain/B = getorgan(/obj/item/organ/brain) if(B) - B.damaged_brain = FALSE + B.brain_death = FALSE for(var/thing in diseases) var/datum/disease/D = thing if(D.severity != DISEASE_SEVERITY_POSITIVE) @@ -900,7 +905,7 @@ /mob/living/carbon/do_after_coefficent() . = ..() - GET_COMPONENT_FROM(mood, /datum/component/mood, src) //Currently, only carbons or higher use mood, move this once that changes. + var/datum/component/mood/mood = src.GetComponent(/datum/component/mood) //Currently, only carbons or higher use mood, move this once that changes. if(mood) switch(mood.sanity) //Alters do_after delay based on how sane you are if(SANITY_INSANE to SANITY_DISTURBED) @@ -942,7 +947,7 @@ return TRUE if(HAS_TRAIT(src, TRAIT_DUMB)) return TRUE - GET_COMPONENT_FROM(mood, /datum/component/mood, src) + var/datum/component/mood/mood = src.GetComponent(/datum/component/mood) if(mood) if(mood.sanity < SANITY_UNSTABLE) return TRUE diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 57483f64e7..b0e9b808df 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -287,7 +287,7 @@ "You give [H] a pat on the head to make [p_them()] feel better!") SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "headpat", /datum/mood_event/headpat) if(HAS_TRAIT(M, TRAIT_FRIENDLY)) - GET_COMPONENT_FROM(mood, /datum/component/mood, M) + var/datum/component/mood/mood = M.GetComponent(/datum/component/mood) if (mood.sanity >= SANITY_GREAT) SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "friendly_hug", /datum/mood_event/besthug, M) else if (mood.sanity >= SANITY_DISTURBED) @@ -322,7 +322,7 @@ "You hug [src] to make [p_them()] feel better!") SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "hug", /datum/mood_event/hug) if(HAS_TRAIT(M, TRAIT_FRIENDLY)) - GET_COMPONENT_FROM(mood, /datum/component/mood, M) + var/datum/component/mood/mood = M.GetComponent(/datum/component/mood) if (mood.sanity >= SANITY_GREAT) SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "friendly_hug", /datum/mood_event/besthug, M) else if (mood.sanity >= SANITY_DISTURBED) @@ -405,16 +405,16 @@ if(istype(ears) && (deafen_pwr || damage_pwr)) var/ear_damage = damage_pwr * effect_amount - var/deaf = max(ears.deaf, deafen_pwr * effect_amount) + var/deaf = deafen_pwr * effect_amount adjustEarDamage(ear_damage,deaf) - if(ears.ear_damage >= 15) + if(ears.damage >= 15) to_chat(src, "Your ears start to ring badly!") - if(prob(ears.ear_damage - 5)) + if(prob(ears.damage - 5)) to_chat(src, "You can't hear anything!") - ears.ear_damage = min(ears.ear_damage, UNHEALING_EAR_DAMAGE) + ears.damage = min(ears.damage, ears.maxHealth) // you need earmuffs, inacusiate, or replacement - else if(ears.ear_damage >= 5) + else if(ears.damage >= 5) to_chat(src, "Your ears start to ring!") SEND_SOUND(src, sound('sound/weapons/flash_ring.ogg',0,1,0,250)) return effect_amount //how soundbanged we are diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 794194b3a1..a1184613fe 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -2,7 +2,7 @@ gender = MALE pressure_resistance = 15 possible_a_intents = list(INTENT_HELP, INTENT_HARM) - hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD,GLAND_HUD,NANITE_HUD,DIAG_NANITE_FULL_HUD) + hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD,GLAND_HUD,NANITE_HUD,DIAG_NANITE_FULL_HUD,RAD_HUD) has_limbs = 1 held_items = list(null, null) var/list/stomach_contents = list() @@ -49,6 +49,7 @@ //Gets filled up in create_bodyparts() var/list/hand_bodyparts = list() //a collection of arms (or actually whatever the fug /bodyparts you monsters use to wreck my systems) + var/list/leg_bodyparts = list() var/icon_render_key = "" var/static/list/limb_icon_cache = list() diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index 749ae3b5b0..7d1e5320fc 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -1,8 +1,8 @@ -/mob/living/carbon/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked = FALSE) +/mob/living/carbon/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE) var/hit_percent = (100-blocked)/100 - if(hit_percent <= 0) + if(!forced && hit_percent <= 0) return 0 var/obj/item/bodypart/BP = null @@ -15,39 +15,39 @@ 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 * hit_percent, 0) : BP.heal_damage(abs(damage * hit_percent), 0)) + if(damage > 0 ? BP.receive_damage(damage_amount) : BP.heal_damage(abs(damage_amount), 0)) update_damage_overlays() else //no bodypart, we deal damage with a more general method. - adjustBruteLoss(damage * hit_percent) + adjustBruteLoss(damage_amount, forced = forced) if(BURN) if(BP) - if(damage > 0 ? BP.receive_damage(0, damage * hit_percent) : BP.heal_damage(0, abs(damage * hit_percent))) + if(damage > 0 ? BP.receive_damage(0, damage_amount) : BP.heal_damage(0, abs(damage_amount))) update_damage_overlays() else - adjustFireLoss(damage * hit_percent) + adjustFireLoss(damage_amount, forced = forced) if(TOX) - adjustToxLoss(damage * hit_percent) + adjustToxLoss(damage_amount, forced = forced) if(OXY) - adjustOxyLoss(damage * hit_percent) + adjustOxyLoss(damage_amount, forced = forced) if(CLONE) - adjustCloneLoss(damage * hit_percent) + adjustCloneLoss(damage_amount, forced = forced) if(STAMINA) if(BP) - if(damage > 0 ? BP.receive_damage(0, 0, damage * hit_percent) : BP.heal_damage(0, 0, abs(damage * hit_percent))) + if(damage > 0 ? BP.receive_damage(0, 0, damage_amount) : BP.heal_damage(0, 0, abs(damage_amount))) update_damage_overlays() else - adjustStaminaLoss(damage * hit_percent) - if(BRAIN) - adjustBrainLoss(damage * hit_percent) + adjustStaminaLoss(damage_amount, forced = forced) //citadel code if(AROUSAL) - adjustArousalLoss(damage * hit_percent) + adjustArousalLoss(damage_amount, forced = forced) return TRUE + //These procs fetch a cumulative total damage from all bodyparts /mob/living/carbon/getBruteLoss() var/amount = 0 @@ -86,7 +86,7 @@ if(!forced && HAS_TRAIT(src, TRAIT_TOXINLOVER)) //damage becomes healing and healing becomes damage amount = -amount if(amount > 0) - blood_volume -= 5*amount + blood_volume -= 3*amount // x5 is too much, x3 should be still penalizing enough. else blood_volume -= amount return ..() @@ -113,6 +113,51 @@ return adjustStaminaLoss(diff, updating, forced) +/** adjustOrganLoss + * inputs: slot (organ slot, like ORGAN_SLOT_HEART), amount (damage to be done), and maximum (currently an arbitrarily large number, can be set so as to limit damage) + * outputs: + * description: If an organ exists in the slot requested, and we are capable of taking damage (we don't have GODMODE on), call the damage proc on that organ. + */ +/mob/living/carbon/adjustOrganLoss(slot, amount, maximum) + var/obj/item/organ/O = getorganslot(slot) + if(O && !(status_flags & GODMODE)) + if(!maximum) + maximum = O.maxHealth + O.applyOrganDamage(amount, maximum) + O.onDamage(amount, maximum) + +/** setOrganLoss + * inputs: slot (organ slot, like ORGAN_SLOT_HEART), amount(damage to be set to) + * outputs: + * description: If an organ exists in the slot requested, and we are capable of taking damage (we don't have GODMODE on), call the set damage proc on that organ, which can + * set or clear the failing variable on that organ, making it either cease or start functions again, unlike adjustOrganLoss. + */ +/mob/living/carbon/setOrganLoss(slot, amount) + var/obj/item/organ/O = getorganslot(slot) + if(O && !(status_flags & GODMODE)) + O.setOrganDamage(amount) + O.onSetDamage(amount) + +/** getOrganLoss + * inputs: slot (organ slot, like ORGAN_SLOT_HEART) + * outputs: organ damage + * description: If an organ exists in the slot requested, return the amount of damage that organ has + */ +/mob/living/carbon/getOrganLoss(slot) + var/obj/item/organ/O = getorganslot(slot) + if(O) + return O.damage + +/mob/living/carbon/proc/adjustAllOrganLoss(amount, maximum) + for(var/obj/item/organ/O in internal_organs) + if(O && !(status_flags & GODMODE)) + continue + if(!maximum) + maximum = O.maxHealth + O.applyOrganDamage(amount, maximum) + O.onDamage(amount, maximum) + + //////////////////////////////////////////// //Returns a list of damaged bodyparts @@ -213,24 +258,25 @@ update_damage_overlays() update_stamina() -/mob/living/carbon/getBrainLoss() +/* 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/adjustBrainLoss(amount, maximum = BRAIN_DAMAGE_DEATH) +/mob/living/carbon/adjustOrganLoss(ORGAN_SLOT_BRAIN, amount, maximum = BRAIN_DAMAGE_DEATH) if(status_flags & GODMODE) return FALSE - var/prev_brainloss = getBrainLoss() + 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 = getBrainLoss() + 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) @@ -253,3 +299,4 @@ if(B) var/adjusted_amount = amount - B.get_brain_damage() B.adjust_brain_damage(adjusted_amount, null) +*/ diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index 22da46346c..5634d21775 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -91,8 +91,9 @@ if(combatmode) msg += "[t_He] [t_is] visibly tense[resting ? "." : ", and [t_is] standing in combative stance."]\n" + msg += common_trait_examine() - GET_COMPONENT_FROM(mood, /datum/component/mood, src) + var/datum/component/mood/mood = src.GetComponent(/datum/component/mood) if(mood) switch(mood.shown_mood) if(-INFINITY to MOOD_LEVEL_SAD4) diff --git a/code/modules/mob/living/carbon/human/damage_procs.dm b/code/modules/mob/living/carbon/human/damage_procs.dm index 7641408529..9f6a572fc8 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 @@ -/mob/living/carbon/human/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE) +/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) + return dna.species.apply_damage(damage, damagetype, def_zone, blocked, src, forced) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 64b75bc801..b0c3f61eec 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -5,10 +5,35 @@ new /obj/effect/temp_visual/dust_animation(loc, "dust-h") /mob/living/carbon/human/spawn_gibs(with_bodyparts) - if(with_bodyparts) - new /obj/effect/gibspawner/human(drop_location(), dna, get_static_viruses()) + if(isjellyperson(src)) + if(with_bodyparts) + new /obj/effect/gibspawner/slime(drop_location(), dna, get_static_viruses()) + else + new /obj/effect/gibspawner/slime/bodypartless(drop_location(), dna, get_static_viruses()) + + if(isipcperson(src)) + if(with_bodyparts) + new /obj/effect/gibspawner/ipc(drop_location(), dna, get_static_viruses()) + else + new /obj/effect/gibspawner/ipc/bodypartless(drop_location(), dna, get_static_viruses()) + + if(isxenoperson(src)) + if(with_bodyparts) + new /obj/effect/gibspawner/xeno/xenoperson(drop_location(), dna, get_static_viruses()) + else + new /obj/effect/gibspawner/xeno/xenoperson/bodypartless(drop_location(), dna, get_static_viruses()) + + if(islizard(src)) + if(with_bodyparts) + new /obj/effect/gibspawner/lizard(drop_location(), dna, get_static_viruses()) + else + new /obj/effect/gibspawner/lizard/bodypartless(drop_location(), dna, get_static_viruses()) + else - new /obj/effect/gibspawner/humanbodypartless(drop_location(), dna, get_static_viruses()) + if(with_bodyparts) + new /obj/effect/gibspawner/human(drop_location(), dna, get_static_viruses()) + else + new /obj/effect/gibspawner/human/bodypartless(drop_location(), dna, get_static_viruses()) /mob/living/carbon/human/spawn_dust(just_ash = FALSE) if(just_ash) diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm index 3406d29b3a..6da188dd2d 100644 --- a/code/modules/mob/living/carbon/human/dummy.dm +++ b/code/modules/mob/living/carbon/human/dummy.dm @@ -4,6 +4,7 @@ status_flags = GODMODE|CANPUSH mouse_drag_pointer = MOUSE_INACTIVE_POINTER var/in_use = FALSE + no_vore = TRUE 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 5b224444e0..7b0fb74f44 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human/examine(mob/user) //User is the person being examined +/mob/living/carbon/human/examine(mob/user) //this is very slightly better than it was because you can use it more places. still can't do \his[src] though. var/t_He = p_they(TRUE) var/t_His = p_their(TRUE) @@ -45,7 +45,7 @@ if(wear_suit) msg += "[t_He] [t_is] wearing [wear_suit.get_examine_string(user)].\n" //suit/armor storage - if(s_store) + if(s_store && !(SLOT_S_STORE in obscured)) msg += "[t_He] [t_is] carrying [s_store.get_examine_string(user)] on [t_his] [wear_suit.name].\n" //back if(back) @@ -56,11 +56,10 @@ if(!(I.item_flags & ABSTRACT)) msg += "[t_He] [t_is] holding [I.get_examine_string(user)] in [t_his] [get_held_index_name(get_held_index_of_item(I))].\n" - GET_COMPONENT(FR, /datum/component/forensics) //gloves if(gloves && !(SLOT_GLOVES in obscured)) msg += "[t_He] [t_has] [gloves.get_examine_string(user)] on [t_his] hands.\n" - else if(FR && length(FR.blood_DNA)) + else if(length(blood_DNA)) var/hand_number = get_num_arms(FALSE) if(hand_number) msg += "[t_He] [t_has] [hand_number > 1 ? "" : "a"] blood-stained hand[hand_number > 1 ? "s" : ""]!\n" @@ -86,7 +85,7 @@ if(wear_mask && !(SLOT_WEAR_MASK in obscured)) msg += "[t_He] [t_has] [wear_mask.get_examine_string(user)] on [t_his] face.\n" - if (wear_neck && !(SLOT_NECK in obscured)) + if(wear_neck && !(SLOT_NECK in obscured)) msg += "[t_He] [t_is] wearing [wear_neck.get_examine_string(user)] around [t_his] neck.\n" //eyes @@ -152,7 +151,7 @@ var/temp = getBruteLoss() //no need to calculate each of these twice - msg += "" + msg += "" //Everything below gets this span var/list/missing = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) var/list/disabled = list() @@ -297,7 +296,7 @@ msg += "[t_He] seem[p_s()] winded.\n" if (getToxLoss() >= 10) msg += "[t_He] seem[p_s()] sickly.\n" - GET_COMPONENT_FROM(mood, /datum/component/mood, src) + var/datum/component/mood/mood = src.GetComponent(/datum/component/mood) if(mood.sanity <= SANITY_DISTURBED) msg += "[t_He] seem[p_s()] distressed.\n" SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "empath", /datum/mood_event/sad_empath, src) @@ -335,6 +334,8 @@ if(digitalcamo) msg += "[t_He] [t_is] moving [t_his] body in an unnatural and blatantly inhuman manner.\n" + msg += common_trait_examine() + var/traitstring = get_trait_string() if(ishuman(user)) var/mob/living/carbon/human/H = user diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index f02689c481..0e6ac72abf 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -32,7 +32,7 @@ if(CONFIG_GET(flag/disable_stambuffer)) togglesprint() - AddComponent(/datum/component/redirect, list(COMSIG_COMPONENT_CLEAN_ACT = CALLBACK(src, .proc/clean_blood))) + RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /mob/living/carbon/human/clean_blood) /mob/living/carbon/human/ComponentInitialize() @@ -689,16 +689,17 @@ if(..()) dropItemToGround(I) -/mob/living/carbon/human/proc/clean_blood(datum/source, strength) - if(strength < CLEAN_STRENGTH_BLOOD) - return - if(gloves) - if(SEND_SIGNAL(gloves, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)) - update_inv_gloves() +/mob/living/carbon/human/clean_blood() + var/mob/living/carbon/human/H = src + if(H.gloves) + if(H.gloves.clean_blood()) + H.update_inv_gloves() else - if(bloody_hands) - bloody_hands = 0 - update_inv_gloves() + ..() // Clear the Blood_DNA list + if(H.bloody_hands) + H.bloody_hands = 0 + H.update_inv_gloves() + update_icons() //apply the now updated overlays to the mob /mob/living/carbon/human/wash_cream() if(creamed) //clean both to prevent a rare bug @@ -859,52 +860,84 @@ .["Copy outfit"] = "?_src_=vars;[HrefToken()];copyoutfit=[REF(src)]" /mob/living/carbon/human/MouseDrop_T(mob/living/target, mob/living/user) - //If they dragged themselves and we're currently aggressively grabbing them try to piggyback - if(user == target && can_piggyback(target) && pulling == target && (HAS_TRAIT(src, TRAIT_PACIFISM) || grab_state >= GRAB_AGGRESSIVE) && stat == CONSCIOUS) - buckle_mob(target,TRUE,TRUE) + if(pulling == target && grab_state >= GRAB_AGGRESSIVE && stat == CONSCIOUS) + //If they dragged themselves and we're currently aggressively grabbing them try to piggyback + if(user == target && can_piggyback(target)) + piggyback(target) + return + //If you dragged them to you and you're aggressively grabbing try to fireman carry them + else if(user != target) + fireman_carry(target) + return . = ..() -/mob/living/carbon/human/proc/piggyback_instant(mob/living/M) - return buckle_mob(M, TRUE, TRUE, FALSE, TRUE) +//src is the user that will be carrying, target is the mob to be carried +/mob/living/carbon/human/proc/can_piggyback(mob/living/carbon/target) + return (istype(target) && target.stat == CONSCIOUS) -//Can C try to piggyback at all. -/mob/living/carbon/human/proc/can_piggyback(mob/living/carbon/C) - if(istype(C) && C.stat == CONSCIOUS) - return TRUE - return FALSE +/mob/living/carbon/human/proc/can_be_firemanned(mob/living/carbon/target) + return (ishuman(target) && target.lying) -/mob/living/carbon/human/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE, bypass_piggybacking = FALSE, no_delay = FALSE) +/mob/living/carbon/human/proc/fireman_carry(mob/living/carbon/target) + if(can_be_firemanned(target)) + visible_message("[src] starts lifting [target] onto their back...", + "You start lifting [target] onto your back...") + if(do_after(src, 30, TRUE, target)) + //Second check to make sure they're still valid to be carried + if(can_be_firemanned(target) && !incapacitated(FALSE, TRUE)) + target.resting = FALSE + buckle_mob(target, TRUE, TRUE, 90, 1, 0) + return + visible_message("[src] fails to fireman carry [target]!") + else + to_chat(src, "You can't fireman carry [target] while they're standing!") + +/mob/living/carbon/human/proc/piggyback(mob/living/carbon/target) + if(can_piggyback(target)) + visible_message("[target] starts to climb onto [src]...") + if(do_after(target, 15, target = src)) + if(can_piggyback(target)) + if(target.incapacitated(FALSE, TRUE) || incapacitated(FALSE, TRUE)) + target.visible_message("[target] can't hang onto [src]!") + return + buckle_mob(target, TRUE, TRUE, FALSE, 0, 2) + else + visible_message("[target] fails to climb onto [src]!") + else + to_chat(target, "You can't piggyback ride [src] right now!") + +/mob/living/carbon/human/buckle_mob(mob/living/target, force = FALSE, check_loc = TRUE, lying_buckle = FALSE, hands_needed = 0, target_hands_needed = 0) if(!force)//humans are only meant to be ridden through piggybacking and special cases return - if(bypass_piggybacking) - return ..() - if(!is_type_in_typecache(M, can_ride_typecache)) - M.visible_message("[M] really can't seem to mount [src]...") + if(!is_type_in_typecache(target, can_ride_typecache)) + target.visible_message("[target] really can't seem to mount [src]...") return + buckle_lying = lying_buckle var/datum/component/riding/human/riding_datum = LoadComponent(/datum/component/riding/human) - riding_datum.ride_check_rider_incapacitated = TRUE - riding_datum.ride_check_rider_restrained = TRUE - riding_datum.set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 6), TEXT_SOUTH = list(0, 6), TEXT_EAST = list(-6, 4), TEXT_WEST = list( 6, 4))) - if(buckled_mobs && ((M in buckled_mobs) || (buckled_mobs.len >= max_buckled_mobs)) || buckled || (M.stat != CONSCIOUS)) + if(target_hands_needed) + riding_datum.ride_check_rider_restrained = TRUE + if(buckled_mobs && ((target in buckled_mobs) || (buckled_mobs.len >= max_buckled_mobs)) || buckled) return - if(can_piggyback(M)) - riding_datum.ride_check_ridden_incapacitated = TRUE - visible_message("[M] starts to climb onto [src]...") - if(no_delay || do_after(M, 15, target = src)) - if(can_piggyback(M)) - if(M.incapacitated(FALSE, TRUE) || incapacitated(FALSE, TRUE)) - M.visible_message("[M] can't hang onto [src]!") - return - if(!riding_datum.equip_buckle_inhands(M, 2)) //MAKE SURE THIS IS LAST!! - M.visible_message("[M] can't climb onto [src]!") - return - . = ..(M, force, check_loc) - stop_pulling() - else - visible_message("[M] fails to climb onto [src]!") - else - . = ..(M,force,check_loc) - stop_pulling() + var/equipped_hands_self + var/equipped_hands_target + if(hands_needed) + equipped_hands_self = riding_datum.equip_buckle_inhands(src, hands_needed, target) + if(target_hands_needed) + equipped_hands_target = riding_datum.equip_buckle_inhands(target, target_hands_needed) + + if(hands_needed || target_hands_needed) + if(hands_needed && !equipped_hands_self) + src.visible_message("[src] can't get a grip on [target] because their hands are full!", + "You can't get a grip on [target] because your hands are full!") + return + else if(target_hands_needed && !equipped_hands_target) + target.visible_message("[target] can't get a grip on [src] because their hands are full!", + "You can't get a grip on [src] because your hands are full!") + return + + stop_pulling() + riding_datum.handle_vehicle_layer() + . = ..(target, force, check_loc) /mob/living/carbon/human/proc/is_shove_knockdown_blocked() //If you want to add more things that block shove knockdown, extend this for(var/obj/item/clothing/C in get_equipped_items()) //doesn't include pockets @@ -1072,3 +1105,18 @@ /mob/living/carbon/human/species/zombie/krokodil_addict race = /datum/species/krokodil_addict + +/mob/living/carbon/human/species/mammal + race = /datum/species/mammal + +/mob/living/carbon/human/species/insect + race = /datum/species/insect + +/mob/living/carbon/human/species/xeno + race = /datum/species/xeno + +/mob/living/carbon/human/species/ipc + race = /datum/species/ipc + +/mob/living/carbon/human/species/roundstartslime + race = /datum/species/jelly/roundstartslime diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index ff4878aa13..a44779e05e 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -348,10 +348,15 @@ if(temp) var/update = 0 var/dmg = rand(M.force/2, M.force) + var/atom/throw_target = get_edge_target_turf(src, M.dir) switch(M.damtype) if("brute") - if(M.force > 20) - Unconscious(20) + if(M.force > 35) // durand and other heavy mechas + Knockdown(50) + src.throw_at(throw_target, rand(1,5), 7) + else if(M.force >= 20 && !IsKnockdown()) // lightweight mechas like gygax + Knockdown(30) + src.throw_at(throw_target, rand(1,3), 7) update |= temp.receive_damage(dmg, 0) playsound(src, 'sound/weapons/punch4.ogg', 50, 1) if("fire") @@ -746,9 +751,54 @@ if(0 to NUTRITION_LEVEL_STARVING) to_send += "You're starving!\n" + + //TODO: Convert these messages into vague messages, thereby encouraging actual dignosis. + //Compiles then shows the list of damaged organs and broken organs + var/list/broken = list() + var/list/damaged = list() + var/broken_message + var/damaged_message + var/broken_plural + var/damaged_plural + //Sets organs into their proper list + for(var/O in internal_organs) + var/obj/item/organ/organ = O + if(organ.organ_flags & ORGAN_FAILING) + if(broken.len) + broken += ", " + broken += organ.name + else if(organ.damage > organ.low_threshold) + if(damaged.len) + damaged += ", " + damaged += organ.name + //Checks to enforce proper grammar, inserts words as necessary into the list + if(broken.len) + if(broken.len > 1) + broken.Insert(broken.len, "and ") + broken_plural = TRUE + else + var/holder = broken[1] //our one and only element + if(holder[lentext(holder)] == "s") + broken_plural = TRUE + //Put the items in that list into a string of text + for(var/B in broken) + broken_message += B + to_chat(src, " Your [broken_message] [broken_plural ? "are" : "is"] non-functional!") + if(damaged.len) + if(damaged.len > 1) + damaged.Insert(damaged.len, "and ") + damaged_plural = TRUE + else + var/holder = damaged[1] + if(holder[lentext(holder)] == "s") + damaged_plural = TRUE + for(var/D in damaged) + damaged_message += D + to_chat(src, "Your [damaged_message] [damaged_plural ? "are" : "is"] hurt.") + if(roundstart_quirks.len) to_send += "You have these quirks: [get_trait_string()].\n" - + to_chat(src, to_send) else if(wear_suit) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 2425fcf14d..b1f11f6463 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -1,5 +1,5 @@ /mob/living/carbon/human - hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD, NANITE_HUD, DIAG_NANITE_FULL_HUD,ANTAG_HUD,GLAND_HUD,SENTIENT_DISEASE_HUD) + hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD, NANITE_HUD, DIAG_NANITE_FULL_HUD,ANTAG_HUD,GLAND_HUD,SENTIENT_DISEASE_HUD,RAD_HUD) hud_type = /datum/hud/human possible_a_intents = list(INTENT_HELP, INTENT_DISARM, INTENT_GRAB, INTENT_HARM) pressure_resistance = 25 @@ -19,6 +19,8 @@ var/horn_color = "85615a" //specific horn colors, because why not? + var/wing_color = "fff" //wings too + var/skin_tone = "caucasian1" //Skin tone var/lip_style = null //no lipstick by default- arguably misleading, as it could be used for general makeup @@ -49,6 +51,9 @@ var/bleed_rate = 0 //how much are we bleeding var/bleedsuppress = 0 //for stopping bloodloss, eventually this will be limb-based like bleeding + var/blood_state = BLOOD_STATE_NOT_BLOODY + var/list/blood_smear = list(BLOOD_STATE_BLOOD = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0) + var/name_override //For temporary visible name changes var/genital_override = FALSE //Force genitals on things incase of chems diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index b65d62b63b..8bc8866380 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -127,3 +127,9 @@ return FALSE return . +/* +/mob/living/carbon/human/transfer_blood_dna(list/blood_dna) + ..() + 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]*/ diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 6ea9c985e2..4e6f9e0eb9 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -56,20 +56,20 @@ //Bloody footprints var/turf/T = get_turf(src) if(S.bloody_shoes && S.bloody_shoes[S.blood_state]) - for(var/obj/effect/decal/cleanable/blood/footprints/oldFP in T) - if (oldFP.blood_state == S.blood_state) - return - //No oldFP or they're all a different kind of blood - S.bloody_shoes[S.blood_state] = max(0, S.bloody_shoes[S.blood_state] - BLOOD_LOSS_PER_STEP) - if (S.bloody_shoes[S.blood_state] > BLOOD_LOSS_IN_SPREAD) - var/obj/effect/decal/cleanable/blood/footprints/FP = new /obj/effect/decal/cleanable/blood/footprints(T) - FP.blood_state = S.blood_state - FP.entered_dirs |= dir - FP.bloodiness = S.bloody_shoes[S.blood_state] - BLOOD_LOSS_IN_SPREAD - FP.add_blood_DNA(S.return_blood_DNA()) - FP.update_icon() + var/obj/effect/decal/cleanable/blood/footprints/oldFP = locate(/obj/effect/decal/cleanable/blood/footprints) in T + if(oldFP && (oldFP.blood_state == S.blood_state && oldFP.color == bloodtype_to_color(S.last_bloodtype))) + return + S.bloody_shoes[S.blood_state] = max(0, S.bloody_shoes[S.blood_state]-BLOOD_LOSS_PER_STEP) + var/obj/effect/decal/cleanable/blood/footprints/FP = new /obj/effect/decal/cleanable/blood/footprints(T) + FP.blood_state = S.blood_state + FP.entered_dirs |= dir + FP.bloodiness = S.bloody_shoes[S.blood_state] + if(S.last_bloodtype) + FP.blood_DNA += list(S.last_blood_DNA = S.last_bloodtype) + FP.update_icon() update_inv_shoes() //End bloody footprints + S.step_action() /mob/living/carbon/human/Process_Spacemove(movement_dir = 0) //Temporary laziness thing. Will change to handles by species reee. diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index b1c31ffdff..9395283aeb 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -74,7 +74,7 @@ else if(eye_blurry) //blurry eyes heal slowly adjust_blurriness(-1) - if (getBrainLoss() >= 30) //Citadel change to make memes more often. + if (getOrganLoss(ORGAN_SLOT_BRAIN) >= 30) //Citadel change to make memes more often. SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "brain_damage", /datum/mood_event/brain_damage) if(prob(3)) if(prob(25)) diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index eee425063d..c54f41017a 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -1,14 +1,14 @@ /mob/living/carbon/human/say_mod(input, message_mode) verb_say = dna.species.say_mod - switch(slurring) - if(10 to 25) - return "jumbles" - if(25 to 50) - return "slurs" - if(50 to INFINITY) - return "garbles" - else - . = ..() + . = ..() + if(message_mode != MODE_CUSTOM_SAY && message_mode != MODE_WHISPER_CRIT) + switch(slurring) + if(10 to 25) + return "jumbles" + if(25 to 50) + return "slurs" + if(50 to INFINITY) + return "garbles" /mob/living/carbon/human/GetVoice() if(istype(wear_mask, /obj/item/clothing/mask/chameleon)) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 7855e9f4fa..f9b4654793 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -9,14 +9,35 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/name // this is the fluff name. these will be left generic (such as 'Lizardperson' for the lizard race) so servers can change them to whatever var/default_color = "#FFF" // if alien colors are disabled, this is the color that will be used by that race - var/sexes = 1 // whether or not the race has sexual characteristics. at the moment this is only 0 for skeletons and shadows + var/sexes = 1 // whether or not the race has sexual characteristics. at the moment this is only 0 for skeletons and shadows - var/list/offset_features = list(OFFSET_UNIFORM = list(0,0), OFFSET_ID = list(0,0), OFFSET_GLOVES = list(0,0), OFFSET_GLASSES = list(0,0), OFFSET_EARS = list(0,0), OFFSET_SHOES = list(0,0), OFFSET_S_STORE = list(0,0), OFFSET_FACEMASK = list(0,0), OFFSET_HEAD = list(0,0), OFFSET_FACE = list(0,0), OFFSET_BELT = list(0,0), OFFSET_BACK = list(0,0), OFFSET_SUIT = list(0,0), OFFSET_NECK = list(0,0)) + //Species Icon Drawing Offsets - Pixel X, Pixel Y, Aka X = Horizontal and Y = Vertical, from bottom left corner + var/list/offset_features = list( + OFFSET_UNIFORM = list(0,0), + OFFSET_ID = list(0,0), + OFFSET_GLOVES = list(0,0), + OFFSET_GLASSES = list(0,0), + OFFSET_EARS = list(0,0), + OFFSET_SHOES = list(0,0), + OFFSET_S_STORE = list(0,0), + OFFSET_FACEMASK = list(0,0), + OFFSET_HEAD = list(0,0), + OFFSET_EYES = list(0,0), + OFFSET_LIPS = list(0,0), + OFFSET_BELT = list(0,0), + OFFSET_BACK = list(0,0), + OFFSET_HAIR = list(0,0), + OFFSET_FHAIR = list(0,0), + OFFSET_SUIT = list(0,0), + OFFSET_NECK = list(0,0), + OFFSET_MUTPARTS = list(0,0) + ) var/hair_color // this allows races to have specific hair colors... if null, it uses the H's hair/facial hair colors. if "mutcolor", it uses the H's mutant_color var/hair_alpha = 255 // the alpha used by the hair. 255 is completely solid, 0 is transparent. var/horn_color //specific horn colors, because why not? + var/wing_color var/use_skintones = 0 // does it use skintones or not? (spoiler alert this is only used by humans) var/exotic_blood = "" // If your race wants to bleed something other than bog standard blood, change this to reagent id. @@ -133,10 +154,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) return //Please override this locally if you want to define when what species qualifies for what rank if human authority is enforced. -/datum/species/proc/qualifies_for_rank(rank, list/features) - if(rank in GLOB.command_positions) - return 0 - return 1 +/datum/species/proc/qualifies_for_rank(rank, list/features) //SPECIES JOB RESTRICTIONS + //if(rank in GLOB.command_positions) Left as an example: The format qualifies for rank takes. + // return 0 //It returns false when it runs the proc so they don't get jobs from the global list. + return 1 //It returns 1 to say they are a-okay to continue. //Will regenerate missing organs /datum/species/proc/regenerate_organs(mob/living/carbon/C,datum/species/old_species,replace_current=TRUE) @@ -318,7 +339,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) /datum/species/proc/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) if(C.dna.species.exotic_bloodtype) - C.dna.blood_type = random_blood_type() + if(!new_species.exotic_bloodtype) + C.dna.blood_type = random_blood_type() + else + C.dna.blood_type = new_species.exotic_bloodtype if(DIGITIGRADE in species_traits) C.Digitigrade_Leg_Swap(TRUE) for(var/X in inherent_traits) @@ -401,6 +425,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) facial_overlay.alpha = hair_alpha + if(OFFSET_FHAIR in H.dna.species.offset_features) + facial_overlay.pixel_x += H.dna.species.offset_features[OFFSET_FHAIR][1] + facial_overlay.pixel_y += H.dna.species.offset_features[OFFSET_FHAIR][2] + standing += facial_overlay if(H.head) @@ -458,9 +486,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) else hair_overlay.color = forced_colour hair_overlay.alpha = hair_alpha - if(OFFSET_FACE in H.dna.species.offset_features) - hair_overlay.pixel_x += H.dna.species.offset_features[OFFSET_FACE][1] - hair_overlay.pixel_y += H.dna.species.offset_features[OFFSET_FACE][2] + + if(OFFSET_HAIR in H.dna.species.offset_features) + hair_overlay.pixel_x += H.dna.species.offset_features[OFFSET_HAIR][1] + hair_overlay.pixel_y += H.dna.species.offset_features[OFFSET_HAIR][2] + if(hair_overlay.icon) standing += hair_overlay @@ -481,9 +511,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(H.lip_style && (LIPS in species_traits)) var/mutable_appearance/lip_overlay = mutable_appearance('icons/mob/human_face.dmi', "lips_[H.lip_style]", -BODY_LAYER) lip_overlay.color = H.lip_color - if(OFFSET_FACE in H.dna.species.offset_features) - lip_overlay.pixel_x += H.dna.species.offset_features[OFFSET_FACE][1] - lip_overlay.pixel_y += H.dna.species.offset_features[OFFSET_FACE][2] + + if(OFFSET_LIPS in H.dna.species.offset_features) + lip_overlay.pixel_x += H.dna.species.offset_features[OFFSET_LIPS][1] + lip_overlay.pixel_y += H.dna.species.offset_features[OFFSET_LIPS][2] + standing += lip_overlay // eyes @@ -496,9 +528,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) eye_overlay = mutable_appearance('icons/mob/human_face.dmi', "eyes", -BODY_LAYER) if((EYECOLOR in species_traits) && has_eyes) eye_overlay.color = "#" + H.eye_color - if(OFFSET_FACE in H.dna.species.offset_features) - eye_overlay.pixel_x += H.dna.species.offset_features[OFFSET_FACE][1] - eye_overlay.pixel_y += H.dna.species.offset_features[OFFSET_FACE][2] + + if(OFFSET_EYES in H.dna.species.offset_features) + eye_overlay.pixel_x += H.dna.species.offset_features[OFFSET_EYES][1] + eye_overlay.pixel_y += H.dna.species.offset_features[OFFSET_EYES][2] + standing += eye_overlay //Underwear, Undershirts & Socks @@ -731,6 +765,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) S = GLOB.wings_list[H.dna.features["wings"]] if("wingsopen") S = GLOB.wings_open_list[H.dna.features["wings"]] + if("deco_wings") + S = GLOB.deco_wings_list[H.dna.features["deco_wings"]] if("legs") S = GLOB.legs_list[H.dna.features["legs"]] if("insect_wings") @@ -782,6 +818,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) bodypart = "snout" if(bodypart == "xenohead") bodypart = "xhead" + if(bodypart == "insect_wings" || bodypart == "deco_wings") + bodypart = "insect_wings" if(S.gender_specific) accessory_overlay.icon_state = "[g]_[bodypart]_[S.icon_state]_[layertext]" @@ -835,6 +873,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) accessory_overlay.color = "#[H.eye_color]" if(HORNCOLOR) accessory_overlay.color = "#[H.horn_color]" + if(WINGCOLOR) + accessory_overlay.color = "#[H.wing_color]" else accessory_overlay.color = forced_colour else @@ -851,6 +891,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) for(var/index=1, index<=husklist.len, index++) husklist[index] = husklist[index]/255 accessory_overlay.color = husklist + + if(OFFSET_MUTPARTS in H.dna.species.offset_features) + accessory_overlay.pixel_x += H.dna.species.offset_features[OFFSET_MUTPARTS][1] + accessory_overlay.pixel_y += H.dna.species.offset_features[OFFSET_MUTPARTS][2] + standing += accessory_overlay if(S.hasinner) @@ -863,6 +908,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(S.center) inner_accessory_overlay = center_image(inner_accessory_overlay, S.dimension_x, S.dimension_y) + if(OFFSET_MUTPARTS in H.dna.species.offset_features) + inner_accessory_overlay.pixel_x += H.dna.species.offset_features[OFFSET_MUTPARTS][1] + inner_accessory_overlay.pixel_y += H.dna.species.offset_features[OFFSET_MUTPARTS][2] + standing += inner_accessory_overlay if(S.extra) //apply the extra overlay, if there is one @@ -903,6 +952,13 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(HORNCOLOR) extra_accessory_overlay.color = "#[H.horn_color]" + if(WINGCOLOR) + extra_accessory_overlay.color = "#[H.wing_color]" + + if(OFFSET_MUTPARTS in H.dna.species.offset_features) + extra_accessory_overlay.pixel_x += H.dna.species.offset_features[OFFSET_MUTPARTS][1] + extra_accessory_overlay.pixel_y += H.dna.species.offset_features[OFFSET_MUTPARTS][2] + standing += extra_accessory_overlay if(S.extra2) //apply the extra overlay, if there is one @@ -937,6 +993,13 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) extra2_accessory_overlay.color = "#[H.hair_color]" if(HORNCOLOR) extra2_accessory_overlay.color = "#[H.horn_color]" + if(WINGCOLOR) + extra2_accessory_overlay.color = "#[H.wing_color]" + + if(OFFSET_MUTPARTS in H.dna.species.offset_features) + extra2_accessory_overlay.pixel_x += H.dna.species.offset_features[OFFSET_MUTPARTS][1] + extra2_accessory_overlay.pixel_y += H.dna.species.offset_features[OFFSET_MUTPARTS][2] + standing += extra2_accessory_overlay @@ -964,6 +1027,16 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) return "TAUR" //END EDIT +/* TODO: Snowflake trail marks +// Impliments different trails for species depending on if they're wearing shoes. +/datum/species/proc/get_move_trail(var/mob/living/carbon/human/H) + if(H.lying) + return /obj/effect/decal/cleanable/blood/footprints/tracks/body + if(H.shoes || (H.wear_suit && (H.wear_suit.body_parts_covered & FEET))) + var/obj/item/clothing/shoes/shoes = (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)) ? H.wear_suit : H.shoes // suits take priority over shoes + return shoes.move_trail + else + return move_trail */ /datum/species/proc/spec_life(mob/living/carbon/human/H) if(HAS_TRAIT(H, TRAIT_NOBREATH)) @@ -1217,13 +1290,18 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if (H.nutrition > 0 && H.stat != DEAD && !HAS_TRAIT(H, TRAIT_NOHUNGER)) // THEY HUNGER var/hunger_rate = HUNGER_FACTOR - GET_COMPONENT_FROM(mood, /datum/component/mood, H) + var/datum/component/mood/mood = H.GetComponent(/datum/component/mood) if(mood && mood.sanity > SANITY_DISTURBED) hunger_rate *= max(0.5, 1 - 0.002 * mood.sanity) //0.85 to 0.75 - if(H.satiety > 0) + // Whether we cap off our satiety or move it towards 0 + if(H.satiety > MAX_SATIETY) + H.satiety = MAX_SATIETY + else if(H.satiety > 0) H.satiety-- - if(H.satiety < 0) + else if(H.satiety < -MAX_SATIETY) + H.satiety = -MAX_SATIETY + else if(H.satiety < 0) H.satiety++ if(prob(round(-H.satiety/40))) H.Jitter(5) @@ -1339,9 +1417,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(!istype(J) && istype(C)) J = C.jetpack if(istype(J) && J.full_speed && J.allow_thrust(0.01, H)) //Prevents stacking - . -= 2 + . -= 0.4 else if(istype(T) && T.allow_thrust(0.01, H)) - . -= 2 + . -= 0.4 if(!ignoreslow && gravity) if(H.wear_suit) @@ -1370,7 +1448,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/grav_force = min(gravity - STANDARD_GRAVITY,3) . += 1 + grav_force - GET_COMPONENT_FROM(mood, /datum/component/mood, H) + var/datum/component/mood/mood = H.GetComponent(/datum/component/mood) if(mood && !flight) //How can depression slow you down if you can just fly away from your problems? switch(mood.sanity) if(SANITY_INSANE to SANITY_CRAZY) @@ -1708,7 +1786,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(BODY_ZONE_HEAD) if(!I.is_sharp() && armor_block < 50) if(prob(I.force)) - H.adjustBrainLoss(20) + H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 20) if(H.stat == CONSCIOUS) H.visible_message("[H] has been knocked senseless!", \ "[H] has been knocked senseless!") @@ -1717,7 +1795,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(prob(10)) H.gain_trauma(/datum/brain_trauma/mild/concussion) else - H.adjustBrainLoss(I.force * 0.2) + H.adjustOrganLoss(ORGAN_SLOT_BRAIN, I.force * 0.2) if(H.stat == CONSCIOUS && H != user && prob(I.force + ((100 - H.health) * 0.5))) // rev deconversion through blunt trauma. var/datum/antagonist/rev/rev = H.mind.has_antag_datum(/datum/antagonist/rev) @@ -1821,67 +1899,36 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(!target.resting) target.adjustStaminaLoss(5) + if(target.is_shove_knockdown_blocked()) + return var/turf/target_oldturf = target.loc var/shove_dir = get_dir(user.loc, target_oldturf) var/turf/target_shove_turf = get_step(target.loc, shove_dir) var/mob/living/carbon/human/target_collateral_human - var/obj/structure/table/target_table var/shove_blocked = FALSE //Used to check if a shove is blocked so that if it is knockdown logic can be applied //Thank you based whoneedsspace target_collateral_human = locate(/mob/living/carbon/human) in target_shove_turf.contents - if(target_collateral_human) + if(target_collateral_human && !target_collateral_human.resting) shove_blocked = TRUE else + target_collateral_human = null target.Move(target_shove_turf, shove_dir) if(get_turf(target) == target_oldturf) - if(target_shove_turf.density) - shove_blocked = TRUE - else - var/thoushallnotpass = FALSE - for(var/obj/O in target_shove_turf) - if(istype(O, /obj/structure/table)) - target_table = O - else if(!O.CanPass(src, target_shove_turf)) - shove_blocked = TRUE - thoushallnotpass = TRUE - if(thoushallnotpass) - target_table = null + shove_blocked = TRUE - if(target.is_shove_knockdown_blocked()) - return - - if(shove_blocked || target_table) - var/directional_blocked = FALSE - if(shove_dir in GLOB.cardinals) //Directional checks to make sure that we're not shoving through a windoor or something like that - var/target_turf = get_turf(target) - for(var/obj/O in target_turf) - if(O.flags_1 & ON_BORDER_1 && O.dir == shove_dir && O.density) - directional_blocked = TRUE - break - if(target_turf != target_shove_turf) //Make sure that we don't run the exact same check twice on the same tile - for(var/obj/O in target_shove_turf) - if(O.flags_1 & ON_BORDER_1 && O.dir == turn(shove_dir, 180) && O.density) - directional_blocked = TRUE - break + if(shove_blocked && !target.buckled) + var/directional_blocked = !target.Adjacent(target_shove_turf) var/targetatrest = target.resting - if(((!target_table && !target_collateral_human) || directional_blocked) && !targetatrest) + if((directional_blocked || !(target_collateral_human || target_shove_turf.shove_act(target, user))) && !targetatrest) target.Knockdown(SHOVE_KNOCKDOWN_SOLID) user.visible_message("[user.name] shoves [target.name], knocking them down!", "You shove [target.name], knocking them down!", null, COMBAT_MESSAGE_RANGE) log_combat(user, target, "shoved", "knocking them down") - else if(target_table) - if(!targetatrest) - target.Knockdown(SHOVE_KNOCKDOWN_TABLE) - user.visible_message("[user.name] shoves [target.name] onto \the [target_table]!", - "You shove [target.name] onto \the [target_table]!", null, COMBAT_MESSAGE_RANGE) - target.forceMove(target_shove_turf) - log_combat(user, target, "shoved", "onto [target_table]") else if(target_collateral_human && !targetatrest) target.Knockdown(SHOVE_KNOCKDOWN_HUMAN) - if(!target_collateral_human.resting) - target_collateral_human.Knockdown(SHOVE_KNOCKDOWN_COLLATERAL) + target_collateral_human.Knockdown(SHOVE_KNOCKDOWN_COLLATERAL) user.visible_message("[user.name] shoves [target.name] into [target_collateral_human.name]!", "You shove [target.name] into [target_collateral_human.name]!", null, COMBAT_MESSAGE_RANGE) log_combat(user, target, "shoved", "into [target_collateral_human.name]") @@ -1912,10 +1959,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) append_message = "loosening their grip on [target_held_item]" log_combat(user, target, "shoved", append_message) -/datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H) +/datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE) var/hit_percent = (100-(blocked+armor))/100 hit_percent = (hit_percent * (100-H.physiology.damage_resistance))/100 - if(hit_percent <= 0) + if(!forced && hit_percent <= 0) return 0 var/obj/item/bodypart/BP = null @@ -1937,37 +1984,44 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) switch(damagetype) if(BRUTE) H.damageoverlaytemp = 20 + var/damage_amount = forced ? damage : damage * hit_percent * brutemod * H.physiology.brute_mod if(BP) - if(damage > 0 ? BP.receive_damage(damage * hit_percent * brutemod * H.physiology.brute_mod, 0) : BP.heal_damage(abs(damage * hit_percent * brutemod * H.physiology.brute_mod), 0)) + if(damage > 0 ? BP.receive_damage(damage_amount, 0) : BP.heal_damage(abs(damage_amount), 0)) H.update_damage_overlays() if(HAS_TRAIT(H, TRAIT_MASO)) - H.adjustArousalLoss(damage * brutemod * H.physiology.brute_mod) + H.adjustArousalLoss(damage_amount, 0) if (H.getArousalLoss() >= 100 && ishuman(H) && H.has_dna()) H.mob_climax(forced_climax=TRUE) else//no bodypart, we deal damage with a more general method. - H.adjustBruteLoss(damage * hit_percent * brutemod * H.physiology.brute_mod) + H.adjustBruteLoss(damage_amount) if(BURN) H.damageoverlaytemp = 20 + var/damage_amount = forced ? damage : damage * hit_percent * burnmod * H.physiology.burn_mod if(BP) - if(damage > 0 ? BP.receive_damage(0, damage * hit_percent * burnmod * H.physiology.burn_mod) : BP.heal_damage(0, abs(damage * hit_percent * burnmod * H.physiology.burn_mod))) + if(damage > 0 ? BP.receive_damage(0, damage_amount) : BP.heal_damage(0, abs(damage_amount))) H.update_damage_overlays() else - H.adjustFireLoss(damage * hit_percent * burnmod * H.physiology.burn_mod) + H.adjustFireLoss(damage_amount) if(TOX) - H.adjustToxLoss(damage * hit_percent * H.physiology.tox_mod) + var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.tox_mod + H.adjustToxLoss(damage_amount) if(OXY) - H.adjustOxyLoss(damage * hit_percent * H.physiology.oxy_mod) + var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.oxy_mod + H.adjustOxyLoss(damage_amount) if(CLONE) - H.adjustCloneLoss(damage * hit_percent * H.physiology.clone_mod) + var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.clone_mod + H.adjustCloneLoss(damage_amount) if(STAMINA) + var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.stamina_mod if(BP) - if(damage > 0 ? BP.receive_damage(0, 0, damage * hit_percent * H.physiology.stamina_mod) : BP.heal_damage(0, 0, abs(damage * hit_percent * H.physiology.stamina_mod), only_robotic = FALSE, only_organic = FALSE)) + if(damage > 0 ? BP.receive_damage(0, 0, damage_amount) : BP.heal_damage(0, 0, abs(damage * hit_percent * H.physiology.stamina_mod), only_robotic = FALSE, only_organic = FALSE)) H.update_stamina() else - H.adjustStaminaLoss(damage * hit_percent * H.physiology.stamina_mod) + H.adjustStaminaLoss(damage_amount) if(BRAIN) - H.adjustBrainLoss(damage * hit_percent * H.physiology.brain_mod) + var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.brain_mod + H.adjustOrganLoss(ORGAN_SLOT_BRAIN, damage_amount) if(AROUSAL) //Citadel edit - arousal H.adjustArousalLoss(damage * hit_percent) return 1 diff --git a/code/modules/mob/living/carbon/human/species_types/abductors.dm b/code/modules/mob/living/carbon/human/species_types/abductors.dm index ad1f5c9190..ffd129ebf7 100644 --- a/code/modules/mob/living/carbon/human/species_types/abductors.dm +++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm @@ -6,10 +6,6 @@ species_traits = list(NOBLOOD,NOEYES,NOGENITALS,NOAROUSAL) inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NOGUNS,TRAIT_NOHUNGER,TRAIT_NOBREATH) mutanttongue = /obj/item/organ/tongue/abductor - var/scientist = FALSE // vars to not pollute spieces list with castes - -/datum/species/abductor/copy_properties_from(datum/species/abductor/old_species) - scientist = old_species.scientist /datum/species/abductor/on_species_gain(mob/living/carbon/C, datum/species/old_species) . = ..() diff --git a/code/modules/mob/living/carbon/human/species_types/bugmen.dm b/code/modules/mob/living/carbon/human/species_types/bugmen.dm index 94dba550b6..d264f11b73 100644 --- a/code/modules/mob/living/carbon/human/species_types/bugmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/bugmen.dm @@ -3,7 +3,7 @@ id = "insect" say_mod = "flutters" default_color = "00FF00" - species_traits = list(LIPS,NOEYES,HAIR,FACEHAIR,MUTCOLORS,HORNCOLOR) + species_traits = list(LIPS,NOEYES,HAIR,FACEHAIR,MUTCOLORS,HORNCOLOR,WINGCOLOR) inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID, MOB_BUG) mutant_bodyparts = list("mam_ears", "mam_snout", "mam_tail", "taur", "insect_wings", "mam_snouts", "insect_fluff","horns") default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_tail" = "None", "mam_ears" = "None", @@ -17,6 +17,7 @@ toxic_food = MEAT | RAW mutanteyes = /obj/item/organ/eyes/insect should_draw_citadel = TRUE + exotic_bloodtype = "BUG" /datum/species/insect/on_species_gain(mob/living/carbon/C) . = ..() diff --git a/code/modules/mob/living/carbon/human/species_types/corporate.dm b/code/modules/mob/living/carbon/human/species_types/corporate.dm index 620f0b2543..146090b366 100644 --- a/code/modules/mob/living/carbon/human/species_types/corporate.dm +++ b/code/modules/mob/living/carbon/human/species_types/corporate.dm @@ -16,5 +16,5 @@ blacklisted = 1 use_skintones = 0 species_traits = list(NOBLOOD,EYECOLOR,NOGENITALS) - inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER) + inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOLIMBDISABLE,TRAIT_NOHUNGER) sexes = 0 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm index 4a7580e978..eba4ff6d2f 100644 --- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm +++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm @@ -13,9 +13,12 @@ blacklisted = TRUE limbs_id = "human" skinned_type = /obj/item/stack/sheet/animalhide/human + var/pumpkin = FALSE var/obj/item/dullahan_relay/myhead +/datum/species/dullahan/pumpkin + pumpkin = TRUE /datum/species/dullahan/check_roundstart_eligible() if(SSevents.holidays && SSevents.holidays[HALLOWEEN]) @@ -27,11 +30,19 @@ H.flags_1 &= ~HEAR_1 var/obj/item/bodypart/head/head = H.get_bodypart(BODY_ZONE_HEAD) if(head) + if(pumpkin)//Pumpkinhead! + head.animal_origin = 100 + head.icon = 'icons/obj/clothing/hats.dmi' + head.icon_state = "hardhat1_pumpkin_j" + head.custom_head = TRUE head.drop_limb() head.flags_1 = HEAR_1 head.throwforce = 25 myhead = new /obj/item/dullahan_relay (head, H) H.put_in_hands(head) + var/obj/item/organ/eyes/E = H.getorganslot(ORGAN_SLOT_EYES) + for(var/datum/action/item_action/organ_action/OA in E.actions) + OA.Trigger() /datum/species/dullahan/on_species_loss(mob/living/carbon/human/H) H.flags_1 |= ~HEAR_1 @@ -64,7 +75,7 @@ /obj/item/organ/brain/dullahan decoy_override = TRUE - vital = FALSE + organ_flags = ORGAN_NO_SPOIL//Do not decay /obj/item/organ/tongue/dullahan zone = "abstract" @@ -138,4 +149,4 @@ D.myhead = null owner.gib() owner = null - ..() \ No newline at end of file + ..() diff --git a/code/modules/mob/living/carbon/human/species_types/dwarves.dm b/code/modules/mob/living/carbon/human/species_types/dwarves.dm new file mode 100644 index 0000000000..946bffbdbc --- /dev/null +++ b/code/modules/mob/living/carbon/human/species_types/dwarves.dm @@ -0,0 +1,192 @@ + +GLOBAL_LIST_INIT(dwarf_first, world.file2list("strings/names/dwarf_first.txt")) //Textfiles with first +GLOBAL_LIST_INIT(dwarf_last, world.file2list("strings/names/dwarf_last.txt")) //textfiles with last + +/datum/species/dwarf //not to be confused with the genetic manlets + name = "Dwarf" + id = "dwarf" //Also called Homo sapiens pumilionis + default_color = "FFFFFF" + species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,NO_UNDERWEAR) + inherent_traits = list() + default_features = list("mcolor" = "FFF", "wings" = "None") + limbs_id = "human" + use_skintones = 1 + say_mod = "bellows" //high energy, EXTRA BIOLOGICAL FUEL + damage_overlay_type = "human" + skinned_type = /obj/item/stack/sheet/animalhide/human + liked_food = ALCOHOL | MEAT | DAIRY //Dwarves like alcohol, meat, and dairy products. + disliked_food = JUNKFOOD | FRIED //Dwarves hate foods that have no nutrition other than alcohol. + mutant_organs = list(/obj/item/organ/dwarfgland) //Dwarven alcohol gland, literal gland warrior + mutantliver = /obj/item/organ/liver/dwarf //Dwarven super liver (Otherwise they r doomed) + +/mob/living/carbon/human/species/dwarf //species admin spawn path + race = /datum/species/dwarf //and the race the path is set to. + +/datum/species/dwarf/check_roundstart_eligible() + if(SSevents.holidays && SSevents.holidays[HALLOWEEN]) + return TRUE + return ..() + +/datum/species/dwarf/on_species_gain(mob/living/carbon/C, datum/species/old_species) + . = ..() + var/dwarf_hair = pick("Beard (Dwarf)", "Beard (Very Long)", "Beard (Long)") //beard roullette + var/mob/living/carbon/human/H = C + H.facial_hair_style = dwarf_hair + H.update_hair() + H.transform = H.transform.Scale(1, 0.8) //We use scale, and yeah. Dwarves can become gnomes with DWARFISM. + RegisterSignal(C, COMSIG_MOB_SAY, .proc/handle_speech) //We register handle_speech is being used. + + +/datum/species/dwarf/on_species_loss(mob/living/carbon/H, datum/species/new_species) + . = ..() + H.transform = H.transform.Scale(1, 1.25) //And we undo it. + UnregisterSignal(H, COMSIG_MOB_SAY) //We register handle_speech is not being used. + +//Dwarf Name stuff +/proc/dwarf_name() //hello caller: my name is urist mcuristurister + return "[pick(GLOB.dwarf_first)] [pick(GLOB.dwarf_last)]" + +/datum/species/dwarf/random_name(gender,unique,lastname) + return dwarf_name() //hello, ill return the value from dwarf_name proc to you when called. + +//Dwarf Speech handling - Basically a filter/forces them to say things. The IC helper +/datum/species/dwarf/proc/handle_speech(datum/source, list/speech_args) + var/message = speech_args[SPEECH_MESSAGE] + if(message[1] != "*") + message = " [message]" //Credits to goonstation for the strings list. + var/list/dwarf_words = strings("dwarf_replacement.json", "dwarf") //thanks to regex too. + + for(var/key in dwarf_words) //Theres like 1459 words or something man. + var/value = dwarf_words[key] //Thus they will always be in character. + if(islist(value)) //Whether they like it or not. + value = pick(value) //This could be drastically reduced if needed though. + + message = replacetextEx(message, " [uppertext(key)]", " [uppertext(value)]") + message = replacetextEx(message, " [capitalize(key)]", " [capitalize(value)]") + message = replacetextEx(message, " [key]", " [value]") //Also its scottish. + + if(prob(3)) + message += pick(" By Armok!") + speech_args[SPEECH_MESSAGE] = trim(message) + +//This mostly exists because my testdwarf's liver died while trying to also not die due to no alcohol. +/obj/item/organ/liver/dwarf + name = "dwarf liver" + icon_state = "liver" + desc = "A dwarven liver, theres something magical about seeing one of these up close." + alcohol_tolerance = 0 //dwarves really shouldn't be dying to alcohol. + toxTolerance = 5 //Shrugs off 5 units of toxins damage. + maxHealth = 150 //More health than the average liver, as you aren't going to be replacing this. + //If it does need replaced with a standard human liver, prepare for hell. + +//alcohol gland +/obj/item/organ/dwarfgland + name = "dwarf alcohol gland" + icon_state = "plasma" //Yes this is a actual icon in icons/obj/surgery.dmi + desc = "A genetically engineered gland which is hopefully a step forward for humanity." + w_class = WEIGHT_CLASS_NORMAL + var/stored_alcohol = 250 //They start with 250 units, that ticks down and eventaully bad effects occur + var/max_alcohol = 500 //Max they can attain, easier than you think to OD on alcohol. + var/heal_rate = 0.5 //The rate they heal damages over 400 alcohol stored. Default is 0.5 so we times 3 since 3 seconds. + var/alcohol_rate = 0.25 //The rate the alcohol ticks down per each iteration of dwarf_eth_ticker completing. + //These count in on_life ticks which should be 2 seconds per every increment of 1 in a perfect world. + var/dwarf_filth_ticker = 0 //Currently set =< 4, that means this will fire the proc around every 4-8 seconds. + var/dwarf_eth_ticker = 0 //Currently set =< 1, that means this will fire the proc around every 2 seconds + +/obj/item/organ/dwarfgland/prepare_eat() + var/obj/S = ..() + S.reagents.add_reagent("ethanol", stored_alcohol/10) + return S + +/obj/item/organ/dwarfgland/on_life() //Primary loop to hook into to start delayed loops for other loops.. + . = ..() + dwarf_cycle_ticker() + +//Handles the delayed tick cycle by just adding on increments per each on_life() tick +/obj/item/organ/dwarfgland/proc/dwarf_cycle_ticker() + if(owner.stat == DEAD) + return //We make sure they are not dead, so they don't increment any tickers. + dwarf_eth_ticker++ + dwarf_filth_ticker++ + + if(dwarf_filth_ticker >= 4) //Should be around 4-8 seconds since a tick is around 2 seconds. + dwarf_filth_cycle() //On_life will adjust regarding other factors, so we are along for the ride. + dwarf_filth_ticker = 0 //We set the ticker back to 0 to go again. + if(dwarf_eth_ticker >= 1) //Alcohol reagent check should be around 2 seconds, since a tick is around 2 seconds. + dwarf_eth_cycle() + dwarf_eth_ticker = 0 + +//If this still friggin uses too much CPU, I'll make a for view subsystem If I have to. +/obj/item/organ/dwarfgland/proc/dwarf_filth_cycle() + if(!owner?.client || !owner?.mind) + return + //Filth Reactions - Since miasma now exists + var/filth_counter = 0 //Holder for the filth check cycle, basically contains how much filth dwarf sees numerically. + for(var/fuck in view(owner,7)) //hello byond for view loop. + if(istype(fuck, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = fuck + if(H.stat == DEAD || (HAS_TRAIT(H, TRAIT_FAKEDEATH))) + filth_counter += 10 + if(istype(fuck, /obj/effect/decal/cleanable/blood)) + if(istype(fuck, /obj/effect/decal/cleanable/blood/gibs)) + filth_counter += 1 + else + filth_counter += 0.1 + if(istype(fuck,/obj/effect/decal/cleanable/vomit)) //They are disgusted by their own vomit too. + filth_counter += 10 //Dwarves could technically chainstun each other in a vomit tantrum spiral. + switch(filth_counter) + if(11 to 25) + if(prob(25)) + to_chat(owner, "Someone should really clean up in here!") + if(26 to 50) + if(prob(30)) //Probability the message appears + to_chat(owner, "The stench makes you queasy.") + if(prob(20)) //And then the probability they vomit along with it. + owner.vomit(20) //I think vomit should stay over a disgust adjustment. + if(51 to 75) + if(prob(35)) + to_chat(owner, "By Armok! You won't be able to keep alcohol down at all!") + if(prob(25)) + owner.vomit(20) //Its more funny + if(76 to 100) + if(prob(40)) + to_chat(owner, "You can't live in such FILTH!") + if(prob(25)) + owner.adjustToxLoss(10) //Now they start dying. + owner.vomit(20) + if(101 to INFINITY) //Now they will really start dying + if(prob(40)) + to_chat(owner, " THERES TOO MUCH FILTH, OH GODS THE FILTH!") + owner.adjustToxLoss(15) + owner.vomit(40) + CHECK_TICK //Check_tick right here, its motherfuckin magic. (To me at least) + +//Handles the dwarf alcohol cycle tied to on_life, it ticks in dwarf_cycle_ticker. +/obj/item/organ/dwarfgland/proc/dwarf_eth_cycle() + //BOOZE POWER + for(var/datum/reagent/R in owner.reagents.reagent_list) + if(istype(R, /datum/reagent/consumable/ethanol)) + var/datum/reagent/consumable/ethanol/E = R + stored_alcohol += (E.boozepwr / 50) + if(stored_alcohol > max_alcohol) //Dwarves technically start at 250 alcohol stored. + stored_alcohol = max_alcohol + var/heal_amt = heal_rate + stored_alcohol -= alcohol_rate //Subtracts alcohol_Rate from stored alcohol so EX: 250 - 0.25 per each loop that occurs. + if(stored_alcohol > 400) //If they are over 400 they start regenerating + owner.adjustBruteLoss(-heal_amt) //But its alcohol, there will be other issues here. + owner.adjustFireLoss(-heal_amt) //Unless they drink casually all the time. + owner.adjustOxyLoss(-heal_amt) + owner.adjustCloneLoss(-heal_amt) //Also they will probably get brain damage if thats a thing here. + if(prob(25)) + switch(stored_alcohol) + if(0 to 24) + to_chat(owner, "DAMNATION INCARNATE, WHY AM I CURSED WITH THIS DRY-SPELL? I MUST DRINK.") + owner.adjustToxLoss(35) + if(25 to 50) + to_chat(owner, "Oh DAMN, I need some brew!") + if(51 to 75) + to_chat(owner, "Your body aches, you need to get ahold of some booze...") + if(76 to 100) + to_chat(owner, "A pint of anything would really hit the spot right now.") + if(101 to 150) + to_chat(owner, "You feel like you could use a good brew.") diff --git a/code/modules/mob/living/carbon/human/species_types/felinid.dm b/code/modules/mob/living/carbon/human/species_types/felinid.dm index 1ee697d66c..ec58a3be9c 100644 --- a/code/modules/mob/living/carbon/human/species_types/felinid.dm +++ b/code/modules/mob/living/carbon/human/species_types/felinid.dm @@ -4,8 +4,8 @@ id = "felinid" limbs_id = "human" - mutant_bodyparts = list("mam_ears", "mam_tail") - default_features = list("mcolor" = "FFF", "mam_tail" = "Cat", "mam_ears" = "Cat", "wings" = "None") + mutant_bodyparts = list("mam_ears", "mam_tail", "deco_wings") + default_features = list("mcolor" = "FFF", "mam_tail" = "Cat", "mam_ears" = "Cat", "wings" = "None", "deco_wings" = "None") mutantears = /obj/item/organ/ears/cat mutanttail = /obj/item/organ/tail/cat diff --git a/code/modules/mob/living/carbon/human/species_types/flypeople.dm b/code/modules/mob/living/carbon/human/species_types/flypeople.dm index 043ee4fde1..0c3bcc2b00 100644 --- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm @@ -10,6 +10,7 @@ meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/fly disliked_food = null liked_food = GROSS + exotic_bloodtype = "BUG" /datum/species/fly/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) if(chem.id == "pestkiller") diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index e726d45347..90714b390c 100644 --- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -3,10 +3,10 @@ id = "mammal" default_color = "4B4B4B" should_draw_citadel = TRUE - species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,HORNCOLOR) + species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,HORNCOLOR,WINGCOLOR) inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID) - mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "mam_snouts", "taur", "horns", "legs") - default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", + mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "mam_snouts", "deco_wings", "taur", "horns", "legs") + default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "deco_wings" = "None", "mam_body_markings" = "Husky", "taur" = "None", "horns" = "None", "legs" = "Plantigrade", "meat_type" = "Mammalian") attack_verb = "claw" attack_sound = 'sound/weapons/slash.ogg' @@ -65,7 +65,7 @@ miss_sound = 'sound/weapons/slashmiss.ogg' meat = /obj/item/reagent_containers/food/snacks/meat/slab/xeno skinned_type = /obj/item/stack/sheet/animalhide/xeno - exotic_bloodtype = "L" + exotic_bloodtype = "X*" damage_overlay_type = "xeno" liked_food = MEAT diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index 84c44ea81c..a7e952f430 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -581,7 +581,7 @@ limbs_id = "cultgolem" sexes = FALSE info_text = "As a Runic Golem, you possess eldritch powers granted by the Elder Goddess Nar'Sie." - species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYES) //no mutcolors + species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYES,NOGENITALS,NOAROUSAL) //no mutcolors prefix = "Runic" special_names = null @@ -634,9 +634,10 @@ id = "clockwork golem" say_mod = "clicks" limbs_id = "clockgolem" - info_text = "As a Clockwork Golem, you are faster than other types of golems. On death, you will break down into scrap." - species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYES) + info_text = "As a Clockwork Golem, you are faster than other types of golems, and are capable of using guns. On death, you will break down into scrap." + species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYES,NOGENITALS,NOAROUSAL) inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID) + inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) armor = 20 //Reinforced, but much less so to allow for fast movement attack_verb = "smash" attack_sound = 'sound/magic/clockwork/anima_fragment_attack.ogg' @@ -682,7 +683,7 @@ blacklisted = TRUE dangerous_existence = TRUE random_eligible = FALSE - info_text = "As a Clockwork Golem Servant, you are faster than other types of golems." //warcult golems leave a corpse + info_text = "As a Clockwork Golem Servant, you are faster than other types of golems, and are capable of using guns." //warcult golems leave a corpse /datum/species/golem/cloth name = "Cloth Golem" @@ -691,7 +692,7 @@ sexes = FALSE info_text = "As a Cloth Golem, you are able to reform yourself after death, provided your remains aren't burned or destroyed. You are, of course, very flammable. \ Being made of cloth, your body is magic resistant and faster than that of other golems, but weaker and less resilient." - species_traits = list(NOBLOOD,NO_UNDERWEAR) //no mutcolors, and can burn + species_traits = list(NOBLOOD,NO_UNDERWEAR,NOGENITALS,NOAROUSAL) //no mutcolors, and can burn inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOGUNS) inherent_biotypes = list(MOB_UNDEAD, MOB_HUMANOID) armor = 15 //feels no pain, but not too resistant diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm index 96b43795a2..3332465c78 100644 --- a/code/modules/mob/living/carbon/human/species_types/humans.dm +++ b/code/modules/mob/living/carbon/human/species_types/humans.dm @@ -1,41 +1,42 @@ -/datum/species/human - name = "Human" - id = "human" - default_color = "FFFFFF" - species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS_PARTSONLY) - mutant_bodyparts = list("ears", "tail_human", "wings", "taur") // CITADEL EDIT gives humans snowflake parts - default_features = list("mcolor" = "FFF", "mcolor2" = "FFF","mcolor3" = "FFF","tail_human" = "None", "ears" = "None", "wings" = "None", "taur" = "None") - use_skintones = 1 - skinned_type = /obj/item/stack/sheet/animalhide/human - disliked_food = GROSS | RAW - liked_food = JUNKFOOD | FRIED - -/datum/species/human/qualifies_for_rank(rank, list/features) - return TRUE //Pure humans are always allowed in all roles. - -/datum/species/human/spec_death(gibbed, mob/living/carbon/human/H) - if(H) - stop_wagging_tail(H) - -/datum/species/human/spec_stun(mob/living/carbon/human/H,amount) - if(H) - stop_wagging_tail(H) - . = ..() - -/datum/species/human/can_wag_tail(mob/living/carbon/human/H) - return ("tail_human" in mutant_bodyparts) || ("waggingtail_human" in mutant_bodyparts) - -/datum/species/human/is_wagging_tail(mob/living/carbon/human/H) - return ("waggingtail_human" in mutant_bodyparts) - -/datum/species/human/start_wagging_tail(mob/living/carbon/human/H) - if("tail_human" in mutant_bodyparts) - mutant_bodyparts -= "tail_human" - mutant_bodyparts |= "waggingtail_human" - H.update_body() - -/datum/species/human/stop_wagging_tail(mob/living/carbon/human/H) - if("waggingtail_human" in mutant_bodyparts) - mutant_bodyparts -= "waggingtail_human" - mutant_bodyparts |= "tail_human" - H.update_body() +/datum/species/human + name = "Human" + id = "human" + default_color = "FFFFFF" + + species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS_PARTSONLY,WINGCOLOR) + mutant_bodyparts = list("ears", "tail_human", "wings", "taur", "deco_wings") // CITADEL EDIT gives humans snowflake parts + default_features = list("mcolor" = "FFF", "mcolor2" = "FFF","mcolor3" = "FFF","tail_human" = "None", "ears" = "None", "wings" = "None", "taur" = "None", "deco_wings" = "None") + use_skintones = 1 + skinned_type = /obj/item/stack/sheet/animalhide/human + disliked_food = GROSS | RAW + liked_food = JUNKFOOD | FRIED + +/datum/species/human/qualifies_for_rank(rank, list/features) + return TRUE //Pure humans are always allowed in all roles. + +/datum/species/human/spec_death(gibbed, mob/living/carbon/human/H) + if(H) + stop_wagging_tail(H) + +/datum/species/human/spec_stun(mob/living/carbon/human/H,amount) + if(H) + stop_wagging_tail(H) + . = ..() + +/datum/species/human/can_wag_tail(mob/living/carbon/human/H) + return ("tail_human" in mutant_bodyparts) || ("waggingtail_human" in mutant_bodyparts) + +/datum/species/human/is_wagging_tail(mob/living/carbon/human/H) + return ("waggingtail_human" in mutant_bodyparts) + +/datum/species/human/start_wagging_tail(mob/living/carbon/human/H) + if("tail_human" in mutant_bodyparts) + mutant_bodyparts -= "tail_human" + mutant_bodyparts |= "waggingtail_human" + H.update_body() + +/datum/species/human/stop_wagging_tail(mob/living/carbon/human/H) + if("waggingtail_human" in mutant_bodyparts) + mutant_bodyparts -= "waggingtail_human" + mutant_bodyparts |= "tail_human" + H.update_body() diff --git a/code/modules/mob/living/carbon/human/species_types/ipc.dm b/code/modules/mob/living/carbon/human/species_types/ipc.dm index 95b924ea18..135c98860a 100644 --- a/code/modules/mob/living/carbon/human/species_types/ipc.dm +++ b/code/modules/mob/living/carbon/human/species_types/ipc.dm @@ -12,8 +12,8 @@ default_features = list("ipc_screen" = "Blank", "ipc_antenna" = "None") meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/ipc mutanttongue = /obj/item/organ/tongue/robot/ipc - - exotic_blood = "oil" + mutant_heart = /obj/item/organ/heart/ipc + exotic_bloodtype = "HF" var/datum/action/innate/monitor_change/screen diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 03cd514300..f416854838 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -4,13 +4,15 @@ id = "jelly" default_color = "00FF90" say_mod = "chirps" - species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD) + species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,WINGCOLOR) mutantlungs = /obj/item/organ/lungs/slime - mutant_bodyparts = list("mam_tail", "mam_ears", "mam_snouts", "taur") //CIT CHANGE - default_features = list("mcolor" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "mam_snouts" = "None", "taur" = "None") //CIT CHANGE + mutant_heart = /obj/item/organ/heart/slime + mutant_bodyparts = list("mam_tail", "mam_ears", "mam_snouts", "taur", "deco_wings") //CIT CHANGE + default_features = list("mcolor" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "mam_snouts" = "None", "taur" = "None", "deco_wings" = "None") //CIT CHANGE inherent_traits = list(TRAIT_TOXINLOVER) meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime - exotic_blood = "slimejelly" + exotic_blood = "jellyblood" + exotic_bloodtype = "GEL" damage_overlay_type = "" var/datum/action/innate/regenerate_limbs/regenerate_limbs var/datum/action/innate/slime_change/slime_change //CIT CHANGE @@ -121,7 +123,7 @@ name = "Xenobiological Slime Entity" id = "slime" default_color = "00FFFF" - species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD) + species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR) say_mod = "says" hair_color = "mutcolor" hair_alpha = 150 @@ -396,7 +398,7 @@ id = "slimeperson" limbs_id = "slime" default_color = "00FFFF" - species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD) + species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR) inherent_traits = list(TRAIT_TOXINLOVER) mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "mam_snouts", "taur") default_features = list("mcolor" = "FFF", "mcolor2" = "FFF","mcolor3" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "mam_body_markings" = "Plain", "mam_snouts" = "None", "taur" = "None") diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 4dbfd23df8..a719f2eda0 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -4,16 +4,16 @@ id = "lizard" say_mod = "hisses" default_color = "00FF00" - species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,LIPS,HORNCOLOR) + species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,LIPS,HORNCOLOR,WINGCOLOR) inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID, MOB_REPTILE) - mutant_bodyparts = list("tail_lizard", "snout", "spines", "horns", "frills", "body_markings", "legs", "taur") + mutant_bodyparts = list("tail_lizard", "snout", "spines", "horns", "frills", "body_markings", "legs", "taur", "deco_wings") mutanttongue = /obj/item/organ/tongue/lizard mutanttail = /obj/item/organ/tail/lizard coldmod = 1.5 heatmod = 0.67 default_features = list("mcolor" = "0F0", "mcolor2" = "0F0", "mcolor3" = "0F0", "tail_lizard" = "Smooth", "snout" = "Round", "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None", - "legs" = "Digitigrade", "taur" = "None") + "legs" = "Digitigrade", "taur" = "None", "deco_wings" = "None") attack_verb = "slash" attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm index b4d47033f3..06f456e004 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -1,5 +1,5 @@ /datum/species/plasmaman - name = "Phoronoid" + name = "Plasmaman" id = "plasmaman" say_mod = "rattles" sexes = 0 @@ -16,7 +16,6 @@ burnmod = 1.5 heatmod = 1.5 breathid = "tox" - speedmod = 1 damage_overlay_type = ""//let's not show bloody wounds or burns over bones. var/internal_fire = FALSE //If the bones themselves are burning clothes won't help you much disliked_food = FRUIT @@ -55,19 +54,95 @@ ..() /datum/species/plasmaman/before_equip_job(datum/job/J, mob/living/carbon/human/H, visualsOnly = FALSE) + var/current_job = J.title var/datum/outfit/plasmaman/O = new /datum/outfit/plasmaman + switch(current_job) + if("Chaplain") + O = new /datum/outfit/plasmaman/chaplain + + if("Curator") + O = new /datum/outfit/plasmaman/curator + + if("Janitor") + O = new /datum/outfit/plasmaman/janitor + + if("Botanist") + O = new /datum/outfit/plasmaman/botany + + if("Bartender", "Lawyer") + O = new /datum/outfit/plasmaman/bar + + if("Cook") + O = new /datum/outfit/plasmaman/chef + + if("Security Officer") + O = new /datum/outfit/plasmaman/security + + if("Detective") + O = new /datum/outfit/plasmaman/detective + + if("Warden") + O = new /datum/outfit/plasmaman/warden + + if("Cargo Technician", "Quartermaster") + O = new /datum/outfit/plasmaman/cargo + + if("Shaft Miner") + O = new /datum/outfit/plasmaman/mining + + if("Medical Doctor") + O = new /datum/outfit/plasmaman/medical + + if("Chemist") + O = new /datum/outfit/plasmaman/chemist + + if("Geneticist") + O = new /datum/outfit/plasmaman/genetics + + if("Roboticist") + O = new /datum/outfit/plasmaman/robotics + + if("Virologist") + O = new /datum/outfit/plasmaman/viro + + if("Scientist") + O = new /datum/outfit/plasmaman/science + + if("Station Engineer") + O = new /datum/outfit/plasmaman/engineering + + if("Atmospheric Technician") + O = new /datum/outfit/plasmaman/atmospherics + + if("Captain") + O = new /datum/outfit/plasmaman/captain + + if("Head of Personnel") + O = new /datum/outfit/plasmaman/hop + + if("Head of Security") + O = new /datum/outfit/plasmaman/hos + + if("Chief Engineer") + O = new /datum/outfit/plasmaman/ce + + if("Chief Medical Officer") + O = new /datum/outfit/plasmaman/cmo + + if("Research Director") + O = new /datum/outfit/plasmaman/rd + + if("Mime") + O = new /datum/outfit/plasmaman/mime + + if("Clown") + O = new /datum/outfit/plasmaman/clown + H.equipOutfit(O, visualsOnly) H.internal = H.get_item_for_held_index(2) H.update_internals_hud_icon(1) return 0 -/datum/species/plasmaman/qualifies_for_rank(rank, list/features) - if(rank in GLOB.security_positions) - return 0 - if(rank == "Clown" || rank == "Mime")//No funny bussiness - return 0 - return ..() - /datum/species/plasmaman/random_name(gender,unique,lastname) if(unique) return random_unique_plasmaman_name() diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index 46207e5e60..f0dd48c6c1 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -36,8 +36,8 @@ var/turf/T = H.loc light_amount = min(1,T.get_lumcount()) - 0.5 H.nutrition += light_amount * light_nutrition_gain_factor - if(H.nutrition > NUTRITION_LEVEL_FULL) - H.nutrition = NUTRITION_LEVEL_FULL + if(H.nutrition >= NUTRITION_LEVEL_FULL) + H.nutrition = NUTRITION_LEVEL_FULL - 1 if(light_amount > 0.2) //if there's enough light, heal H.heal_overall_damage(light_bruteheal, light_burnheal) H.adjustToxLoss(-light_toxheal) diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index 754c48c3bd..09fc26d04f 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -102,6 +102,7 @@ color = "#1C1C1C" var/respawn_progress = 0 var/obj/item/light_eater/blade + decay_factor = 0 /obj/item/organ/heart/nightmare/attack(mob/M, mob/living/carbon/user, obj/target) @@ -122,10 +123,8 @@ if(special != HEART_SPECIAL_SHADOWIFY) blade = new/obj/item/light_eater M.put_in_hands(blade) - START_PROCESSING(SSobj, src) /obj/item/organ/heart/nightmare/Remove(mob/living/carbon/M, special = 0) - STOP_PROCESSING(SSobj, src) respawn_progress = 0 if(blade && special != HEART_SPECIAL_SHADOWIFY) QDEL_NULL(blade) @@ -138,9 +137,8 @@ /obj/item/organ/heart/nightmare/update_icon() return //always beating visually -/obj/item/organ/heart/nightmare/process() - if(QDELETED(owner) || owner.stat != DEAD) - respawn_progress = 0 +/obj/item/organ/heart/nightmare/on_death() + if(!owner) return var/turf/T = get_turf(owner) if(istype(T)) diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm index 135992f3a6..6a4c7a4463 100644 --- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm +++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm @@ -3,7 +3,7 @@ name = "Spooky Scary Skeleton" id = "skeleton" say_mod = "rattles" - blacklisted = 1 + blacklisted = 0 sexes = 0 meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton species_traits = list(NOBLOOD,NOGENITALS,NOAROUSAL) @@ -12,13 +12,19 @@ mutanttongue = /obj/item/organ/tongue/bone damage_overlay_type = ""//let's not show bloody wounds or burns over bones. disliked_food = NONE - liked_food = GROSS | MEAT | RAW + liked_food = GROSS | MEAT | RAW | DAIRY /datum/species/skeleton/check_roundstart_eligible() if(SSevents.holidays && SSevents.holidays[HALLOWEEN]) return TRUE return ..() -/datum/species/skeleton/pirate - name = "Space Queen's Skeleton" +/datum/species/skeleton/space + name = "Spooky Spacey Skeleton" + id = "spaceskeleton" + limbs_id = "skeleton" + blacklisted = 1 inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH, TRAIT_CALCIUM_HEALER) + +/datum/species/skeleton/space/check_roundstart_eligible() + return FALSE \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species_types/synths.dm b/code/modules/mob/living/carbon/human/species_types/synths.dm index e325cbb4f4..ac18580e9b 100644 --- a/code/modules/mob/living/carbon/human/species_types/synths.dm +++ b/code/modules/mob/living/carbon/human/species_types/synths.dm @@ -4,7 +4,7 @@ say_mod = "beep boops" //inherited from a user's real species sexes = 0 species_traits = list(NOTRANSSTING,NOGENITALS,NOAROUSAL) //all of these + whatever we inherit from the real species - inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER,TRAIT_NOBREATH) + inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOLIMBDISABLE,TRAIT_NOHUNGER,TRAIT_NOBREATH) inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID) dangerous_existence = 1 blacklisted = 1 @@ -12,7 +12,7 @@ damage_overlay_type = "synth" limbs_id = "synth" var/list/initial_species_traits = list(NOTRANSSTING) //for getting these values back for assume_disguise() - var/list/initial_inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER,TRAIT_NOBREATH) + var/list/initial_inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOLIMBDISABLE,TRAIT_NOHUNGER,TRAIT_NOBREATH) var/disguise_fail_health = 75 //When their health gets to this level their synthflesh partially falls off var/datum/species/fake_species = null //a species to do most of our work for us, unless we're damaged diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm index 504dbb514b..a1dce4fb0f 100644 --- a/code/modules/mob/living/carbon/human/species_types/zombies.dm +++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -16,7 +16,13 @@ disliked_food = NONE liked_food = GROSS | MEAT | RAW -/datum/species/zombie/check_roundstart_eligible() +/datum/species/zombie/notspaceproof + id = "notspaceproofzombie" + limbs_id = "zombie" + blacklisted = 0 + inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_NOBREATH,TRAIT_NODEATH,TRAIT_FAKEDEATH) + +/datum/species/zombie/notspaceproof/check_roundstart_eligible() if(SSevents.holidays && SSevents.holidays[HALLOWEEN]) return TRUE return ..() @@ -39,7 +45,7 @@ /datum/species/zombie/infectious/spec_stun(mob/living/carbon/human/H,amount) . = min(20, amount) -/datum/species/zombie/infectious/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H) +/datum/species/zombie/infectious/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE) . = ..() if(.) regen_cooldown = world.time + REGENERATION_DELAY @@ -47,7 +53,7 @@ /datum/species/zombie/infectious/spec_life(mob/living/carbon/C) . = ..() C.a_intent = INTENT_HARM // THE SUFFERING MUST FLOW - + //Zombies never actually die, they just fall down until they regenerate enough to rise back up. //They must be restrained, beheaded or gibbed to stop being a threat. if(regen_cooldown < world.time) @@ -58,7 +64,7 @@ C.adjustToxLoss(-heal_amt) if(!C.InCritical() && prob(4)) playsound(C, pick(spooks), 50, TRUE, 10) - + //Congrats you somehow died so hard you stopped being a zombie /datum/species/zombie/infectious/spec_death(mob/living/carbon/C) . = ..() diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 72ff7e7a60..a68aded85f 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -123,25 +123,20 @@ There are several things that need to be remembered: if(U.adjusted == ALT_STYLE) t_color = "[t_color]_d" - if(U.mutantrace_variation) - if(U.suit_style == DIGITIGRADE_SUIT_STYLE) - U.alternate_worn_icon = 'modular_citadel/icons/mob/uniform_digi.dmi' - if(U.adjusted == ALT_STYLE) - t_color = "[t_color]_d_l" - else if(U.adjusted == NORMAL_STYLE) - t_color = "[t_color]_l" - else - U.alternate_worn_icon = null + var/alt_worn = U.alternate_worn_icon + + if(!U.force_alternate_icon && U.mutantrace_variation && U.suit_style == DIGITIGRADE_SUIT_STYLE) + alt_worn = 'modular_citadel/icons/mob/uniform_digi.dmi' var/mutable_appearance/uniform_overlay if(dna && dna.species.sexes) var/G = (gender == FEMALE) ? "f" : "m" if(G == "f" && U.fitted != NO_FEMALE_UNIFORM) - uniform_overlay = U.build_worn_icon(state = "[t_color]", default_layer = UNIFORM_LAYER, default_icon_file = ((w_uniform.alternate_worn_icon) ? w_uniform.alternate_worn_icon : 'icons/mob/uniform.dmi'), isinhands = FALSE, femaleuniform = U.fitted) + uniform_overlay = U.build_worn_icon(state = "[t_color]", default_layer = UNIFORM_LAYER, default_icon_file = (alt_worn ? alt_worn : 'icons/mob/uniform.dmi'), isinhands = FALSE, femaleuniform = U.fitted) if(!uniform_overlay) - uniform_overlay = U.build_worn_icon(state = "[t_color]", default_layer = UNIFORM_LAYER, default_icon_file = ((w_uniform.alternate_worn_icon) ? w_uniform.alternate_worn_icon : 'icons/mob/uniform.dmi'), isinhands = FALSE) + uniform_overlay = U.build_worn_icon(state = "[t_color]", default_layer = UNIFORM_LAYER, default_icon_file = (alt_worn ? alt_worn : 'icons/mob/uniform.dmi'), isinhands = FALSE) if(OFFSET_UNIFORM in dna.species.offset_features) @@ -185,7 +180,7 @@ There are several things that need to be remembered: inv.update_icon() if(!gloves && bloody_hands) - var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER) + var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER, color = blood_DNA_to_color()) if(get_num_arms() < 2) if(has_left_hand()) bloody_overlay.icon_state = "bloodyhands_left" @@ -275,6 +270,32 @@ There are several things that need to be remembered: if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_SHOES] inv.update_icon() +/* + if(!shoes && bloody_feet) + var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyfeet", -SHOES_LAYER, color = blood_DNA_to_color()) + if(dna.features["taur"] != "None") + if(dna.features["taur"] in GLOB.noodle_taurs) + bloody_overlay = mutable_appearance('modular_citadel/icons/mob/64x32_effects.dmi', "snekbloodyfeet", -SHOES_LAYER, color = blood_DNA_to_color()) + if(get_num_legs() < 2) + if(has_left_leg()) + bloody_overlay.icon_state = "snekbloodyfeet_left" + else if(has_right_leg()) + bloody_overlay.icon_state = "snekbloodyfeet_right" + else if(dna.features["taur"] in GLOB.paw_taurs) + bloody_overlay = mutable_appearance('modular_citadel/icons/mob/64x32_effects.dmi', "pawbloodyfeet", -SHOES_LAYER, color = blood_DNA_to_color()) + if(get_num_legs() < 2) + if(has_left_leg()) + bloody_overlay.icon_state = "pawbloodyfeet_left" + else if(has_right_leg()) + bloody_overlay.icon_state = "pawbloodyfeet_right" + else + if(get_num_legs() < 2) + if(has_left_leg()) + bloody_overlay.icon_state = "bloodyfeet_left" + else if(has_right_leg()) + bloody_overlay.icon_state = "bloodyfeet_right" + + overlays_standing[GLOVES_LAYER] = bloody_overlay*/ if(shoes) var/obj/item/clothing/shoes/S = shoes @@ -388,22 +409,23 @@ There are several things that need to be remembered: client.screen += wear_suit update_observer_view(wear_suit,1) - if(!no_taur_thanks && S.mutantrace_variation) //Just make sure we've got this checked too - if(S.taurmode == NOT_TAURIC && S.adjusted == ALT_STYLE) //are we not a taur, but we have Digitigrade legs? Run this check first, then. - S.alternate_worn_icon = 'modular_citadel/icons/mob/suit_digi.dmi' - else - S.alternate_worn_icon = null - - if(S.tauric == TRUE) //Are we a suit with tauric mode possible? - if(S.taurmode == SNEK_TAURIC) - S.alternate_worn_icon = 'modular_citadel/icons/mob/taur_naga.dmi' - if(S.taurmode == PAW_TAURIC) - S.alternate_worn_icon = 'modular_citadel/icons/mob/taur_canine.dmi' - if(S.taurmode == NOT_TAURIC && S.adjusted == ALT_STYLE) + if(!S.force_alternate_icon) + if(!no_taur_thanks && S.mutantrace_variation) //Just make sure we've got this checked too + if(S.taurmode == NOT_TAURIC && S.adjusted == ALT_STYLE) //are we not a taur, but we have Digitigrade legs? Run this check first, then. S.alternate_worn_icon = 'modular_citadel/icons/mob/suit_digi.dmi' - else if(S.taurmode == NOT_TAURIC && S.adjusted == NORMAL_STYLE) + else S.alternate_worn_icon = null + if(S.tauric == TRUE) //Are we a suit with tauric mode possible? + if(S.taurmode == SNEK_TAURIC) + S.alternate_worn_icon = 'modular_citadel/icons/mob/taur_naga.dmi' + if(S.taurmode == PAW_TAURIC) + S.alternate_worn_icon = 'modular_citadel/icons/mob/taur_canine.dmi' + if(S.taurmode == NOT_TAURIC && S.adjusted == ALT_STYLE) + S.alternate_worn_icon = 'modular_citadel/icons/mob/suit_digi.dmi' + else if(S.taurmode == NOT_TAURIC && S.adjusted == NORMAL_STYLE) + S.alternate_worn_icon = null + overlays_standing[SUIT_LAYER] = S.build_worn_icon(state = wear_suit.icon_state, default_layer = SUIT_LAYER, default_icon_file = ((wear_suit.alternate_worn_icon) ? S.alternate_worn_icon : 'icons/mob/suit.dmi')) var/mutable_appearance/suit_overlay = overlays_standing[SUIT_LAYER] if(OFFSET_SUIT in dna.species.offset_features) @@ -707,9 +729,9 @@ generate/load female uniform sprites matching all previously decided variables if(lip_style && (LIPS in dna.species.species_traits)) var/mutable_appearance/lip_overlay = mutable_appearance('icons/mob/human_face.dmi', "lips_[lip_style]", -BODY_LAYER) lip_overlay.color = lip_color - if(OFFSET_FACE in dna.species.offset_features) - lip_overlay.pixel_x += dna.species.offset_features[OFFSET_FACE][1] - lip_overlay.pixel_y += dna.species.offset_features[OFFSET_FACE][2] + if(OFFSET_LIPS in dna.species.offset_features) + lip_overlay.pixel_x += dna.species.offset_features[OFFSET_LIPS][1] + lip_overlay.pixel_y += dna.species.offset_features[OFFSET_LIPS][2] add_overlay(lip_overlay) // eyes @@ -722,9 +744,9 @@ generate/load female uniform sprites matching all previously decided variables eye_overlay = mutable_appearance('icons/mob/human_face.dmi', "eyes", -BODY_LAYER) if((EYECOLOR in dna.species.species_traits) && has_eyes) eye_overlay.color = "#" + eye_color - if(OFFSET_FACE in dna.species.offset_features) - eye_overlay.pixel_x += dna.species.offset_features[OFFSET_FACE][1] - eye_overlay.pixel_y += dna.species.offset_features[OFFSET_FACE][2] + if(OFFSET_EYES in dna.species.offset_features) + eye_overlay.pixel_x += dna.species.offset_features[OFFSET_EYES][1] + eye_overlay.pixel_y += dna.species.offset_features[OFFSET_EYES][2] add_overlay(eye_overlay) dna.species.handle_hair(src) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 36e4e18817..5b18e95235 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -8,8 +8,8 @@ damageoverlaytemp = 0 update_damage_hud() - if(stat != DEAD) //Reagent processing needs to come before breathing, to prevent edge cases. - handle_organs() + //Reagent processing needs to come before breathing, to prevent edge cases. + handle_organs() . = ..() @@ -28,11 +28,14 @@ if(stat != DEAD) handle_brain_damage() + /* BUG_PROBABLE_CAUSE if(stat != DEAD) handle_liver() + */ if(stat == DEAD) stop_sound_channel(CHANNEL_HEARTBEAT) + handle_death() rot() //Updates the number of stored chemicals for powers @@ -41,14 +44,34 @@ if(stat != DEAD) return 1 +//Procs called while dead +/mob/living/carbon/proc/handle_death() + for(var/datum/reagent/R in reagents.reagent_list) + if(R.chemical_flags & REAGENT_DEAD_PROCESS) + R.on_mob_dead(src) + /////////////// // BREATHING // /////////////// //Start of a breath chain, calls breathe() /mob/living/carbon/handle_breathing(times_fired) - if((times_fired % 4) == 2 || failed_last_breath) - breathe() //Breathe per 4 ticks, unless suffocating + var/next_breath = 4 + var/obj/item/organ/lungs/L = getorganslot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/heart/H = getorganslot(ORGAN_SLOT_HEART) + if(L) + if(L.damage > L.high_threshold) + next_breath-- + if(H) + if(H.damage > H.high_threshold) + next_breath-- + + if((times_fired % next_breath) == 0 || failed_last_breath) + breathe() //Breathe per 4 ticks if healthy, down to 2 if our lungs or heart are damaged, unless suffocating + if(failed_last_breath) + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "suffocation", /datum/mood_event/suffocation) + else + SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "suffocation") else if(istype(loc, /obj/)) var/obj/location_as_object = loc @@ -56,6 +79,7 @@ //Second link in a breath chain, calls check_breath() /mob/living/carbon/proc/breathe() + var/obj/item/organ/lungs = getorganslot(ORGAN_SLOT_LUNGS) if(reagents.has_reagent("lexorin")) return if(istype(loc, /obj/machinery/atmospherics/components/unary/cryo_cell)) @@ -74,7 +98,7 @@ var/datum/gas_mixture/breath if(!getorganslot(ORGAN_SLOT_BREATHING_TUBE)) - if(health <= HEALTH_THRESHOLD_FULLCRIT || (pulledby && pulledby.grab_state >= GRAB_KILL)) + if(health <= HEALTH_THRESHOLD_FULLCRIT || (pulledby && pulledby.grab_state >= GRAB_KILL) || lungs.organ_flags & ORGAN_FAILING) losebreath++ //You can't breath at all when in critical or when being choked, so you're going to miss a breath else if(health <= crit_threshold) @@ -126,7 +150,7 @@ if((status_flags & GODMODE)) return - var/lungs = getorganslot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/lungs = getorganslot(ORGAN_SLOT_LUNGS) if(!lungs) adjustOxyLoss(2) @@ -366,9 +390,16 @@ . |= BP.on_life() /mob/living/carbon/proc/handle_organs() - for(var/V in internal_organs) - var/obj/item/organ/O = V - O.on_life() + if(stat != DEAD) + for(var/V in internal_organs) + var/obj/item/organ/O = V + if(O) + O.on_life() + else + for(var/V in internal_organs) + var/obj/item/organ/O = V + if(O) + O.on_death() //Needed so organs decay while inside the body. /mob/living/carbon/handle_diseases() for(var/thing in diseases) @@ -475,7 +506,7 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put /mob/living/carbon/handle_status_effects() ..() if(getStaminaLoss() && !combatmode)//CIT CHANGE - prevents stamina regen while combat mode is active - adjustStaminaLoss(resting ? (recoveringstam ? -7.5 : -3) : -1.5)//CIT CHANGE - decreases adjuststaminaloss to stop stamina damage from being such a joke + adjustStaminaLoss(resting ? (recoveringstam ? -7.5 : -6) : -3)//CIT CHANGE - decreases adjuststaminaloss to stop stamina damage from being such a joke if(!recoveringstam && incomingstammult != 1) incomingstammult = max(0.01, incomingstammult) @@ -613,7 +644,7 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put to_chat(src, "Maybe you should lie down for a bit...") if(drunkenness >= 91) - adjustBrainLoss(0.4, 60) + adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.4, 60) if(prob(20) && !stat) if(SSshuttle.emergency.mode == SHUTTLE_DOCKED && is_station_level(z)) //QoL mainly to_chat(src, "You're so tired... but you can't miss that shuttle...") @@ -647,8 +678,8 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put if((!dna && !liver) || (NOLIVER in dna.species.species_traits)) return if(liver) - if(liver.damage >= liver.maxHealth) - liver.failing = TRUE + if(liver.damage < liver.maxHealth) + liver.organ_flags |= ORGAN_FAILING liver_failure() else liver_failure() @@ -671,7 +702,7 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put /mob/living/carbon/proc/liver_failure() reagents.end_metabolization(src, keep_liverless = TRUE) //Stops trait-based effects on reagents, to prevent permanent buffs reagents.metabolize(src, can_overdose=FALSE, liverless = TRUE) - if(HAS_TRAIT(src, TRAIT_STABLEHEART)) + if(HAS_TRAIT(src, TRAIT_STABLELIVER)) return adjustToxLoss(4, TRUE, TRUE) if(prob(30)) @@ -687,13 +718,6 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put var/datum/brain_trauma/BT = T BT.on_life() - if(getBrainLoss() >= BRAIN_DAMAGE_DEATH) //rip - to_chat(src, "The last spark of life in your brain fizzles out...") - death() - var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN) - if(B) - B.damaged_brain = TRUE - ///////////////////////////////////// //MONKEYS WITH TOO MUCH CHOLOESTROL// ///////////////////////////////////// @@ -702,7 +726,7 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put if(!needs_heart()) return FALSE var/obj/item/organ/heart/heart = getorganslot(ORGAN_SLOT_HEART) - if(!heart || heart.synthetic) + if(!heart || (heart.organ_flags & ORGAN_SYNTHETIC)) return FALSE return TRUE diff --git a/code/modules/mob/living/carbon/monkey/inventory.dm b/code/modules/mob/living/carbon/monkey/inventory.dm index fdc28d13a0..d5fffc70a2 100644 --- a/code/modules/mob/living/carbon/monkey/inventory.dm +++ b/code/modules/mob/living/carbon/monkey/inventory.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/monkey/can_equip(obj/item/I, slot, disable_warning = 0) +/mob/living/carbon/monkey/can_equip(obj/item/I, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE) switch(slot) if(SLOT_HANDS) if(get_empty_held_indexes()) diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm index 5662f25993..63a83ac96b 100644 --- a/code/modules/mob/living/carbon/update_icons.dm +++ b/code/modules/mob/living/carbon/update_icons.dm @@ -97,8 +97,12 @@ /mob/living/carbon/update_damage_overlays() remove_overlay(DAMAGE_LAYER) + var/dam_colors = "#E62525" + if(ishuman(src)) + var/mob/living/carbon/human/H = src + dam_colors = bloodtype_to_color(H.dna.blood_type) - var/mutable_appearance/damage_overlay = mutable_appearance('icons/mob/dam_mob.dmi', "blank", -DAMAGE_LAYER) + var/mutable_appearance/damage_overlay = mutable_appearance('icons/mob/dam_mob.dmi', "blank", -DAMAGE_LAYER, color = dam_colors) overlays_standing[DAMAGE_LAYER] = damage_overlay for(var/X in bodyparts) @@ -189,7 +193,7 @@ var/mutable_appearance/legcuffs = mutable_appearance('icons/mob/restraints.dmi', legcuffed.item_state, -LEGCUFF_LAYER) legcuffs.color = legcuffed.color - overlays_standing[HANDCUFF_LAYER] = legcuffs + overlays_standing[LEGCUFF_LAYER] = legcuffs apply_overlay(LEGCUFF_LAYER) throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = legcuffed) diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index b2eed2d19e..dc43ab8b07 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -8,25 +8,24 @@ Returns standard 0 if fail */ -/mob/living/proc/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE) +/mob/living/proc/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE) var/hit_percent = (100-blocked)/100 if(!damage || (hit_percent <= 0)) return 0 + var/damage_amount = forced ? damage : damage * hit_percent switch(damagetype) if(BRUTE) - adjustBruteLoss(damage * hit_percent) + adjustBruteLoss(damage_amount, forced = forced) if(BURN) - adjustFireLoss(damage * hit_percent) + adjustFireLoss(damage_amount, forced = forced) if(TOX) - adjustToxLoss(damage * hit_percent) + adjustToxLoss(damage_amount, forced = forced) if(OXY) - adjustOxyLoss(damage * hit_percent) + adjustOxyLoss(damage_amount, forced = forced) if(CLONE) - adjustCloneLoss(damage * hit_percent) + adjustCloneLoss(damage_amount, forced = forced) if(STAMINA) - adjustStaminaLoss(damage * hit_percent) - if(BRAIN) - adjustBrainLoss(damage * hit_percent) + adjustStaminaLoss(damage_amount, forced = forced) return 1 /mob/living/proc/apply_damage_type(damage = 0, damagetype = BRUTE) //like apply damage except it always uses the damage procs @@ -43,8 +42,6 @@ return adjustCloneLoss(damage) if(STAMINA) return adjustStaminaLoss(damage) - if(BRAIN) - return adjustBrainLoss(damage) /mob/living/proc/get_damage_amount(damagetype = BRUTE) switch(damagetype) @@ -60,8 +57,6 @@ return getCloneLoss() if(STAMINA) return getStaminaLoss() - if(BRAIN) - return getBrainLoss() /mob/living/proc/apply_damages(brute = 0, burn = 0, tox = 0, oxy = 0, clone = 0, def_zone = null, blocked = FALSE, stamina = 0, brain = 0) @@ -85,7 +80,7 @@ -/mob/living/proc/apply_effect(effect = 0,effecttype = EFFECT_STUN, blocked = FALSE) +/mob/living/proc/apply_effect(effect = 0,effecttype = EFFECT_STUN, blocked = FALSE, knockdown_stamoverride, knockdown_stammax) var/hit_percent = (100-blocked)/100 if(!effect || (hit_percent <= 0)) return 0 @@ -93,7 +88,7 @@ if(EFFECT_STUN) Stun(effect * hit_percent) if(EFFECT_KNOCKDOWN) - Knockdown(effect * hit_percent) + Knockdown(effect * hit_percent, override_stamdmg = knockdown_stammax ? CLAMP(knockdown_stamoverride, 0, knockdown_stammax-getStaminaLoss()) : knockdown_stamoverride) if(EFFECT_UNCONSCIOUS) Unconscious(effect * hit_percent) if(EFFECT_IRRADIATE) @@ -113,13 +108,13 @@ return 1 -/mob/living/proc/apply_effects(stun = 0, knockdown = 0, unconscious = 0, irradiate = 0, slur = 0, stutter = 0, eyeblur = 0, drowsy = 0, blocked = FALSE, stamina = 0, jitter = 0) +/mob/living/proc/apply_effects(stun = 0, knockdown = 0, unconscious = 0, irradiate = 0, slur = 0, stutter = 0, eyeblur = 0, drowsy = 0, blocked = FALSE, stamina = 0, jitter = 0, kd_stamoverride, kd_stammax) if(blocked >= 100) return 0 if(stun) apply_effect(stun, EFFECT_STUN, blocked) if(knockdown) - apply_effect(knockdown, EFFECT_KNOCKDOWN, blocked) + apply_effect(knockdown, EFFECT_KNOCKDOWN, blocked, kd_stamoverride, kd_stammax) if(unconscious) apply_effect(unconscious, EFFECT_UNCONSCIOUS, blocked) if(irradiate) @@ -218,13 +213,13 @@ updatehealth() return amount -/mob/living/proc/getBrainLoss() - . = 0 - -/mob/living/proc/adjustBrainLoss(amount, maximum = BRAIN_DAMAGE_DEATH) +/mob/living/proc/adjustOrganLoss(slot, amount, maximum) return -/mob/living/proc/setBrainLoss(amount) +/mob/living/proc/setOrganLoss(slot, amount, maximum) + return + +/mob/living/proc/getOrganLoss(slot) return /mob/living/proc/getStaminaLoss() diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index f16572c5d0..f7dec3272c 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -13,6 +13,10 @@ if(!no_bodyparts) spread_bodyparts(no_brain, no_organs) + for(var/X in implants) + var/obj/item/implant/I = X + qdel(I) + spawn_gibs(no_bodyparts) qdel(src) diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 25d8c4d44c..df711a6dca 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -255,7 +255,7 @@ H.Knockdown(20) else message_param = "bumps [user.p_their()] head on the ground trying to motion towards %t." - H.adjustBrainLoss(5) + H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5) ..() /datum/emote/living/pout diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 19f18f9973..d249cd1a61 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -287,6 +287,8 @@ if(HAS_TRAIT(src, TRAIT_STRONG_GRABBER)) C.grippedby(src) + update_pull_movespeed() + //mob verbs are a lot faster than object verbs //for more info on why this is not atom/pull, see examinate() in mob.dm /mob/living/verb/pulled(atom/movable/AM as mob|obj in oview(1)) @@ -300,6 +302,7 @@ /mob/living/stop_pulling() ..() + update_pull_movespeed() update_pull_hud_icon() /mob/living/verb/stop_pulling1() @@ -343,6 +346,11 @@ if(stat || IsUnconscious() || IsStun() || IsKnockdown() || recoveringstam || (!ignore_restraints && restrained(ignore_grab))) // CIT CHANGE - adds recoveringstam check here return TRUE +/mob/living/canUseStorage() + if (get_num_arms() <= 0) + return FALSE + return TRUE + /mob/living/proc/InCritical() return (health <= crit_threshold && (stat == SOFT_CRIT || stat == UNCONSCIOUS)) @@ -473,7 +481,6 @@ setToxLoss(0, 0) //zero as second argument not automatically call updatehealth(). setOxyLoss(0, 0) setCloneLoss(0, 0) - setBrainLoss(0) setStaminaLoss(0, 0) SetUnconscious(0, FALSE) set_disgust(0) @@ -495,11 +502,18 @@ fire_stacks = 0 confused = 0 update_canmove() - GET_COMPONENT(mood, /datum/component/mood) + var/datum/component/mood/mood = GetComponent(/datum/component/mood) if (mood) QDEL_LIST_ASSOC_VAL(mood.mood_events) mood.sanity = SANITY_GREAT mood.update_mood() + //Heal all organs + if(iscarbon(src)) + var/mob/living/carbon/C = src + if(C.internal_organs) + for(var/organ in C.internal_organs) + var/obj/item/organ/O = organ + O.setOrganDamage(0) //proc called by revive(), to check if we can actually ressuscitate the mob (we don't want to revive him and have him instantly die again) @@ -520,6 +534,10 @@ var/old_direction = dir var/turf/T = loc + + if(pulling) + update_pull_movespeed() + . = ..() if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1)//separated from our puller and not in the middle of a diagonal move. @@ -894,7 +912,7 @@ if(mind) mind.transfer_to(new_mob) else - new_mob.key = key + transfer_ckey(new_mob) for(var/para in hasparasites()) var/mob/living/simple_animal/hostile/guardian/G = para @@ -1023,6 +1041,9 @@ stop_pulling() //CIT CHANGE - Ditto... else if(has_legs || ignore_legs) lying = 0 + if (pulledby) + var/mob/living/L = pulledby + L.update_pull_movespeed() if(buckled) lying = 90*buckle_lying else if(!lying) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index e434bc4e95..9d04f288cd 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -153,7 +153,7 @@ to_chat(user, "[src] can't be grabbed more aggressively!") return FALSE - if(HAS_TRAIT(user, TRAIT_PACIFISM)) + if(user.grab_state >= GRAB_AGGRESSIVE && HAS_TRAIT(user, TRAIT_PACIFISM)) to_chat(user, "You don't want to risk hurting [src]!") return FALSE @@ -184,11 +184,17 @@ user.grab_state++ switch(user.grab_state) if(GRAB_AGGRESSIVE) - log_combat(user, src, "grabbed", addition="aggressive grab") - visible_message("[user] has grabbed [src] aggressively!", \ - "[user] has grabbed [src] aggressively!") - drop_all_held_items() + var/add_log = "" + if(HAS_TRAIT(user, TRAIT_PACIFISM)) + visible_message("[user] has firmly gripped [src]!", + "[user] has firmly gripped you!") + add_log = " (pacifist)" + else + visible_message("[user] has grabbed [src] aggressively!", \ + "[user] has grabbed you aggressively!") + drop_all_held_items() stop_pulling() + log_combat(user, src, "grabbed", addition="aggressive grab[add_log]") if(GRAB_NECK) log_combat(user, src, "grabbed", addition="neck grab") visible_message("[user] has grabbed [src] by the neck!",\ diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index c24e6ab108..4d2a36907d 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -2,7 +2,7 @@ see_invisible = SEE_INVISIBLE_LIVING sight = 0 see_in_dark = 2 - hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD,NANITE_HUD,DIAG_NANITE_FULL_HUD) + hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD,NANITE_HUD,DIAG_NANITE_FULL_HUD,RAD_HUD) pressure_resistance = 10 var/resize = 1 //Badminnery resize @@ -110,3 +110,5 @@ //List of active diseases var/list/diseases = list() // list of all diseases in a mob var/list/disease_resistances = list() + + var/drag_slowdown = TRUE //Whether the mob is slowed down when dragging another prone mob \ No newline at end of file diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm index 9566edc2ed..1ee563bc1f 100644 --- a/code/modules/mob/living/living_movement.dm +++ b/code/modules/mob/living/living_movement.dm @@ -25,3 +25,11 @@ add_movespeed_modifier(MOVESPEED_ID_LIVING_TURF_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = T.slowdown) else remove_movespeed_modifier(MOVESPEED_ID_LIVING_TURF_SPEEDMOD) + +/mob/living/proc/update_pull_movespeed() + if(pulling && isliving(pulling)) + var/mob/living/L = pulling + if(drag_slowdown && L.lying && !L.buckled && grab_state < GRAB_AGGRESSIVE) + add_movespeed_modifier(MOVESPEED_ID_PRONE_DRAGGING, multiplicative_slowdown = PULL_PRONE_SLOWDOWN) + return + remove_movespeed_modifier(MOVESPEED_ID_PRONE_DRAGGING) \ No newline at end of file diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 3b045b9eee..174fd5c394 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -357,8 +357,8 @@ GLOBAL_LIST_INIT(department_radio_keys, list( return message /mob/living/proc/radio(message, message_mode, list/spans, language) - var/obj/item/implant/radio/imp = locate() in src - if(imp && imp.radio.on) + var/obj/item/implant/radio/imp = locate() in implants + if(imp?.radio.on) if(message_mode == MODE_HEADSET) imp.radio.talk_into(src, message, , spans, language) return ITALICS | REDUCE_RANGE @@ -391,16 +391,16 @@ GLOBAL_LIST_INIT(department_radio_keys, list( return 0 /mob/living/say_mod(input, message_mode) - if(message_mode == MODE_WHISPER) - . = verb_whisper - else if(message_mode == MODE_WHISPER_CRIT) + . = ..() + if(message_mode == MODE_WHISPER_CRIT) . = "[verb_whisper] in [p_their()] last breath" - else if(stuttering) - . = "stammers" - else if(derpspeech) - . = "gibbers" - else - . = ..() + else if(message_mode != MODE_CUSTOM_SAY) + if(message_mode == MODE_WHISPER) + . = verb_whisper + else if(stuttering) + . = "stammers" + else if(derpspeech) + . = "gibbers" /mob/living/whisper(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) say("#[message]", bubble_type, spans, sanitize, language, ignore_spam, forced) diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm index c6d4527812..f757203237 100644 --- a/code/modules/mob/living/silicon/ai/say.dm +++ b/code/modules/mob/living/silicon/ai/say.dm @@ -49,7 +49,7 @@ else padloc = "(UNKNOWN)" src.log_talk(message, LOG_SAY, tag="HOLOPAD in [padloc]") - send_speech(message, 7, T, "robot", language = language) + send_speech(message, 7, T, "robot", message_language = language) to_chat(src, "Holopad transmitted, [real_name] \"[message]\"") else to_chat(src, "No holopad connected.") diff --git a/code/modules/mob/living/silicon/ai/vox_sounds.dm b/code/modules/mob/living/silicon/ai/vox_sounds.dm index eb6d0ce991..50a808032d 100644 --- a/code/modules/mob/living/silicon/ai/vox_sounds.dm +++ b/code/modules/mob/living/silicon/ai/vox_sounds.dm @@ -975,4 +975,635 @@ GLOBAL_LIST_INIT(vox_sounds, list("abduction" = 'sound/vox_fem/abduction.ogg', "zombie" = 'sound/vox_fem/zombie.ogg', "zone" = 'sound/vox_fem/zone.ogg', "zulu" = 'sound/vox_fem/zulu.ogg')) + +//for vim +// :%s/\(\(.*\)\.ogg\)/"\2" = 'sound\/vox\/\1',/g +GLOBAL_LIST_INIT(vox_sounds_male, list("," = 'sound/vox/_comma.ogg', +"." = 'sound/vox/_period.ogg', +"a" = 'sound/vox/a.ogg', +"accelerating" = 'sound/vox/accelerating.ogg', +"accelerator" = 'sound/vox/accelerator.ogg', +"accepted" = 'sound/vox/accepted.ogg', +"access" = 'sound/vox/access.ogg', +"acknowledge" = 'sound/vox/acknowledge.ogg', +"acknowledged" = 'sound/vox/acknowledged.ogg', +"acquired" = 'sound/vox/acquired.ogg', +"acquisition" = 'sound/vox/acquisition.ogg', +"across" = 'sound/vox/across.ogg', +"activate" = 'sound/vox/activate.ogg', +"activated" = 'sound/vox/activated.ogg', +"activity" = 'sound/vox/activity.ogg', +"adios" = 'sound/vox/adios.ogg', +"administration" = 'sound/vox/administration.ogg', +"advanced" = 'sound/vox/advanced.ogg', +"after" = 'sound/vox/after.ogg', +"agent" = 'sound/vox/agent.ogg', +"alarm" = 'sound/vox/alarm.ogg', +"alert" = 'sound/vox/alert.ogg', +"alien" = 'sound/vox/alien.ogg', +"aligned" = 'sound/vox/aligned.ogg', +"all" = 'sound/vox/all.ogg', +"alpha" = 'sound/vox/alpha.ogg', +"am" = 'sound/vox/am.ogg', +"amigo" = 'sound/vox/amigo.ogg', +"ammunition" = 'sound/vox/ammunition.ogg', +"an" = 'sound/vox/an.ogg', +"and" = 'sound/vox/and.ogg', +"announcement" = 'sound/vox/announcement.ogg', +"anomalous" = 'sound/vox/anomalous.ogg', +"antenna" = 'sound/vox/antenna.ogg', +"any" = 'sound/vox/any.ogg', +"apprehend" = 'sound/vox/apprehend.ogg', +"approach" = 'sound/vox/approach.ogg', +"are" = 'sound/vox/are.ogg', +"area" = 'sound/vox/area.ogg', +"arm" = 'sound/vox/arm.ogg', +"armed" = 'sound/vox/armed.ogg', +"armor" = 'sound/vox/armor.ogg', +"armory" = 'sound/vox/armory.ogg', +"arrest" = 'sound/vox/arrest.ogg', +"ass" = 'sound/vox/ass.ogg', +"at" = 'sound/vox/at.ogg', +"atomic" = 'sound/vox/atomic.ogg', +"attention" = 'sound/vox/attention.ogg', +"authorize" = 'sound/vox/authorize.ogg', +"authorized" = 'sound/vox/authorized.ogg', +"automatic" = 'sound/vox/automatic.ogg', +"away" = 'sound/vox/away.ogg', +"b" = 'sound/vox/b.ogg', +"back" = 'sound/vox/back.ogg', +"backman" = 'sound/vox/backman.ogg', +"bad" = 'sound/vox/bad.ogg', +"bag" = 'sound/vox/bag.ogg', +"bailey" = 'sound/vox/bailey.ogg', +"barracks" = 'sound/vox/barracks.ogg', +"base" = 'sound/vox/base.ogg', +"bay" = 'sound/vox/bay.ogg', +"be" = 'sound/vox/be.ogg', +"been" = 'sound/vox/been.ogg', +"before" = 'sound/vox/before.ogg', +"beyond" = 'sound/vox/beyond.ogg', +"biohazard" = 'sound/vox/biohazard.ogg', +"biological" = 'sound/vox/biological.ogg', +"birdwell" = 'sound/vox/birdwell.ogg', +"bizwarn" = 'sound/vox/bizwarn.ogg', +"black" = 'sound/vox/black.ogg', +"blast" = 'sound/vox/blast.ogg', +"blocked" = 'sound/vox/blocked.ogg', +"bloop" = 'sound/vox/bloop.ogg', +"blue" = 'sound/vox/blue.ogg', +"bottom" = 'sound/vox/bottom.ogg', +"bravo" = 'sound/vox/bravo.ogg', +"breach" = 'sound/vox/breach.ogg', +"breached" = 'sound/vox/breached.ogg', +"break" = 'sound/vox/break.ogg', +"bridge" = 'sound/vox/bridge.ogg', +"bust" = 'sound/vox/bust.ogg', +"but" = 'sound/vox/but.ogg', +"button" = 'sound/vox/button.ogg', +"buzwarn" = 'sound/vox/buzwarn.ogg', +"bypass" = 'sound/vox/bypass.ogg', +"c" = 'sound/vox/c.ogg', +"cable" = 'sound/vox/cable.ogg', +"call" = 'sound/vox/call.ogg', +"called" = 'sound/vox/called.ogg', +"canal" = 'sound/vox/canal.ogg', +"cap" = 'sound/vox/cap.ogg', +"captain" = 'sound/vox/captain.ogg', +"capture" = 'sound/vox/capture.ogg', +"captured" = 'sound/vox/captured.ogg', +"ceiling" = 'sound/vox/ceiling.ogg', +"celsius" = 'sound/vox/celsius.ogg', +"center" = 'sound/vox/center.ogg', +"centi" = 'sound/vox/centi.ogg', +"central" = 'sound/vox/central.ogg', +"chamber" = 'sound/vox/chamber.ogg', +"charlie" = 'sound/vox/charlie.ogg', +"check" = 'sound/vox/check.ogg', +"checkpoint" = 'sound/vox/checkpoint.ogg', +"chemical" = 'sound/vox/chemical.ogg', +"cleanup" = 'sound/vox/cleanup.ogg', +"clear" = 'sound/vox/clear.ogg', +"clearance" = 'sound/vox/clearance.ogg', +"close" = 'sound/vox/close.ogg', +"clown" = 'sound/vox/clown.ogg', +"code" = 'sound/vox/code.ogg', +"coded" = 'sound/vox/coded.ogg', +"collider" = 'sound/vox/collider.ogg', +"command" = 'sound/vox/command.ogg', +"communication" = 'sound/vox/communication.ogg', +"complex" = 'sound/vox/complex.ogg', +"computer" = 'sound/vox/computer.ogg', +"condition" = 'sound/vox/condition.ogg', +"containment" = 'sound/vox/containment.ogg', +"contamination" = 'sound/vox/contamination.ogg', +"control" = 'sound/vox/control.ogg', +"coolant" = 'sound/vox/coolant.ogg', +"coomer" = 'sound/vox/coomer.ogg', +"core" = 'sound/vox/core.ogg', +"correct" = 'sound/vox/correct.ogg', +"corridor" = 'sound/vox/corridor.ogg', +"crew" = 'sound/vox/crew.ogg', +"cross" = 'sound/vox/cross.ogg', +"cryogenic" = 'sound/vox/cryogenic.ogg', +"d" = 'sound/vox/d.ogg', +"dadeda" = 'sound/vox/dadeda.ogg', +"damage" = 'sound/vox/damage.ogg', +"damaged" = 'sound/vox/damaged.ogg', +"danger" = 'sound/vox/danger.ogg', +"day" = 'sound/vox/day.ogg', +"deactivated" = 'sound/vox/deactivated.ogg', +"decompression" = 'sound/vox/decompression.ogg', +"decontamination" = 'sound/vox/decontamination.ogg', +"deeoo" = 'sound/vox/deeoo.ogg', +"defense" = 'sound/vox/defense.ogg', +"degrees" = 'sound/vox/degrees.ogg', +"delta" = 'sound/vox/delta.ogg', +"denied" = 'sound/vox/denied.ogg', +"deploy" = 'sound/vox/deploy.ogg', +"deployed" = 'sound/vox/deployed.ogg', +"destroy" = 'sound/vox/destroy.ogg', +"destroyed" = 'sound/vox/destroyed.ogg', +"detain" = 'sound/vox/detain.ogg', +"detected" = 'sound/vox/detected.ogg', +"detonation" = 'sound/vox/detonation.ogg', +"device" = 'sound/vox/device.ogg', +"did" = 'sound/vox/did.ogg', +"die" = 'sound/vox/die.ogg', +"dimensional" = 'sound/vox/dimensional.ogg', +"dirt" = 'sound/vox/dirt.ogg', +"disengaged" = 'sound/vox/disengaged.ogg', +"dish" = 'sound/vox/dish.ogg', +"disposal" = 'sound/vox/disposal.ogg', +"distance" = 'sound/vox/distance.ogg', +"distortion" = 'sound/vox/distortion.ogg', +"do" = 'sound/vox/do.ogg', +"doctor" = 'sound/vox/doctor.ogg', +"doop" = 'sound/vox/doop.ogg', +"door" = 'sound/vox/door.ogg', +"down" = 'sound/vox/down.ogg', +"dual" = 'sound/vox/dual.ogg', +"duct" = 'sound/vox/duct.ogg', +"e" = 'sound/vox/e.ogg', +"east" = 'sound/vox/east.ogg', +"echo" = 'sound/vox/echo.ogg', +"ed" = 'sound/vox/ed.ogg', +"effect" = 'sound/vox/effect.ogg', +"egress" = 'sound/vox/egress.ogg', +"eight" = 'sound/vox/eight.ogg', +"eighteen" = 'sound/vox/eighteen.ogg', +"eighty" = 'sound/vox/eighty.ogg', +"electric" = 'sound/vox/electric.ogg', +"electromagnetic" = 'sound/vox/electromagnetic.ogg', +"elevator" = 'sound/vox/elevator.ogg', +"eleven" = 'sound/vox/eleven.ogg', +"eliminate" = 'sound/vox/eliminate.ogg', +"emergency" = 'sound/vox/emergency.ogg', +"enemy" = 'sound/vox/enemy.ogg', +"energy" = 'sound/vox/energy.ogg', +"engage" = 'sound/vox/engage.ogg', +"engaged" = 'sound/vox/engaged.ogg', +"engine" = 'sound/vox/engine.ogg', +"enter" = 'sound/vox/enter.ogg', +"entry" = 'sound/vox/entry.ogg', +"environment" = 'sound/vox/environment.ogg', +"error" = 'sound/vox/error.ogg', +"escape" = 'sound/vox/escape.ogg', +"evacuate" = 'sound/vox/evacuate.ogg', +"exchange" = 'sound/vox/exchange.ogg', +"exit" = 'sound/vox/exit.ogg', +"expect" = 'sound/vox/expect.ogg', +"experiment" = 'sound/vox/experiment.ogg', +"experimental" = 'sound/vox/experimental.ogg', +"explode" = 'sound/vox/explode.ogg', +"explosion" = 'sound/vox/explosion.ogg', +"exposure" = 'sound/vox/exposure.ogg', +"exterminate" = 'sound/vox/exterminate.ogg', +"extinguish" = 'sound/vox/extinguish.ogg', +"extinguisher" = 'sound/vox/extinguisher.ogg', +"extreme" = 'sound/vox/extreme.ogg', +"f" = 'sound/vox/f.ogg', +"face" = 'sound/vox/face.ogg', +"facility" = 'sound/vox/facility.ogg', +"fahrenheit" = 'sound/vox/fahrenheit.ogg', +"failed" = 'sound/vox/failed.ogg', +"failure" = 'sound/vox/failure.ogg', +"farthest" = 'sound/vox/farthest.ogg', +"fast" = 'sound/vox/fast.ogg', +"feet" = 'sound/vox/feet.ogg', +"field" = 'sound/vox/field.ogg', +"fifteen" = 'sound/vox/fifteen.ogg', +"fifth" = 'sound/vox/fifth.ogg', +"fifty" = 'sound/vox/fifty.ogg', +"final" = 'sound/vox/final.ogg', +"fine" = 'sound/vox/fine.ogg', +"fire" = 'sound/vox/fire.ogg', +"first" = 'sound/vox/first.ogg', +"five" = 'sound/vox/five.ogg', +"flag" = 'sound/vox/flag.ogg', +"flooding" = 'sound/vox/flooding.ogg', +"floor" = 'sound/vox/floor.ogg', +"fool" = 'sound/vox/fool.ogg', +"for" = 'sound/vox/for.ogg', +"forbidden" = 'sound/vox/forbidden.ogg', +"force" = 'sound/vox/force.ogg', +"forms" = 'sound/vox/forms.ogg', +"found" = 'sound/vox/found.ogg', +"four" = 'sound/vox/four.ogg', +"fourteen" = 'sound/vox/fourteen.ogg', +"fourth" = 'sound/vox/fourth.ogg', +"fourty" = 'sound/vox/fourty.ogg', +"foxtrot" = 'sound/vox/foxtrot.ogg', +"freeman" = 'sound/vox/freeman.ogg', +"freezer" = 'sound/vox/freezer.ogg', +"from" = 'sound/vox/from.ogg', +"front" = 'sound/vox/front.ogg', +"fuel" = 'sound/vox/fuel.ogg', +"g" = 'sound/vox/g.ogg', +"gay" = 'sound/vox/gay.ogg', +"get" = 'sound/vox/get.ogg', +"go" = 'sound/vox/go.ogg', +"going" = 'sound/vox/going.ogg', +"good" = 'sound/vox/good.ogg', +"goodbye" = 'sound/vox/goodbye.ogg', +"gordon" = 'sound/vox/gordon.ogg', +"got" = 'sound/vox/got.ogg', +"government" = 'sound/vox/government.ogg', +"granted" = 'sound/vox/granted.ogg', +"great" = 'sound/vox/great.ogg', +"green" = 'sound/vox/green.ogg', +"grenade" = 'sound/vox/grenade.ogg', +"guard" = 'sound/vox/guard.ogg', +"gulf" = 'sound/vox/gulf.ogg', +"gun" = 'sound/vox/gun.ogg', +"guthrie" = 'sound/vox/guthrie.ogg', +"handling" = 'sound/vox/handling.ogg', +"hangar" = 'sound/vox/hangar.ogg', +"has" = 'sound/vox/has.ogg', +"have" = 'sound/vox/have.ogg', +"hazard" = 'sound/vox/hazard.ogg', +"head" = 'sound/vox/head.ogg', +"health" = 'sound/vox/health.ogg', +"heat" = 'sound/vox/heat.ogg', +"helicopter" = 'sound/vox/helicopter.ogg', +"helium" = 'sound/vox/helium.ogg', +"hello" = 'sound/vox/hello.ogg', +"help" = 'sound/vox/help.ogg', +"here" = 'sound/vox/here.ogg', +"hide" = 'sound/vox/hide.ogg', +"high" = 'sound/vox/high.ogg', +"highest" = 'sound/vox/highest.ogg', +"hit" = 'sound/vox/hit.ogg', +"holds" = 'sound/vox/holds.ogg', +"hole" = 'sound/vox/hole.ogg', +"hostile" = 'sound/vox/hostile.ogg', +"hot" = 'sound/vox/hot.ogg', +"hotel" = 'sound/vox/hotel.ogg', +"hour" = 'sound/vox/hour.ogg', +"hours" = 'sound/vox/hours.ogg', +"hundred" = 'sound/vox/hundred.ogg', +"hydro" = 'sound/vox/hydro.ogg', +"i" = 'sound/vox/i.ogg', +"idiot" = 'sound/vox/idiot.ogg', +"illegal" = 'sound/vox/illegal.ogg', +"immediate" = 'sound/vox/immediate.ogg', +"immediately" = 'sound/vox/immediately.ogg', +"in" = 'sound/vox/in.ogg', +"inches" = 'sound/vox/inches.ogg', +"india" = 'sound/vox/india.ogg', +"ing" = 'sound/vox/ing.ogg', +"inoperative" = 'sound/vox/inoperative.ogg', +"inside" = 'sound/vox/inside.ogg', +"inspection" = 'sound/vox/inspection.ogg', +"inspector" = 'sound/vox/inspector.ogg', +"interchange" = 'sound/vox/interchange.ogg', +"intruder" = 'sound/vox/intruder.ogg', +"invallid" = 'sound/vox/invallid.ogg', +"invasion" = 'sound/vox/invasion.ogg', +"is" = 'sound/vox/is.ogg', +"it" = 'sound/vox/it.ogg', +"johnson" = 'sound/vox/johnson.ogg', +"juliet" = 'sound/vox/juliet.ogg', +"key" = 'sound/vox/key.ogg', +"kill" = 'sound/vox/kill.ogg', +"kilo" = 'sound/vox/kilo.ogg', +"kit" = 'sound/vox/kit.ogg', +"lab" = 'sound/vox/lab.ogg', +"lambda" = 'sound/vox/lambda.ogg', +"laser" = 'sound/vox/laser.ogg', +"last" = 'sound/vox/last.ogg', +"launch" = 'sound/vox/launch.ogg', +"leak" = 'sound/vox/leak.ogg', +"leave" = 'sound/vox/leave.ogg', +"left" = 'sound/vox/left.ogg', +"legal" = 'sound/vox/legal.ogg', +"level" = 'sound/vox/level.ogg', +"lever" = 'sound/vox/lever.ogg', +"lie" = 'sound/vox/lie.ogg', +"lieutenant" = 'sound/vox/lieutenant.ogg', +"life" = 'sound/vox/life.ogg', +"light" = 'sound/vox/light.ogg', +"lima" = 'sound/vox/lima.ogg', +"liquid" = 'sound/vox/liquid.ogg', +"loading" = 'sound/vox/loading.ogg', +"locate" = 'sound/vox/locate.ogg', +"located" = 'sound/vox/located.ogg', +"location" = 'sound/vox/location.ogg', +"lock" = 'sound/vox/lock.ogg', +"locked" = 'sound/vox/locked.ogg', +"locker" = 'sound/vox/locker.ogg', +"lockout" = 'sound/vox/lockout.ogg', +"lower" = 'sound/vox/lower.ogg', +"lowest" = 'sound/vox/lowest.ogg', +"magnetic" = 'sound/vox/magnetic.ogg', +"main" = 'sound/vox/main.ogg', +"maintenance" = 'sound/vox/maintenance.ogg', +"malfunction" = 'sound/vox/malfunction.ogg', +"man" = 'sound/vox/man.ogg', +"mass" = 'sound/vox/mass.ogg', +"materials" = 'sound/vox/materials.ogg', +"maximum" = 'sound/vox/maximum.ogg', +"may" = 'sound/vox/may.ogg', +"med" = 'sound/vox/med.ogg', +"medical" = 'sound/vox/medical.ogg', +"men" = 'sound/vox/men.ogg', +"mercy" = 'sound/vox/mercy.ogg', +"mesa" = 'sound/vox/mesa.ogg', +"message" = 'sound/vox/message.ogg', +"meter" = 'sound/vox/meter.ogg', +"micro" = 'sound/vox/micro.ogg', +"middle" = 'sound/vox/middle.ogg', +"mike" = 'sound/vox/mike.ogg', +"miles" = 'sound/vox/miles.ogg', +"military" = 'sound/vox/military.ogg', +"milli" = 'sound/vox/milli.ogg', +"million" = 'sound/vox/million.ogg', +"minefield" = 'sound/vox/minefield.ogg', +"minimum" = 'sound/vox/minimum.ogg', +"minutes" = 'sound/vox/minutes.ogg', +"mister" = 'sound/vox/mister.ogg', +"mode" = 'sound/vox/mode.ogg', +"motor" = 'sound/vox/motor.ogg', +"motorpool" = 'sound/vox/motorpool.ogg', +"move" = 'sound/vox/move.ogg', +"must" = 'sound/vox/must.ogg', +"nearest" = 'sound/vox/nearest.ogg', +"nice" = 'sound/vox/nice.ogg', +"nine" = 'sound/vox/nine.ogg', +"nineteen" = 'sound/vox/nineteen.ogg', +"ninety" = 'sound/vox/ninety.ogg', +"no" = 'sound/vox/no.ogg', +"nominal" = 'sound/vox/nominal.ogg', +"north" = 'sound/vox/north.ogg', +"not" = 'sound/vox/not.ogg', +"november" = 'sound/vox/november.ogg', +"now" = 'sound/vox/now.ogg', +"number" = 'sound/vox/number.ogg', +"objective" = 'sound/vox/objective.ogg', +"observation" = 'sound/vox/observation.ogg', +"of" = 'sound/vox/of.ogg', +"officer" = 'sound/vox/officer.ogg', +"ok" = 'sound/vox/ok.ogg', +"on" = 'sound/vox/on.ogg', +"one" = 'sound/vox/one.ogg', +"open" = 'sound/vox/open.ogg', +"operating" = 'sound/vox/operating.ogg', +"operations" = 'sound/vox/operations.ogg', +"operative" = 'sound/vox/operative.ogg', +"option" = 'sound/vox/option.ogg', +"order" = 'sound/vox/order.ogg', +"organic" = 'sound/vox/organic.ogg', +"oscar" = 'sound/vox/oscar.ogg', +"out" = 'sound/vox/out.ogg', +"outside" = 'sound/vox/outside.ogg', +"over" = 'sound/vox/over.ogg', +"overload" = 'sound/vox/overload.ogg', +"override" = 'sound/vox/override.ogg', +"pacify" = 'sound/vox/pacify.ogg', +"pain" = 'sound/vox/pain.ogg', +"pal" = 'sound/vox/pal.ogg', +"panel" = 'sound/vox/panel.ogg', +"percent" = 'sound/vox/percent.ogg', +"perimeter" = 'sound/vox/perimeter.ogg', +"permitted" = 'sound/vox/permitted.ogg', +"personnel" = 'sound/vox/personnel.ogg', +"pipe" = 'sound/vox/pipe.ogg', +"plant" = 'sound/vox/plant.ogg', +"platform" = 'sound/vox/platform.ogg', +"please" = 'sound/vox/please.ogg', +"point" = 'sound/vox/point.ogg', +"portal" = 'sound/vox/portal.ogg', +"power" = 'sound/vox/power.ogg', +"presence" = 'sound/vox/presence.ogg', +"press" = 'sound/vox/press.ogg', +"primary" = 'sound/vox/primary.ogg', +"proceed" = 'sound/vox/proceed.ogg', +"processing" = 'sound/vox/processing.ogg', +"progress" = 'sound/vox/progress.ogg', +"proper" = 'sound/vox/proper.ogg', +"propulsion" = 'sound/vox/propulsion.ogg', +"prosecute" = 'sound/vox/prosecute.ogg', +"protective" = 'sound/vox/protective.ogg', +"push" = 'sound/vox/push.ogg', +"quantum" = 'sound/vox/quantum.ogg', +"quebec" = 'sound/vox/quebec.ogg', +"question" = 'sound/vox/question.ogg', +"questioning" = 'sound/vox/questioning.ogg', +"quick" = 'sound/vox/quick.ogg', +"quit" = 'sound/vox/quit.ogg', +"radiation" = 'sound/vox/radiation.ogg', +"radioactive" = 'sound/vox/radioactive.ogg', +"rads" = 'sound/vox/rads.ogg', +"rapid" = 'sound/vox/rapid.ogg', +"reach" = 'sound/vox/reach.ogg', +"reached" = 'sound/vox/reached.ogg', +"reactor" = 'sound/vox/reactor.ogg', +"red" = 'sound/vox/red.ogg', +"relay" = 'sound/vox/relay.ogg', +"released" = 'sound/vox/released.ogg', +"remaining" = 'sound/vox/remaining.ogg', +"renegade" = 'sound/vox/renegade.ogg', +"repair" = 'sound/vox/repair.ogg', +"report" = 'sound/vox/report.ogg', +"reports" = 'sound/vox/reports.ogg', +"required" = 'sound/vox/required.ogg', +"research" = 'sound/vox/research.ogg', +"reset" = 'sound/vox/reset.ogg', +"resevoir" = 'sound/vox/resevoir.ogg', +"resistance" = 'sound/vox/resistance.ogg', +"returned" = 'sound/vox/returned.ogg', +"right" = 'sound/vox/right.ogg', +"rocket" = 'sound/vox/rocket.ogg', +"roger" = 'sound/vox/roger.ogg', +"romeo" = 'sound/vox/romeo.ogg', +"room" = 'sound/vox/room.ogg', +"round" = 'sound/vox/round.ogg', +"run" = 'sound/vox/run.ogg', +"safe" = 'sound/vox/safe.ogg', +"safety" = 'sound/vox/safety.ogg', +"sargeant" = 'sound/vox/sargeant.ogg', +"satellite" = 'sound/vox/satellite.ogg', +"save" = 'sound/vox/save.ogg', +"science" = 'sound/vox/science.ogg', +"scores" = 'sound/vox/scores.ogg', +"scream" = 'sound/vox/scream.ogg', +"screen" = 'sound/vox/screen.ogg', +"search" = 'sound/vox/search.ogg', +"second" = 'sound/vox/second.ogg', +"secondary" = 'sound/vox/secondary.ogg', +"seconds" = 'sound/vox/seconds.ogg', +"sector" = 'sound/vox/sector.ogg', +"secure" = 'sound/vox/secure.ogg', +"secured" = 'sound/vox/secured.ogg', +"security" = 'sound/vox/security.ogg', +"select" = 'sound/vox/select.ogg', +"selected" = 'sound/vox/selected.ogg', +"service" = 'sound/vox/service.ogg', +"seven" = 'sound/vox/seven.ogg', +"seventeen" = 'sound/vox/seventeen.ogg', +"seventy" = 'sound/vox/seventy.ogg', +"severe" = 'sound/vox/severe.ogg', +"sewage" = 'sound/vox/sewage.ogg', +"sewer" = 'sound/vox/sewer.ogg', +"shield" = 'sound/vox/shield.ogg', +"shipment" = 'sound/vox/shipment.ogg', +"shock" = 'sound/vox/shock.ogg', +"shoot" = 'sound/vox/shoot.ogg', +"shower" = 'sound/vox/shower.ogg', +"shut" = 'sound/vox/shut.ogg', +"side" = 'sound/vox/side.ogg', +"sierra" = 'sound/vox/sierra.ogg', +"sight" = 'sound/vox/sight.ogg', +"silo" = 'sound/vox/silo.ogg', +"six" = 'sound/vox/six.ogg', +"sixteen" = 'sound/vox/sixteen.ogg', +"sixty" = 'sound/vox/sixty.ogg', +"slime" = 'sound/vox/slime.ogg', +"slow" = 'sound/vox/slow.ogg', +"soldier" = 'sound/vox/soldier.ogg', +"some" = 'sound/vox/some.ogg', +"someone" = 'sound/vox/someone.ogg', +"something" = 'sound/vox/something.ogg', +"son" = 'sound/vox/son.ogg', +"sorry" = 'sound/vox/sorry.ogg', +"south" = 'sound/vox/south.ogg', +"squad" = 'sound/vox/squad.ogg', +"square" = 'sound/vox/square.ogg', +"stairway" = 'sound/vox/stairway.ogg', +"status" = 'sound/vox/status.ogg', +"sterile" = 'sound/vox/sterile.ogg', +"sterilization" = 'sound/vox/sterilization.ogg', +"stolen" = 'sound/vox/stolen.ogg', +"storage" = 'sound/vox/storage.ogg', +"sub" = 'sound/vox/sub.ogg', +"subsurface" = 'sound/vox/subsurface.ogg', +"sudden" = 'sound/vox/sudden.ogg', +"suit" = 'sound/vox/suit.ogg', +"superconducting" = 'sound/vox/superconducting.ogg', +"supercooled" = 'sound/vox/supercooled.ogg', +"supply" = 'sound/vox/supply.ogg', +"surface" = 'sound/vox/surface.ogg', +"surrender" = 'sound/vox/surrender.ogg', +"surround" = 'sound/vox/surround.ogg', +"surrounded" = 'sound/vox/surrounded.ogg', +"switch" = 'sound/vox/switch.ogg', +"system" = 'sound/vox/system.ogg', +"systems" = 'sound/vox/systems.ogg', +"tactical" = 'sound/vox/tactical.ogg', +"take" = 'sound/vox/take.ogg', +"talk" = 'sound/vox/talk.ogg', +"tango" = 'sound/vox/tango.ogg', +"tank" = 'sound/vox/tank.ogg', +"target" = 'sound/vox/target.ogg', +"team" = 'sound/vox/team.ogg', +"temperature" = 'sound/vox/temperature.ogg', +"temporal" = 'sound/vox/temporal.ogg', +"ten" = 'sound/vox/ten.ogg', +"terminal" = 'sound/vox/terminal.ogg', +"terminated" = 'sound/vox/terminated.ogg', +"termination" = 'sound/vox/termination.ogg', +"test" = 'sound/vox/test.ogg', +"that" = 'sound/vox/that.ogg', +"the" = 'sound/vox/the.ogg', +"then" = 'sound/vox/then.ogg', +"there" = 'sound/vox/there.ogg', +"third" = 'sound/vox/third.ogg', +"thirteen" = 'sound/vox/thirteen.ogg', +"thirty" = 'sound/vox/thirty.ogg', +"this" = 'sound/vox/this.ogg', +"those" = 'sound/vox/those.ogg', +"thousand" = 'sound/vox/thousand.ogg', +"threat" = 'sound/vox/threat.ogg', +"three" = 'sound/vox/three.ogg', +"through" = 'sound/vox/through.ogg', +"time" = 'sound/vox/time.ogg', +"to" = 'sound/vox/to.ogg', +"top" = 'sound/vox/top.ogg', +"topside" = 'sound/vox/topside.ogg', +"touch" = 'sound/vox/touch.ogg', +"towards" = 'sound/vox/towards.ogg', +"track" = 'sound/vox/track.ogg', +"train" = 'sound/vox/train.ogg', +"transportation" = 'sound/vox/transportation.ogg', +"truck" = 'sound/vox/truck.ogg', +"tunnel" = 'sound/vox/tunnel.ogg', +"turn" = 'sound/vox/turn.ogg', +"turret" = 'sound/vox/turret.ogg', +"twelve" = 'sound/vox/twelve.ogg', +"twenty" = 'sound/vox/twenty.ogg', +"two" = 'sound/vox/two.ogg', +"unauthorized" = 'sound/vox/unauthorized.ogg', +"under" = 'sound/vox/under.ogg', +"uniform" = 'sound/vox/uniform.ogg', +"unlocked" = 'sound/vox/unlocked.ogg', +"until" = 'sound/vox/until.ogg', +"up" = 'sound/vox/up.ogg', +"upper" = 'sound/vox/upper.ogg', +"uranium" = 'sound/vox/uranium.ogg', +"us" = 'sound/vox/us.ogg', +"usa" = 'sound/vox/usa.ogg', +"use" = 'sound/vox/use.ogg', +"used" = 'sound/vox/used.ogg', +"user" = 'sound/vox/user.ogg', +"vacate" = 'sound/vox/vacate.ogg', +"valid" = 'sound/vox/valid.ogg', +"vapor" = 'sound/vox/vapor.ogg', +"vent" = 'sound/vox/vent.ogg', +"ventillation" = 'sound/vox/ventillation.ogg', +"victor" = 'sound/vox/victor.ogg', +"violated" = 'sound/vox/violated.ogg', +"violation" = 'sound/vox/violation.ogg', +"voltage" = 'sound/vox/voltage.ogg', +"vox_login" = 'sound/vox/vox_login.ogg', +"walk" = 'sound/vox/walk.ogg', +"wall" = 'sound/vox/wall.ogg', +"want" = 'sound/vox/want.ogg', +"wanted" = 'sound/vox/wanted.ogg', +"warm" = 'sound/vox/warm.ogg', +"warn" = 'sound/vox/warn.ogg', +"warning" = 'sound/vox/warning.ogg', +"waste" = 'sound/vox/waste.ogg', +"water" = 'sound/vox/water.ogg', +"we" = 'sound/vox/we.ogg', +"weapon" = 'sound/vox/weapon.ogg', +"west" = 'sound/vox/west.ogg', +"whiskey" = 'sound/vox/whiskey.ogg', +"white" = 'sound/vox/white.ogg', +"wilco" = 'sound/vox/wilco.ogg', +"will" = 'sound/vox/will.ogg', +"with" = 'sound/vox/with.ogg', +"without" = 'sound/vox/without.ogg', +"woop" = 'sound/vox/woop.ogg', +"xeno" = 'sound/vox/xeno.ogg', +"yankee" = 'sound/vox/yankee.ogg', +"yards" = 'sound/vox/yards.ogg', +"year" = 'sound/vox/year.ogg', +"yellow" = 'sound/vox/yellow.ogg', +"yes" = 'sound/vox/yes.ogg', +"you" = 'sound/vox/you.ogg', +"your" = 'sound/vox/your.ogg', +"yourself" = 'sound/vox/yourself.ogg', +"zero" = 'sound/vox/zero.ogg', +"zone" = 'sound/vox/zone.ogg', +"zulu" = 'sound/vox/zulu.ogg',)) #endif \ No newline at end of file diff --git a/code/modules/mob/living/silicon/damage_procs.dm b/code/modules/mob/living/silicon/damage_procs.dm index 1190a00645..8fbd7afbdd 100644 --- a/code/modules/mob/living/silicon/damage_procs.dm +++ b/code/modules/mob/living/silicon/damage_procs.dm @@ -1,16 +1,17 @@ -/mob/living/silicon/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE) +/mob/living/silicon/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE) var/hit_percent = (100-blocked)/100 - if(!damage || (hit_percent <= 0)) + if(!damage || (!forced && hit_percent <= 0)) return 0 + var/damage_amount = forced ? damage : damage * hit_percent switch(damagetype) if(BRUTE) - adjustBruteLoss(damage * hit_percent) + adjustBruteLoss(damage_amount, forced = forced) if(BURN) - adjustFireLoss(damage * hit_percent) + adjustFireLoss(damage_amount, forced = forced) if(OXY) - if(damage < 0) //we shouldn't be taking oxygen damage through this proc, but we'll let it heal. - adjustOxyLoss(damage * hit_percent) + if(damage < 0 || forced) //we shouldn't be taking oxygen damage through this proc, but we'll let it heal. + adjustOxyLoss(damage_amount, forced = forced) return 1 @@ -29,14 +30,14 @@ /mob/living/silicon/setCloneLoss(amount, updating_health = TRUE, forced = FALSE) return FALSE -/mob/living/silicon/adjustStaminaLoss(amount, updating_stamina = 1)//immune to stamina damage. +/mob/living/silicon/adjustStaminaLoss(amount, updating_stamina = 1, forced = FALSE)//immune to stamina damage. return FALSE /mob/living/silicon/setStaminaLoss(amount, updating_stamina = 1) return FALSE -/mob/living/silicon/adjustBrainLoss(amount) +/mob/living/silicon/adjustOrganLoss(slot, amount, maximum = 500) return FALSE -/mob/living/silicon/setBrainLoss(amount) +/mob/living/silicon/setOrganLoss(slot, amount) return FALSE diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 7fd861bfeb..0f8687397d 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -192,7 +192,7 @@ /mob/proc/makePAI(delold) var/obj/item/paicard/card = new /obj/item/paicard(get_turf(src)) var/mob/living/silicon/pai/pai = new /mob/living/silicon/pai(card) - pai.key = key + transfer_ckey(pai) pai.name = name card.setPersonality(pai) if(delold) diff --git a/code/modules/mob/living/silicon/pai/pai_defense.dm b/code/modules/mob/living/silicon/pai/pai_defense.dm index f20ccbc730..dda8ddfebd 100644 --- a/code/modules/mob/living/silicon/pai/pai_defense.dm +++ b/code/modules/mob/living/silicon/pai/pai_defense.dm @@ -81,10 +81,13 @@ /mob/living/silicon/pai/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE) return FALSE -/mob/living/silicon/pai/adjustStaminaLoss(amount) - take_holo_damage(amount & 0.25) +/mob/living/silicon/pai/adjustStaminaLoss(amount, updating_health, forced = FALSE) + if(forced) + take_holo_damage(amount) + else + take_holo_damage(amount * 0.25) -/mob/living/silicon/pai/adjustBrainLoss(amount) +/mob/living/silicon/pai/adjustOrganLoss(slot, amount, maximum = 500) //I kept this in, unlike tg Knockdown(amount * 0.2) /mob/living/silicon/pai/getBruteLoss() @@ -102,18 +105,12 @@ /mob/living/silicon/pai/getCloneLoss() return FALSE -/mob/living/silicon/pai/getBrainLoss() - return FALSE - /mob/living/silicon/pai/getStaminaLoss() return FALSE /mob/living/silicon/pai/setCloneLoss() return FALSE -/mob/living/silicon/pai/setBrainLoss() - return FALSE - /mob/living/silicon/pai/setStaminaLoss() return FALSE diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 63874d7b2e..5b670aaa42 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -226,6 +226,9 @@ to_chat(src,"ERROR: Module installer reply timeout. Please check internal connections.") return + if(!CONFIG_GET(flag/disable_secborg) && GLOB.security_level < CONFIG_GET(number/minimum_secborg_alert)) + to_chat(src, "NOTICE: Due to local station regulations, the security cyborg module and its variants are only available during [num2seclevel(CONFIG_GET(number/minimum_secborg_alert))] alert and greater.") + var/list/modulelist = list("Standard" = /obj/item/robot_module/standard, \ "Engineering" = /obj/item/robot_module/engineering, \ "Medical" = /obj/item/robot_module/medical, \ @@ -234,7 +237,7 @@ "Service" = /obj/item/robot_module/butler) if(!CONFIG_GET(flag/disable_peaceborg)) modulelist["Peacekeeper"] = /obj/item/robot_module/peacekeeper - if(!CONFIG_GET(flag/disable_secborg)) + if(BORG_SEC_AVAILABLE) modulelist["Security"] = /obj/item/robot_module/security modulelist += get_cit_modules() //Citadel change - adds Citadel's borg modules. @@ -1216,20 +1219,21 @@ return if(incapacitated()) return - if(M.incapacitated()) - return if(module) if(!module.allow_riding) M.visible_message("Unfortunately, [M] just can't seem to hold onto [src]!") return - if(iscarbon(M) && (!riding_datum.equip_buckle_inhands(M, 1))) - M.visible_message("[M] can't climb onto [src] because [M.p_their()] hands are full!") + if(iscarbon(M) && !M.incapacitated() && !riding_datum.equip_buckle_inhands(M, 1)) + if(M.get_num_arms() <= 0) + M.visible_message("[M] can't climb onto [src] because [M.p_they()] don't have any usable arms!") + else + M.visible_message("[M] can't climb onto [src] because [M.p_their()] hands are full!") return . = ..(M, force, check_loc) /mob/living/silicon/robot/unbuckle_mob(mob/user, force=FALSE) if(iscarbon(user)) - GET_COMPONENT(riding_datum, /datum/component/riding) + var/datum/component/riding/riding_datum = GetComponent(/datum/component/riding) if(istype(riding_datum)) riding_datum.unequip_buckle_inhands(user) riding_datum.restore_position(user) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 7b95ced63f..209b21cd22 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -311,6 +311,10 @@ /obj/item/multitool/cyborg, /obj/item/t_scanner, /obj/item/analyzer, + /obj/item/storage/part_replacer/cyborg, + /obj/item/holosign_creator/atmos, + /obj/item/weapon/gripper, + /obj/item/lightreplacer/cyborg, /obj/item/geiger_counter/cyborg, /obj/item/assembly/signaler/cyborg, /obj/item/areaeditor/blueprints/cyborg, @@ -362,6 +366,7 @@ /obj/item/holosign_creator/cyborg, /obj/item/borg/cyborghug/peacekeeper, /obj/item/extinguisher, + /obj/item/megaphone, /obj/item/borg/projectile_dampen) emag_modules = list(/obj/item/reagent_containers/borghypo/peace/hacked) ratvar_modules = list( diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 49261d6e38..a5943aa0e6 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -290,7 +290,7 @@ to_chat(user, "Access denied.") else if(istype(W, /obj/item/paicard)) insertpai(user, W) - else if(istype(W, /obj/item/hemostat) && paicard) + else if(W.tool_behaviour == TOOL_HEMOSTAT && paicard) if(open) to_chat(user, "Close the access panel before manipulating the personality slot!") else @@ -808,11 +808,18 @@ Pass a positive integer as an argument to override a bot's default speed. switch(href_list["operation"]) if("patrol") + if(!issilicon(usr) && !IsAdminGhost(usr) && !(bot_core.allowed(usr) || !locked)) + return TRUE auto_patrol = !auto_patrol bot_reset() if("remote") remote_disabled = !remote_disabled if("hack") + if(!issilicon(usr) && !IsAdminGhost(usr)) + var/msg = "[key_name(usr)] attempted to hack a bot with a href that shouldn't be available!" + message_admins(msg) + log_admin(msg) + return TRUE if(emagged != 2) emagged = 2 hacked = TRUE @@ -915,7 +922,7 @@ Pass a positive integer as an argument to override a bot's default speed. if(mind && paicard.pai) mind.transfer_to(paicard.pai) else if(paicard.pai) - paicard.pai.key = key + transfer_ckey(paicard.pai) else ghostize(0) // The pAI card that just got ejected was dead. key = null diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index ab1e906cf2..d31c368ca4 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -198,7 +198,6 @@ ) if(blood) - target_types += /obj/effect/decal/cleanable/xenoblood target_types += /obj/effect/decal/cleanable/blood target_types += /obj/effect/decal/cleanable/trail_holder target_types += /obj/effect/decal/cleanable/insectguts diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index 1bff7dc10c..50c331940a 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -51,6 +51,7 @@ var/treatment_fire = "kelotane" var/treatment_tox_avoid = "tricordrazine" var/treatment_tox = "charcoal" + var/treatment_tox_toxlover = "toxin" var/treatment_virus_avoid = null var/treatment_virus = "spaceacillin" var/treat_virus = 1 //If on, the bot will attempt to treat viral infections, curing them if possible. @@ -381,8 +382,8 @@ if((!C.reagents.has_reagent(treatment_fire_avoid)) && (C.getFireLoss() >= heal_threshold) && (!C.reagents.has_reagent(treatment_fire))) return TRUE - - if((!C.reagents.has_reagent(treatment_tox_avoid)) && (C.getToxLoss() >= heal_threshold) && (!C.reagents.has_reagent(treatment_tox))) + var/treatment_toxavoid = get_avoidchem_toxin(C) + if(((isnull(treatment_toxavoid) || !C.reagents.has_reagent(treatment_toxavoid))) && (C.getToxLoss() >= heal_threshold) && (!C.reagents.has_reagent(get_healchem_toxin(C)))) return TRUE if(treat_virus && !C.reagents.has_reagent(treatment_virus_avoid) && !C.reagents.has_reagent(treatment_virus)) @@ -396,6 +397,12 @@ return FALSE +/mob/living/simple_animal/bot/medbot/proc/get_avoidchem_toxin(mob/M) + return HAS_TRAIT(M, TRAIT_TOXINLOVER)? null : treatment_tox_avoid + +/mob/living/simple_animal/bot/medbot/proc/get_healchem_toxin(mob/M) + return HAS_TRAIT(M, TRAIT_TOXINLOVER)? treatment_tox_toxlover : treatment_tox + /mob/living/simple_animal/bot/medbot/UnarmedAttack(atom/A) if(iscarbon(A)) var/mob/living/carbon/C = A @@ -463,8 +470,10 @@ reagent_id = treatment_fire if(!reagent_id && (C.getToxLoss() >= heal_threshold)) - if(!C.reagents.has_reagent(treatment_tox) && !C.reagents.has_reagent(treatment_tox_avoid)) - reagent_id = treatment_tox + var/toxin_heal_avoid = get_avoidchem_toxin(C) + var/toxin_healchem = get_healchem_toxin(C) + if(!C.reagents.has_reagent(toxin_healchem) && (isnull(toxin_heal_avoid) || !C.reagents.has_reagent(toxin_heal_avoid))) + reagent_id = toxin_healchem //If the patient is injured but doesn't have our special reagent in them then we should give it to them first if(reagent_id && use_beaker && reagent_glass && reagent_glass.reagents.total_volume) diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 1bc7493684..94283f82da 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -476,7 +476,8 @@ if(isturf(next)) if(bloodiness) var/obj/effect/decal/cleanable/blood/tracks/B = new(loc) - B.add_blood_DNA(return_blood_DNA()) + if(blood_DNA && blood_DNA.len) + B.blood_DNA |= blood_DNA.Copy() var/newdir = get_dir(next, loc) if(newdir == dir) B.setDir(newdir) @@ -489,7 +490,6 @@ B.setDir(newdir) bloodiness-- - var/oldloc = loc var/moved = step_towards(src, next) // attempt to move if(cell) diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 9572b4dafc..f22139ac22 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -131,7 +131,8 @@ Auto Patrol: []"}, /mob/living/simple_animal/bot/secbot/Topic(href, href_list) if(..()) return 1 - + if(!issilicon(usr) && !IsAdminGhost(usr) && !(bot_core.allowed(usr) || !locked)) + return TRUE switch(href_list["operation"]) if("idcheck") idcheck = !idcheck diff --git a/code/modules/mob/living/simple_animal/damage_procs.dm b/code/modules/mob/living/simple_animal/damage_procs.dm index 1031c5b7ee..0cc097dc08 100644 --- a/code/modules/mob/living/simple_animal/damage_procs.dm +++ b/code/modules/mob/living/simple_animal/damage_procs.dm @@ -37,5 +37,5 @@ else if(damage_coeff[CLONE]) . = adjustHealth(amount * damage_coeff[CLONE] * CONFIG_GET(number/damage_multiplier), updating_health, forced) -/mob/living/simple_animal/adjustStaminaLoss(amount) +/mob/living/simple_animal/adjustStaminaLoss(amount, forced = FALSE) return diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index 6d3121474c..d7d4d1b9f2 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -160,7 +160,7 @@ if(mind) mind.transfer_to(R, 1) else - R.key = key + transfer_ckey(R) qdel(src) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm index a655bdf231..e54b21724d 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm @@ -61,5 +61,5 @@ var/obj/item/new_hat = new hat_type(D) D.equip_to_slot_or_del(new_hat, SLOT_HEAD) D.flags_1 |= (flags_1 & ADMIN_SPAWNED_1) - D.key = user.key + user.transfer_ckey(D, FALSE) qdel(src) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm index 23ac527b2e..521f458e2f 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm @@ -33,7 +33,7 @@ /mob/living/simple_animal/drone/syndrone/Initialize() . = ..() - GET_COMPONENT_FROM(hidden_uplink, /datum/component/uplink, internal_storage) + var/datum/component/uplink/hidden_uplink = internal_storage.GetComponent(/datum/component/uplink) hidden_uplink.telecrystals = 10 /mob/living/simple_animal/drone/syndrone/Login() @@ -47,9 +47,9 @@ /mob/living/simple_animal/drone/syndrone/badass/Initialize() . = ..() - GET_COMPONENT_FROM(hidden_uplink, /datum/component/uplink, internal_storage) + var/datum/component/uplink/hidden_uplink = internal_storage.GetComponent(/datum/component/uplink) hidden_uplink.telecrystals = 30 - var/obj/item/implant/weapons_auth/W = new/obj/item/implant/weapons_auth(src) + var/obj/item/implant/weapons_auth/W = new W.implant(src) /mob/living/simple_animal/drone/snowflake diff --git a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm index 3f344c2936..6e89f045da 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm @@ -19,7 +19,7 @@ return 0 -/mob/living/simple_animal/drone/can_equip(obj/item/I, slot) +/mob/living/simple_animal/drone/can_equip(obj/item/I, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE) switch(slot) if(SLOT_HEAD) if(head) diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 73274dcfaf..e3ef14c784 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -44,7 +44,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians var/reset = 0 //if the summoner has reset the guardian already var/cooldown = 0 var/mob/living/carbon/summoner - var/range = 10 //how far from the user the spirit can be + var/range = 13 //how far from the user the spirit can be var/toggle_button_type = /obj/screen/guardian/ToggleMode/Inactive //what sort of toggle button the hud uses var/datum/guardianname/namedatum = new/datum/guardianname() var/playstyle_string = "You are a standard Guardian. You shouldn't exist!" @@ -429,9 +429,9 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians to_chat(G, "Your user reset you, and your body was taken over by a ghost. Looks like they weren't happy with your performance.") to_chat(src, "Your [G.real_name] has been successfully reset.") message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(G)])") - G.ghostize(0) + G.ghostize(FALSE) G.setthemename(G.namedatum.theme) //give it a new color, to show it's a new person - G.key = C.key + C.transfer_ckey(G) G.reset = 1 switch(G.namedatum.theme) if("tech") diff --git a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm index 45d8c17d0c..e507a4c831 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm @@ -1,7 +1,5 @@ //Assassin /mob/living/simple_animal/hostile/guardian/assassin - melee_damage_lower = 15 - melee_damage_upper = 15 attacktext = "slashes" attack_sound = 'sound/weapons/bladeslice.ogg' damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) @@ -12,7 +10,7 @@ toggle_button_type = /obj/screen/guardian/ToggleMode/Assassin var/toggle = FALSE - var/stealthcooldown = 160 + var/stealthcooldown = 100 var/obj/screen/alert/canstealthalert var/obj/screen/alert/instealthalert diff --git a/code/modules/mob/living/simple_animal/guardian/types/charger.dm b/code/modules/mob/living/simple_animal/guardian/types/charger.dm index 7a4c454f9f..3ece5d4e27 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/charger.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/charger.dm @@ -1,13 +1,10 @@ //Charger /mob/living/simple_animal/hostile/guardian/charger - melee_damage_lower = 15 - melee_damage_upper = 15 ranged = 1 //technically ranged_message = "charges" - ranged_cooldown_time = 40 - speed = -1 - damage_coeff = list(BRUTE = 0.6, BURN = 0.6, TOX = 0.6, CLONE = 0.6, STAMINA = 0, OXY = 0.6) - playstyle_string = "As a charger type you do medium damage, have medium damage resistance, move very fast, and can charge at a location, damaging any target hit and forcing them to drop any items they are holding." + ranged_cooldown_time = 20 + damage_coeff = list(BRUTE = 0, BURN = 0.5, TOX = 0.5, CLONE = 0.5, STAMINA = 0, OXY = 0.5) + playstyle_string = "As a charger type you do medium damage, take half damage, immunity to brute damage, move very fast, and can charge at a location, damaging any target hit and forcing them to drop any items they are holding." magic_fluff_string = "..And draw the Hunter, an alien master of rapid assault." tech_fluff_string = "Boot sequence complete. Charge modules loaded. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! Caught one! It's a charger carp, that likes running at people. But it doesn't have any legs..." diff --git a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm index e7dbbda242..52a007e24c 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm @@ -3,7 +3,7 @@ melee_damage_lower = 10 melee_damage_upper = 10 damage_coeff = list(BRUTE = 0.75, BURN = 0.75, TOX = 0.75, CLONE = 0.75, STAMINA = 0, OXY = 0.75) - playstyle_string = "As a dextrous type you can hold items, store an item within yourself, and have medium damage resistance, but do low damage on attacks. Recalling and leashing will force you to drop unstored items!" + playstyle_string = "As a dextrous type you can hold items, store an item within yourself, and take half damage, but do low damage on attacks. Recalling and leashing will force you to drop unstored items!" magic_fluff_string = "..And draw the Drone, a dextrous master of construction and repair." tech_fluff_string = "Boot sequence complete. Dextrous combat modules loaded. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! You caught one! It can hold stuff in its fins, sort of." @@ -52,7 +52,7 @@ return 1 return 0 -/mob/living/simple_animal/hostile/guardian/dextrous/can_equip(obj/item/I, slot) +/mob/living/simple_animal/hostile/guardian/dextrous/can_equip(obj/item/I, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE) switch(slot) if(SLOT_GENERC_DEXTROUS_STORAGE) if(internal_storage) diff --git a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm index ff2f453207..531c513819 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm @@ -1,10 +1,7 @@ //Bomb /mob/living/simple_animal/hostile/guardian/bomb - melee_damage_lower = 15 - melee_damage_upper = 15 damage_coeff = list(BRUTE = 0.6, BURN = 0.6, TOX = 0.6, CLONE = 0.6, STAMINA = 0, OXY = 0.6) - range = 13 - playstyle_string = "As an explosive type, you have moderate close combat abilities, may explosively teleport targets on attack, and are capable of converting nearby items and objects into disguised bombs via alt click." + playstyle_string = "As an explosive type, you have moderate close combat abilities, take half damage, may explosively teleport targets on attack, and are capable of converting nearby items and objects into disguised bombs via alt click." magic_fluff_string = "..And draw the Scientist, master of explosive death." tech_fluff_string = "Boot sequence complete. Explosive modules active. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! Caught one! It's an explosive carp! Boom goes the fishy." diff --git a/code/modules/mob/living/simple_animal/guardian/types/fire.dm b/code/modules/mob/living/simple_animal/guardian/types/fire.dm index 7a469dd12c..b111caae50 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/fire.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/fire.dm @@ -1,13 +1,13 @@ //Fire /mob/living/simple_animal/hostile/guardian/fire a_intent = INTENT_HELP - melee_damage_lower = 7 - melee_damage_upper = 7 + melee_damage_lower = 10 + melee_damage_upper = 10 attack_sound = 'sound/items/welder.ogg' attacktext = "ignites" - damage_coeff = list(BRUTE = 0.7, BURN = 0.7, TOX = 0.7, CLONE = 0.7, STAMINA = 0, OXY = 0.7) - range = 7 - playstyle_string = "As a chaos type, you have only light damage resistance, but will ignite any enemy you bump into. In addition, your melee attacks will cause human targets to see everyone as you." + melee_damage_type = BURN + damage_coeff = list(BRUTE = 0.7, BURN = 0, TOX = 0.7, CLONE = 0.7, STAMINA = 0, OXY = 0.7) + playstyle_string = "As a chaos type, you take 30% damage reduction to all but burn, which you are immune to. You will ignite any enemy you bump into. in addition, your melee attacks will cause human targets to see everyone as you." magic_fluff_string = "..And draw the Wizard, bringer of endless chaos!" tech_fluff_string = "Boot sequence complete. Crowd control modules activated. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! You caught one! OH GOD, EVERYTHING'S ON FIRE. Except you and the fish." @@ -38,6 +38,6 @@ /mob/living/simple_animal/hostile/guardian/fire/proc/collision_ignite(AM as mob|obj) if(isliving(AM)) var/mob/living/M = AM - if(!hasmatchingsummoner(M) && M != summoner && M.fire_stacks < 7) - M.fire_stacks = 7 + if(!hasmatchingsummoner(M) && M != summoner && M.fire_stacks < 10) + M.fire_stacks = 10 M.IgniteMob() diff --git a/code/modules/mob/living/simple_animal/guardian/types/lightning.dm b/code/modules/mob/living/simple_animal/guardian/types/lightning.dm index ad1c47732b..7b7651822a 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/lightning.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/lightning.dm @@ -4,14 +4,13 @@ layer = LYING_MOB_LAYER /mob/living/simple_animal/hostile/guardian/beam - melee_damage_lower = 7 - melee_damage_upper = 7 + melee_damage_lower = 10 + melee_damage_upper = 10 attacktext = "shocks" melee_damage_type = BURN attack_sound = 'sound/machines/defib_zap.ogg' damage_coeff = list(BRUTE = 0.7, BURN = 0.7, TOX = 0.7, CLONE = 0.7, STAMINA = 0, OXY = 0.7) - range = 7 - playstyle_string = "As a lightning type, you will apply lightning chains to targets on attack and have a lightning chain to your summoner. Lightning chains will shock anyone near them." + playstyle_string = "As a lightning type, you have 30% damage reduction, apply lightning chains to targets on attack and have a lightning chain to your summoner. Lightning chains will shock anyone near them." magic_fluff_string = "..And draw the Tesla, a shocking, lethal source of power." tech_fluff_string = "Boot sequence complete. Lightning modules active. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! Caught one! It's a lightning carp! Everyone else goes zap zap." @@ -31,7 +30,7 @@ var/datum/beam/C = pick(enemychains) qdel(C) enemychains -= C - enemychains += Beam(target, "lightning[rand(1,12)]", time=70, maxdistance=7, beam_type=/obj/effect/ebeam/chain) + enemychains += Beam(target, "lightning[rand(1,12)]", time=70, maxdistance=13, beam_type=/obj/effect/ebeam/chain) /mob/living/simple_animal/hostile/guardian/beam/Destroy() removechains() diff --git a/code/modules/mob/living/simple_animal/guardian/types/protector.dm b/code/modules/mob/living/simple_animal/guardian/types/protector.dm index 14430bb269..53964254cd 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/protector.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/protector.dm @@ -1,7 +1,5 @@ //Protector /mob/living/simple_animal/hostile/guardian/protector - melee_damage_lower = 15 - melee_damage_upper = 15 range = 15 //worse for it due to how it leashes damage_coeff = list(BRUTE = 0.4, BURN = 0.4, TOX = 0.4, CLONE = 0.4, STAMINA = 0, OXY = 0.4) playstyle_string = "As a protector type you cause your summoner to leash to you instead of you leashing to them and have two modes; Combat Mode, where you do and take medium damage, and Protection Mode, where you do and take almost no damage, but move slightly slower." @@ -33,9 +31,9 @@ cooldown = world.time + 10 if(toggle) cut_overlays() - melee_damage_lower = initial(melee_damage_lower) - melee_damage_upper = initial(melee_damage_upper) - speed = initial(speed) + melee_damage_lower = 15 + melee_damage_upper = 15 + speed = 0 damage_coeff = list(BRUTE = 0.4, BURN = 0.4, TOX = 0.4, CLONE = 0.4, STAMINA = 0, OXY = 0.4) to_chat(src, "You switch to combat mode.") toggle = FALSE @@ -44,8 +42,8 @@ if(namedatum) shield_overlay.color = namedatum.colour add_overlay(shield_overlay) - melee_damage_lower = 2 - melee_damage_upper = 2 + melee_damage_lower = 5 + melee_damage_upper = 5 speed = 1 damage_coeff = list(BRUTE = 0.05, BURN = 0.05, TOX = 0.05, CLONE = 0.05, STAMINA = 0, OXY = 0.05) //damage? what's damage? to_chat(src, "You switch to protection mode.") diff --git a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm index 5adcc8b292..0e8f632dbd 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm @@ -16,8 +16,7 @@ ranged_cooldown_time = 1 //fast! projectilesound = 'sound/effects/hit_on_shattered_glass.ogg' ranged = 1 - range = 13 - playstyle_string = "As a ranged type, you have only light damage resistance, but are capable of spraying shards of crystal at incredibly high speed. You can also deploy surveillance snares to monitor enemy movement. Finally, you can switch to scout mode, in which you can't attack, but can move without limit." + playstyle_string = "As a ranged type, you have 10% damage reduction, but are capable of spraying shards of crystal at incredibly high speed. You can also deploy surveillance snares to monitor enemy movement. Finally, you can switch to scout mode, in which you can't attack, but can move without limit." magic_fluff_string = "..And draw the Sentinel, an alien master of ranged combat." tech_fluff_string = "Boot sequence complete. Ranged combat modules active. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! Caught one, it's a ranged carp. This fishy can watch people pee in the ocean." @@ -36,7 +35,7 @@ obj_damage = initial(obj_damage) environment_smash = initial(environment_smash) alpha = 255 - range = initial(range) + range = 13 to_chat(src, "You switch to combat mode.") toggle = FALSE else diff --git a/code/modules/mob/living/simple_animal/guardian/types/standard.dm b/code/modules/mob/living/simple_animal/guardian/types/standard.dm index 4edd9d9e41..2285167df5 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/standard.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/standard.dm @@ -3,9 +3,9 @@ melee_damage_lower = 20 melee_damage_upper = 20 obj_damage = 80 - next_move_modifier = 0.8 //attacks 20% faster + next_move_modifier = 0.5 //attacks 50% faster environment_smash = ENVIRONMENT_SMASH_WALLS - playstyle_string = "As a standard type you have no special abilities, but have a high damage resistance and a powerful attack capable of smashing through walls." + playstyle_string = "As a standard type you have no special abilities, but take half damage and have powerful attack capable of smashing through walls." magic_fluff_string = "..And draw the Assistant, faceless and generic, but never to be underestimated." tech_fluff_string = "Boot sequence complete. Standard combat modules loaded. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! You caught one! It's really boring and standard. Better punch some walls to ease the tension." diff --git a/code/modules/mob/living/simple_animal/guardian/types/support.dm b/code/modules/mob/living/simple_animal/guardian/types/support.dm index 794683e69f..d31809e9aa 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/support.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm @@ -2,11 +2,8 @@ /mob/living/simple_animal/hostile/guardian/healer a_intent = INTENT_HARM friendly = "heals" - speed = 0 damage_coeff = list(BRUTE = 0.7, BURN = 0.7, TOX = 0.7, CLONE = 0.7, STAMINA = 0, OXY = 0.7) - melee_damage_lower = 15 - melee_damage_upper = 15 - playstyle_string = "As a support type, you may toggle your basic attacks to a healing mode. In addition, Alt-Clicking on an adjacent object or mob will warp them to your bluespace beacon after a short delay." + playstyle_string = "As a support type, you have 30% damage reduction and may toggle your basic attacks to a healing mode. In addition, Alt-Clicking on an adjacent object or mob will warp them to your bluespace beacon after a short delay." magic_fluff_string = "..And draw the CMO, a potent force of life... and death." carp_fluff_string = "CARP CARP CARP! You caught a support carp. It's a kleptocarp!" tech_fluff_string = "Boot sequence complete. Support modules active. Holoparasite swarm online." @@ -33,7 +30,7 @@ C.adjustBruteLoss(-5) C.adjustFireLoss(-5) C.adjustOxyLoss(-5) - C.adjustToxLoss(-5) + C.adjustToxLoss(-5, forced = TRUE) var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(C)) if(namedatum) H.color = namedatum.colour diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index 3d92912f9c..5240b4d06c 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -168,7 +168,6 @@ /mob/living/simple_animal/hostile/alien/maid/Initialize(mapload) . = ..() - AddComponent(/datum/component/cleaning) /mob/living/simple_animal/hostile/alien/maid/AttackingTarget() if(ismovableatom(target)) @@ -177,6 +176,7 @@ qdel(target) return TRUE var/atom/movable/M = target - SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + M.clean_blood() visible_message("[src] polishes \the [target].") return TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index cfdf302d6b..f5b1706f87 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -90,7 +90,7 @@ if(key) to_chat(user, "Someone else already took this spider.") return 1 - key = user.key + user.transfer_ckey(src, FALSE) return 1 //nursemaids - these create webs and eggs diff --git a/code/modules/mob/living/simple_animal/hostile/goose.dm b/code/modules/mob/living/simple_animal/hostile/goose.dm new file mode 100644 index 0000000000..b67770fb4b --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/goose.dm @@ -0,0 +1,35 @@ +#define GOOSE_SATIATED 50 + +/mob/living/simple_animal/hostile/retaliate/goose + name = "goose" + desc = "It's loose" + icon_state = "goose" // sprites by cogwerks from goonstation, used with permission + icon_living = "goose" + icon_dead = "goose_dead" + mob_biotypes = list(MOB_ORGANIC, MOB_BEAST) + speak_chance = 0 + turns_per_move = 5 + butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 2) + response_help = "pets" + response_disarm = "gently pushes aside" + response_harm = "kicks" + emote_taunt = list("hisses") + taunt_chance = 30 + speed = 0 + maxHealth = 25 + health = 25 + harm_intent_damage = 5 + melee_damage_lower = 5 + melee_damage_upper = 5 + attacktext = "pecks" + attack_sound = "goose" + speak_emote = list("honks") + faction = list("neutral") + attack_same = TRUE + gold_core_spawnable = HOSTILE_SPAWN + var/random_retaliate = TRUE + +/mob/living/simple_animal/hostile/retaliate/goose/handle_automated_movement() + . = ..() + if(prob(5) && random_retaliate == TRUE) + Retaliate() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index b529d826c9..b43bf2bb51 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -585,7 +585,7 @@ Difficulty: Very Hard var/be_helper = alert("Become a Lightgeist? (Warning, You can no longer be cloned!)",,"Yes","No") if(be_helper == "Yes" && !QDELETED(src) && isobserver(user)) var/mob/living/simple_animal/hostile/lightgeist/W = new /mob/living/simple_animal/hostile/lightgeist(get_turf(loc)) - W.key = user.key + user.transfer_ckey(W, FALSE) /obj/machinery/anomalous_crystal/helpers/Topic(href, href_list) @@ -649,7 +649,7 @@ Difficulty: Very Hard L.heal_overall_damage(heal_power, heal_power) new /obj/effect/temp_visual/heal(get_turf(target), "#80F5FF") -/mob/living/simple_animal/hostile/lightgeist/ghostize() +/mob/living/simple_animal/hostile/lightgeist/ghostize(can_reenter_corpse = TRUE, send_the_signal = TRUE) . = ..() if(.) death() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm index 26f146b952..8c06b01402 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm @@ -42,7 +42,7 @@ autotransferwait = 200 /obj/belly/megafauna/dragon/gut - name = "stomach" + name = "gut" vore_capacity = 5 //I doubt this many people will actually last in the gut, but... vore_sound = "Tauric Swallow" desc = "With a rush of burning ichor greeting you, you're introduced to the Drake's stomach. Wrinkled walls greedily grind against you, acidic slimes working into your body as you become fuel and nutriton for a superior predator. All that's left is your body's willingness to resist your destiny." diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index 301b270e36..d62f59cdd7 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -127,7 +127,7 @@ var/client/C = L.client SSmedals.UnlockMedal("Boss [BOSS_KILL_MEDAL]", C) SSmedals.UnlockMedal("[medaltype] [BOSS_KILL_MEDAL]", C) - if(crusher_kill && istype(L.get_active_held_item(), /obj/item/twohanded/required/kinetic_crusher)) + if(crusher_kill && istype(L.get_active_held_item(), /obj/item/twohanded/kinetic_crusher)) SSmedals.UnlockMedal("[medaltype] [BOSS_KILL_MEDAL_CRUSHER]", C) SSmedals.SetScore(BOSS_SCORE, C, 1) SSmedals.SetScore(score_type, C, 1) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm index c2d0a214b4..910e9c3c4a 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm @@ -39,7 +39,7 @@ animal_species = /mob/living/simple_animal/hostile/asteroid/gutlunch childtype = list(/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck = 45, /mob/living/simple_animal/hostile/asteroid/gutlunch/guthen = 55) - wanted_objects = list(/obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/blood/gibs/) + wanted_objects = list(/obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/) var/obj/item/udder/gutlunch/udder = null /mob/living/simple_animal/hostile/asteroid/gutlunch/Initialize() diff --git a/code/modules/mob/living/simple_animal/hostile/wizard.dm b/code/modules/mob/living/simple_animal/hostile/wizard.dm index a946cbf45b..f047a7aed1 100644 --- a/code/modules/mob/living/simple_animal/hostile/wizard.dm +++ b/code/modules/mob/living/simple_animal/hostile/wizard.dm @@ -46,7 +46,8 @@ fireball.human_req = 0 fireball.player_lock = 0 AddSpell(fireball) - implants += new /obj/item/implant/exile(src) + var/obj/item/implant/exile/I = new + I.implant(src, null, TRUE) mm = new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile mm.clothes_req = 0 diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 86f63a729d..5e2798cc8e 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -916,7 +916,7 @@ if(mind) mind.transfer_to(G) else - G.key = key + transfer_ckey(G) ..(gibbed) /mob/living/simple_animal/parrot/Poly/proc/Read_Memory() diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 1f81899d8a..7ece4f792c 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -536,7 +536,7 @@ //ANIMAL RIDING /mob/living/simple_animal/user_buckle_mob(mob/living/M, mob/user) - GET_COMPONENT(riding_datum, /datum/component/riding) + var/datum/component/riding/riding_datum = GetComponent(/datum/component/riding) if(riding_datum) if(user.incapacitated()) return @@ -547,7 +547,7 @@ return ..() /mob/living/simple_animal/relaymove(mob/user, direction) - GET_COMPONENT(riding_datum, /datum/component/riding) + var/datum/component/riding/riding_datum = GetComponent(/datum/component/riding) if(tame && riding_datum) riding_datum.handle_ride(user, direction) diff --git a/code/modules/mob/living/simple_animal/simple_animal_vr.dm b/code/modules/mob/living/simple_animal/simple_animal_vr.dm index 666de9cef0..700ee3b7ce 100644 --- a/code/modules/mob/living/simple_animal/simple_animal_vr.dm +++ b/code/modules/mob/living/simple_animal/simple_animal_vr.dm @@ -29,21 +29,22 @@ /mob/living/simple_animal/Destroy() release_vore_contents(include_absorbed = TRUE, silent = TRUE) prey_excludes.Cut() + QDEL_NULL_LIST(vore_organs) . = ..() // Update fullness based on size & quantity of belly contents /mob/living/simple_animal/proc/update_fullness(var/atom/movable/M) var/new_fullness = 0 - for(var/I in vore_organs) - var/datum/belly/B = vore_organs[I] - if (!(M in B.internal_contents)) + for(var/belly in vore_organs) + var/obj/belly/B = vore_organs[belly] + if (!(M in B.contents)) return FALSE // Nothing's inside new_fullness += M vore_fullness = new_fullness /mob/living/simple_animal/death() - release_vore_contents(silent = TRUE) + release_vore_contents() . = ..() // Simple animals have only one belly. This creates it (if it isn't already set up) @@ -51,16 +52,18 @@ vore_init = TRUE if(CHECK_BITFIELD(flags_1, HOLOGRAM_1)) return - if(vore_organs.len) - return - if(no_vore) //If it can't vore, let's not give it a stomach. + if(!vore_active || no_vore) //If it can't vore, let's not give it a stomach. return if(vore_active && !IsAdvancedToolUser()) //vore active, but doesn't have thumbs to grab people with. verbs |= /mob/living/simple_animal/proc/animal_nom - var/obj/belly/B = new /obj/belly(src) + if(LAZYLEN(vore_organs)) + return + + LAZYINITLIST(vore_organs) + var/obj/belly/B = new (src) vore_selected = B - B.immutable = 1 + B.immutable = TRUE B.name = vore_stomach_name ? vore_stomach_name : "stomach" B.desc = vore_stomach_flavor ? vore_stomach_flavor : "Your surroundings are warm, soft, and slimy. Makes sense, considering you're inside \the [name]." B.digest_mode = vore_default_mode @@ -125,13 +128,12 @@ // Simple nom proc for if you get ckey'd into a simple_animal mob! Avoids grabs. // /mob/living/simple_animal/proc/animal_nom(var/mob/living/T in oview(1)) - set name = "Animal Nom" + set name = "Animal Nom (pull target)" set category = "Vore" set desc = "Since you can't grab, you get a verb!" if (stat != CONSCIOUS) return - if (T.devourable == FALSE) - to_chat(usr, "You can't eat this!") + if(!T.devourable) return - return vore_attack(usr,T,usr) + return vore_attack(src,T,src) diff --git a/modular_citadel/code/modules/mob/living/simple_animal/simplemob_vore_values.dm b/code/modules/mob/living/simple_animal/simplemob_vore_values.dm similarity index 98% rename from modular_citadel/code/modules/mob/living/simple_animal/simplemob_vore_values.dm rename to code/modules/mob/living/simple_animal/simplemob_vore_values.dm index 78e18fdb5e..22ed5e3ab4 100644 --- a/modular_citadel/code/modules/mob/living/simple_animal/simplemob_vore_values.dm +++ b/code/modules/mob/living/simple_animal/simplemob_vore_values.dm @@ -129,6 +129,8 @@ vore_default_mode = DM_DIGEST /mob/living/simple_animal/hostile/carp + devourable = TRUE + digestable = TRUE feeding = TRUE vore_active = TRUE isPredator = TRUE diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm index a3e2f48b75..bf80ab9ff4 100644 --- a/code/modules/mob/living/simple_animal/slime/powers.dm +++ b/code/modules/mob/living/simple_animal/slime/powers.dm @@ -198,7 +198,7 @@ if(src.mind) src.mind.transfer_to(new_slime) else - new_slime.key = src.key + transfer_ckey(new_slime) qdel(src) else to_chat(src, "I am not ready to reproduce yet...") diff --git a/code/modules/mob/living/taste.dm b/code/modules/mob/living/taste.dm index 282fe0a716..e4d1aa94a5 100644 --- a/code/modules/mob/living/taste.dm +++ b/code/modules/mob/living/taste.dm @@ -43,7 +43,7 @@ .=..() if ((from.pH > 12.5) || (from.pH < 1.5)) to_chat(src, "You taste chemical burns!") - T.adjustTongueLoss(src, 4) + T.applyOrganDamage(5) if(istype(T, /obj/item/organ/tongue/cybernetic)) to_chat(src, "Your tongue moves on it's own in response to the liquid.") say("The pH is appropriately [round(from.pH, 1)].") @@ -52,13 +52,11 @@ switch(from.pH) if(11.5 to INFINITY) to_chat(src, "You taste a strong alkaline flavour!") - T.adjustTongueLoss(src, 1) if(8.5 to 11.5) to_chat(src, "You taste a sort of soapy tone in the mixture.") if(2.5 to 5.5) to_chat(src, "You taste a sort of acid tone in the mixture.") if(-INFINITY to 2.5) to_chat(src, "You taste a strong acidic flavour!") - T.adjustTongueLoss(src, 1) #undef DEFAULT_TASTE_SENSITIVITY diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 89b37700ea..5a7c6e21ab 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -444,7 +444,13 @@ // M.Login() //wat return - +/mob/proc/transfer_ckey(mob/new_mob, send_signal = TRUE) + if(!ckey) + return FALSE + if(send_signal) + SEND_SIGNAL(src, COMSIG_MOB_KEY_CHANGE, new_mob, src) + new_mob.ckey = ckey + return TRUE /mob/verb/cancel_camera() set name = "Cancel Camera View" @@ -534,7 +540,12 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) return if(isAI(M)) return - show_inv(usr) + +/mob/MouseDrop_T(atom/dropping, atom/user) + . = ..() + if(ismob(dropping) && dropping != user) + var/mob/M = dropping + M.show_inv(user) /mob/proc/is_muzzled() return 0 @@ -805,6 +816,9 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) /mob/proc/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE) return +/mob/proc/canUseStorage() + return FALSE + /mob/proc/faction_check_mob(mob/target, exact_match) if(exact_match) //if we need an exact match, we need to do some bullfuckery. var/list/faction_src = faction.Copy() diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 776bd04935..eb22ab7403 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -88,7 +88,7 @@ if(newletter==" ") newletter="...huuuhhh..." if(newletter==".") - newletter=" *BURP*." + newletter=" BURP!" if(rand(1,100) <= strength*0.5) if(rand(1,5) == 1) newletter+="'" @@ -429,8 +429,8 @@ It's fairly easy to fix if dealing with single letters but not so much with comp var/mob/dead/observer/C = pick(candidates) to_chat(M, "Your mob has been taken over by a ghost!") message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(M)])") - M.ghostize(0) - M.key = C.key + M.ghostize(FALSE, TRUE) + C.transfer_ckey(M, FALSE) return TRUE else to_chat(M, "There were no ghosts willing to take control.") @@ -486,3 +486,35 @@ It's fairly easy to fix if dealing with single letters but not so much with comp /mob/proc/can_hear() . = TRUE + +/proc/bloodtype_to_color(var/type) + . = BLOOD_COLOR_HUMAN + switch(type) + if("U")//Universal blood; a bit orange + . = BLOOD_COLOR_UNIVERSAL + if("SY")//Synthetics blood; blue + . = BLOOD_COLOR_SYNTHETIC + if("L")//lizard, a bit pink/purple + . = BLOOD_COLOR_LIZARD + if("X*")//xeno blood; greenish yellow + . = BLOOD_COLOR_XENO + if("HF")// Oil/Hydraulic blood. something something why not. reee + . = BLOOD_COLOR_OIL + if("GEL")// slimepeople blood, rgb 0, 255, 144 + . = BLOOD_COLOR_SLIME + if("BUG")// yellowish, like, y'know bug guts I guess. + . = BLOOD_COLOR_BUG + //add more stuff to the switch if you have more blood colors for different types + // the defines are in _DEFINES/misc.dm + +//Examine text for traits shared by multiple types. I wish examine was less copypasted. +/mob/proc/common_trait_examine() + if(HAS_TRAIT(src, TRAIT_DISSECTED)) + var/dissectionmsg = "" + if(HAS_TRAIT_FROM(src, TRAIT_DISSECTED,"Extraterrestrial Dissection")) + dissectionmsg = " via Extraterrestrial Dissection. It is no longer worth experimenting on" + else if(HAS_TRAIT_FROM(src, TRAIT_DISSECTED,"Experimental Dissection")) + dissectionmsg = " via Experimental Dissection" + else if(HAS_TRAIT_FROM(src, TRAIT_DISSECTED,"Thorough Dissection")) + dissectionmsg = " via Thorough Dissection" + . += "This body has been dissected and analyzed[dissectionmsg].
" diff --git a/code/modules/mob/mob_transformation_simple.dm b/code/modules/mob/mob_transformation_simple.dm index 673548ff48..a11e7a228e 100644 --- a/code/modules/mob/mob_transformation_simple.dm +++ b/code/modules/mob/mob_transformation_simple.dm @@ -53,7 +53,7 @@ if(mind && isliving(M)) mind.transfer_to(M, 1) // second argument to force key move to new mob else - M.key = key + transfer_ckey(M) if(delete_old_mob) QDEL_IN(src, 1) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 5703e2190b..6394b45aa7 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -75,7 +75,7 @@ O.setOxyLoss(getOxyLoss(), 0) O.setCloneLoss(getCloneLoss(), 0) O.adjustFireLoss(getFireLoss(), 0) - O.setBrainLoss(getBrainLoss(), 0) + O.setOrganLoss(ORGAN_SLOT_BRAIN, getOrganLoss(ORGAN_SLOT_BRAIN), 0) O.adjustStaminaLoss(getStaminaLoss(), 0)//CIT CHANGE - makes monkey transformations inherit stamina O.updatehealth() O.radiation = radiation @@ -236,7 +236,7 @@ O.setOxyLoss(getOxyLoss(), 0) O.setCloneLoss(getCloneLoss(), 0) O.adjustFireLoss(getFireLoss(), 0) - O.setBrainLoss(getBrainLoss(), 0) + O.setOrganLoss(ORGAN_SLOT_BRAIN, getOrganLoss(ORGAN_SLOT_BRAIN), 0) O.adjustStaminaLoss(getStaminaLoss(), 0)//CIT CHANGE - makes monkey transformations inherit stamina O.updatehealth() O.radiation = radiation @@ -382,7 +382,7 @@ mind.active = FALSE mind.transfer_to(R) else if(transfer_after) - R.key = key + transfer_ckey(R) R.apply_pref_name("cyborg") @@ -401,7 +401,7 @@ qdel(src) //human -> alien -/mob/living/carbon/human/proc/Alienize() +/mob/living/carbon/human/proc/Alienize(mind_transfer = TRUE) if (notransform) return for(var/obj/item/W in src) @@ -425,13 +425,16 @@ new_xeno = new /mob/living/carbon/alien/humanoid/drone(loc) new_xeno.a_intent = INTENT_HARM - new_xeno.key = key + if(mind && mind_transfer) + mind.transfer_to(new_xeno) + else + transfer_ckey(new_xeno) to_chat(new_xeno, "You are now an alien.") . = new_xeno qdel(src) -/mob/living/carbon/human/proc/slimeize(reproduce as num) +/mob/living/carbon/human/proc/slimeize(reproduce, mind_transfer = TRUE) if (notransform) return for(var/obj/item/W in src) @@ -457,20 +460,26 @@ else new_slime = new /mob/living/simple_animal/slime(loc) new_slime.a_intent = INTENT_HARM - new_slime.key = key + if(mind && mind_transfer) + mind.transfer_to(new_slime) + else + transfer_ckey(new_slime) to_chat(new_slime, "You are now a slime. Skreee!") . = new_slime qdel(src) -/mob/proc/become_overmind(starting_points = 60) +/mob/proc/become_overmind(starting_points = 60, mind_transfer = FALSE) var/mob/camera/blob/B = new /mob/camera/blob(get_turf(src), starting_points) - B.key = key + if(mind && mind_transfer) + mind.transfer_to(B) + else + transfer_ckey(B) . = B qdel(src) -/mob/living/carbon/human/proc/corgize() +/mob/living/carbon/human/proc/corgize(mind_transfer = TRUE) if (notransform) return for(var/obj/item/W in src) @@ -485,13 +494,16 @@ var/mob/living/simple_animal/pet/dog/corgi/new_corgi = new /mob/living/simple_animal/pet/dog/corgi (loc) new_corgi.a_intent = INTENT_HARM - new_corgi.key = key + if(mind && mind_transfer) + mind.transfer_to(new_corgi) + else + transfer_ckey(new_corgi) to_chat(new_corgi, "You are now a Corgi. Yap Yap!") . = new_corgi qdel(src) -/mob/living/carbon/proc/gorillize() +/mob/living/carbon/proc/gorillize(mind_transfer = TRUE) if(notransform) return @@ -509,22 +521,22 @@ invisibility = INVISIBILITY_MAXIMUM var/mob/living/simple_animal/hostile/gorilla/new_gorilla = new (get_turf(src)) new_gorilla.a_intent = INTENT_HARM - if(mind) + if(mind && mind_transfer) mind.transfer_to(new_gorilla) else - new_gorilla.key = key + transfer_ckey(new_gorilla) to_chat(new_gorilla, "You are now a gorilla. Ooga ooga!") . = new_gorilla qdel(src) -/mob/living/carbon/human/Animalize() +/mob/living/carbon/human/Animalize(mind_transfer = TRUE) var/list/mobtypes = typesof(/mob/living/simple_animal) - var/mobpath = input("Which type of mob should [src] turn into?", "Choose a type") in mobtypes - - if(!safe_animal(mobpath)) - to_chat(usr, "Sorry but this mob type is currently unavailable.") + var/mobpath = input("Which type of mob should [src] turn into?", "Choose a type") as null|anything in mobtypes + if(!mobpath) return + if(mind) + mind_transfer = alert("Want to transfer their mind into the new mob", "Mind Transfer", "Yes", "No") == "Yes" ? TRUE : FALSE if(notransform) return @@ -532,8 +544,8 @@ dropItemToGround(W) regenerate_icons() - notransform = 1 - canmove = 0 + notransform = TRUE + canmove = FALSE icon = null invisibility = INVISIBILITY_MAXIMUM @@ -541,8 +553,10 @@ qdel(t) var/mob/new_mob = new mobpath(src.loc) - - new_mob.key = key + if(mind && mind_transfer) + mind.transfer_to(new_mob) + else + transfer_ckey(new_mob) new_mob.a_intent = INTENT_HARM @@ -550,59 +564,23 @@ . = new_mob qdel(src) -/mob/proc/Animalize() +/mob/proc/Animalize(mind_transfer = TRUE) var/list/mobtypes = typesof(/mob/living/simple_animal) - var/mobpath = input("Which type of mob should [src] turn into?", "Choose a type") in mobtypes - - if(!safe_animal(mobpath)) - to_chat(usr, "Sorry but this mob type is currently unavailable.") + var/mobpath = input("Which type of mob should [src] turn into?", "Choose a type") as null|anything in mobtypes + if(!mobpath) return + if(mind) + mind_transfer = alert("Want to transfer their mind into the new mob", "Mind Transfer", "Yes", "No") == "Yes" ? TRUE : FALSE var/mob/new_mob = new mobpath(src.loc) - new_mob.key = key + if(mind && mind_transfer) + mind.transfer_to(new_mob) + else + transfer_ckey(new_mob) new_mob.a_intent = INTENT_HARM to_chat(new_mob, "You feel more... animalistic") . = new_mob qdel(src) - -/* Certain mob types have problems and should not be allowed to be controlled by players. - * - * This proc is here to force coders to manually place their mob in this list, hopefully tested. - * This also gives a place to explain -why- players shouldnt be turn into certain mobs and hopefully someone can fix them. - */ -/mob/proc/safe_animal(MP) - -//Bad mobs! - Remember to add a comment explaining what's wrong with the mob - if(!MP) - return 0 //Sanity, this should never happen. - - if(ispath(MP, /mob/living/simple_animal/hostile/construct)) - return 0 //Verbs do not appear for players. - -//Good mobs! - if(ispath(MP, /mob/living/simple_animal/pet/cat)) - return 1 - if(ispath(MP, /mob/living/simple_animal/pet/dog/corgi)) - return 1 - if(ispath(MP, /mob/living/simple_animal/crab)) - return 1 - if(ispath(MP, /mob/living/simple_animal/hostile/carp)) - return 1 - if(ispath(MP, /mob/living/simple_animal/hostile/mushroom)) - return 1 - if(ispath(MP, /mob/living/simple_animal/shade)) - return 1 - if(ispath(MP, /mob/living/simple_animal/hostile/killertomato)) - return 1 - if(ispath(MP, /mob/living/simple_animal/mouse)) - return 1 //It is impossible to pull up the player panel for mice (Fixed! - Nodrak) - if(ispath(MP, /mob/living/simple_animal/hostile/bear)) - return 1 //Bears will auto-attack mobs, even if they're player controlled (Fixed! - Nodrak) - if(ispath(MP, /mob/living/simple_animal/parrot)) - return 1 //Parrots are no longer unfinished! -Nodrak - - //Not in here? Must be untested! - return 0 diff --git a/code/modules/ninja/suit/shoes.dm b/code/modules/ninja/suit/shoes.dm index 115b14b63b..1bda62e064 100644 --- a/code/modules/ninja/suit/shoes.dm +++ b/code/modules/ninja/suit/shoes.dm @@ -2,7 +2,6 @@ name = "ninja shoes" desc = "A pair of running shoes. Excellent for running and even better for smashing skulls." icon_state = "s-ninja" - item_state = "secshoes" permeability_coefficient = 0.01 clothing_flags = NOSLIP resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF diff --git a/code/modules/oracle_ui/hookup_procs.dm b/code/modules/oracle_ui/hookup_procs.dm index e6038744c1..0a092caf30 100644 --- a/code/modules/oracle_ui/hookup_procs.dm +++ b/code/modules/oracle_ui/hookup_procs.dm @@ -23,6 +23,8 @@ 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 diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index 907fccdc5b..ccbcf34d8c 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -67,6 +67,9 @@ /obj/structure/filingcabinet/ui_interact(mob/user) . = ..() + if(isobserver(user)) + return + if(contents.len <= 0) to_chat(user, "[src] is empty.") return diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 059a42bb36..471aca34c7 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -32,6 +32,7 @@ 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 /obj/item/paper/pickup(user) @@ -59,7 +60,8 @@ updateinfolinks() /obj/item/paper/oui_getcontent(mob/target) - if(!target.is_literate()) + 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]" @@ -70,8 +72,8 @@ if(check_rights_for(target.client, R_FUN)) //Allows admins to view faxes return TRUE if(isAI(target)) - var/mob/living/silicon/ai/ai = target - return get_dist(src, ai.current) < 2 + force_stars = TRUE + return TRUE if(iscyborg(target)) return get_dist(src, target) < 2 return ..() @@ -133,18 +135,8 @@ playsound(loc, 'sound/items/bikehorn.ogg', 50, 1) addtimer(CALLBACK(src, .proc/reset_spamflag), 20) - /obj/item/paper/attack_ai(mob/living/silicon/ai/user) - var/dist - if(istype(user) && user.current) //is AI - dist = get_dist(src, user.current) - else //cyborg or AI not seeing through a camera - dist = get_dist(src, user) - if(dist < 2) - show_content(user) - else - to_chat(user, "You can't quite see it.") - + show_content(user) /obj/item/paper/proc/addtofield(id, text, links = 0) var/locid = 0 diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index a5900aa196..fece60f268 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -158,13 +158,14 @@ if(..()) if(reagents.total_volume) if(M.reagents) + reagents.reaction(M, INJECT) reagents.trans_to(M, reagents.total_volume) /obj/item/pen/sleepy/Initialize() . = ..() create_reagents(45, OPENCONTAINER) - reagents.add_reagent("chloralhydratedelayed", 20) + reagents.add_reagent("chloralhydrate", 20) reagents.add_reagent("mutetoxin", 15) reagents.add_reagent("tirizene", 10) @@ -200,7 +201,7 @@ throwforce = 35 playsound(user, 'sound/weapons/saberon.ogg', 5, 1) to_chat(user, "[src] is now active.") - GET_COMPONENT_FROM(butchering, /datum/component/butchering, src) + var/datum/component/butchering/butchering = src.GetComponent(/datum/component/butchering) butchering.butchering_enabled = on update_icon() diff --git a/code/modules/photography/photos/album.dm b/code/modules/photography/photos/album.dm index bd77d468d7..3400ed6de0 100644 --- a/code/modules/photography/photos/album.dm +++ b/code/modules/photography/photos/album.dm @@ -13,7 +13,7 @@ /obj/item/storage/photo_album/Initialize() . = ..() - GET_COMPONENT(STR, /datum/component/storage) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.can_hold = typecacheof(list(/obj/item/photo)) STR.max_combined_w_class = 42 STR.max_items = 21 diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index d837f0d420..5fc29cb813 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -802,8 +802,6 @@ if(!ui) ui = new(user, src, ui_key, "apc", name, 535, 515, master_ui, state) ui.open() - if(ui) - ui.set_autoupdate(state = (failure_timer ? 1 : 0)) /obj/machinery/power/apc/ui_data(mob/user) var/list/data = list( diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 3e93d9f42b..bbbf8edae5 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -20,6 +20,7 @@ var/self_recharge = 0 //does it self recharge, over time, or not? var/ratingdesc = TRUE var/grown_battery = FALSE // If it's a grown that acts as a battery, add a wire overlay to it. + rad_flags = RAD_NO_CONTAMINATE // Prevent the same cheese as with the stock parts /obj/item/stock_parts/cell/get_cell() return src @@ -191,7 +192,7 @@ /obj/item/stock_parts/cell/secborg name = "security borg rechargeable D battery" - maxcharge = 1750 //35/17/8 disabler/laser/taser shots. + maxcharge = 1250 //25/12/6 disabler/laser/taser shots. materials = list(MAT_GLASS=40) /obj/item/stock_parts/cell/secborg/empty/Initialize() @@ -201,7 +202,7 @@ /obj/item/stock_parts/cell/lascarbine name = "laser carbine power supply" - maxcharge = 2500 + maxcharge = 1500 //20 laser shots. /obj/item/stock_parts/cell/pulse //200 pulse shots name = "pulse rifle power cell" diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index f82f0ee8e6..8d99cbb485 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -323,6 +323,8 @@ var/BR = brightness var/PO = bulb_power var/CO = bulb_colour + if(color) + CO = color var/area/A = get_area(src) if (A && A.fire) CO = bulb_emergency_colour @@ -360,6 +362,9 @@ else removeStaticPower(static_power_used, STATIC_LIGHT) +/obj/machinery/light/update_atom_colour() + . = ..() + update() /obj/machinery/light/process() if (!cell) diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 4159d9898a..974b210648 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -19,6 +19,7 @@ circuit = /obj/item/circuitboard/machine/rad_collector var/obj/item/tank/internals/plasma/loaded_tank = null var/stored_power = 0 + var/last_push var/active = 0 var/locked = FALSE var/drainratio = 1 @@ -61,9 +62,9 @@ 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) - var/bitcoins_mined = RAD_COLLECTOR_OUTPUT - SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, bitcoins_mined*RAD_COLLECTOR_MINING_CONVERSION_RATE) - stored_power-=bitcoins_mined + SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, stored_power*RAD_COLLECTOR_MINING_CONVERSION_RATE) + last_push = stored_power + stored_power = 0 /obj/machinery/power/rad_collector/interact(mob/user) if(anchored) @@ -170,9 +171,9 @@ . = ..() if(active) if(!bitcoinmining) - to_chat(user, "[src]'s display states that it has stored [DisplayPower(stored_power)], and processing [DisplayPower(RAD_COLLECTOR_OUTPUT)].") + to_chat(user, "[src]'s display states that it has stored [DisplayPower(stored_power)], and is processing [DisplayPower((RAD_COLLECTOR_OUTPUT)*((60 SECONDS)/SSmachines.wait))] per minute.
The plasma within it's tank is being irradiated into tritium.
") else - to_chat(user, "[src]'s display states that it has stored a total of [stored_power*RAD_COLLECTOR_MINING_CONVERSION_RATE], and producing [RAD_COLLECTOR_OUTPUT*RAD_COLLECTOR_MINING_CONVERSION_RATE] research points per minute.") + to_chat(user, "[src]'s display states that it's producing a total of [(last_push*RAD_COLLECTOR_MINING_CONVERSION_RATE)*((60 SECONDS)/SSmachines.wait)] research points per minute.
The tritium and oxygen within it's tank is being combusted into carbon dioxide.
") else if(!bitcoinmining) to_chat(user,"[src]'s display displays the words: \"Power production mode. Please insert Plasma. Use a multitool to change production modes.\"") diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 3c151d4e77..e6fa1e0ee4 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -29,7 +29,7 @@ #define MOLE_HEAT_PENALTY 350 //Heat damage scales around this. Too hot setups with this amount of moles do regular damage, anything above and below is scaled #define POWER_PENALTY_THRESHOLD 5000 //Higher == Engine can generate more power before triggering the high power penalties. #define SEVERE_POWER_PENALTY_THRESHOLD 7000 //Same as above, but causes more dangerous effects -#define CRITICAL_POWER_PENALTY_THRESHOLD 9000 //Even more dangerous effects, threshold for tesla delamination +#define CRITICAL_POWER_PENALTY_THRESHOLD 12000 //Even more dangerous effects, threshold for tesla delamination #define HEAT_PENALTY_THRESHOLD 40 //Higher == Crystal safe operational temperature is higher. #define DAMAGE_HARDCAP 0.002 #define DAMAGE_INCREASE_MULTIPLIER 0.25 @@ -329,6 +329,12 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) if(power) soundloop.volume = min(40, (round(power/100)/50)+1) // 5 +1 volume per 20 power. 2500 power is max + if(isclosedturf(T)) + var/turf/did_it_melt = T.Melt() + if(!isclosedturf(did_it_melt)) //In case some joker finds way to place these on indestructible walls + visible_message("[src] melts through [T]!") + return + //Ok, get the air from the turf var/datum/gas_mixture/env = T.return_air() @@ -415,7 +421,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) if(prob(50)) radiation_pulse(src, power * (1 + (tritiumcomp * TRITIUM_RADIOACTIVITY_MODIFIER) + ((pluoxiumcomp * PLUOXIUM_RADIOACTIVITY_MODIFIER) * pluoxiumbonus) * (power_transmission_bonus/(10-(bzcomp * BZ_RADIOACTIVITY_MODIFIER))))) // Rad Modifiers BZ(500%), Tritium(300%), and Pluoxium(-200%) if(bzcomp >= 0.4 && prob(30 * bzcomp)) - src.fire_nuclear_particles() // Start to emit radballs at a maximum of 30% chance per tick + fire_nuclear_particle() // Start to emit radballs at a maximum of 30% chance per tick var/device_energy = power * REACTION_POWER_MODIFIER diff --git a/code/modules/projectiles/ammunition/energy/stun.dm b/code/modules/projectiles/ammunition/energy/stun.dm index c9e60ddc1d..36d6e16496 100644 --- a/code/modules/projectiles/ammunition/energy/stun.dm +++ b/code/modules/projectiles/ammunition/energy/stun.dm @@ -25,3 +25,6 @@ fire_sound = 'sound/weapons/taser2.ogg' harmful = FALSE click_cooldown_override = 3.5 + +/obj/item/ammo_casing/energy/disabler/secborg + e_cost = 50 \ No newline at end of file diff --git a/code/modules/projectiles/boxes_magazines/external/smg.dm b/code/modules/projectiles/boxes_magazines/external/smg.dm index 65724e503a..783b8b895b 100644 --- a/code/modules/projectiles/boxes_magazines/external/smg.dm +++ b/code/modules/projectiles/boxes_magazines/external/smg.dm @@ -3,11 +3,11 @@ icon_state = "46x30mmt-20" ammo_type = /obj/item/ammo_casing/c46x30mm caliber = "4.6x30mm" - max_ammo = 20 + max_ammo = 32 /obj/item/ammo_box/magazine/wt550m9/update_icon() ..() - icon_state = "46x30mmt-[round(ammo_count(),4)]" + icon_state = "46x30mmt-[round(20*(ammo_count()/max_ammo),4)]" /obj/item/ammo_box/magazine/wt550m9/wtap name = "wt550 magazine (Armour Piercing 4.6x30mm)" @@ -16,7 +16,7 @@ /obj/item/ammo_box/magazine/wt550m9/wtap/update_icon() ..() - icon_state = "46x30mmtA-[round(ammo_count(),4)]" + icon_state = "46x30mmtA-[round(20*(ammo_count()/max_ammo),4)]" /obj/item/ammo_box/magazine/wt550m9/wtic name = "wt550 magazine (Incendiary 4.6x30mm)" @@ -25,7 +25,7 @@ /obj/item/ammo_box/magazine/wt550m9/wtic/update_icon() ..() - icon_state = "46x30mmtI-[round(ammo_count(),4)]" + icon_state = "46x30mmtI-[round(20*(ammo_count()/max_ammo),4)]" /obj/item/ammo_box/magazine/uzim9mm name = "uzi magazine (9mm)" diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index fb3ed19f82..4004bc81ae 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -34,6 +34,7 @@ var/semicd = 0 //cooldown handler var/weapon_weight = WEAPON_LIGHT //currently only used for inaccuracy var/spread = 0 //Spread induced by the gun itself. + var/burst_spread = 0 //Spread induced by the gun itself during burst fire per iteration. Only checked if spread is 0. var/randomspread = 1 //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once. var/inaccuracy_modifier = 1 @@ -62,16 +63,18 @@ var/zoomed = FALSE //Zoom toggle var/zoom_amt = 3 //Distance in TURFs to move the user's screen forward (the "zoom" effect) var/zoom_out_amt = 0 - var/datum/action/toggle_scope_zoom/azoom + var/datum/action/item_action/toggle_scope_zoom/azoom + + var/dualwield_spread_mult = 1 //dualwield spread multiplier /obj/item/gun/Initialize() . = ..() if(pin) pin = new pin(src) if(gun_light) - alight = new /datum/action/item_action/toggle_gunlight(src) - build_zooming() - + alight = new (src) + if(zoomable) + azoom = new (src) /obj/item/gun/CheckParts(list/parts_list) ..() @@ -185,7 +188,7 @@ if(G == src || G.weapon_weight >= WEAPON_MEDIUM) continue else if(G.can_trigger_gun(user)) - bonus_spread += 24 * G.weapon_weight + bonus_spread += 24 * G.weapon_weight * G.dualwield_spread_mult loop_counter++ addtimer(CALLBACK(G, /obj/item/gun.proc/process_fire, target, user, TRUE, params, null, bonus_spread), loop_counter) @@ -226,9 +229,9 @@ to_chat(user, " [src] is lethally chambered! You don't want to risk harming anyone...") return if(randomspread) - sprd = round((rand() - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread)) + sprd = round((rand() - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread), 1) else //Smart spread - sprd = round((((rand_spr/burst_size) * iteration) - (0.5 + (rand_spr * 0.25))) * (randomized_gun_spread + randomized_bonus_spread)) + sprd = round((((rand_spr/burst_size) * iteration) - (0.5 + (rand_spr * 0.25))) * (randomized_gun_spread + randomized_bonus_spread), 1) if(!chambered.fire_casing(target, user, params, ,suppressed, zone_override, sprd)) shoot_with_empty_chamber(user) @@ -259,7 +262,9 @@ var/randomized_gun_spread = 0 var/rand_spr = rand() if(spread) - randomized_gun_spread = rand(0,spread) + randomized_gun_spread = rand(0, spread) + else if(burst_size > 1 && burst_spread) + randomized_gun_spread = rand(0, burst_spread) if(HAS_TRAIT(user, TRAIT_POOR_AIM)) //nice shootin' tex bonus_spread += 25 var/randomized_bonus_spread = rand(0, bonus_spread) @@ -372,6 +377,12 @@ else return ..() +/obj/item/gun/ui_action_click(mob/user, action) + if(istype(action, /datum/action/item_action/toggle_scope_zoom)) + zoom(user) + else if(istype(action, alight)) + toggle_gunlight() + /obj/item/gun/proc/toggle_gunlight() if(!gun_light) return @@ -407,21 +418,10 @@ var/datum/action/A = X A.UpdateButtonIcon() -/obj/item/gun/pickup(mob/user) - ..() - if(azoom) - azoom.Grant(user) - if(alight) - alight.Grant(user) - -/obj/item/gun/dropped(mob/user) - ..() - if(zoomed) - zoom(user,FALSE) - if(azoom) - azoom.Remove(user) - if(alight) - alight.Remove(user) +/obj/item/gun/item_action_slot_check(slot, mob/user, datum/action/A) + if(istype(A, /datum/action/item_action/toggle_scope_zoom) && slot != SLOT_HANDS) + return FALSE + return ..() /obj/item/gun/proc/handle_suicide(mob/living/carbon/human/user, mob/living/carbon/human/target, params, bypass_timer) if(!ishuman(user) || !ishuman(target)) @@ -468,41 +468,32 @@ // ZOOMING // ///////////// -/datum/action/toggle_scope_zoom +/datum/action/item_action/toggle_scope_zoom name = "Toggle Scope" - check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_RESTRAINED|AB_CHECK_STUN|AB_CHECK_LYING icon_icon = 'icons/mob/actions/actions_items.dmi' button_icon_state = "sniper_zoom" - var/obj/item/gun/gun = null -/datum/action/toggle_scope_zoom/Trigger() - gun.zoom(owner) - -/datum/action/toggle_scope_zoom/IsAvailable() +/datum/action/item_action/toggle_scope_zoom/IsAvailable() . = ..() - if(!gun) - return FALSE if(!.) - gun.zoom(owner, FALSE) - if(!owner.get_held_index_of_item(gun)) - return FALSE - -/datum/action/toggle_scope_zoom/Remove(mob/living/L) - gun.zoom(L, FALSE) - ..() + var/obj/item/gun/G = target + G.zoom(owner, FALSE) +/datum/action/item_action/toggle_scope_zoom/Remove(mob/living/L) + var/obj/item/gun/G = target + G.zoom(L, FALSE) + return ..() /obj/item/gun/proc/zoom(mob/living/user, forced_zoom) - if(!user || !user.client) + if(!(user?.client)) return - switch(forced_zoom) - if(FALSE) - zoomed = FALSE - if(TRUE) - zoomed = TRUE - else - zoomed = !zoomed + if(!isnull(forced_zoom)) + if(zoomed == forced_zoom) + return + zoomed = forced_zoom + else + zoomed = !zoomed if(zoomed) var/_x = 0 @@ -524,16 +515,6 @@ user.client.change_view(CONFIG_GET(string/default_view)) user.client.pixel_x = 0 user.client.pixel_y = 0 - return zoomed - -//Proc, so that gun accessories/scopes/etc. can easily add zooming. -/obj/item/gun/proc/build_zooming() - if(azoom) - return - - if(zoomable) - azoom = new() - azoom.gun = src /obj/item/gun/handle_atom_del(atom/A) if(A == chambered) diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 1117bc1000..2f198c1319 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -26,7 +26,6 @@ else icon_state = "[initial(icon_state)][suppressed ? "-suppressed" : ""][sawn_off ? "-sawn" : ""]" - /obj/item/gun/ballistic/process_chamber(empty_chamber = 1) var/obj/item/ammo_casing/AC = chambered //Find chambered round if(istype(AC)) //there's a chambered round @@ -170,7 +169,7 @@ if(iscarbon(user)) var/mob/living/carbon/C = user user_dna = C.dna - B.add_blood_DNA(user_dna) + B.add_blood_DNA(user_dna, C.diseases) var/datum/callback/gibspawner = CALLBACK(GLOBAL_PROC, /proc/spawn_atom_to_turf, /obj/effect/gibspawner/generic, B, 1, FALSE, list(user_dna)) B.throw_at(target, BRAINS_BLOWN_THROW_RANGE, BRAINS_BLOWN_THROW_SPEED, callback=gibspawner) return(BRUTELOSS) diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 4bd65a7b20..5182c96671 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -2,6 +2,7 @@ w_class = WEIGHT_CLASS_NORMAL var/alarmed = 0 var/select = 1 + var/automatic_burst_overlay = TRUE can_suppress = TRUE burst_size = 3 fire_delay = 2 @@ -19,10 +20,11 @@ /obj/item/gun/ballistic/automatic/update_icon() ..() - if(!select) - add_overlay("[initial(icon_state)]semi") - if(select == 1) - add_overlay("[initial(icon_state)]burst") + if(automatic_burst_overlay) + if(!select) + add_overlay("[initial(icon_state)]semi") + if(select == 1) + add_overlay("[initial(icon_state)]burst") icon_state = "[initial(icon_state)][magazine ? "-[magazine.max_ammo]" : ""][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]" /obj/item/gun/ballistic/automatic/attackby(obj/item/A, mob/user, params) @@ -51,19 +53,20 @@ else to_chat(user, "You cannot seem to get \the [src] out of your hands!") -/obj/item/gun/ballistic/automatic/ui_action_click() - burst_select() +/obj/item/gun/ballistic/automatic/ui_action_click(mob/user, action) + if(istype(action, /datum/action/item_action/toggle_firemode)) + burst_select() + else + return ..() /obj/item/gun/ballistic/automatic/proc/burst_select() var/mob/living/carbon/human/user = usr select = !select if(!select) - burst_size = 1 - fire_delay = 0 + disable_burst() to_chat(user, "You switch to semi-automatic.") else - burst_size = initial(burst_size) - fire_delay = initial(fire_delay) + enable_burst() to_chat(user, "You switch to [burst_size]-rnd burst.") playsound(user, 'sound/weapons/empty.ogg', 100, 1) @@ -72,6 +75,14 @@ var/datum/action/A = X A.UpdateButtonIcon() +/obj/item/gun/ballistic/automatic/proc/enable_burst() + burst_size = initial(burst_size) + fire_delay = initial(fire_delay) + +/obj/item/gun/ballistic/automatic/proc/disable_burst() + burst_size = 1 + fire_delay = 0 + /obj/item/gun/ballistic/automatic/can_shoot() return get_ammo() @@ -106,7 +117,6 @@ /obj/item/gun/ballistic/automatic/c20r/afterattack() . = ..() empty_alarm() - return /obj/item/gun/ballistic/automatic/c20r/update_icon() ..() @@ -118,17 +128,25 @@ icon_state = "wt550" item_state = "arg" mag_type = /obj/item/ammo_box/magazine/wt550m9 - fire_delay = 2 can_suppress = FALSE - burst_size = 0 - actions_types = list() + burst_size = 2 + fire_delay = 1 can_bayonet = TRUE knife_x_offset = 25 knife_y_offset = 12 + automatic_burst_overlay = FALSE + +/obj/item/gun/ballistic/automatic/wt550/enable_burst() + . = ..() + spread = 15 + +/obj/item/gun/ballistic/automatic/wt550/disable_burst() + . = ..() + spread = 0 /obj/item/gun/ballistic/automatic/wt550/update_icon() ..() - icon_state = "wt550[magazine ? "-[CEILING(get_ammo(0)/4, 1)*4]" : ""]" + icon_state = "wt550[magazine ? "-[CEILING(( (get_ammo(FALSE) / magazine.max_ammo) * 20) /4, 1)*4]" : "-0"]" //Sprites only support up to 20. /obj/item/gun/ballistic/automatic/mini_uzi name = "\improper Type U3 Uzi" diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index f455e0f138..a5fb8a85aa 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -277,12 +277,12 @@ ..() if(istype(A, /obj/item/ammo_box) || istype(A, /obj/item/ammo_casing)) chamber_round() + if(A.tool_behaviour == TOOL_SAW || istype(A, /obj/item/gun/energy/plasmacutter)) + sawoff(user) if(istype(A, /obj/item/melee/transforming/energy)) var/obj/item/melee/transforming/energy/W = A if(W.active) sawoff(user) - if(istype(A, /obj/item/circular_saw) || istype(A, /obj/item/gun/energy/plasmacutter)) - sawoff(user) /obj/item/gun/ballistic/revolver/doublebarrel/attack_self(mob/living/user) var/num_unloaded = 0 diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index d1b99c0e3c..47ccb6076f 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -95,7 +95,7 @@ /obj/item/gun/ballistic/shotgun/riot/attackby(obj/item/A, mob/user, params) ..() - if(istype(A, /obj/item/circular_saw) || istype(A, /obj/item/gun/energy/plasmacutter)) + if(A.tool_behaviour == TOOL_SAW || istype(A, /obj/item/gun/energy/plasmacutter)) sawoff(user) if(istype(A, /obj/item/melee/transforming/energy)) var/obj/item/melee/transforming/energy/W = A diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 6060ceba99..2cccc57d9e 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -174,9 +174,6 @@ itemState += "[ratio]" item_state = itemState -/obj/item/gun/energy/ui_action_click() - toggle_gunlight() - /obj/item/gun/energy/suicide_act(mob/living/user) if (istype(user) && can_shoot() && can_trigger_gun(user) && user.get_bodypart(BODY_ZONE_HEAD)) user.visible_message("[user] is putting the barrel of [src] in [user.p_their()] mouth. It looks like [user.p_theyre()] trying to commit suicide!") diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index 54cb9fe5d0..de738c9047 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -118,11 +118,11 @@ switch(fail_tick) if(0 to 200) fail_tick += (2*(fail_chance)) - M.rad_act(40) + M.rad_act(400) to_chat(M, "Your [name] feels warmer.") if(201 to INFINITY) SSobj.processing.Remove(src) - M.rad_act(80) + M.rad_act(800) crit_fail = 1 to_chat(M, "Your [name]'s reactor overloads!") diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 3733dad9a3..c5d4c36813 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -20,7 +20,7 @@ name = "hybrid taser" desc = "A dual-mode taser designed to fire both short-range high-power electrodes and long-range disabler beams." icon_state = "advtaser" - ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/disabler) + ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/electrode) ammo_x_offset = 2 /obj/item/gun/energy/e_gun/advtaser/cyborg @@ -49,6 +49,7 @@ name = "cyborg disabler" desc = "An integrated disabler that draws from a cyborg's power cell. This one contains a limiter to prevent the cyborg's power cell from overheating." can_charge = FALSE + ammo_type = list(/obj/item/ammo_casing/energy/disabler/secborg) selfcharge = EGUN_SELFCHARGE_BORG cell_type = /obj/item/stock_parts/cell/secborg charge_delay = 5 diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index e4d13ad315..92fe91c222 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -45,7 +45,7 @@ var/aiming_lastangle = 0 var/mob/current_user = null var/list/obj/effect/projectile/tracer/current_tracers - + var/structure_piercing = 1 var/structure_bleed_coeff = 0.7 var/wall_pierce_amount = 0 @@ -76,7 +76,7 @@ var/static/image/drained_overlay = image(icon = 'icons/obj/guns/energy.dmi', icon_state = "esniper_empty") var/datum/action/item_action/zoom_lock_action/zoom_lock_action - var/datum/component/mobhook + var/mob/listeningTo /obj/item/gun/energy/beam_rifle/debug delay = 0 @@ -111,7 +111,9 @@ to_chat(owner, "You switch [src]'s zooming processor to center mode.") if(ZOOM_LOCK_OFF) to_chat(owner, "You disable [src]'s zooming system.") - reset_zooming() + reset_zooming() + else + return ..() /obj/item/gun/energy/beam_rifle/proc/set_autozoom_pixel_offsets_immediate(current_angle) if(zoom_lock == ZOOM_LOCK_CENTER_VIEW || zoom_lock == ZOOM_LOCK_OFF) @@ -172,7 +174,7 @@ STOP_PROCESSING(SSfastprocess, src) set_user(null) QDEL_LIST(current_tracers) - QDEL_NULL(mobhook) + listeningTo = null return ..() /obj/item/gun/energy/beam_rifle/emp_act(severity) @@ -259,14 +261,17 @@ if(user == current_user) return stop_aiming(current_user) - QDEL_NULL(mobhook) + if(listeningTo) + UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) + listeningTo = null if(istype(current_user)) LAZYREMOVE(current_user.mousemove_intercept_objects, src) current_user = null if(istype(user)) current_user = user LAZYOR(current_user.mousemove_intercept_objects, src) - mobhook = user.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED = CALLBACK(src, .proc/on_mob_move))) + RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/on_mob_move) + listeningTo = user /obj/item/gun/energy/beam_rifle/onMouseDrag(src_object, over_object, src_location, over_location, params, mob) if(aiming) diff --git a/code/modules/projectiles/guns/misc/syringe_gun.dm b/code/modules/projectiles/guns/misc/syringe_gun.dm index 26e66b1987..342ceecbc2 100644 --- a/code/modules/projectiles/guns/misc/syringe_gun.dm +++ b/code/modules/projectiles/guns/misc/syringe_gun.dm @@ -122,3 +122,32 @@ else to_chat(user, "You can't put the [A] into \the [src]!") return FALSE + +/obj/item/gun/syringe/dart/rapiddart + name = "Repeating dart gun" + icon_state = "rapiddartgun" + item_state = "rapiddartgun" + +/obj/item/gun/syringe/dart/rapiddart/CheckParts(list/parts_list) + var/obj/item/reagent_containers/glass/beaker/B = locate(/obj/item/reagent_containers/glass/beaker) in parts_list + + if(istype(B, /obj/item/reagent_containers/glass/beaker/large)) + desc = "[initial(desc)] A modification of the dart gun's pressure chamber has been perfomed using a [B], extending it's holding size to [max_syringes]." + max_syringes = 2 + return + else if(istype(B, /obj/item/reagent_containers/glass/beaker/plastic)) + desc = "[initial(desc)] A modification of the dart gun's pressure chamber has been perfomed using a [B], extending it's holding size to [max_syringes]." + max_syringes = 3 + return + else if(istype(B, /obj/item/reagent_containers/glass/beaker/meta)) + desc = "[initial(desc)] A modification of the dart gun's pressure chamber has been perfomed using a [B], extending it's holding size to [max_syringes]." + max_syringes = 4 + return + else if(istype(B, /obj/item/reagent_containers/glass/beaker/bluespace)) + desc = "[initial(desc)] A modification of the dart gun's pressure chamber has been perfomed using a [B], extending it's holding size to [max_syringes]." + max_syringes = 6 + return + else + max_syringes = 1 + desc = "[initial(desc)] It has a [B] strapped to it, but it doesn't seem to be doing anything." + ..() diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index efae090707..8b881b57ed 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -88,6 +88,8 @@ //Effects var/stun = 0 var/knockdown = 0 + var/knockdown_stamoverride + var/knockdown_stam_max var/unconscious = 0 var/irradiate = 0 var/stutter = 0 @@ -161,15 +163,26 @@ var/splatter_dir = dir if(starting) splatter_dir = get_dir(starting, target_loca) - if(isalien(L)) + var/obj/item/bodypart/B = L.get_bodypart(def_zone) + if(B.status == BODYPART_ROBOTIC) // So if you hit a robotic, it sparks instead of bloodspatters + do_sparks(2, FALSE, target.loc) + if(prob(25)) + new /obj/effect/decal/cleanable/oil(target_loca) + else if(isalien(L)) new /obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter(target_loca, splatter_dir) else - new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir) + if(ishuman(target)) + var/mob/living/carbon/human/H = target + new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir, bloodtype_to_color(H.dna.blood_type)) + else + new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir, bloodtype_to_color()) + if(iscarbon(L)) var/mob/living/carbon/C = L C.bleed(damage) else L.add_splatter_floor(target_loca) + else if(impact_effect_type && !hitscan) new impact_effect_type(target_loca, hitx, hity) @@ -202,7 +215,7 @@ else L.log_message("has been shot by [firer] with [src]", LOG_ATTACK, color="orange") - return L.apply_effects(stun, knockdown, unconscious, irradiate, slur, stutter, eyeblur, drowsy, blocked, stamina, jitter) + return L.apply_effects(stun, knockdown, unconscious, irradiate, slur, stutter, eyeblur, drowsy, blocked, stamina, jitter, knockdown_stamoverride, knockdown_stam_max) /obj/item/projectile/proc/vol_by_damage() if(src.damage) diff --git a/code/modules/projectiles/projectile/bullets/smg.dm b/code/modules/projectiles/projectile/bullets/smg.dm index dfc6df537d..94ec2d3c2b 100644 --- a/code/modules/projectiles/projectile/bullets/smg.dm +++ b/code/modules/projectiles/projectile/bullets/smg.dm @@ -1,60 +1,69 @@ -// .45 (M1911 & C20r) - -/obj/item/projectile/bullet/c45 - name = ".45 bullet" - damage = 20 - stamina = 65 - -/obj/item/projectile/bullet/c45_nostamina - name = ".45 bullet" - damage = 30 - -/obj/item/projectile/bullet/c45_cleaning - name = ".45 bullet" - damage = 24 - stamina = 10 - -/obj/item/projectile/bullet/c45_cleaning/on_hit(atom/target, blocked = FALSE) - . = ..() - var/turf/T = get_turf(target) - - //section shamelessly copypasta'd from the clean component - SEND_SIGNAL(T, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - for(var/A in T) - if(is_cleanable(A)) - qdel(A) - else if(istype(A, /obj/item)) - var/obj/item/I = A - SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - if(ismob(I.loc)) - var/mob/M = I.loc - M.regenerate_icons() - else if(ishuman(A)) - var/mob/living/carbon/human/cleaned_human = A - if(cleaned_human.head) - SEND_SIGNAL(cleaned_human.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - if(cleaned_human.wear_suit) - SEND_SIGNAL(cleaned_human.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - else if(cleaned_human.w_uniform) - SEND_SIGNAL(cleaned_human.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - if(cleaned_human.shoes) - SEND_SIGNAL(cleaned_human.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - SEND_SIGNAL(cleaned_human, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - cleaned_human.wash_cream() - cleaned_human.regenerate_icons() - -// 4.6x30mm (Autorifles) - -/obj/item/projectile/bullet/c46x30mm - name = "4.6x30mm bullet" - damage = 20 - -/obj/item/projectile/bullet/c46x30mm_ap - name = "4.6x30mm armor-piercing bullet" - damage = 15 - armour_penetration = 40 - -/obj/item/projectile/bullet/incendiary/c46x30mm - name = "4.6x30mm incendiary bullet" - damage = 10 - fire_stacks = 1 +// .45 (M1911 & C20r) + +/obj/item/projectile/bullet/c45 + name = ".45 bullet" + damage = 20 + stamina = 65 + +/obj/item/projectile/bullet/c45_nostamina + name = ".45 bullet" + damage = 30 + +/obj/item/projectile/bullet/c45_cleaning + name = ".45 bullet" + damage = 24 + stamina = 10 + +/obj/item/projectile/bullet/c45_cleaning/on_hit(atom/target, blocked = FALSE) + . = ..() + var/turf/T = get_turf(target) + SEND_SIGNAL(T, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + for(var/A in T) + if(is_cleanable(A)) + qdel(A) + else if(isitem(A)) + var/obj/item/cleaned_item = A + SEND_SIGNAL(cleaned_item, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_item.clean_blood() + if(ismob(cleaned_item.loc)) + var/mob/M = cleaned_item.loc + M.regenerate_icons() + else if(ishuman(A)) + var/mob/living/carbon/human/cleaned_human = A + if(cleaned_human.lying) + if(cleaned_human.head) + SEND_SIGNAL(cleaned_human.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_human.head.clean_blood() + cleaned_human.update_inv_head() + if(cleaned_human.wear_suit) + SEND_SIGNAL(cleaned_human.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_human.wear_suit.clean_blood() + cleaned_human.update_inv_wear_suit() + else if(cleaned_human.w_uniform) + SEND_SIGNAL(cleaned_human.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_human.w_uniform.clean_blood() + cleaned_human.update_inv_w_uniform() + if(cleaned_human.shoes) + SEND_SIGNAL(cleaned_human.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_human.shoes.clean_blood() + cleaned_human.update_inv_shoes() + SEND_SIGNAL(cleaned_human, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_human.clean_blood() + cleaned_human.wash_cream() + cleaned_human.regenerate_icons() + +// 4.6x30mm (Autorifles) + +/obj/item/projectile/bullet/c46x30mm + name = "4.6x30mm bullet" + damage = 15 + +/obj/item/projectile/bullet/c46x30mm_ap + name = "4.6x30mm armor-piercing bullet" + damage = 12.5 + armour_penetration = 40 + +/obj/item/projectile/bullet/incendiary/c46x30mm + name = "4.6x30mm incendiary bullet" + damage = 7.5 + fire_stacks = 1 diff --git a/code/modules/projectiles/projectile/energy/nuclear_particle.dm b/code/modules/projectiles/projectile/energy/nuclear_particle.dm index 1753587ad3..e08f806fe5 100644 --- a/code/modules/projectiles/projectile/energy/nuclear_particle.dm +++ b/code/modules/projectiles/projectile/energy/nuclear_particle.dm @@ -3,10 +3,9 @@ name = "nuclear particle" icon_state = "nuclear_particle" pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE - damage = 20 - damage_type = TOX - irradiate = 2500 //enough to knockdown and induce vomiting - speed = 0.4 + flag = "rad" + irradiate = 5000 + speed = 0.4 hitsound = 'sound/weapons/emitter2.ogg' impact_type = /obj/effect/projectile/impact/xray var/static/list/particle_colors = list( @@ -25,22 +24,6 @@ add_atom_colour(particle_colors[our_color], FIXED_COLOUR_PRIORITY) set_light(4, 3, particle_colors[our_color]) //Range of 4, brightness of 3 - Same range as a flashlight -/atom/proc/fire_nuclear_particles(power_ratio) //used by fusion to fire random # of nuclear particles - power ratio determines about how many are fired - var/random_particles = rand(3,6) - var/particles_to_fire - var/particles_fired - switch(power_ratio) //multiply random_particles * factor for whatever tier - if(0 to FUSION_MID_TIER_THRESHOLD) - particles_to_fire = random_particles * FUSION_PARTICLE_FACTOR_LOW - if(FUSION_MID_TIER_THRESHOLD to FUSION_HIGH_TIER_THRESHOLD) - particles_to_fire = random_particles * FUSION_PARTICLE_FACTOR_MID - if(FUSION_HIGH_TIER_THRESHOLD to FUSION_SUPER_TIER_THRESHOLD) - particles_to_fire = random_particles * FUSION_PARTICLE_FACTOR_HIGH - if(FUSION_SUPER_TIER_THRESHOLD to INFINITY) - particles_to_fire = random_particles * FUSION_PARTICLE_FACTOR_SUPER - while(particles_to_fire) - particles_fired++ - var/angle = rand(0,360) - var/obj/item/projectile/energy/nuclear_particle/P = new /obj/item/projectile/energy/nuclear_particle(src) - addtimer(CALLBACK(P, /obj/item/projectile.proc/fire, angle), particles_fired) //multiply particles fired * delay so the particles end up stagnated (once every decisecond) - particles_to_fire-- \ No newline at end of file +/atom/proc/fire_nuclear_particle(angle = rand(0,360)) //used by fusion to fire random nuclear particles. Fires one particle in a random direction. + var/obj/item/projectile/energy/nuclear_particle/P = new /obj/item/projectile/energy/nuclear_particle(src) + P.fire(angle) diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm index 895a165f49..d7c8b8b082 100644 --- a/code/modules/projectiles/projectile/energy/stun.dm +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -3,7 +3,9 @@ icon_state = "spark" color = "#FFFF00" nodamage = 1 - knockdown = 100 + knockdown = 60 + knockdown_stamoverride = 36 + knockdown_stam_max = 50 stutter = 5 jitter = 20 hitsound = 'sound/weapons/taserhit.ogg' @@ -11,6 +13,7 @@ tracer_type = /obj/effect/projectile/tracer/stun muzzle_type = /obj/effect/projectile/muzzle/stun impact_type = /obj/effect/projectile/impact/stun + var/tase_duration = 50 /obj/item/projectile/energy/electrode/on_hit(atom/target, blocked = FALSE) . = ..() @@ -23,6 +26,7 @@ if(C.dna && C.dna.check_mutation(HULK)) C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk") else if((C.status_flags & CANKNOCKDOWN) && !HAS_TRAIT(C, TRAIT_STUNIMMUNE)) + C.apply_status_effect(STATUS_EFFECT_TASED, tase_duration) addtimer(CALLBACK(C, /mob/living/carbon.proc/do_jitter_animation, jitter), 5) /obj/item/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet diff --git a/code/modules/projectiles/projectile/special/mindflayer.dm b/code/modules/projectiles/projectile/special/mindflayer.dm index d717bed39e..ac4488cae0 100644 --- a/code/modules/projectiles/projectile/special/mindflayer.dm +++ b/code/modules/projectiles/projectile/special/mindflayer.dm @@ -5,5 +5,5 @@ . = ..() if(ishuman(target)) var/mob/living/carbon/human/M = target - M.adjustBrainLoss(20) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 20) M.hallucination += 30 diff --git a/code/modules/projectiles/projectile/special/neurotoxin.dm b/code/modules/projectiles/projectile/special/neurotoxin.dm index baf1495abb..1d359585c0 100644 --- a/code/modules/projectiles/projectile/special/neurotoxin.dm +++ b/code/modules/projectiles/projectile/special/neurotoxin.dm @@ -8,7 +8,7 @@ if(isalien(target)) knockdown = 0 nodamage = TRUE - else if(isliving(target)) + else if(iscarbon(target)) var/mob/living/L = target L.Knockdown(100, TRUE, FALSE, 30, 25) return ..() diff --git a/code/modules/reagents/chem_wiki_render.dm b/code/modules/reagents/chem_wiki_render.dm new file mode 100644 index 0000000000..efb6bdecfd --- /dev/null +++ b/code/modules/reagents/chem_wiki_render.dm @@ -0,0 +1,387 @@ +//Generates a markdown txt file for use with the wiki + +/proc/find_reagent(input) + . = FALSE + if(GLOB.chemical_reagents_list[input]) //prefer IDs! + var/datum/reagent/R = GLOB.chemical_reagents_list[input] + return R + else + for(var/X in GLOB.chemical_reagents_list) + var/datum/reagent/R = GLOB.chemical_reagents_list[X] + if(input == replacetext(lowertext(R.name), " ", "")) + return R + if(input == replacetext(lowertext(R.id), " ", "")) + return R + + + + +/client/proc/generate_wikichem_list() + set name = "Generate Wikichems" + set category = "Debug" + set desc = "Generate a huge loglist of all the chems. Do not click unless you want lag." + + + + var/prefix = "|Name | Reagents | Reaction vars | Description | Chem properties |\n|---|---|---|-----------|---|\n" + var/input_reagent = replacetext(lowertext(input("Input the name/id of a reagent to get it's description on it's own, or leave blank to parse every chem.", "Input") as text), " ", "") //95% of the time, the reagent id is a lowercase/no spaces version of the name + if(input_reagent) + var/input_reagent2 = find_reagent(input_reagent) + if(!input_reagent2) + to_chat(usr, "Unable to find reagent, stopping proc.") + var/single_parse = generate_chemwiki_line(input_reagent2, input_reagent, FALSE) + text2file(single_parse, "[GLOB.log_directory]/chem_parse.md") + to_chat(usr, "[single_parse].") + + single_parse = generate_chemwiki_line(input_reagent2, input_reagent, FALSE) + text2file(single_parse, "[GLOB.log_directory]/chem_parse.md") + to_chat(usr, "[single_parse].") + to_chat(usr, "Saved line to (wherever your root folder is, i.e. where the DME is)/[GLOB.log_directory]/chem_parse.md OR use the Get Current Logs verb under the Admin tab. (if you click Open, and it does nothing, that's because you've not set a .md default program! Try downloading it instead, and use that file to set a default program! Also have a cute day.)") + //Do things here + return + to_chat(usr, "Generating big list") + message_admins("Someone pressed the lag button. (Generate Wikichems)") + ///datum/reagent/medicine, /datum/reagent/toxin, /datum/reagent/consumable, /datum/reagent/plantnutriment, /datum/reagent/uranium, + ///datum/reagent/colorful_reagent, /datum/reagent/mutationtoxin, /datum/reagent/fermi, /datum/reagent/drug, /datum/reagent/impure + + //Probably not the most eligant of solutions. + to_chat(usr, "Attempting reagent scan. Length of list [LAZYLEN(GLOB.chemical_reagents_list)*2]") + var/datum/reagent/R + var/tally = 0 + var/processCR = TRUE //Process reactions first + var/medicine = "" + var/toxin = "" + var/consumable = "" + var/plant = "" + var/uranium = "" + var/colours = "" + var/muta = "" + var/fermi = "" + var/remainder = "" + var/drug = "" + var/basic = "" + var/upgraded = "" + var/drinks = "" + var/alco = "" + var/grinded = "" + var/blob = "" + var/impure = "" + + //Chem_dispencer + var/list/dispensable_reagents = list( + "hydrogen", + "lithium", + "carbon", + "nitrogen", + "oxygen", + "fluorine", + "sodium", + "aluminium", + "silicon", + "phosphorus", + "sulfur", + "chlorine", + "potassium", + "iron", + "copper", + "mercury", + "radium", + "water", + "ethanol", + "sugar", + "sacid", + "welding_fuel", + "silver", + "iodine", + "bromine", + "stable_plasma" + ) + var/list/components = list( + "oil", + "ammonia", + "ash", + "acetone", + "phenol", + "diethylamine", + "saltpetre", + "sodiumchloride", + "lye" + ) + + var/list/grind = list( + "bluespace", + "gold", + "plasma", + "uranium" + ) + + //Bartender + var/dispence_drinks = list( + "water", + "ice", + "coffee", + "cream", + "tea", + "icetea", + "cola", + "spacemountainwind", + "dr_gibb", + "space_up", + "tonic", + "sodawater", + "lemon_lime", + "pwr_game", + "shamblers", + "sugar", + "orangejuice", + "grenadine", + "limejuice", + "tomatojuice", + "lemonjuice", + "menthol" + ) + var/dispence_alco = list( + "beer", + "kahlua", + "whiskey", + "wine", + "vodka", + "gin", + "rum", + "tequila", + "vermouth", + "cognac", + "ale", + "absinthe", + "hcider", + "creme_de_menthe", + "creme_de_cacao", + "triple_sec", + "sake", + "applejack" + ) + + var/breakout = FALSE + for(var/i = 1, i <= 2, i+=1) + for(var/X in GLOB.chemical_reagents_list) + R = GLOB.chemical_reagents_list[X] + if(!R.description) //No description? It's not worth my time. + continue + + for(var/Y in dispensable_reagents) //Why do you have to do this + if(R.id == Y) + basic += generate_chemwiki_line(R, X, processCR) + breakout = TRUE + continue + + for(var/Y in components) + if(R.id == Y) + upgraded += generate_chemwiki_line(R, X, processCR) + breakout = TRUE + continue + + for(var/Y in dispence_drinks) + if(R.id == Y) + drinks += generate_chemwiki_line(R, X, processCR) + breakout = TRUE + continue + + for(var/Y in dispence_alco) + if(R.id == Y) + alco += generate_chemwiki_line(R, X, processCR) + breakout = TRUE + continue + + for(var/Y in grind) + if(R.id == Y) + grinded += generate_chemwiki_line(R, X, processCR) + breakout = TRUE + continue + + if(breakout) + breakout = FALSE + continue + + if(istype(R, /datum/reagent/medicine)) + medicine += generate_chemwiki_line(R, X, processCR) + + else if(istype(R, /datum/reagent/toxin)) + toxin += generate_chemwiki_line(R, X, processCR) + + else if(istype(R, /datum/reagent/consumable)) + consumable += generate_chemwiki_line(R, X, processCR) + + else if(istype(R, /datum/reagent/plantnutriment)) + plant += generate_chemwiki_line(R, X, processCR) + + else if(istype(R, /datum/reagent/uranium)) + uranium += generate_chemwiki_line(R, X, processCR) + + else if(istype(R, /datum/reagent/colorful_reagent)) + colours += generate_chemwiki_line(R, X, processCR) + + else if(istype(R, /datum/reagent/mutationtoxin)) + muta += generate_chemwiki_line(R, X, processCR) + + else if(istype(R, /datum/reagent/fermi)) + fermi += generate_chemwiki_line(R, X, processCR) + + else if(istype(R, /datum/reagent/drug)) + drug += generate_chemwiki_line(R, X, processCR) + + else if(istype(R, /datum/reagent/blob)) + blob += generate_chemwiki_line(R, X, processCR) + + else if(istype(R, /datum/reagent/impure)) + impure += generate_chemwiki_line(R, X, processCR) + + else + remainder += generate_chemwiki_line(R, X, processCR) + + tally++ + if((tally%50)==0) + to_chat(usr, "[tally] of [LAZYLEN(GLOB.chemical_reagents_list)*2] done.") + + processCR = FALSE + + to_chat(usr, "finished chems") + + var/wholeString = ("\n# DISPENCEABLE REAGENTS\n\n[prefix][basic]\n\n# COMPONENT REAGENTS\n\n[prefix][upgraded]\n\n# GROUND REAGENTS\n\n[prefix][grinded]\n") + wholeString += ("\n# MEDICINE:\n\n[prefix][medicine]\n\n# TOXIN:\n\n[prefix][toxin]\n\n# DRUGS\n\n[prefix][drug]\n\n# FERMI\n\nThese chems lie on the cutting edge of chemical technology, and as such are not recommended for beginners!\n\n[prefix][fermi]\n\n# IMPURE REAGENTS\n\n[prefix][impure]\n\n# GENERAL REAGENTS\n\n[prefix][remainder]\n\n# DISPENCEABLE SOFT DRINKS\n\n[prefix][drinks]\n\n# DISPENCEABLE HARD DRINKS\n\n[prefix][alco]\n\n# CONSUMABLE\n\n[prefix][consumable]\n\n# PLANTS\n\n[prefix][plant]\n\n# URANIUM\n\n[prefix][uranium]\n\n# COLOURS\n\n[prefix][colours]\n\n# RACE MUTATIONS\n\n[prefix][muta]\n\n\n# BLOB REAGENTS\n\n[prefix][blob]\n") + + prefix = "|Name | Reagents | Reaction vars | Description |\n|---|---|---|----------|\n" + var/CRparse = "" + to_chat(usr, "starting reactions") + + //generate the reactions that we missed from before + for(var/reagent in GLOB.chemical_reactions_list) + for(var/datum/chemical_reaction/CR in GLOB.chemical_reactions_list[reagent]) + CRparse += generate_chemreactwiki_line(CR) + + wholeString += ("\n# CHEMICAL REACTIONS\n\n[prefix][CRparse]\n") + text2file(wholeString, "[GLOB.log_directory]/chem_parse.md") + to_chat(usr, "finished reactions") + to_chat(usr, "Saved file to (wherever your root folder is, i.e. where the DME is)/[GLOB.log_directory]/chem_parse.md OR use the Get Current Logs verb under the Admin tab. (if you click Open, and it does nothing, that's because you've not set a .md default program! Try downloading it instead, and use that file to set a default program! Also have a cute day.)") + + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + + +//Generate the big list of reagent based reactions. +/proc/generate_chemwiki_line(datum/reagent/R, X, processCR) + //name | Reagent pH | reagents | reaction temp | explosion temp | pH range | Kinetics | description | OD level | Addiction level | Metabolism rate | impure chem | inverse chem + + var/datum/chemical_reaction/CR = get_chemical_reaction(R.id) + if((!CR && processCR) || (CR && !processCR)) // Do reactions first. + return "" + + + var/outstring = "|
!\[[R.color]\](https://placehold.it/15/[copytext(R.color, 2, 8)]/000000?text=+)[R.name]
pH: [R.pH] | " + var/datum/reagent/R3 + if(CR) + outstring += "
    " + for(var/R2 in CR.required_reagents) + R3 = GLOB.chemical_reagents_list[R2]//What a convoluted mess + outstring += "
  • [R3.name]: [CR.required_reagents[R3.id]]u
  • " + if(CR.required_catalysts) + for(var/R2 in CR.required_catalysts) + R3 = GLOB.chemical_reagents_list[R2] + outstring += "
  • Catalyst: [R3.name]: [CR.required_catalysts[R3.id]]u
  • " + outstring += "
| " + else + outstring += "N/A | " + + + //Temp, Explosions and pH + if(CR) + outstring += "
    [(CR.FermiChem?"
  • Min react temp: [CR.OptimalTempMin]K
  • ":"[(CR.required_temp?"
  • Min react temp: [CR.required_temp]K
  • ":"")]")] [(CR.FermiChem?"
  • Explosion_temp: [CR.ExplodeTemp]K
  • ":"")] [(CR.FermiChem?"
  • pH range: [max((CR.OptimalpHMin - CR.ReactpHLim), 0)] to [min((CR.OptimalpHMax + CR.ReactpHLim), 14)]
  • ":"")] " + if(CR.FermiChem) + outstring += "[(CR.PurityMin?"
  • Min explosive purity: [CR.PurityMin]
  • ":"")] [(CR.FermiExplode?"
  • Special explosion: Yes
  • ":"")]" + else + outstring += "" + + //Kinetics + if(CR) + if(CR.FermiChem) + switch(CR.ThermicConstant) + if(-INFINITY to -9.9) + outstring += "
  • Extremely endothermic
  • " + if(-9.9 to -4.9) + outstring += "
  • Very endothermic
  • " + if(-4.9 to -0.1) + outstring += "
  • Endothermic
  • " + if(-0.1 to 0.1) + outstring += "
  • Neutral
  • " + if(0.1 to 4.9) + outstring += "
  • Exothermic
  • " + if(4.9 to 9.9) + outstring += "
  • Very exothermic
  • " + if(9.9 to 19.9) + outstring += "
  • Extremely exothermic
  • " + if(19.9 to INFINITY ) + outstring += "
  • **Dangerously exothermic**
  • " + //if("cheesey") + //outstring += "
  • Dangerously Cheesey
  • " + + outstring += "
| " + else + outstring += " | " + + //Description, OD, Addict, Meta + outstring += "[R.description] |
  • Metabolism rate: [R.metabolization_rate/2]u/s
  • [(R.overdose_threshold?"
  • Overdose: [R.overdose_threshold]u
  • ":"")] [(R.addiction_threshold?"
  • Addiction: [R.addiction_threshold]u
  • ":"")] " + + if(R.impure_chem && R.impure_chem != "fermiTox") + R3 = GLOB.chemical_reagents_list[R.impure_chem] + outstring += "
  • Impure chem:[R3.name]
  • " + + if(R.inverse_chem && R.impure_chem != "fermiTox") + R3 = GLOB.chemical_reagents_list[R.inverse_chem] + outstring += "
  • Inverse chem:[R3.name]
  • [(R3.inverse_chem_val?"
  • Inverse purity: [R3.inverse_chem_val]
  • ":"")] " + + if(CR) + if(CR.required_container) + /*var/obj/item/I + I = istype(I, CR.required_container) if you can work out how to get this to work, by all means. + outstring += "
  • Required container: [I.name]
  • "*/ + outstring += "
  • Required container: [CR.required_container]
  • " + + outstring += "
|\n" + return outstring + +//Generate the big list of reaction based reactions. +//|Name | Reagents | Reaction vars | Description | Chem properties +/proc/generate_chemreactwiki_line(datum/chemical_reaction/CR) + if(CR.results.len) //Handled prior + return + var/outstring = "|[CR.name] |
    " + + //reagents + var/datum/reagent/R3 + for(var/R2 in CR.required_reagents) + R3 = GLOB.chemical_reagents_list[R2] + outstring += "
  • [R3.name]: [CR.required_reagents[R3.id]]u
  • " + if(CR.required_catalysts) + for(var/R2 in CR.required_catalysts) + R3 = GLOB.chemical_reagents_list[R2] + outstring += "
  • Catalyst: [R3.name]: [CR.required_catalysts[R3.id]]u
  • " + outstring += "
|
    " + + //Reaction vars + if(CR.required_temp) + outstring += "
  • Min react temp: [CR.required_temp]K
  • " + if(CR.FermiChem) + outstring += "[(CR.FermiChem?"
  • Min react temp: [CR.OptimalTempMin]K
  • ":"[(CR.required_temp?"
  • Min react temp: [CR.required_temp]K
  • ":"")]")] [(CR.FermiChem?"
  • Explosion temp: [CR.ExplodeTemp]K
  • ":"")] [(CR.FermiChem?"
  • pH range: [max((CR.OptimalpHMin - CR.ReactpHLim), 0)] to [min((CR.OptimalpHMax + CR.ReactpHLim), 14)]
  • ":"")]
  • Minimum purity: [CR.PurityMin] [(CR.FermiExplode?"
  • Special explosion: Yes
  • ":"")]" + if(CR.is_cold_recipe) + outstring += "
  • Cold: Yes
  • " + if(CR.required_container) + outstring += "
  • Required container: [CR.required_container]
  • " + if(CR.mob_react) + outstring += "
  • Can react in mob: Yes
  • " + + //description + outstring += "
| fill in manually " + + outstring += "
    |\n" + return outstring diff --git a/code/modules/reagents/chemistry/fermi/readme.md b/code/modules/reagents/chemistry/fermi/readme.md new file mode 100644 index 0000000000..4b897b6c4b --- /dev/null +++ b/code/modules/reagents/chemistry/fermi/readme.md @@ -0,0 +1,23 @@ +How to code fermichem reactions: +First off, probably read though the readme for standard reagent mechanisms, this builds on top of that. + +#bitflags +for `datum/reagent/` you have the following options with `var/chemical_flags`: + +``` +REAGENT_DEAD_PROCESS calls on_mob_dead() if present in a dead body +REAGENT_DONOTSPLIT Do not split the chem at all during processing +REAGENT_ONLYINVERSE Only invert chem, no splitting +REAGENT_ONMOBMERGE Call on_mob_life proc when reagents are merging. +REAGENT_INVISIBLE Doesn't appear on handheld health analyzers. +REAGENT_FORCEONNEW Forces a on_new() call without a data overhead +REAGENT_SNEAKYNAME When inverted, the inverted chem uses the name of the original chem +REAGENT_SPLITRETAINVOL Retains initial volume of chem when splitting +``` + +for `datum/chemical_reaction/` under `var/clear_conversion` + +``` +REACTION_CLEAR_IMPURE Convert into impure/pure on reaction completion +REACTION_CLEAR_INVERSE Convert into inverse on reaction completion when purity is low enough +``` diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 61273d181d..fb064b6146 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -63,7 +63,7 @@ var/targetVol = 0 //the target volume, i.e. the total amount that can be created during a fermichem reaction. var/reactedVol = 0 //how much of the reagent is reacted during a fermireaction var/fermiIsReacting = FALSE //that prevents multiple reactions from occurring (i.e. add_reagent calls to process_reactions(), this stops any extra reactions.) - var/fermiReactID = null //ID of the chem being made during a fermireaction, kept here so it's cache isn't lost between loops/procs. + var/fermiReactID //ID of the chem being made during a fermireaction, kept here so it's cache isn't lost between loops/procs. /datum/reagents/New(maximum=100, new_flags) maximum_volume = maximum @@ -128,14 +128,12 @@ /datum/reagents/proc/remove_all(amount = 1) var/list/cached_reagents = reagent_list - if((total_volume - amount) <= 0)//Because this can result in 0, I don't want it to crash. - pH = 7 if(total_volume > 0) var/part = amount / total_volume for(var/reagent in cached_reagents) var/datum/reagent/R = reagent remove_reagent(R.id, R.volume * part, ignore_pH = TRUE) - + pH = REAGENT_NORMAL_PH update_total() handle_reactions() return amount @@ -365,7 +363,7 @@ /datum/reagents/proc/handle_reactions()//HERE EDIT HERE THE MAIN REACTION - if(fermiIsReacting == TRUE) + if(fermiIsReacting) //This ARRESTS other reactions. If you don't want this, then remove it. return if(reagents_holder_flags & NO_REACT) @@ -404,7 +402,7 @@ for(var/B in cached_required_reagents) - if(!has_reagent(B, cached_required_reagents[B])) + if(!has_reagent(B, cached_required_reagents[B]))//Allows vols at less than 1 to react. break total_matching_reagents++ for(var/B in cached_required_catalysts) @@ -464,44 +462,47 @@ //Temperature plays into a larger role too. var/datum/chemical_reaction/C = selected_reaction - if (C.FermiChem == TRUE && !continue_reacting) + if (C.FermiChem && !continue_reacting) if (chem_temp > C.ExplodeTemp) //This is first to ensure explosions. - var/datum/chemical_reaction/fermi/Ferm = selected_reaction + var/datum/chemical_reaction/Ferm = selected_reaction fermiIsReacting = FALSE SSblackbox.record_feedback("tally", "fermi_chem", 1, ("[Ferm] explosion")) Ferm.FermiExplode(src, my_atom, volume = total_volume, temp = chem_temp, pH = pH) return 0 + //This is just to calc the on_reaction multiplier, and is a candidate for removal. for(var/B in cached_required_reagents) - multiplier = min(multiplier, round((get_reagent_amount(B) / cached_required_reagents[B]), CHEMICAL_QUANTISATION_LEVEL)) + multiplier = min(multiplier, round((get_reagent_amount(B) / cached_required_reagents[B]), 0.0001)) for(var/P in selected_reaction.results) targetVol = cached_results[P]*multiplier - if( (chem_temp <= C.ExplodeTemp) && (chem_temp >= C.OptimalTempMin)) - if( (pH >= (C.OptimalpHMin - C.ReactpHLim)) && (pH <= (C.OptimalpHMax + C.ReactpHLim)) )//To prevent pointless reactions - - if (fermiIsReacting == TRUE) - return 0 - else - START_PROCESSING(SSprocessing, src) - selected_reaction.on_reaction(src, my_atom, multiplier) - fermiIsReacting = TRUE - fermiReactID = selected_reaction - reaction_occurred = 1 - - else //It's a little bit of a confusing nest, but esstentially we check if it's a fermireaction, then temperature, then pH. If this is true, the remainer of this handler is run. - return 0 //If pH is out of range + if(!((chem_temp <= C.ExplodeTemp) && (chem_temp >= C.OptimalTempMin))) + return 0 //Not hot enough + if(! ((pH >= (C.OptimalpHMin - C.ReactpHLim)) && (pH <= (C.OptimalpHMax + C.ReactpHLim)) ))//To prevent pointless reactions + return 0 + if (fermiIsReacting) + return 0 else - return 0 //If not hot enough + START_PROCESSING(SSprocessing, src) + selected_reaction.on_reaction(src, my_atom, multiplier) + fermiIsReacting = TRUE + fermiReactID = selected_reaction + reaction_occurred = 1 //Standard reaction mechanics: else - if (C.FermiChem == TRUE)//Just to make sure + if (C.FermiChem)//Just to make sure, should only proc when grenades are combining. + if (chem_temp > C.ExplodeTemp) //To allow fermigrenades + var/datum/chemical_reaction/fermi/Ferm = selected_reaction + fermiIsReacting = FALSE + SSblackbox.record_feedback("tally", "fermi_chem", 1, ("[Ferm] explosion")) + Ferm.FermiExplode(src, my_atom, volume = total_volume, temp = chem_temp, pH = pH) return 0 for(var/B in cached_required_reagents) // multiplier = min(multiplier, round((get_reagent_amount(B) / cached_required_reagents[B]), CHEMICAL_QUANTISATION_LEVEL)) + for(var/B in cached_required_reagents) remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1, ignore_pH = TRUE) @@ -539,59 +540,67 @@ return 0 /datum/reagents/process() - var/datum/chemical_reaction/fermi/C = fermiReactID + var/datum/chemical_reaction/C = fermiReactID var/list/cached_required_reagents = C.required_reagents//update reagents list var/list/cached_results = C.results//resultant chemical list var/multiplier = INFINITY - for(var/B in cached_required_reagents) // - multiplier = min(multiplier, round((get_reagent_amount(B) / cached_required_reagents[B]), 0.001)) - if (multiplier == 0) + multiplier = min(multiplier, round((get_reagent_amount(B) / cached_required_reagents[B]), 0.0001)) + if (multiplier <= 0)//clarity fermiEnd() return - for(var/P in cached_results) - targetVol = cached_results[P]*multiplier - if (fermiIsReacting == FALSE) - CRASH("Fermi has refused to stop reacting even though we asked her nicely.") - - if (chem_temp > C.OptimalTempMin && fermiIsReacting == TRUE)//To prevent pointless reactions - if( (pH >= (C.OptimalpHMin - C.ReactpHLim)) && (pH <= (C.OptimalpHMax + C.ReactpHLim)) ) - if (reactedVol < targetVol) - reactedVol = fermiReact(fermiReactID, chem_temp, pH, reactedVol, targetVol, cached_required_reagents, cached_results, multiplier) - else//Volume is used up + if(C.required_catalysts) + for(var/P in C.required_catalysts) + if(!has_reagent(P)) fermiEnd() return - else//pH is out of range - fermiEnd() - return - else//Temperature is too low, or reaction has stopped. + + if (!fermiIsReacting) + CRASH("Fermi has refused to stop reacting even though we asked her nicely.") + + if (!(chem_temp >= C.OptimalTempMin))//To prevent pointless reactions fermiEnd() return + if (!( (pH >= (C.OptimalpHMin - C.ReactpHLim)) && (pH <= (C.OptimalpHMax + C.ReactpHLim)) )) //if pH is too far out, (could possibly allow reactions at this point, after the reaction has started, but make purity = 0) + fermiEnd() + return + + reactedVol = fermiReact(fermiReactID, chem_temp, pH, reactedVol, targetVol, cached_required_reagents, cached_results, multiplier) + if(round(reactedVol, CHEMICAL_QUANTISATION_LEVEL) == round(targetVol, CHEMICAL_QUANTISATION_LEVEL)) + fermiEnd() + if(!reactedVol)//Maybe unnessicary. + fermiEnd() + return + /datum/reagents/proc/fermiEnd() - var/datum/chemical_reaction/fermi/C = fermiReactID + var/datum/chemical_reaction/C = fermiReactID STOP_PROCESSING(SSprocessing, src) fermiIsReacting = FALSE reactedVol = 0 targetVol = 0 + //Cap off values + for(var/datum/reagent/R in reagent_list) + R.volume = round(R.volume, CHEMICAL_QUANTISATION_LEVEL)//To prevent runaways. //pH check, handled at the end to reduce calls. if(istype(my_atom, /obj/item/reagent_containers)) var/obj/item/reagent_containers/RC = my_atom RC.pH_check() - C.FermiFinish(src, my_atom) + C.FermiFinish(src, my_atom, reactedVol) + reactedVol = 0 + targetVol = 0 handle_reactions() update_total() //Reaction sounds and words - playsound(get_turf(my_atom), C.mix_sound, 80, 1) var/list/seen = viewers(5, get_turf(my_atom)) var/iconhtml = icon2html(my_atom, seen) for(var/mob/M in seen) to_chat(M, "[iconhtml] [C.mix_message]") /datum/reagents/proc/fermiReact(selected_reaction, cached_temp, cached_pH, reactedVol, targetVol, cached_required_reagents, cached_results, multiplier) - var/datum/chemical_reaction/fermi/C = selected_reaction + var/datum/chemical_reaction/C = selected_reaction var/deltaT = 0 var/deltapH = 0 var/stepChemAmmount = 0 @@ -641,16 +650,18 @@ //ONLY WORKS FOR ONE PRODUCT AT THE MOMENT //Calculate how much product to make and how much reactant to remove factors.. for(var/P in cached_results) - //stepChemAmmount = CLAMP(((deltaT * multiplier), 0, ((targetVol - reactedVol)/cached_results[P])) //used to have multipler, now it does stepChemAmmount = (multiplier*cached_results[P]) - if (stepChemAmmount >= C.RateUpLim) - stepChemAmmount = (C.RateUpLim) + if (stepChemAmmount > C.RateUpLim) + stepChemAmmount = C.RateUpLim addChemAmmount = deltaT * stepChemAmmount if (addChemAmmount >= (targetVol - reactedVol)) addChemAmmount = (targetVol - reactedVol) if (addChemAmmount < CHEMICAL_QUANTISATION_LEVEL) addChemAmmount = CHEMICAL_QUANTISATION_LEVEL removeChemAmmount = (addChemAmmount/cached_results[P]) + //keep limited. + addChemAmmount = round(addChemAmmount, CHEMICAL_QUANTISATION_LEVEL) + removeChemAmmount = round(removeChemAmmount, CHEMICAL_QUANTISATION_LEVEL) //This is kept for future bugtesters. //message_admins("Reaction vars: PreReacted: [reactedVol] of [targetVol]. deltaT [deltaT], multiplier [multiplier], Step [stepChemAmmount], uncapped Step [deltaT*(multiplier*cached_results[P])], addChemAmmount [addChemAmmount], removeFactor [removeChemAmmount] Pfactor [cached_results[P]], adding [addChemAmmount]") @@ -663,7 +674,7 @@ for(var/P in cached_results) SSblackbox.record_feedback("tally", "chemical_reaction", addChemAmmount, P)//log SSblackbox.record_feedback("tally", "fermi_chem", addChemAmmount, P) - add_reagent(P, (addChemAmmount), null, cached_temp, purity)//add reagent function!! I THINK I can do this: + add_reagent(P, (addChemAmmount), null, cached_temp, purity) TotalStep += addChemAmmount//for multiple products //Above should reduce yeild based on holder purity. //Purity Check @@ -672,11 +683,11 @@ if (R.purity < C.PurityMin)//If purity is below the min, blow it up. fermiIsReacting = FALSE SSblackbox.record_feedback("tally", "fermi_chem", 1, ("[P] explosion")) - C.FermiExplode(src, my_atom, (reactedVol+targetVol), cached_temp, pH) + C.FermiExplode(src, my_atom, (total_volume), cached_temp, pH) STOP_PROCESSING(SSprocessing, src) - return 0 + return - C.FermiCreate(src)//proc that calls when step is done + C.FermiCreate(src, addChemAmmount, purity)//proc that calls when step is done //Apply pH changes and thermal output of reaction to beaker chem_temp = round(cached_temp + (C.ThermicConstant * addChemAmmount)) @@ -689,18 +700,18 @@ //go to explode proc fermiIsReacting = FALSE SSblackbox.record_feedback("tally", "fermi_chem", 1, ("[C] explosions")) - C.FermiExplode(src, my_atom, (reactedVol+targetVol), chem_temp, pH) + C.FermiExplode(src, my_atom, (total_volume), chem_temp, pH) STOP_PROCESSING(SSprocessing, src) return - //Make sure things are limited. + //Make sure things are limited, but superacids/bases can push forward the reaction pH = CLAMP(pH, 0, 14) //return said amount to compare for next step. return (reactedVol) //Currently calculates it irrespective of required reagents at the start -/datum/reagents/proc/reactant_purity(var/datum/chemical_reaction/fermi/C, holder) +/datum/reagents/proc/reactant_purity(var/datum/chemical_reaction/C, holder) var/list/cached_reagents = reagent_list var/i = 0 var/cachedPurity @@ -708,8 +719,18 @@ if (R in cached_reagents) cachedPurity += R.purity i++ + if(!i)//I've never seen it get here with 0, but in case + CRASH("No reactants found mid reaction for [fermiReactID]/[C], how it got here is beyond me. Beaker: [holder]") return cachedPurity/i +/datum/reagents/proc/uncache_purity(id) + var/datum/reagent/R = has_reagent("[id]") + if(!R) + return + if(R.cached_purity == 1) + return + R.purity = R.cached_purity + /datum/reagents/proc/isolate_reagent(reagent) var/list/cached_reagents = reagent_list for(var/_reagent in cached_reagents) @@ -741,10 +762,14 @@ total_volume = 0 for(var/reagent in cached_reagents) var/datum/reagent/R = reagent - if(R.volume < CHEMICAL_QUANTISATION_LEVEL) + if(R.volume <= 0)//For clarity + del_reagent(R.id) + if((R.volume < 0.01) && !fermiIsReacting) del_reagent(R.id) else total_volume += R.volume + if(!reagent_list || !total_volume) + pH = REAGENT_NORMAL_PH return 0 /datum/reagents/proc/clear_reagents() @@ -809,7 +834,7 @@ if(!isnum(amount) || !amount) return FALSE - if(amount <= CHEMICAL_QUANTISATION_LEVEL)//To prevent small ammount problems. + if(amount < CHEMICAL_QUANTISATION_LEVEL)//To prevent small ammount problems. return FALSE var/datum/reagent/D = GLOB.chemical_reagents_list[reagent] @@ -817,7 +842,7 @@ WARNING("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])") return FALSE - if (D.id == "water" && no_react == FALSE && !istype(my_atom, /obj/item/reagent_containers/food)) //Do like an otter, add acid to water, but also don't blow up botany. + if (D.id == "water" && !no_react && !istype(my_atom, /obj/item/reagent_containers/food)) //Do like an otter, add acid to water, but also don't blow up botany. if (pH <= 2) SSblackbox.record_feedback("tally", "fermi_chem", 1, "water-acid explosions") var/datum/effect_system/smoke_spread/chem/s = new @@ -843,7 +868,6 @@ var/new_total = cached_total + amount var/cached_temp = chem_temp var/list/cached_reagents = reagent_list - var/cached_pH = pH @@ -860,7 +884,7 @@ chem_temp = thermal_energy / (specific_heat * new_total) //cacluate reagent based pH shift. - if(ignore_pH == TRUE) + if(ignore_pH) pH = ((cached_pH * cached_total)+(other_pH * amount))/(cached_total + amount)//should be right else pH = ((cached_pH * cached_total)+(D.pH * amount))/(cached_total + amount)//should be right @@ -880,10 +904,8 @@ if(my_atom) my_atom.on_reagent_change(ADD_REAGENT) if(isliving(my_atom)) - if(R.OnMobMergeCheck == TRUE)//Forces on_mob_add proc when a chem is merged + if(R.chemical_flags & REAGENT_ONMOBMERGE)//Forces on_mob_add proc when a chem is merged R.on_mob_add(my_atom, amount) - //else - // R.on_merge(data, amount, my_atom, other_purity) R.on_merge(data, amount, my_atom, other_purity) if(!no_react) handle_reactions() @@ -901,7 +923,7 @@ if(data) R.data = data R.on_new(data) - if(R.addProc == TRUE)//Allows on new without data overhead. + if(R.chemical_flags & REAGENT_FORCEONNEW)//Allows on new without data overhead. R.on_new(pH) //Add more as desired. @@ -939,9 +961,9 @@ var/datum/reagent/R = A if (R.id == reagent) if((total_volume - amount) <= 0)//Because this can result in 0, I don't want it to crash. - pH = 7 + pH = REAGENT_NORMAL_PH //In practice this is really confusing and players feel like it randomly melts their beakers, but I'm not sure how else to handle it. We'll see how it goes and I can remove this if it confuses people. - else if (ignore_pH == FALSE) + else if (!ignore_pH) //if (((pH > R.pH) && (pH <= 7)) || ((pH < R.pH) && (pH >= 7))) pH = (((pH - R.pH) / total_volume) * amount) + pH if(istype(my_atom, /obj/item/reagent_containers/)) diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index 436ee80e7b..eeb452dbb5 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -77,6 +77,16 @@ updateUsrDialog() update_icon() return + + if(beaker) + if(istype(I, /obj/item/reagent_containers/dropper)) + var/obj/item/reagent_containers/dropper/D = I + D.afterattack(beaker, user, 1) + + if(istype(I, /obj/item/reagent_containers/syringe)) + var/obj/item/reagent_containers/syringe/S = I + S.afterattack(beaker, user, 1) + return ..() /obj/machinery/chem_heater/on_deconstruction() diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 85cf5e5011..f540ae850d 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -175,7 +175,7 @@ data["chosenPillStyle"] = chosenPillStyle data["isPillBottleLoaded"] = bottle ? 1 : 0 if(bottle) - GET_COMPONENT_FROM(STRB, /datum/component/storage, bottle) + var/datum/component/storage/STRB = bottle.GetComponent(/datum/component/storage) data["pillBotContent"] = bottle.contents.len data["pillBotMaxContent"] = STRB.max_items @@ -263,7 +263,7 @@ var/target_loc = bottle ? bottle : drop_location() var/drop_threshold = INFINITY if(bottle) - GET_COMPONENT_FROM(STRB, /datum/component/storage, bottle) + var/datum/component/storage/STRB = bottle.GetComponent(/datum/component/storage) if(STRB) drop_threshold = STRB.max_items - bottle.contents.len @@ -384,6 +384,38 @@ adjust_item_drop_location(P) reagents.trans_to(P, vol_part) . = TRUE + + if("createDart") + for(var/datum/reagent/R in reagents.reagent_list) + if(!(istype(R, /datum/reagent/medicine))) + visible_message("The [src] beeps, \"SmartDarts are insoluble with non-medicinal compounds.\"") + return + + var/many = params["many"] + if(reagents.total_volume == 0) + return + var/amount = 1 + var/vol_each = min(reagents.total_volume, 20) + if(text2num(many)) + amount = CLAMP(round(input(usr, "Max 10. Buffer content will be split evenly.", "How many darts?", amount) as num|null), 0, 10) + if(!amount) + return + vol_each = min(reagents.total_volume / amount, 20) + + var/name = stripped_input(usr,"Name:","Name your SmartDart!", "[reagents.get_master_reagent_name()] ([vol_each]u)", MAX_NAME_LEN) + if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) + return + + var/obj/item/reagent_containers/syringe/dart/D + for(var/i = 0; i < amount; i++) + D = new /obj/item/reagent_containers/syringe/dart(drop_location()) + D.name = trim("[name] SmartDart") + adjust_item_drop_location(D) + reagents.trans_to(D, vol_each) + D.mode=!mode + D.update_icon() + . = TRUE + //END CITADEL ADDITIONS if("analyzeBeak") var/datum/reagent/R = GLOB.chemical_reagents_list[params["id"]] @@ -405,7 +437,7 @@ if(!targetReagent) CRASH("Tried to find a reagent that doesn't exist in the chem_master!") - analyzeVars = list("name" = initial(R.name), "state" = state, "color" = initial(R.color), "description" = initial(R.description), "metaRate" = T, "overD" = initial(R.overdose_threshold), "addicD" = initial(R.addiction_threshold), "purityF" = targetReagent.purity, "inverseRatioF" = initial(R.InverseChemVal), "purityE" = initial(Rcr.PurityMin), "minTemp" = initial(Rcr.OptimalTempMin), "maxTemp" = initial(Rcr.OptimalTempMax), "eTemp" = initial(Rcr.ExplodeTemp), "pHpeak" = pHpeakCache) + analyzeVars = list("name" = initial(R.name), "state" = state, "color" = initial(R.color), "description" = initial(R.description), "metaRate" = T, "overD" = initial(R.overdose_threshold), "addicD" = initial(R.addiction_threshold), "purityF" = targetReagent.purity, "inverseRatioF" = initial(R.inverse_chem_val), "purityE" = initial(Rcr.PurityMin), "minTemp" = initial(Rcr.OptimalTempMin), "maxTemp" = initial(Rcr.OptimalTempMax), "eTemp" = initial(Rcr.ExplodeTemp), "pHpeak" = pHpeakCache) else fermianalyze = FALSE analyzeVars = list("name" = initial(R.name), "state" = state, "color" = initial(R.color), "description" = initial(R.description), "metaRate" = T, "overD" = initial(R.overdose_threshold), "addicD" = initial(R.addiction_threshold)) @@ -432,7 +464,7 @@ if(!targetReagent) CRASH("Tried to find a reagent that doesn't exist in the chem_master!") - analyzeVars = list("name" = initial(R.name), "state" = state, "color" = initial(R.color), "description" = initial(R.description), "metaRate" = T, "overD" = initial(R.overdose_threshold), "addicD" = initial(R.addiction_threshold), "purityF" = targetReagent.purity, "inverseRatioF" = initial(R.InverseChemVal), "purityE" = initial(Rcr.PurityMin), "minTemp" = initial(Rcr.OptimalTempMin), "maxTemp" = initial(Rcr.OptimalTempMax), "eTemp" = initial(Rcr.ExplodeTemp), "pHpeak" = pHpeakCache) + analyzeVars = list("name" = initial(R.name), "state" = state, "color" = initial(R.color), "description" = initial(R.description), "metaRate" = T, "overD" = initial(R.overdose_threshold), "addicD" = initial(R.addiction_threshold), "purityF" = targetReagent.purity, "inverseRatioF" = initial(R.inverse_chem_val), "purityE" = initial(Rcr.PurityMin), "minTemp" = initial(Rcr.OptimalTempMin), "maxTemp" = initial(Rcr.OptimalTempMax), "eTemp" = initial(Rcr.ExplodeTemp), "pHpeak" = pHpeakCache) else fermianalyze = FALSE analyzeVars = list("name" = initial(R.name), "state" = state, "color" = initial(R.color), "description" = initial(R.description), "metaRate" = T, "overD" = initial(R.overdose_threshold), "addicD" = initial(R.addiction_threshold)) diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 0e482f8cec..05fa4d382a 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -125,12 +125,6 @@ else cut_overlays() -/obj/machinery/computer/pandemic/proc/eject_beaker() - if(beaker) - beaker.forceMove(drop_location()) - beaker = null - update_icon() - /obj/machinery/computer/pandemic/ui_interact(mob/user, ui_key = "main", datum/tgui/ui, force_open = FALSE, 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) @@ -165,7 +159,7 @@ return switch(action) if("eject_beaker") - eject_beaker() + replace_beaker(usr) . = TRUE if("empty_beaker") if(beaker) @@ -174,7 +168,7 @@ if("empty_eject_beaker") if(beaker) beaker.reagents.clear_reagents() - eject_beaker() + replace_beaker(usr) . = TRUE if("rename_disease") var/id = get_virus_id_by_index(text2num(params["index"])) @@ -194,13 +188,15 @@ to_chat(usr, "ERROR: Cannot replicate virus strain.") return A = A.Copy() - var/list/data = list("viruses" = list(A)) + var/list/data = list("blood_DNA" = "UNKNOWN DNA", "blood_type" = "SY", "viruses" = list(A)) var/obj/item/reagent_containers/glass/bottle/B = new(drop_location()) B.name = "[A.name] culture bottle" B.desc = "A small bottle. Contains [A.agent] culture in synthblood medium." B.reagents.add_reagent("blood", 20, data) wait = TRUE update_icon() + var/turf/source_turf = get_turf(src) + log_virus("A culture bottle was printed for the virus [A.admin_details()] at [loc_name(source_turf)] by [key_name(usr)]") addtimer(CALLBACK(src, .proc/reset_replicator_cooldown), 50) . = TRUE if("create_vaccine_bottle") @@ -232,18 +228,32 @@ . = TRUE //no afterattack if(stat & (NOPOWER|BROKEN)) return - if(beaker) - to_chat(user, "A container is already loaded into [src]!") + var/obj/item/reagent_containers/B = I + if(!user.transferItemToLoc(B, src)) return - if(!user.transferItemToLoc(I, src)) - return - - beaker = I + replace_beaker(user, B) to_chat(user, "You insert [I] into [src].") - update_icon() else return ..() +/obj/machinery/computer/pandemic/AltClick(mob/living/user) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + return + replace_beaker(user) + return + +/obj/machinery/computer/pandemic/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker) + if(beaker) + if(user && Adjacent(user) && !issiliconoradminghost(user)) + if(!user.put_in_hands(beaker)) + beaker.forceMove(drop_location()) + if(new_beaker) + beaker = new_beaker + else + beaker = null + update_icon() + return TRUE + /obj/machinery/computer/pandemic/on_deconstruction() - eject_beaker() + replace_beaker(usr) . = ..() diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 520148848c..52d3ba7822 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -32,20 +32,18 @@ var/addiction_stage3_end = 30 var/addiction_stage4_end = 40 var/overdosed = 0 // You fucked up and this is now triggering its overdose effects, purge that shit quick. - var/self_consuming = FALSE - var/metabolizing = FALSE - var/invisible = FALSE //Set to true if it doesn't appear on handheld health analyzers. + var/self_consuming = FALSE //I think this uhhh, makes weird stuff happen when metabolising, but... doesn't seem to do what I think, so I'm gonna leave it. //Fermichem vars: - var/purity = 1 //How pure a chemical is from 0 - 1. - var/addProc = FALSE //If the chemical should force an on_new() call - var/turf/loc = null //Should be the creation location! + var/purity = 1 //How pure a chemical is from 0 - 1. + var/cached_purity = 1 + var/turf/loc = null //Should be the creation location! var/pH = 7 //pH of the specific reagent, used for calculating the sum pH of a holder. - var/SplitChem = FALSE //If the chem splits on metabolism - var/ImpureChem = "fermiTox"// What chemical is metabolised with an inpure reaction - var/InverseChemVal = 0.25 // If the impurity is below 0.5, replace ALL of the chem with InverseChem upon metabolising - var/InverseChem = "fermiTox"// What chem is metabolised when purity is below InverseChemVal, this shouldn't be made, but if it does, well, I guess I'll know about it. - var/DoNotSplit = FALSE // If impurity is handled within the main chem itself - var/OnMobMergeCheck = FALSE //Call on_mob_life proc when reagents are merging. + //var/SplitChem = FALSE //If the chem splits on metabolism + var/impure_chem // What chemical is metabolised with an inpure reaction + var/inverse_chem_val = 0 // If the impurity is below 0.5, replace ALL of the chem with inverse_chemupon metabolising + var/inverse_chem // What chem is metabolised when purity is below inverse_chem_val, this shouldn't be made, but if it does, well, I guess I'll know about it. + var/metabolizing = FALSE + var/chemical_flags // See fermi/readme.dm REAGENT_DEAD_PROCESS, REAGENT_DONOTSPLIT, REAGENT_ONLYINVERSE, REAGENT_ONMOBMERGE, REAGENT_INVISIBLE, REAGENT_FORCEONNEW, REAGENT_SNEAKYNAME /datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references @@ -75,28 +73,47 @@ holder.remove_reagent(src.id, metabolization_rate * M.metabolism_efficiency) //By default it slowly disappears. return +//called when a mob processes chems when dead. +/datum/reagent/proc/on_mob_dead(mob/living/carbon/M) + if(!(chemical_flags & REAGENT_DEAD_PROCESS)) //justincase + return + current_cycle++ + if(holder) + holder.remove_reagent(src.id, metabolization_rate * M.metabolism_efficiency) //By default it slowly disappears. + return + // Called when this reagent is first added to a mob /datum/reagent/proc/on_mob_add(mob/living/L, amount) - if(SplitChem) - var/mob/living/carbon/M = L - if(!M) - return - if(purity < 0) - CRASH("Purity below 0 for chem: [id], Please let Fermis Know!") - if (purity == 1 || DoNotSplit == TRUE) - log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume]u of [id]") - return - else if (InverseChemVal > purity)//Turns all of a added reagent into the inverse chem - M.reagents.remove_reagent(id, amount, FALSE) - M.reagents.add_reagent(InverseChem, amount, FALSE, other_purity = 1) - log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume]u of [InverseChem]") - return - else - var/impureVol = amount * (1 - purity) //turns impure ratio into impure chem + if(!iscarbon(L)) + return + var/mob/living/carbon/M = L + if (purity == 1) + log_game("CHEM: [L] ckey: [L.key] has ingested [volume]u of [id]") + return + if(cached_purity == 1) + cached_purity = purity + else if(purity < 0) + CRASH("Purity below 0 for chem: [id], Please let Fermis Know!") + if(chemical_flags & REAGENT_DONOTSPLIT) + return + + if ((inverse_chem_val > purity) && (inverse_chem))//Turns all of a added reagent into the inverse chem + M.reagents.remove_reagent(id, amount, FALSE) + M.reagents.add_reagent(inverse_chem, amount, FALSE, other_purity = 1-cached_purity) + var/datum/reagent/R = M.reagents.has_reagent("[inverse_chem]") + if(R.chemical_flags & REAGENT_SNEAKYNAME) + R.name = name//Negative effects are hidden + if(R.chemical_flags & REAGENT_INVISIBLE) + R.chemical_flags |= (REAGENT_INVISIBLE) + log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume]u of [inverse_chem]") + return + else if (impure_chem) + var/impureVol = amount * (1 - purity) //turns impure ratio into impure chem + if(!(chemical_flags & REAGENT_SPLITRETAINVOL)) M.reagents.remove_reagent(id, (impureVol), FALSE) - M.reagents.add_reagent(ImpureChem, impureVol, FALSE, other_purity = 1) - log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume - impureVol]u of [id]") - log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume]u of [ImpureChem]") + M.reagents.add_reagent(impure_chem, impureVol, FALSE, other_purity = 1-cached_purity) + log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume - impureVol]u of [id]") + log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume]u of [impure_chem]") return // Called when this reagent is removed while inside a mob @@ -120,31 +137,34 @@ // Called when two reagents of the same are mixing. /datum/reagent/proc/on_merge(data, amount, mob/living/carbon/M, purity) - if(SplitChem) - if(!ishuman(M)) - return - if (purity < 0) - CRASH("Purity below 0 for chem: [id], Please let Fermis Know!") - if (purity == 1 || DoNotSplit == TRUE) - log_game("FERMICHEM: [M] ckey: [M.key] has merged [volume]u of [id] in themselves") - return - else if (InverseChemVal > purity) - M.reagents.remove_reagent(id, amount, FALSE) - M.reagents.add_reagent(InverseChem, amount, FALSE, other_purity = 1) - for(var/datum/reagent/fermi/R in M.reagents.reagent_list) - if(R.name == "") - R.name = name//Negative effects are hidden - log_game("FERMICHEM: [M] ckey: [M.key] has merged [volume]u of [InverseChem]") - return - else - var/impureVol = amount * (1 - purity) + if(!iscarbon(M)) + return + if (purity == 1) + log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume]u of [id]") + return + cached_purity = purity //purity SHOULD be precalculated from the add_reagent, update cache. + if (purity < 0) + CRASH("Purity below 0 for chem: [id], Please let Fermis Know!") + if(chemical_flags & REAGENT_DONOTSPLIT) + return + + if ((inverse_chem_val > purity) && (inverse_chem)) //INVERT + M.reagents.remove_reagent(id, amount, FALSE) + M.reagents.add_reagent(inverse_chem, amount, FALSE, other_purity = 1-cached_purity) + var/datum/reagent/R = M.reagents.has_reagent("[inverse_chem]") + if(R.chemical_flags & REAGENT_SNEAKYNAME) + R.name = name//Negative effects are hidden + if(R.chemical_flags & REAGENT_INVISIBLE) + R.chemical_flags |= (REAGENT_INVISIBLE) + log_game("FERMICHEM: [M] ckey: [M.key] has merged [volume]u of [inverse_chem]") + return + else if (impure_chem) //SPLIT + var/impureVol = amount * (1 - purity) + if(!(chemical_flags & REAGENT_SPLITRETAINVOL)) M.reagents.remove_reagent(id, impureVol, FALSE) - M.reagents.add_reagent(ImpureChem, impureVol, FALSE, other_purity = 1) - for(var/datum/reagent/fermi/R in M.reagents.reagent_list) - if(R.name == "") - R.name = name//Negative effects are hidden - log_game("FERMICHEM: [M] ckey: [M.key] has merged [volume - impureVol]u of [id]") - log_game("FERMICHEM: [M] ckey: [M.key] has merged [volume]u of [ImpureChem]") + M.reagents.add_reagent(impure_chem, impureVol, FALSE, other_purity = 1-cached_purity) + log_game("FERMICHEM: [M] ckey: [M.key] has merged [volume - impureVol]u of [id]") + log_game("FERMICHEM: [M] ckey: [M.key] has merged [volume]u of [impure_chem]") return /datum/reagent/proc/on_update(atom/A) diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 88073ca5f3..94aca411be 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -1383,10 +1383,10 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "neurotoxinglass" glass_name = "Neurotoxin" glass_desc = "A drink that is guaranteed to knock you silly." - SplitChem = TRUE - ImpureChem = "neuroweak" - InverseChemVal = 0 //Clear conversion - InverseChem = "neuroweak" + //SplitChem = TRUE + impure_chem = "neuroweak" + inverse_chem_val = 0.5 //Clear conversion + inverse_chem = "neuroweak" /datum/reagent/consumable/ethanol/neurotoxin/proc/pickt() return (pick(TRAIT_PARALYSIS_L_ARM,TRAIT_PARALYSIS_R_ARM,TRAIT_PARALYSIS_R_LEG,TRAIT_PARALYSIS_L_LEG)) @@ -1394,7 +1394,7 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/neurotoxin/on_mob_life(mob/living/carbon/M) M.set_drugginess(50) M.dizziness +=2 - M.adjustBrainLoss(1*REM, 150) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1*REM, 150) if(prob(20) && !holder.has_reagent("neuroweak")) M.adjustStaminaLoss(10) M.drop_all_held_items() @@ -1405,7 +1405,7 @@ All effects don't start immediately, but rather get worse over time; the rate is ADD_TRAIT(M, t, type) M.adjustStaminaLoss(10) if(current_cycle > 30) - M.adjustBrainLoss(2*REM) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2*REM) if(current_cycle > 50 && prob(15)) if(!M.undergoing_cardiac_arrest() && M.can_heartattack()) M.set_heartattack(TRUE) @@ -1431,13 +1431,13 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/neuroweak/on_mob_life(mob/living/carbon/M) if(holder.has_reagent("neurotoxin")) - M.adjustBrainLoss(-1*REM, 150) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1*REM, 150) M.reagents.remove_reagent("neurotoxin", 1.5 * REAGENTS_METABOLISM, FALSE) if(holder.has_reagent("fentanyl")) - M.adjustBrainLoss(-1*REM, 150) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1*REM, 150) M.reagents.remove_reagent("fentanyl", 0.75 * REAGENTS_METABOLISM, FALSE) else - M.adjustBrainLoss(-0.5*REM, 150) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -0.5*REM, 150) M.dizziness +=2 ..() diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 5b06710472..1475f94f53 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -80,14 +80,14 @@ . = 1 /datum/reagent/drug/crank/overdose_process(mob/living/M) - M.adjustBrainLoss(2*REM) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2*REM) M.adjustToxLoss(2*REM, 0) M.adjustBruteLoss(2*REM, 0) ..() . = 1 /datum/reagent/drug/crank/addiction_act_stage1(mob/living/M) - M.adjustBrainLoss(5*REM) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5*REM) ..() /datum/reagent/drug/crank/addiction_act_stage2(mob/living/M) @@ -101,7 +101,7 @@ . = 1 /datum/reagent/drug/crank/addiction_act_stage4(mob/living/M) - M.adjustBrainLoss(3*REM) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3*REM) M.adjustToxLoss(5*REM, 0) M.adjustBruteLoss(5*REM, 0) ..() @@ -125,13 +125,13 @@ ..() /datum/reagent/drug/krokodil/overdose_process(mob/living/M) - M.adjustBrainLoss(0.25*REM) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.25*REM) M.adjustToxLoss(0.25*REM, 0) ..() . = 1 /datum/reagent/drug/krokodil/addiction_act_stage1(mob/living/M) - M.adjustBrainLoss(2*REM) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2*REM) M.adjustToxLoss(2*REM, 0) ..() . = 1 @@ -192,7 +192,7 @@ if(jitter) M.Jitter(2) if(brain_damage) - M.adjustBrainLoss(rand(1,4)) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(1,4)) M.heal_overall_damage(2, 2) if(prob(5)) M.emote(pick("twitch", "shiver")) @@ -210,7 +210,7 @@ M.drop_all_held_items() ..() M.adjustToxLoss(1, 0) - M.adjustBrainLoss(pick(0.5, 0.6, 0.7, 0.8, 0.9, 1)) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, pick(0.5, 0.6, 0.7, 0.8, 0.9, 1)) . = 1 /datum/reagent/drug/methamphetamine/addiction_act_stage1(mob/living/M) @@ -289,7 +289,7 @@ if(prob(5)) to_chat(M, "[high_message]") M.adjustStaminaLoss(-5, 0) - M.adjustBrainLoss(4) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 4) M.hallucination += 5 if(M.canmove && !ismovableatom(M.loc)) step(M, pick(GLOB.cardinals)) @@ -314,7 +314,7 @@ for(var/i = 0, i < 8, i++) step(M, pick(GLOB.cardinals)) M.Jitter(5) - M.adjustBrainLoss(10) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10) if(prob(20)) M.emote(pick("twitch","drool","moan")) ..() @@ -326,7 +326,7 @@ step(M, pick(GLOB.cardinals)) M.Jitter(10) M.Dizzy(10) - M.adjustBrainLoss(10) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10) if(prob(30)) M.emote(pick("twitch","drool","moan")) ..() @@ -338,7 +338,7 @@ step(M, pick(GLOB.cardinals)) M.Jitter(15) M.Dizzy(15) - M.adjustBrainLoss(10) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10) if(prob(40)) M.emote(pick("twitch","drool","moan")) ..() @@ -351,7 +351,7 @@ M.Jitter(50) M.Dizzy(50) M.adjustToxLoss(5, 0) - M.adjustBrainLoss(10) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10) if(prob(50)) M.emote(pick("twitch","drool","moan")) ..() @@ -401,7 +401,7 @@ M.jitteriness = 0 M.confused = 0 M.disgust = 0 - M.adjustBrainLoss(0.2) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.2) ..() . = 1 @@ -418,12 +418,12 @@ if(3) M.emote("frown") SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "happiness_drug", /datum/mood_event/happiness_drug_bad_od) - M.adjustBrainLoss(0.5) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5) ..() . = 1 /datum/reagent/drug/happiness/addiction_act_stage1(mob/living/M)// all work and no play makes jack a dull boy - GET_COMPONENT_FROM(mood, /datum/component/mood, M) + var/datum/component/mood/mood = M.GetComponent(/datum/component/mood) mood.setSanity(min(mood.sanity, SANITY_DISTURBED)) M.Jitter(5) if(prob(20)) @@ -431,7 +431,7 @@ ..() /datum/reagent/drug/happiness/addiction_act_stage2(mob/living/M) - GET_COMPONENT_FROM(mood, /datum/component/mood, M) + var/datum/component/mood/mood = M.GetComponent(/datum/component/mood) mood.setSanity(min(mood.sanity, SANITY_UNSTABLE)) M.Jitter(10) if(prob(30)) @@ -439,7 +439,7 @@ ..() /datum/reagent/drug/happiness/addiction_act_stage3(mob/living/M) - GET_COMPONENT_FROM(mood, /datum/component/mood, M) + var/datum/component/mood/mood = M.GetComponent(/datum/component/mood) mood.setSanity(min(mood.sanity, SANITY_CRAZY)) M.Jitter(15) if(prob(40)) @@ -447,7 +447,7 @@ ..() /datum/reagent/drug/happiness/addiction_act_stage4(mob/living/carbon/human/M) - GET_COMPONENT_FROM(mood, /datum/component/mood, M) + var/datum/component/mood/mood = M.GetComponent(/datum/component/mood) mood.setSanity(SANITY_INSANE) M.Jitter(20) if(prob(50)) @@ -490,7 +490,7 @@ H.dna.species.punchdamagehigh *= 0.2 /datum/reagent/drug/skooma/on_mob_life(mob/living/carbon/M) - M.adjustBrainLoss(1*REM) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1*REM) M.adjustToxLoss(1*REM) if(prob(10)) M.adjust_blurriness(2) @@ -522,7 +522,7 @@ M.Dizzy(50) M.adjust_blurriness(10) if(prob(50)) //This proc will be called about 200 times and the adjustbrainloss() below only has to be called 40 times to kill. This will make surviving skooma addiction pretty rare without mannitol usage. - M.adjustBrainLoss(5) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5) if(prob(40)) M.emote(pick("twitch","drool","moan")) ..() diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 19aeaeb25e..056c5b1901 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -191,6 +191,13 @@ color = "#731008" // rgb: 115, 16, 8 taste_description = "ketchup" +/datum/reagent/consumable/mustard + name = "Mustard" + id = "mustard" + description = "Mustard, mostly used on hotdogs, corndogs and burgers." + nutriment_factor = 5 * REAGENTS_METABOLISM + color = "#DDED26" // rgb: 221, 237, 38 + taste_description = "mustard" /datum/reagent/consumable/capsaicin name = "Capsaicin Oil" @@ -684,7 +691,7 @@ . = 1 if(prob(20)) M.losebreath += 4 - M.adjustBrainLoss(2*REM, 150) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2*REM, 150) M.adjustToxLoss(3*REM,0) M.adjustStaminaLoss(10*REM,0) M.blur_eyes(5) diff --git a/code/modules/reagents/chemistry/reagents/impure_reagents.dm b/code/modules/reagents/chemistry/reagents/impure_reagents.dm new file mode 100644 index 0000000000..c96347cda2 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/impure_reagents.dm @@ -0,0 +1,26 @@ +//Reagents produced by metabolising/reacting fermichems inoptimally, i.e. inverse_chems or impure_chems +//Inverse = Splitting +//Invert = Whole conversion + +/datum/reagent/impure + chemical_flags = REAGENT_INVISIBLE | REAGENT_SNEAKYNAME //by default, it will stay hidden on splitting, but take the name of the source on inverting + + +/datum/reagent/impure/fermiTox + name = "Chemical Isomers" + id = "fermiTox" + description = "Toxic chemical isomers made from impure reactions. At low volumes will cause light toxin damage, but as the volume increases, it deals larger amounts, damages the liver, then eventually the heart. This is default impure chem for all chems, and changes only if stated." + data = "merge" + color = "FFFFFF" + can_synth = FALSE + var/potency = 1 //potency multiplies the volume when added. + + +//I'm concerned this is too weak, but I also don't want deathmixes. +//TODO: liver damage, 100+ heart +/datum/reagent/impure/fermiTox/on_mob_life(mob/living/carbon/C, method) + if(C.dna && istype(C.dna.species, /datum/species/jelly)) + C.adjustToxLoss(-2) + else + C.adjustToxLoss(2) + ..() diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 4dc0d145dc..3db5c4c4dc 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -44,7 +44,7 @@ M.heal_bodypart_damage(5,5) M.adjustToxLoss(-5, 0, TRUE) M.hallucination = 0 - M.setBrainLoss(0) + M.setOrganLoss(ORGAN_SLOT_BRAIN, 0) REMOVE_TRAITS_NOT_IN(M, list(SPECIES_TRAIT, ROUNDSTART_TRAIT, ORGAN_TRAIT)) M.set_blurriness(0) M.set_blindness(0) @@ -64,6 +64,10 @@ if(M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio)) M.blood_volume = (BLOOD_VOLUME_NORMAL*M.blood_ratio) + for(var/organ in M.internal_organs) + var/obj/item/organ/O = organ + O.setOrganDamage(0) + for(var/thing in M.diseases) var/datum/disease/D = thing if(D.severity == DISEASE_SEVERITY_POSITIVE) @@ -232,10 +236,12 @@ /datum/reagent/medicine/silver_sulfadiazine name = "Silver Sulfadiazine" id = "silver_sulfadiazine" - description = "If used in touch-based applications, immediately restores burn wounds as well as restoring more over time. If ingested through other means, deals minor toxin damage." + description = "If used in touch-based applications, immediately restores burn wounds as well as restoring more over time. It is mildly poisonous taken orally or by injection. If overdosed, deals brute and minor liver damage." reagent_state = LIQUID pH = 7.2 color = "#ffeac9" + metabolization_rate = 5 * REAGENTS_METABOLISM + overdose_threshold = 50 /datum/reagent/medicine/silver_sulfadiazine/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) if(iscarbon(M) && M.stat != DEAD) @@ -256,6 +262,15 @@ ..() . = 1 +/datum/reagent/medicine/silver_sulfadiazine/overdose_start(mob/living/M) + metabolization_rate = 15 * REAGENTS_METABOLISM + M.adjustBruteLoss(2*REM, 0) + if(iscarbon(M)) + var/mob/living/carbon/C = M + C.applyLiverDamage(1) + ..() + . = 1 + /datum/reagent/medicine/oxandrolone name = "Oxandrolone" id = "oxandrolone" @@ -267,7 +282,7 @@ pH = 10.7 /datum/reagent/medicine/oxandrolone/on_mob_life(mob/living/carbon/M) - if(M.getFireLoss() > 50) + if(M.getFireLoss() > 25) M.adjustFireLoss(-4*REM, 0) //Twice as effective as silver sulfadiazine for severe burns else M.adjustFireLoss(-0.5*REM, 0) //But only a quarter as effective for more minor ones @@ -283,10 +298,12 @@ /datum/reagent/medicine/styptic_powder name = "Styptic Powder" id = "styptic_powder" - description = "If used in touch-based applications, immediately restores bruising as well as restoring more over time. If ingested through other means, deals minor toxin damage." + description = "If used in touch-based applications, immediately restores bruising as well as restoring more over time. It is poisonous if taken orally or by injection. If overdosed, deals brute and minor liver damage." reagent_state = LIQUID color = "#FF9696" pH = 6.7 + metabolization_rate = 5 * REAGENTS_METABOLISM + overdose_threshold = 50 /datum/reagent/medicine/styptic_powder/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) if(iscarbon(M) && M.stat != DEAD) @@ -308,6 +325,15 @@ ..() . = 1 +datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) + metabolization_rate = 15 * REAGENTS_METABOLISM + M.adjustBruteLoss(2*REM, 0) + if(iscarbon(M)) + var/mob/living/carbon/C = M + C.applyLiverDamage(1) + ..() + . = 1 + /datum/reagent/medicine/salglu_solution name = "Saline-Glucose Solution" id = "salglu_solution" @@ -394,23 +420,35 @@ /datum/reagent/medicine/synthflesh name = "Synthflesh" id = "synthflesh" - description = "Has a 100% chance of instantly healing brute and burn damage. One unit of the chemical will heal one point of damage. Touch application only." + description = "Has a 100% chance of healing large amounts of brute and burn damage very quickly. One unit of the chemical will heal one point of damage. Touch application only." reagent_state = LIQUID color = "#FFEBEB" pH = 11.5 + metabolization_rate = 5 * REAGENTS_METABOLISM + overdose_threshold = 40 /datum/reagent/medicine/synthflesh/reaction_mob(mob/living/M, method=TOUCH, reac_volume,show_message = 1) if(iscarbon(M)) if (M.stat == DEAD) show_message = 0 - if(method in list(PATCH, TOUCH)) - M.adjustBruteLoss(-1.25 * reac_volume) - M.adjustFireLoss(-1.25 * reac_volume) + if(method in list(INGEST, VAPOR)) + var/mob/living/carbon/C = M + C.losebreath++ + C.emote("cough") + to_chat(M, "You feel your throat closing up!") + else if(method == INJECT) + return + else if(method in list(PATCH, TOUCH)) + M.adjustBruteLoss(-1 * reac_volume) + M.adjustFireLoss(-1 * reac_volume) if(show_message) to_chat(M, "You feel your burns and bruises healing! It stings like hell!") SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine) ..() +/datum/reagent/medicine/synthflesh/overdose_start(mob/living/M) + metabolization_rate = 15 * REAGENTS_METABOLISM + /datum/reagent/medicine/charcoal name = "Charcoal" id = "charcoal" @@ -541,7 +579,7 @@ /datum/reagent/medicine/sal_acid/on_mob_life(mob/living/carbon/M) - if(M.getBruteLoss() > 50) + if(M.getBruteLoss() > 25) M.adjustBruteLoss(-4*REM, 0) //Twice as effective as styptic powder for severe bruising else M.adjustBruteLoss(-0.5*REM, 0) //But only a quarter as effective for more minor ones @@ -852,10 +890,16 @@ if(M.notify_ghost_cloning(source = M)) spawn (100) //so the ghost has time to re-enter return + else M.adjustOxyLoss(-20, 0) M.adjustToxLoss(-20, 0) + var/mob/living/carbon/H = M + for(var/organ in H.internal_organs) + var/obj/item/organ/O = organ + O.setOrganDamage(0) M.updatehealth() + if(M.revive()) M.emote("gasp") log_combat(M, M, "revived", src) @@ -875,7 +919,7 @@ pH = 10.4 /datum/reagent/medicine/mannitol/on_mob_life(mob/living/carbon/C) - C.adjustBrainLoss(-2*REM) + C.adjustOrganLoss(ORGAN_SLOT_BRAIN, -2*REM) if(prob(10)) C.cure_trauma_type(resilience = TRAUMA_RESILIENCE_BASIC) ..() @@ -1130,7 +1174,7 @@ M.adjustFireLoss(-5*REM, 0) M.adjustOxyLoss(-15, 0) M.adjustToxLoss(-5*REM, 0) - M.adjustBrainLoss(-15*REM) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -15*REM) M.adjustCloneLoss(-3*REM, 0) M.adjustStaminaLoss(-20*REM,0) ..() @@ -1175,7 +1219,7 @@ M.adjustFireLoss(-3 * REM, 0) M.adjustOxyLoss(-15 * REM, 0) M.adjustToxLoss(-3 * REM, 0, TRUE) //Heals TOXINLOVERS - M.adjustBrainLoss(2 * REM, 150) //This does, after all, come from ambrosia, and the most powerful ambrosia in existence, at that! + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2 * REM, 150) //This does, after all, come from ambrosia, and the most powerful ambrosia in existence, at that! M.adjustCloneLoss(-1 * REM, 0) M.adjustStaminaLoss(-13 * REM, 0) M.jitteriness = min(max(0, M.jitteriness + 3), 30) @@ -1207,7 +1251,7 @@ if (M.hallucination >= 5) M.hallucination -= 5 if(prob(20)) - M.adjustBrainLoss(1*REM, 50) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1*REM, 50) M.adjustStaminaLoss(2.5*REM, 0) ..() return TRUE @@ -1287,10 +1331,12 @@ /datum/reagent/medicine/corazone/on_mob_metabolize(mob/living/M) ..() - ADD_TRAIT(M, TRAIT_STABLEHEART, id) + ADD_TRAIT(M, TRAIT_STABLEHEART, type) + ADD_TRAIT(M, TRAIT_STABLELIVER, type) /datum/reagent/medicine/corazone/on_mob_end_metabolize(mob/living/M) - REMOVE_TRAIT(M, TRAIT_STABLEHEART, id) + REMOVE_TRAIT(M, TRAIT_STABLEHEART, type) + REMOVE_TRAIT(M, TRAIT_STABLELIVER, type) ..() /datum/reagent/medicine/muscle_stimulant @@ -1397,7 +1443,7 @@ M.dizziness = max(0, M.dizziness-6) M.confused = max(0, M.confused-6) M.disgust = max(0, M.disgust-6) - GET_COMPONENT_FROM(mood, /datum/component/mood, M) + var/datum/component/mood/mood = M.GetComponent(/datum/component/mood) if(mood.sanity <= SANITY_NEUTRAL) // only take effect if in negative sanity and then... mood.setSanity(min(mood.sanity+5, SANITY_NEUTRAL)) // set minimum to prevent unwanted spiking over neutral ..() diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index bc64d6636b..8f8902503c 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1,8 +1,9 @@ /datum/reagent/blood - data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) + data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_HUMAN, "blood_type"= null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) name = "Blood" id = "blood" - color = "#C80000" // rgb: 200, 0, 0 + color = BLOOD_COLOR_HUMAN // rgb: 200, 0, 0 + description = "Blood from some creature." metabolization_rate = 5 //fast rate so it disappears fast. taste_description = "iron" taste_mult = 1.3 @@ -27,27 +28,75 @@ if(iscarbon(L)) var/mob/living/carbon/C = L - if(C.get_blood_id() == "blood" && (method == INJECT || (method == INGEST && C.dna && C.dna.species && (DRINKSBLOOD in C.dna.species.species_traits)))) - if(!data || !(data["blood_type"] in get_safe_blood(C.dna.blood_type))) - C.reagents.add_reagent("toxin", reac_volume * 0.5) - else - C.blood_volume = min(C.blood_volume + round(reac_volume, 0.1), BLOOD_VOLUME_MAXIMUM) + var/blood_id = C.get_blood_id() + if((blood_id == "blood" || blood_id == "jellyblood") && (method == INJECT || (method == INGEST && C.dna && C.dna.species && (DRINKSBLOOD in C.dna.species.species_traits)))) + C.blood_volume = min(C.blood_volume + round(reac_volume, 0.1), BLOOD_VOLUME_MAXIMUM * C.blood_ratio) + // we don't care about bloodtype here, we're just refilling the mob - if(reac_volume >= 10 && istype(L)) + if(reac_volume >= 10 && istype(L) && method != INJECT) L.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"])) +/datum/reagent/blood/on_mob_life(mob/living/carbon/C) //Because lethals are preferred over stamina. damnifino. + var/blood_id = C.get_blood_id() + if((blood_id == "blood" || blood_id == "jellyblood")) + if(!data || !(data["blood_type"] in get_safe_blood(C.dna.blood_type))) //we only care about bloodtype here because this is where the poisoning should be + C.adjustToxLoss(rand(2,8)*REM, TRUE, TRUE) //forced to ensure people don't use it to gain beneficial toxin as slime person + ..() + /datum/reagent/blood/reaction_obj(obj/O, volume) if(volume >= 3 && istype(O)) - O.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"])) + O.add_blood_DNA(data) + +/datum/reagent/blood/reaction_turf(turf/T, reac_volume)//splash the blood all over the place + if(!istype(T)) + return + if(reac_volume < 3) + return + + var/obj/effect/decal/cleanable/blood/B = locate() in T //find some blood here + if(!B) + B = new(T) + if(data["blood_DNA"]) + B.blood_DNA[data["blood_DNA"]] = data["blood_type"] + if(!B.reagents) + B.reagents.add_reagent(id, reac_volume) + B.update_icon() /datum/reagent/blood/on_new(list/data) if(istype(data)) SetViruses(src, data) + color = bloodtype_to_color(data["blood_type"]) + if(data["blood_type"] == "SY") + name = "Synthetic Blood" + taste_description = "oily" + + if(data["blood_type"] == "X*") + name = "Xenomorph Blood" + taste_description = "acidic heresy" + shot_glass_icon_state = "shotglassgreen" + pH = 2.5 + + if(data["blood_type"] == "HF") + name = "Hydraulic Blood" + taste_description = "burnt oil" + pH = 9.75 + + if(data["blood_type"] == "BUG") + name = "Insect Blood" + taste_description = "greasy" + pH = 7.25 + + if(data["blood_type"] == "L") + name = "Lizard Blood" + taste_description = "spicy" + pH = 6.85 + + /datum/reagent/blood/on_merge(list/mix_data) if(data && mix_data) if(data["blood_DNA"] != mix_data["blood_DNA"]) - data["cloneable"] = 0 //On mix, consider the genetic sampling unviable for pod cloning if the DNA sample doesn't match. + data["cloneable"] = FALSE //On mix, consider the genetic sampling unviable for pod cloning if the DNA sample doesn't match. if(data["viruses"] || mix_data["viruses"]) var/list/mix1 = data["viruses"] @@ -77,27 +126,111 @@ var/datum/disease/D = thing . += D -/datum/reagent/blood/reaction_turf(turf/T, reac_volume)//splash the blood all over the place - if(!istype(T)) - return - if(reac_volume < 3) - return +/datum/reagent/blood/synthetics + data = list("donor"=null,"viruses"=null,"blood_DNA"="REPLICATED", "bloodcolor" = BLOOD_COLOR_SYNTHETIC, "blood_type"="SY","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) + name = "Synthetic Blood" + id = "syntheticblood" + taste_description = "oily" + color = BLOOD_COLOR_SYNTHETIC // rgb: 11, 7, 48 - var/obj/effect/decal/cleanable/blood/B = locate() in T //find some blood here - if(!B) - B = new(T) - if(data["blood_DNA"]) - B.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"])) +/datum/reagent/blood/lizard + data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_LIZARD, "blood_type"="L","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) + name = "Lizard Blood" + id = "lizardblood" + taste_description = "spicy" + color = BLOOD_COLOR_LIZARD // rgb: 11, 7, 48 + pH = 6.85 + +/datum/reagent/blood/jellyblood + data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_SLIME, "blood_type"="GEL","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) + name = "Slime Jelly Blood" + id = "jellyblood" + description = "A gooey semi-liquid produced from one of the deadliest lifeforms in existence. SO REAL." + color = BLOOD_COLOR_SLIME + taste_description = "slime" + taste_mult = 1.3 + pH = 4 + +/datum/reagent/blood/xenomorph + data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_XENO, "blood_type"="X*","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) + name = "Xenomorph Blood" + id = "xenoblood" + taste_description = "acidic heresy" + color = BLOOD_COLOR_XENO // greenish yellow ooze + shot_glass_icon_state = "shotglassgreen" + pH = 2.5 + +/datum/reagent/blood/oil + data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_OIL, "blood_type"="HF","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) + name = "Hydraulic Blood" + id = "oilblood" + taste_description = "burnt oil" + color = BLOOD_COLOR_OIL // dark, y'know, expected batman colors. + pH = 9.75 + +/datum/reagent/blood/insect + data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_BUG, "blood_type"="BUG","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) + name = "Insectoid Blood" + id = "bugblood" + taste_description = "waxy" + color = BLOOD_COLOR_BUG // Bug colored, I guess. + pH = 7.25 + + +/datum/reagent/blood/jellyblood/on_mob_life(mob/living/carbon/M) + if(prob(10)) + if(M.dna?.species?.exotic_bloodtype != "GEL") + to_chat(M, "Your insides are burning!") + M.adjustToxLoss(rand(20,60)*REM, 0) + . = 1 + else if(prob(40) && isjellyperson(M)) + M.heal_bodypart_damage(2*REM) + . = 1 + ..() /datum/reagent/liquidgibs name = "Liquid gibs" id = "liquidgibs" - color = "#FF9966" + color = BLOOD_COLOR_HUMAN description = "You don't even want to think about what's in here." taste_description = "gross iron" shot_glass_icon_state = "shotglassred" + data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_HUMAN, "blood_type"= "O+","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) pH = 7.45 +/datum/reagent/liquidgibs/xeno + name = "Liquid xeno gibs" + id = "liquidxenogibs" + color = BLOOD_COLOR_XENO + taste_description = "blended heresy" + shot_glass_icon_state = "shotglassgreen" + data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_XENO, "blood_type"="X*","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) + pH = 2.5 + +/datum/reagent/liquidgibs/slime + name = "Slime sludge" + id = "liquidslimegibs" + color = BLOOD_COLOR_SLIME + taste_description = "slime" + shot_glass_icon_state = "shotglassgreen" + data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_SLIME, "blood_type"="GEL","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) + pH = 4 + +/datum/reagent/liquidgibs/synth + name = "Synthetic sludge" + id = "liquidsyntheticgibs" + color = BLOOD_COLOR_SYNTHETIC + taste_description = "jellied plastic" + data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_SYNTHETIC, "blood_type"="SY","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) + +/datum/reagent/liquidgibs/oil + name = "Hydraulic sludge" + id = "liquidoilgibs" + color = BLOOD_COLOR_OIL + taste_description = "chunky burnt oil" + data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_OIL, "blood_type"="HF","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) + pH = 9.75 + /datum/reagent/vaccine //data must contain virus type name = "Vaccine" @@ -200,22 +333,20 @@ pH = 7.5 //God is alkaline /datum/reagent/water/holywater/on_mob_metabolize(mob/living/L) - ..() + . = ..() ADD_TRAIT(L, TRAIT_HOLY, id) + if(is_servant_of_ratvar(L)) + to_chat(L, "A fog spreads through your mind, purging the Justiciar's influence!") + else if(iscultist(L)) + to_chat(L, "A fog spreads through your mind, weakening your connection to the veil and purging Nar-sie's influence") + /datum/reagent/water/holywater/on_mob_end_metabolize(mob/living/L) REMOVE_TRAIT(L, TRAIT_HOLY, id) - ..() - -/datum/reagent/water/holywater/reaction_mob(mob/living/M, method=TOUCH, reac_volume) - if(is_servant_of_ratvar(M)) - to_chat(M, "A fog spreads through your mind, purging the Justiciar's influence!") - ..() - -/datum/reagent/water/holywater/reaction_mob(mob/living/M, method=TOUCH, reac_volume) - if(iscultist(M)) - to_chat(M, "A fog spreads through your mind, weakening your connection to the veil and purging Nar-sie's influence") - ..() + if(iscultist(L)) + for(var/datum/action/innate/cult/blood_magic/BM in L.actions) + BM.holy_dispel = FALSE + return ..() /datum/reagent/water/holywater/on_mob_life(mob/living/carbon/M) if(!data) @@ -224,9 +355,11 @@ M.jitteriness = min(M.jitteriness+4,10) if(iscultist(M)) for(var/datum/action/innate/cult/blood_magic/BM in M.actions) - to_chat(M, "Your blood rites falter as holy water scours your body!") - for(var/datum/action/innate/cult/blood_spell/BS in BM.spells) - qdel(BS) + if(!BM.holy_dispel) + BM.holy_dispel = TRUE + to_chat(M, "Your blood rites falter as holy water scours your body!") + for(var/datum/action/innate/cult/blood_spell/BS in BM.spells) + qdel(BS) if(data >= 25) // 10 units, 45 seconds @ metabolism 0.4 units & tick rate 1.8 sec if(!M.stuttering) M.stuttering = 1 @@ -296,7 +429,7 @@ if(ishuman(M) && M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio)) M.blood_volume += 3 else // Will deal about 90 damage when 50 units are thrown - M.adjustBrainLoss(3, 150) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3, 150) M.adjustToxLoss(2, 0) M.adjustFireLoss(2, 0) M.adjustOxyLoss(2, 0) @@ -315,7 +448,7 @@ M.IgniteMob() //Only problem with igniting people is currently the commonly availible fire suits make you immune to being on fire M.adjustToxLoss(1, 0) M.adjustFireLoss(1, 0) //Hence the other damages... ain't I a bastard? - M.adjustBrainLoss(5, 150) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5, 150) holder.remove_reagent(id, 1) pH = 0.1 @@ -584,6 +717,30 @@ race = /datum/species/android mutationtext = "The pain subsides. You feel... artificial." +//Citadel Races +/datum/reagent/mutationtoxin/mammal + name = "Mammal Mutation Toxin" + id = "mammalmutationtoxin" + description = "A glowing toxin." + color = "#5EFF3B" //RGB: 94, 255, 59 + race = /datum/species/mammal + mutationtext = "The pain subsides. You feel... fluffier." + +/datum/reagent/mutationtoxin/insect + name = "Insect Mutation Toxin" + id = "insectmutationtoxin" + description = "A glowing toxin." + color = "#5EFF3B" //RGB: 94, 255, 59 + race = /datum/species/insect + mutationtext = "The pain subsides. You feel... attracted to dark, moist areas." + +/datum/reagent/mutationtoxin/xenoperson + name = "Xeno-Hybrid Mutation Toxin" + id = "xenopersonmutationtoxin" + description = "A glowing toxin." + color = "#5EFF3B" //RGB: 94, 255, 59 + race = /datum/species/xeno + mutationtext = "The pain subsides. You feel... oddly longing for the Queen." //sadly, not the British one. //BLACKLISTED RACES /datum/reagent/mutationtoxin/skeleton @@ -805,7 +962,7 @@ step(M, pick(GLOB.cardinals)) if(prob(5)) M.emote(pick("twitch","drool","moan")) - M.adjustBrainLoss(1) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1) ..() /datum/reagent/sulfur @@ -946,12 +1103,12 @@ reagent_state = SOLID taste_description = "iron" pH = 6 - + overdose_threshold = 30 color = "#c2391d" /datum/reagent/iron/on_mob_life(mob/living/carbon/C) if(C.blood_volume < (BLOOD_VOLUME_NORMAL*C.blood_ratio)) - C.blood_volume += 0.5 + C.blood_volume += 0.01 //we'll have synthetics from medbay. ..() /datum/reagent/iron/reaction_mob(mob/living/M, method=TOUCH, reac_volume) @@ -960,6 +1117,17 @@ M.reagents.add_reagent("toxin", reac_volume) ..() +/datum/reagent/iron/overdose_start(mob/living/M) + to_chat(M, "You start feeling your guts twisting painfully!") + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[id]_overdose", /datum/mood_event/overdose, name) + +/datum/reagent/iron/overdose_process(mob/living/carbon/C) + if(prob(20)) + var/obj/item/organ/liver/L = C.getorganslot(ORGAN_SLOT_LIVER) + if (istype(L)) + C.applyLiverDamage(2) //mild until the fabled med rework comes out. the organ damage galore + ..() + /datum/reagent/gold name = "Gold" id = "gold" @@ -1076,17 +1244,19 @@ pH = 5.5 /datum/reagent/space_cleaner/reaction_obj(obj/O, reac_volume) - if(istype(O, /obj/effect/decal/cleanable)) + if(istype(O, /obj/effect/decal/cleanable) || istype(O, /obj/item/projectile/bullet/reusable/foam_dart) || istype(O, /obj/item/ammo_casing/caseless/foam_dart)) qdel(O) else if(O) O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + O.clean_blood() /datum/reagent/space_cleaner/reaction_turf(turf/T, reac_volume) if(reac_volume >= 1) T.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - SEND_SIGNAL(T, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(T, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + T.clean_blood() for(var/obj/effect/decal/cleanable/C in T) qdel(C) @@ -1104,26 +1274,33 @@ H.lip_style = null H.update_body() for(var/obj/item/I in C.held_items) - SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + I.clean_blood() if(C.wear_mask) - if(SEND_SIGNAL(C.wear_mask, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)) + SEND_SIGNAL(C.wear_mask, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + if(C.wear_mask.clean_blood()) C.update_inv_wear_mask() if(ishuman(M)) var/mob/living/carbon/human/H = C if(H.head) - if(SEND_SIGNAL(H.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)) + SEND_SIGNAL(H.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + if(H.head.clean_blood()) H.update_inv_head() if(H.wear_suit) - if(SEND_SIGNAL(H.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)) + SEND_SIGNAL(H.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + if(H.wear_suit.clean_blood()) H.update_inv_wear_suit() else if(H.w_uniform) - if(SEND_SIGNAL(H.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)) + SEND_SIGNAL(H.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + if(H.w_uniform.clean_blood()) H.update_inv_w_uniform() if(H.shoes) - if(SEND_SIGNAL(H.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)) + SEND_SIGNAL(H.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + if(H.shoes.clean_blood()) H.update_inv_shoes() H.wash_cream() - SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + M.clean_blood() /datum/reagent/space_cleaner/ez_clean name = "EZ Clean" @@ -1172,7 +1349,7 @@ /datum/reagent/impedrezene/on_mob_life(mob/living/carbon/M) M.jitteriness = max(M.jitteriness-5,0) if(prob(80)) - M.adjustBrainLoss(2*REM) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2*REM) if(prob(50)) M.drowsyness = max(M.drowsyness, 3) if(prob(10)) @@ -1222,7 +1399,7 @@ description = "A perfluoronated sulfonic acid that forms a foam when mixed with water." color = "#9E6B38" // rgb: 158, 107, 56 taste_description = "metal" - pH = 13 + pH = 11 /datum/reagent/foaming_agent// Metal foaming agent. This is lithium hydride. Add other recipes (e.g. LiH + H2O -> LiOH + H2) eventually. name = "Foaming agent" @@ -1231,7 +1408,7 @@ reagent_state = SOLID color = "#664B63" // rgb: 102, 75, 99 taste_description = "metal" - pH = 12.5 + pH = 11.5 /datum/reagent/smart_foaming_agent //Smart foaming agent. Functions similarly to metal foam, but conforms to walls. name = "Smart foaming agent" @@ -1445,9 +1622,6 @@ color = "#FFFFFF" // white random_color_list = list("#FFFFFF") //doesn't actually change appearance at all - - - //////////////////////////////////Hydroponics stuff/////////////////////////////// /datum/reagent/plantnutriment @@ -1489,16 +1663,8 @@ tox_prob = 15 pH = 1 - - - - - - // GOON OTHERS - - /datum/reagent/oil name = "Oil" id = "oil" @@ -1530,20 +1696,6 @@ taste_description = "metal" pH = 4.5 -/datum/reagent/carpet - name = "Carpet" - id = "carpet" - description = "For those that need a more creative way to roll out a red carpet." - reagent_state = LIQUID - color = "#b51d05" - taste_description = "carpet" // Your tounge feels furry. - -/datum/reagent/carpet/reaction_turf(turf/T, reac_volume) - if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) - var/turf/open/floor/F = T - F.PlaceOnTop(/turf/open/floor/carpet) - ..() - /datum/reagent/bromine name = "Bromine" id = "bromine" @@ -1676,7 +1828,7 @@ reagent_state = LIQUID color = "#FFFFD6" // very very light yellow taste_description = "alkali" //who put ACID for NaOH ???? - pH = 13 + pH = 11.9 /datum/reagent/drying_agent name = "Drying agent" @@ -1697,6 +1849,143 @@ qdel(O) new /obj/item/clothing/shoes/galoshes/dry(t_loc) +// Liquid Carpets +/datum/reagent/carpet + name = "Liquid Carpet" + id = "carpet" + description = "For those that need a more creative way to roll out a carpet." + reagent_state = LIQUID + color = "#b51d05" + taste_description = "carpet" // Your tounge feels furry. + +/datum/reagent/carpet/reaction_turf(turf/T, reac_volume) + if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) + var/turf/open/floor/F = T + F.PlaceOnTop(/turf/open/floor/carpet) + ..() + +/datum/reagent/carpet/black + name = "Liquid Black Carpet" + id = "blackcarpet" + color = "#363636" + +/datum/reagent/carpet/black/reaction_turf(turf/T, reac_volume) + if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) + var/turf/open/floor/F = T + F.PlaceOnTop(/turf/open/floor/carpet/black) + ..() + +/datum/reagent/carpet/blackred + name = "Liquid Red Black Carpet" + id = "blackredcarpet" + color = "#342125" + +/datum/reagent/carpet/blackred/reaction_turf(turf/T, reac_volume) + if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) + var/turf/open/floor/F = T + F.PlaceOnTop(/turf/open/floor/carpet/blackred) + ..() + +/datum/reagent/carpet/monochrome + name = "Liquid Monochrome Carpet" + id = "monochromecarpet" + color = "#b4b4b4" + +/datum/reagent/carpet/monochrome/reaction_turf(turf/T, reac_volume) + if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) + var/turf/open/floor/F = T + F.PlaceOnTop(/turf/open/floor/carpet/monochrome) + ..() + +/datum/reagent/carpet/blue + name = "Liquid Blue Carpet" + id = "bluecarpet" + color = "#1256ff" + +/datum/reagent/carpet/blue/reaction_turf(turf/T, reac_volume) + if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) + var/turf/open/floor/F = T + F.PlaceOnTop(/turf/open/floor/carpet/blue) + ..() + +/datum/reagent/carpet/cyan + name = "Liquid Cyan Carpet" + id = "cyancarpet" + color = "#3acfb9" + +/datum/reagent/carpet/cyan/reaction_turf(turf/T, reac_volume) + if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) + var/turf/open/floor/F = T + F.PlaceOnTop(/turf/open/floor/carpet/cyan) + ..() + +/datum/reagent/carpet/green + name = "Liquid Green Carpet" + id = "greencarpet" + color = "#619b62" + +/datum/reagent/carpet/green/reaction_turf(turf/T, reac_volume) + if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) + var/turf/open/floor/F = T + F.PlaceOnTop(/turf/open/floor/carpet/green) + ..() + +/datum/reagent/carpet/orange + name = "Liquid Orange Carpet" + id = "orangecarpet" + color = "#cc7900" + +/datum/reagent/carpet/orange/reaction_turf(turf/T, reac_volume) + if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) + var/turf/open/floor/F = T + F.PlaceOnTop(/turf/open/floor/carpet/orange) + ..() + +/datum/reagent/carpet/purple + name = "Liquid Purple Carpet" + id = "purplecarpet" + color = "#6d3392" + +/datum/reagent/carpet/purple/reaction_turf(turf/T, reac_volume) + if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) + var/turf/open/floor/F = T + F.PlaceOnTop(/turf/open/floor/carpet/purple) + ..() + +/datum/reagent/carpet/red + name = "Liquid Red Carpet" + id = "redcarpet" + color = "#871515" + +/datum/reagent/carpet/red/reaction_turf(turf/T, reac_volume) + if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) + var/turf/open/floor/F = T + F.PlaceOnTop(/turf/open/floor/carpet/red) + ..() + +/datum/reagent/carpet/royalblack + name = "Liquid Royal Black Carpet" + id = "royalblackcarpet" + color = "#483d05" + +/datum/reagent/carpet/royalblack/reaction_turf(turf/T, reac_volume) + if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) + var/turf/open/floor/F = T + F.PlaceOnTop(/turf/open/floor/carpet/royalblack) + ..() + +/datum/reagent/carpet/royalblue + name = "Liquid Royal Blue Carpet" + id = "royalbluecarpet" + color = "#24227e" + +/datum/reagent/carpet/royalblue/reaction_turf(turf/T, reac_volume) + if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) + var/turf/open/floor/F = T + F.PlaceOnTop(/turf/open/floor/carpet/royalblue) + ..() + + // Virology virus food chems. /datum/reagent/toxin/mutagen/mutagenvirusfood @@ -2003,35 +2292,38 @@ can_synth = FALSE var/datum/dna/original_dna var/reagent_ticks = 0 - invisible = TRUE + chemical_flags = REAGENT_INVISIBLE /datum/reagent/changeling_string/on_mob_metabolize(mob/living/carbon/C) - if(C && C.dna && data["desired_dna"]) + if(ishuman(C) && C.dna && data["desired_dna"]) original_dna = new C.dna.type C.dna.copy_dna(original_dna) var/datum/dna/new_dna = data["desired_dna"] - new_dna.copy_dna(C.dna) + new_dna.transfer_identity(C, TRUE) C.real_name = new_dna.real_name - C.updateappearance(mutcolor_update=1) - C.update_body() + C.updateappearance(mutcolor_update = TRUE) C.domutcheck() - C.regenerate_icons() ..() /datum/reagent/changeling_string/on_mob_end_metabolize(mob/living/carbon/C) if(original_dna) - original_dna.copy_dna(C.dna) + original_dna.transfer_identity(C, TRUE) C.real_name = original_dna.real_name - C.updateappearance(mutcolor_update=1) - C.update_body() + C.updateappearance(mutcolor_update = TRUE) C.domutcheck() - C.regenerate_icons() ..() /datum/reagent/changeling_string/Destroy() qdel(original_dna) return ..() +/datum/reagent/mustardgrind + name = "Mustardgrind" + id = "mustardgrind" + description = "A powerd that is mixed with water and enzymes to make mustard." + color = "#BCC740" //RGB: 188, 199, 64 + taste_description = "plant dust" + /datum/reagent/pax/catnip name = "catnip" id = "catnip" diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 2848c336e2..2b50ecc0f1 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -313,25 +313,6 @@ . = 1 ..() -/datum/reagent/toxin/chloralhydratedelayed //sedates half as quickly and does not cause toxloss. same name/desc so it doesn't give away sleepypens - name = "Chloral Hydrate" - id = "chloralhydratedelayed" - description = "A powerful sedative that induces confusion and drowsiness before putting its target to sleep." - reagent_state = SOLID - color = "#000067" // rgb: 0, 0, 103 - toxpwr = 0 - metabolization_rate = 1 * REAGENTS_METABOLISM - -/datum/reagent/toxin/chloralhydratedelayed/on_mob_life(mob/living/carbon/M) - switch(current_cycle) - if(10 to 20) - M.confused += 1 - M.drowsyness += 1 - M.adjustStaminaLoss(7.5) - if(20 to INFINITY) - M.Sleeping(40, 0) - ..() - /datum/reagent/toxin/fakebeer //disguised as normal beer for use by emagged brobots name = "Beer" id = "fakebeer" @@ -389,12 +370,12 @@ id = "tirizene" description = "A nonlethal poison that causes extreme fatigue and weakness in its victim." color = "#6E2828" - data = 13 + data = 15 toxpwr = 0 /datum/reagent/toxin/staminatoxin/on_mob_life(mob/living/carbon/M) M.adjustStaminaLoss(REM * data, 0) - data = max(data - 1, 3) + data = max(data - 1, 5) ..() . = 1 @@ -490,7 +471,7 @@ toxpwr = 0 /datum/reagent/toxin/fentanyl/on_mob_life(mob/living/carbon/M) - M.adjustBrainLoss(3*REM, 150) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3*REM, 150) if(M.toxloss <= 60) M.adjustToxLoss(1*REM, 0) if(current_cycle >= 18) @@ -969,3 +950,20 @@ to_chat(M, "Your missing arm aches from wherever you left it.") M.emote("sigh") return ..() + +/datum/reagent/toxin/brainhurtingjuice //oof ouch + name = "Brain Hurting Juice" + id = "brainhurtingjuice" + color = "#AAAAAA77" //RGBA: 170, 170, 170, 77 + toxpwr = 0 + taste_description = "brain hurting" + metabolization_rate = 5 + +/datum/reagent/toxin/brainhurtingjuice/on_mob_life(mob/living/carbon/M) + if(prob(50)) + M.gain_trauma_type(BRAIN_TRAUMA_MILD) + else if(prob(50)) + M.gain_trauma_type(BRAIN_TRAUMA_SEVERE) + else + M.gain_trauma_type(BRAIN_TRAUMA_SPECIAL) + ..() diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index 32155c9b89..a915087428 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -32,6 +32,7 @@ var/RateUpLim = 10 // Optimal/max rate possible if all conditions are perfect var/FermiChem = FALSE // If the chemical uses the Fermichem reaction mechanics//If the chemical uses the Fermichem reaction mechanics var/FermiExplode = FALSE // If the chemical explodes in a special way + var/clear_conversion //bitflags for clear conversions; REACTION_CLEAR_IMPURE or REACTION_CLEAR_INVERSE var/PurityMin = 0.15 //If purity is below 0.15, it explodes too. Set to 0 to disable this. diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index 59865dd1da..374f7715bb 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -68,6 +68,44 @@ results = list("synthflesh" = 3) required_reagents = list("blood" = 1, "carbon" = 1, "styptic_powder" = 1) +/datum/chemical_reaction/synthtissue + name = "Synthtissue" + id = "synthtissue" + results = list("synthtissue" = 5) + required_reagents = list("synthflesh" = 1) + required_catalysts = list("nutriment" = 0.1) + //FermiChem vars: + OptimalTempMin = 305 // Lower area of bell curve for determining heat based rate reactions + OptimalTempMax = 315 // Upper end for above + ExplodeTemp = 1050 // Temperature at which reaction explodes + OptimalpHMin = 8.5 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) + OptimalpHMax = 9.5 // Higest value for above + ReactpHLim = 2 // How far out pH wil react, giving impurity place (Exponential phase) + CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) + CurveSharpT = 1 // How sharp the temperature exponential curve is (to the power of value) + CurveSharppH = 2.5 // How sharp the pH exponential curve is (to the power of value) + ThermicConstant = 0.01 // Temperature change per 1u produced + HIonRelease = 0.015 // pH change per 1u reaction (inverse for some reason) + RateUpLim = 0.05 // Optimal/max rate possible if all conditions are perfect + FermiChem = TRUE // If the chemical uses the Fermichem reaction mechanics + PurityMin = 0 + +/datum/chemical_reaction/synthtissue/FermiCreate(datum/reagents/holder, added_volume, added_purity) + var/datum/reagent/synthtissue/St = holder.has_reagent("synthtissue") + var/datum/reagent/N = holder.has_reagent("nutriment") + if(!St) + return + if(holder.chem_temp > 320) + var/temp_ratio = 1-(330 - holder.chem_temp)/10 + holder.remove_reagent(src.id, added_volume*temp_ratio) + if(St.purity < 1) + St.volume *= St.purity + St.purity = 1 + var/amount = CLAMP(0.002, 0, N.volume) + N.volume -= amount + St.data["grown_volume"] = St.data["grown_volume"] + added_volume + St.name = "[initial(St.name)] [round(St.data["grown_volume"], 0.1)]u colony" + /datum/chemical_reaction/styptic_powder name = "Styptic Powder" id = "styptic_powder" @@ -245,6 +283,12 @@ results = list("regen_jelly" = 2) required_reagents = list("tricordrazine" = 1, "slimejelly" = 1) +/datum/chemical_reaction/jelly_convert + name = "Blood Jelly Conversion" + id = "blood_jelly" + results = list("slimejelly" = 1) + required_reagents = list("toxin" = 1, "jellyblood" = 1) + /datum/chemical_reaction/corazone name = "Corazone" id = "corazone" diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index fb2e4c396c..eaae548d68 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -82,6 +82,12 @@ required_temp = 374 mob_react = FALSE +/datum/chemical_reaction/mustard + name = "Mustard" + id = "mustard" + results = list("mustard" = 5) + required_reagents = list("mustardgrind" = 1, "water" = 10, "enzyme"= 1) + /datum/chemical_reaction/soapification/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) @@ -488,12 +494,6 @@ results = list("acetone" = 3) required_reagents = list("oil" = 1, "welding_fuel" = 1, "oxygen" = 1) -/datum/chemical_reaction/carpet - name = "carpet" - id = "carpet" - results = list("carpet" = 2) - required_reagents = list("space_drugs" = 1, "blood" = 1) - /datum/chemical_reaction/oil name = "Oil" id = "oil" @@ -635,3 +635,77 @@ results = list("shadowmutationtoxin" = 1) required_reagents = list("liquid_dark_matter" = 5, "synaptizine" = 10, "oculine" = 10, "stablemutationtoxin" = 1) required_temp = 600 + +// Liquid Carpets + +/datum/chemical_reaction/carpet + name = "carpet" + id = "carpet" + results = list("carpet" = 2) + required_reagents = list("space_drugs" = 1, "blood" = 1) + +/datum/chemical_reaction/carpet/black + name = "liquid black carpet" + id = "blackcarpet" + results = list("blackcarpet" = 2) + required_reagents = list("carpet" = 1, "carbon" = 1) + +/datum/chemical_reaction/carpet/blackred + name = "liquid red black carpet" + id = "blackredcarpet" + results = list("blackredcarpet" = 2) + required_reagents = list("carpet" = 1, "charcoal" = 1) + +/datum/chemical_reaction/carpet/monochrome + name = "liquid monochrome carpet" + id = "monochromecarpet" + results = list("monochromecarpet" = 2) + required_reagents = list("carpet" = 1, "oil" = 1) + +/datum/chemical_reaction/carpet/blue + name = "liquid blue carpet" + id = "bluecarpet" + results = list("bluecarpet" = 2) + required_reagents = list("carpet" = 1, "tonic" = 1) + +/datum/chemical_reaction/carpet/cyan + name = "liquid cyan carpet" + id = "cyancarpet" + results = list("cyancarpet" = 2) + required_reagents = list("carpet" = 1, "ice" = 1) + +/datum/chemical_reaction/carpet/green + name = "liquid green carpet" + id = "greencarpet" + results = list("greencarpet" = 2) + required_reagents = list("carpet" = 1, "sacid" = 1) + +/datum/chemical_reaction/carpet/orange + name = "liquid orange carpet" + id = "orangecarpet" + results = list("orangecarpet" = 2) + required_reagents = list("carpet" = 1, "orangejuice" = 1) + +/datum/chemical_reaction/carpet/purple + name = "liquid purple carpet" + id = "purplecarpet" + results = list("purplecarpet" = 2) + required_reagents = list("carpet" = 1, "stable_plasma" = 1) + +/datum/chemical_reaction/carpet/red + name = "liquid red carpet" + id = "redcarpet" + results = list("redcarpet" = 2) + required_reagents = list("carpet" = 1, "welding_fuel" = 1) + +/datum/chemical_reaction/carpet/royalblack + name = "liquid royal black carpet" + id = "royalblackcarpet" + results = list("royalblackcarpet" = 2) + required_reagents = list("carpet" = 1, "blackpepper" = 1) + +/datum/chemical_reaction/carpet/royalblue + name = "liquid royal blue carpet" + id = "royalbluecarpet" + results = list("royalbluecarpet" = 2) + required_reagents = list("carpet" = 1, "clonexadone" = 1) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 48abfcb649..d475b118b2 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -17,6 +17,7 @@ var/spillable = FALSE var/beaker_weakness_bitflag = NONE//Bitflag! var/container_HP = 2 + var/cached_icon /obj/item/reagent_containers/Initialize(mapload, vol) . = ..() @@ -25,7 +26,7 @@ create_reagents(volume, reagent_flags) if(spawned_disease) var/datum/disease/F = new spawned_disease() - var/list/data = list("viruses"= list(F)) + var/list/data = list("blood_DNA" = "UNKNOWN DNA", "blood_type" = "SY","viruses"= list(F)) reagents.add_reagent("blood", disease_amount, data) add_initial_reagents() @@ -148,30 +149,71 @@ /obj/item/reagent_containers/proc/temp_check() if(beaker_weakness_bitflag & TEMP_WEAK) if(reagents.chem_temp >= 444)//assuming polypropylene - var/list/seen = viewers(5, get_turf(src)) - var/iconhtml = icon2html(src, seen) - for(var/mob/M in seen) - to_chat(M, "[iconhtml] \The [src]'s melts from the temperature!") - playsound(get_turf(src), 'sound/FermiChem/heatmelt.ogg', 80, 1) - to_chat(M, "[iconhtml] Have you tried using glass or meta beakers for high temperature reactions? These are immune to temperature effects.") - SSblackbox.record_feedback("tally", "fermi_chem", 1, "Times beakers have melted from temperature") - qdel(src) + START_PROCESSING(SSobj, src) //melts glass beakers /obj/item/reagent_containers/proc/pH_check() if(beaker_weakness_bitflag & PH_WEAK) - if((reagents.pH < 0.5) || (reagents.pH > 13.5)) - var/list/seen = viewers(5, get_turf(src)) - var/iconhtml = icon2html(src, seen) - container_HP-- - if(container_HP <= 0) - for(var/mob/M in seen) - to_chat(M, "[iconhtml] \The [src]'s melts from the extreme pH!") - playsound(get_turf(src), 'sound/FermiChem/acidmelt.ogg', 80, 1) - SSblackbox.record_feedback("tally", "fermi_chem", 1, "Times beakers have melted from pH") - qdel(src) + if((reagents.pH < 1.5) || (reagents.pH > 12.5)) + START_PROCESSING(SSobj, src) + + +/obj/item/reagent_containers/process() + if(!cached_icon) + cached_icon = icon_state + var/damage + var/cause + if(beaker_weakness_bitflag & PH_WEAK) + if(reagents.pH < 2) + damage = (2 - reagents.pH)/20 + cause = "from the extreme pH" + playsound(get_turf(src), 'sound/FermiChem/bufferadd.ogg', 50, 1) + + if(reagents.pH > 12) + damage = (reagents.pH - 12)/20 + cause = "from the extreme pH" + playsound(get_turf(src), 'sound/FermiChem/bufferadd.ogg', 50, 1) + + if(beaker_weakness_bitflag & TEMP_WEAK) + if(reagents.chem_temp >= 444) + if(damage) + damage += (reagents.chem_temp/444)/5 else - for(var/mob/M in seen) - to_chat(M, "[iconhtml] \The [src]'s is damaged by the extreme pH and begins to deform!") - playsound(get_turf(src), 'sound/FermiChem/bufferadd.ogg', 50, 1) - to_chat(M, "[iconhtml] Have you tried using plastic beakers (XL) or metabeakers for high pH reactions? These beakers are immune to pH effects.") + damage = (reagents.chem_temp/444)/5 + if(cause) + cause += " and " + cause += "from the high temperature" + playsound(get_turf(src), 'sound/FermiChem/heatdam.ogg', 50, 1) + + if(!damage || damage <= 0) + STOP_PROCESSING(SSobj, src) + + container_HP -= damage + + var/list/seen = viewers(5, get_turf(src)) + var/iconhtml = icon2html(src, seen) + + var/damage_percent = ((container_HP / initial(container_HP)*100)) + switch(damage_percent) + if(-INFINITY to 0) + for(var/mob/M in seen) + to_chat(M, "[iconhtml] \The [src]'s melts [cause]!") + playsound(get_turf(src), 'sound/FermiChem/acidmelt.ogg', 80, 1) + SSblackbox.record_feedback("tally", "fermi_chem", 1, "Times beakers have melted") + STOP_PROCESSING(SSobj, src) + qdel(src) + return + if(0 to 35) + icon_state = "[cached_icon]_m3" + desc = "[initial(desc)] It is severely deformed." + if(35 to 70) + icon_state = "[cached_icon]_m2" + desc = "[initial(desc)] It is deformed." + if(70 to 85) + desc = "[initial(desc)] It is mildly deformed." + icon_state = "[cached_icon]_m1" + + update_icon() + if(prob(25)) + for(var/mob/M in seen) + to_chat(M, "[iconhtml] \The [src]'s is damaged by [cause] and begins to deform!") diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index 31e893aa3a..fe35981bfe 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -4,13 +4,16 @@ icon = 'icons/obj/bloodpack.dmi' icon_state = "bloodpack" volume = 200 + reagent_flags = DRAINABLE var/blood_type = null var/labelled = 0 + var/color_to_apply = "#FFFFFF" + var/mutable_appearance/fill_overlay /obj/item/reagent_containers/blood/Initialize() . = ..() if(blood_type != null) - reagents.add_reagent("blood", 200, list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=blood_type,"resistances"=null,"trace_chem"=null)) + reagents.add_reagent("blood", 200, list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_colour"=color, "blood_type"=blood_type,"resistances"=null,"trace_chem"=null)) update_icon() /obj/item/reagent_containers/blood/on_reagent_change(changetype) @@ -18,6 +21,7 @@ var/datum/reagent/blood/B = reagents.has_reagent("blood") if(B && B.data && B.data["blood_type"]) blood_type = B.data["blood_type"] + color_to_apply = bloodtype_to_color(blood_type) else blood_type = null update_pack_name() @@ -45,7 +49,7 @@ /obj/item/reagent_containers/blood/random/Initialize() icon_state = "bloodpack" - blood_type = pick("A+", "A-", "B+", "B-", "O+", "O-", "L") + blood_type = pick("A+", "A-", "B+", "B-", "O+", "O-", "L", "SY", "HF", "GEL", "BUG") return ..() /obj/item/reagent_containers/blood/APlus @@ -72,6 +76,18 @@ /obj/item/reagent_containers/blood/universal blood_type = "U" +/obj/item/reagent_containers/blood/synthetics + blood_type = "SY" + +/obj/item/reagent_containers/blood/oilblood + blood_type = "HF" + +/obj/item/reagent_containers/blood/jellyblood + blood_type = "GEL" + +/obj/item/reagent_containers/blood/insect + blood_type = "BUG" + /obj/item/reagent_containers/blood/attackby(obj/item/I, mob/user, params) if (istype(I, /obj/item/pen) || istype(I, /obj/item/toy/crayon)) if(!user.is_literate()) @@ -90,3 +106,9 @@ update_pack_name() else return ..() + +/obj/item/reagent_containers/blood/bluespace + name = "bluespace blood pack" + desc = "Contains blood used for transfusion, this one has been made with bluespace technology to hold much more blood. Must be attached to an IV drip." + icon_state = "bsbloodpack" + volume = 600 //its a blood bath! \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index 249ed56d20..afe48ab3fb 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -404,3 +404,25 @@ /obj/item/reagent_containers/glass/bottle/bromine name = "bromine bottle" list_reagents = list("bromine" = 30) + +//Lewd Stuff + +/obj/item/reagent_containers/glass/bottle/crocin + name = "Crocin bottle" + desc = "A bottle of mild aphrodisiac. Increases libido." + list_reagents = list("aphro" = 30) + +/obj/item/reagent_containers/glass/bottle/hexacrocin + name = "Hexacrocin bottle" + desc = "A bottle of strong aphrodisiac. Increases libido." + list_reagents = list("aphro+" = 30) + +/obj/item/reagent_containers/glass/bottle/camphor + name = "Camphor bottle" + desc = "A bottle of mild anaphrodisiac. Reduces libido." + list_reagents = list("anaphro" = 30) + +/obj/item/reagent_containers/glass/bottle/hexacamphor + name = "Hexacamphor bottle" + desc = "A bottle of strong anaphrodisiac. Reduces libido." + list_reagents = list("anaphro+" = 30) \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 014401b72c..257106aaa7 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -6,7 +6,7 @@ reagent_flags = OPENCONTAINER spillable = TRUE resistance_flags = ACID_PROOF - container_HP = 3 + container_HP = 2 /obj/item/reagent_containers/glass/attack(mob/M, mob/user, obj/target) @@ -115,7 +115,6 @@ item_state = "beaker" materials = list(MAT_GLASS=500) beaker_weakness_bitflag = PH_WEAK - container_HP = 5 /obj/item/reagent_containers/glass/beaker/Initialize() . = ..() @@ -128,27 +127,29 @@ update_icon() /obj/item/reagent_containers/glass/beaker/update_icon() + if(!cached_icon) + cached_icon = icon_state cut_overlays() if(reagents.total_volume) - var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "[icon_state]10") + var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "[cached_icon]10") var/percent = round((reagents.total_volume / volume) * 100) switch(percent) if(0 to 9) - filling.icon_state = "[icon_state]-10" + filling.icon_state = "[cached_icon]-10" if(10 to 24) - filling.icon_state = "[icon_state]10" + filling.icon_state = "[cached_icon]10" if(25 to 49) - filling.icon_state = "[icon_state]25" + filling.icon_state = "[cached_icon]25" if(50 to 74) - filling.icon_state = "[icon_state]50" + filling.icon_state = "[cached_icon]50" if(75 to 79) - filling.icon_state = "[icon_state]75" + filling.icon_state = "[cached_icon]75" if(80 to 90) - filling.icon_state = "[icon_state]80" + filling.icon_state = "[cached_icon]80" if(91 to INFINITY) - filling.icon_state = "[icon_state]100" + filling.icon_state = "[cached_icon]100" filling.color = mix_color_from_reagents(reagents.reagent_list) add_overlay(filling) @@ -167,7 +168,7 @@ volume = 100 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,20,25,30,50,100) - container_HP = 6 + container_HP = 3 /obj/item/reagent_containers/glass/beaker/plastic name = "x-large beaker" @@ -227,7 +228,7 @@ volume = 300 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,20,25,30,50,100,300) - container_HP = 8 + container_HP = 4 /obj/item/reagent_containers/glass/beaker/cryoxadone list_reagents = list("cryoxadone" = 30) @@ -284,7 +285,7 @@ SLOT_L_STORE, SLOT_R_STORE,\ SLOT_GENERC_DEXTROUS_STORAGE ) - container_HP = 2 + container_HP = 1 /obj/item/reagent_containers/glass/bucket/Initialize() beaker_weakness_bitflag |= TEMP_WEAK @@ -338,7 +339,7 @@ materials = list(MAT_GLASS=0) volume = 50 amount_per_transfer_from_this = 10 - container_HP = 2 + container_HP = 1 /obj/item/reagent_containers/glass/beaker/waterbottle/Initialize() beaker_weakness_bitflag |= TEMP_WEAK @@ -354,7 +355,7 @@ list_reagents = list("water" = 100) volume = 100 amount_per_transfer_from_this = 20 - container_HP = 2 + container_HP = 1 /obj/item/reagent_containers/glass/beaker/waterbottle/large/empty list_reagents = list() diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 82d95cea40..432b9289dd 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -127,6 +127,21 @@ else to_chat(usr, "It is spent.") +/obj/item/reagent_containers/hypospray/medipen/stimulants + name = "illegal stimpack medipen" + desc = "A highly illegal medipen due to its load and small injections, allow for five uses before being drained" + volume = 50 + amount_per_transfer_from_this = 10 + list_reagents = list("stimulants" = 50) + +/obj/item/reagent_containers/hypospray/medipen/stimulants/baseball + name = "the reason the syndicate major league team wins." + desc = "They say drugs never win, but look where you are now, then where they are." + icon_state = "baseballstim" + volume = 50 + amount_per_transfer_from_this = 50 + list_reagents = list("stimulants" = 50) + /obj/item/reagent_containers/hypospray/medipen/stimpack //goliath kiting name = "stimpack medipen" desc = "A rapid way to stimulate your body's adrenaline, allowing for freer movement in restrictive armor." @@ -181,3 +196,318 @@ volume = 250 list_reagents = list("holywater" = 150, "tiresolution" = 50, "dizzysolution" = 50) amount_per_transfer_from_this = 50 + +#define HYPO_SPRAY 0 +#define HYPO_INJECT 1 + +#define WAIT_SPRAY 25 +#define WAIT_INJECT 25 +#define SELF_SPRAY 15 +#define SELF_INJECT 15 + +#define DELUXE_WAIT_SPRAY 20 +#define DELUXE_WAIT_INJECT 20 +#define DELUXE_SELF_SPRAY 10 +#define DELUXE_SELF_INJECT 10 + +#define COMBAT_WAIT_SPRAY 0 +#define COMBAT_WAIT_INJECT 0 +#define COMBAT_SELF_SPRAY 0 +#define COMBAT_SELF_INJECT 0 + +//A vial-loaded hypospray. Cartridge-based! +/obj/item/hypospray/mkii + name = "hypospray mk.II" + icon_state = "hypo2" + icon = 'icons/obj/syringe.dmi' + desc = "A new development from DeForest Medical, this hypospray takes 30-unit vials as the drug supply for easy swapping." + w_class = WEIGHT_CLASS_TINY + var/list/allowed_containers = list(/obj/item/reagent_containers/glass/bottle/vial/tiny, /obj/item/reagent_containers/glass/bottle/vial/small) + var/mode = HYPO_INJECT + var/obj/item/reagent_containers/glass/bottle/vial/vial + var/start_vial = /obj/item/reagent_containers/glass/bottle/vial/small + var/spawnwithvial = TRUE + var/inject_wait = WAIT_INJECT + var/spray_wait = WAIT_SPRAY + var/spray_self = SELF_SPRAY + var/inject_self = SELF_INJECT + var/quickload = FALSE + var/penetrates = FALSE + +/obj/item/hypospray/mkii/brute + start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/bicaridine + +/obj/item/hypospray/mkii/toxin + start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/antitoxin + +/obj/item/hypospray/mkii/oxygen + start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/dexalin + +/obj/item/hypospray/mkii/burn + start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/kelotane + +/obj/item/hypospray/mkii/tricord + start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/tricord + +/obj/item/hypospray/mkii/enlarge + spawnwithvial = FALSE + +/obj/item/hypospray/mkii/CMO + name = "hypospray mk.II deluxe" + allowed_containers = list(/obj/item/reagent_containers/glass/bottle/vial/tiny, /obj/item/reagent_containers/glass/bottle/vial/small, /obj/item/reagent_containers/glass/bottle/vial/large) + icon_state = "cmo2" + desc = "The Deluxe Hypospray can take larger-size vials. It also acts faster and delivers more reagents per spray." + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF + start_vial = /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/CMO + inject_wait = DELUXE_WAIT_INJECT + spray_wait = DELUXE_WAIT_SPRAY + spray_self = DELUXE_SELF_SPRAY + inject_self = DELUXE_SELF_INJECT + +/obj/item/hypospray/mkii/CMO/combat + name = "combat hypospray mk.II" + desc = "A combat-ready deluxe hypospray that acts almost instantly. It can be tactically reloaded by using a vial on it." + icon_state = "combat2" + start_vial = /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/combat + inject_wait = COMBAT_WAIT_INJECT + spray_wait = COMBAT_WAIT_SPRAY + spray_self = COMBAT_SELF_SPRAY + inject_self = COMBAT_SELF_INJECT + quickload = TRUE + penetrates = TRUE + +/obj/item/hypospray/mkii/Initialize() + . = ..() + if(!spawnwithvial) + update_icon() + return + if(start_vial) + vial = new start_vial + update_icon() + +/obj/item/hypospray/mkii/update_icon() + ..() + icon_state = "[initial(icon_state)][vial ? "" : "-e"]" + if(ismob(loc)) + var/mob/M = loc + M.update_inv_hands() + return + +/obj/item/hypospray/mkii/examine(mob/user) + . = ..() + if(vial) + to_chat(user, "[vial] has [vial.reagents.total_volume]u remaining.") + else + to_chat(user, "It has no vial loaded in.") + to_chat(user, "[src] is set to [mode ? "Inject" : "Spray"] contents on application.") + +/obj/item/hypospray/mkii/proc/unload_hypo(obj/item/I, mob/user) + if((istype(I, /obj/item/reagent_containers/glass/bottle/vial))) + var/obj/item/reagent_containers/glass/bottle/vial/V = I + V.forceMove(user.loc) + user.put_in_hands(V) + to_chat(user, "You remove [vial] from [src].") + vial = null + update_icon() + playsound(loc, 'sound/weapons/empty.ogg', 50, 1) + else + to_chat(user, "This hypo isn't loaded!") + return + +/obj/item/hypospray/mkii/attackby(obj/item/I, mob/living/user) + if((istype(I, /obj/item/reagent_containers/glass/bottle/vial) && vial != null)) + if(!quickload) + to_chat(user, "[src] can not hold more than one vial!") + return FALSE + unload_hypo(vial, user) + if((istype(I, /obj/item/reagent_containers/glass/bottle/vial))) + var/obj/item/reagent_containers/glass/bottle/vial/V = I + if(!is_type_in_list(V, allowed_containers)) + to_chat(user, "[src] doesn't accept this type of vial.") + return FALSE + if(!user.transferItemToLoc(V,src)) + return FALSE + vial = V + user.visible_message("[user] has loaded a vial into [src].","You have loaded [vial] into [src].") + update_icon() + playsound(loc, 'sound/weapons/autoguninsert.ogg', 35, 1) + return TRUE + else + to_chat(user, "This doesn't fit in [src].") + return FALSE + return FALSE + +/obj/item/hypospray/mkii/AltClick(mob/user) + if(vial) + vial.attack_self(user) + +// Gunna allow this for now, still really don't approve - Pooj +/obj/item/hypospray/mkii/emag_act(mob/user) + . = ..() + if(obj_flags & EMAGGED) + to_chat(user, "[src] happens to be already overcharged.") + return + inject_wait = COMBAT_WAIT_INJECT + spray_wait = COMBAT_WAIT_SPRAY + spray_self = COMBAT_SELF_INJECT + inject_self = COMBAT_SELF_SPRAY + penetrates = TRUE + to_chat(user, "You overcharge [src]'s control circuit.") + obj_flags |= EMAGGED + return TRUE + +/obj/item/hypospray/mkii/attack_hand(mob/user) + . = ..() //Don't bother changing this or removing it from containers will break. + +/obj/item/hypospray/mkii/attack(obj/item/I, mob/user, params) + return + +/obj/item/hypospray/mkii/afterattack(atom/target, mob/user, proximity) + if(!vial) + return + + if(!proximity) + return + + if(!ismob(target)) + return + + var/mob/living/L + if(isliving(target)) + L = target + if(!penetrates && !L.can_inject(user, 1)) //This check appears another four times, since otherwise the penetrating sprays will break in do_mob. + return + + if(!L && !target.is_injectable()) //only checks on non-living mobs, due to how can_inject() handles + to_chat(user, "You cannot directly fill [target]!") + return + + if(target.reagents.total_volume >= target.reagents.maximum_volume) + to_chat(user, "[target] is full.") + return + + if(ishuman(L)) + var/obj/item/bodypart/affecting = L.get_bodypart(check_zone(user.zone_selected)) + if(!affecting) + to_chat(user, "The limb is missing!") + return + if(affecting.status != BODYPART_ORGANIC) + to_chat(user, "Medicine won't work on a robotic limb!") + return + + var/contained = vial.reagents.log_list() + log_combat(user, L, "attemped to inject", src, addition="which had [contained]") +//Always log attemped injections for admins + if(vial != null) + switch(mode) + if(HYPO_INJECT) + if(L) //living mob + if(L != user) + L.visible_message("[user] is trying to inject [L] with [src]!", \ + "[user] is trying to inject [L] with [src]!") + if(!do_mob(user, L, inject_wait)) + return + if(!penetrates && !L.can_inject(user, 1)) + return + if(!vial.reagents.total_volume) + return + if(L.reagents.total_volume >= L.reagents.maximum_volume) + return + L.visible_message("[user] uses the [src] on [L]!", \ + "[user] uses the [src] on [L]!") + else + if(!do_mob(user, L, inject_self)) + return + if(!penetrates && !L.can_inject(user, 1)) + return + if(!vial.reagents.total_volume) + return + if(L.reagents.total_volume >= L.reagents.maximum_volume) + return + log_attack("[user.name] ([user.ckey]) applied [src] to [L.name] ([L.ckey]), which had [contained] (INTENT: [uppertext(user.a_intent)]) (MODE: [src.mode])") + L.log_message("applied [src] to themselves ([contained]).", INDIVIDUAL_ATTACK_LOG) + + var/fraction = min(vial.amount_per_transfer_from_this/vial.reagents.total_volume, 1) + vial.reagents.reaction(L, INJECT, fraction) + vial.reagents.trans_to(target, vial.amount_per_transfer_from_this) + if(vial.amount_per_transfer_from_this >= 15) + playsound(loc,'sound/items/hypospray_long.ogg',50, 1, -1) + if(vial.amount_per_transfer_from_this < 15) + playsound(loc, pick('sound/items/hypospray.ogg','sound/items/hypospray2.ogg'), 50, 1, -1) + to_chat(user, "You inject [vial.amount_per_transfer_from_this] units of the solution. The hypospray's cartridge now contains [vial.reagents.total_volume] units.") + + if(HYPO_SPRAY) + if(L) //living mob + if(L != user) + L.visible_message("[user] is trying to spray [L] with [src]!", \ + "[user] is trying to spray [L] with [src]!") + if(!do_mob(user, L, spray_wait)) + return + if(!penetrates && !L.can_inject(user, 1)) + return + if(!vial.reagents.total_volume) + return + if(L.reagents.total_volume >= L.reagents.maximum_volume) + return + L.visible_message("[user] uses the [src] on [L]!", \ + "[user] uses the [src] on [L]!") + else + if(!do_mob(user, L, spray_self)) + return + if(!penetrates && !L.can_inject(user, 1)) + return + if(!vial.reagents.total_volume) + return + if(L.reagents.total_volume >= L.reagents.maximum_volume) + return + log_attack("[user.name] ([user.ckey]) applied [src] to [L.name] ([L.ckey]), which had [contained] (INTENT: [uppertext(user.a_intent)]) (MODE: [src.mode])") + L.log_message("applied [src] to themselves ([contained]).", INDIVIDUAL_ATTACK_LOG) + var/fraction = min(vial.amount_per_transfer_from_this/vial.reagents.total_volume, 1) + vial.reagents.reaction(L, PATCH, fraction) + vial.reagents.trans_to(target, vial.amount_per_transfer_from_this) + if(vial.amount_per_transfer_from_this >= 15) + playsound(loc,'sound/items/hypospray_long.ogg',50, 1, -1) + if(vial.amount_per_transfer_from_this < 15) + playsound(loc, pick('sound/items/hypospray.ogg','sound/items/hypospray2.ogg'), 50, 1, -1) + to_chat(user, "You spray [vial.amount_per_transfer_from_this] units of the solution. The hypospray's cartridge now contains [vial.reagents.total_volume] units.") + else + to_chat(user, "[src] doesn't work here!") + return + +/obj/item/hypospray/mkii/attack_self(mob/living/user) + if(user) + if(user.incapacitated()) + return + else if(!vial) + to_chat(user, "This Hypo needs to be loaded first!") + return + else + unload_hypo(vial,user) + +/obj/item/hypospray/mkii/verb/modes() + set name = "Toggle Application Mode" + set category = "Object" + set src in usr + var/mob/M = usr + switch(mode) + if(HYPO_SPRAY) + mode = HYPO_INJECT + to_chat(M, "[src] is now set to inject contents on application.") + if(HYPO_INJECT) + mode = HYPO_SPRAY + to_chat(M, "[src] is now set to spray contents on application.") + +#undef HYPO_SPRAY +#undef HYPO_INJECT +#undef WAIT_SPRAY +#undef WAIT_INJECT +#undef SELF_SPRAY +#undef SELF_INJECT +#undef DELUXE_WAIT_SPRAY +#undef DELUXE_WAIT_INJECT +#undef DELUXE_SELF_SPRAY +#undef DELUXE_SELF_INJECT +#undef COMBAT_WAIT_SPRAY +#undef COMBAT_WAIT_INJECT +#undef COMBAT_SELF_SPRAY +#undef COMBAT_SELF_INJECT diff --git a/modular_citadel/code/modules/reagents/reagent container/hypovial.dm b/code/modules/reagents/reagent_containers/hypovial.dm old mode 100755 new mode 100644 similarity index 96% rename from modular_citadel/code/modules/reagents/reagent container/hypovial.dm rename to code/modules/reagents/reagent_containers/hypovial.dm index c1e0d6ff01..ba5ce48a4a --- a/modular_citadel/code/modules/reagents/reagent container/hypovial.dm +++ b/code/modules/reagents/reagent_containers/hypovial.dm @@ -1,7 +1,8 @@ +//hypovials used with the MkII hypospray. See hypospray.dm. + /obj/item/reagent_containers/glass/bottle/vial name = "broken hypovial" desc = "A hypovial compatible with most hyposprays." - icon = 'modular_citadel/icons/obj/vial.dmi' icon_state = "hypovial" spillable = FALSE var/comes_with = list() //Easy way of doing this. @@ -34,7 +35,7 @@ /obj/item/reagent_containers/glass/bottle/vial/update_icon() cut_overlays() if(reagents.total_volume) - var/mutable_appearance/filling = mutable_appearance('modular_citadel/icons/obj/vial.dmi', "hypovial10") + var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "hypovial10") var/percent = round((reagents.total_volume / volume) * 100) switch(percent) @@ -86,7 +87,7 @@ /obj/item/reagent_containers/glass/bottle/vial/large/update_icon() cut_overlays() if(reagents.total_volume) - var/mutable_appearance/filling = mutable_appearance('modular_citadel/icons/obj/vial.dmi', "hypoviallarge10") + var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "hypoviallarge10") var/percent = round((reagents.total_volume / volume) * 100) switch(percent) diff --git a/code/modules/reagents/reagent_containers/medspray.dm b/code/modules/reagents/reagent_containers/medspray.dm index 54a38eef86..df7c7af225 100644 --- a/code/modules/reagents/reagent_containers/medspray.dm +++ b/code/modules/reagents/reagent_containers/medspray.dm @@ -19,8 +19,8 @@ var/can_fill_from_container = TRUE var/apply_type = PATCH var/apply_method = "spray" - var/self_delay = 30 - var/squirt_mode = 0 + var/self_delay = 3 SECONDS + var/squirt_mode = FALSE var/squirt_amount = 5 /obj/item/reagent_containers/medspray/attack_self(mob/user) @@ -31,40 +31,51 @@ amount_per_transfer_from_this = initial(amount_per_transfer_from_this) to_chat(user, "You will now apply the medspray's contents in [squirt_mode ? "short bursts":"extended sprays"]. You'll now use [amount_per_transfer_from_this] units per use.") -/obj/item/reagent_containers/medspray/attack(mob/M, mob/user, def_zone) +/obj/item/reagent_containers/medspray/attack(mob/living/L, mob/user, def_zone) if(!reagents || !reagents.total_volume) to_chat(user, "[src] is empty!") return - if(M == user) - M.visible_message("[user] attempts to [apply_method] [src] on [user.p_them()]self.") + if(ishuman(L)) + var/obj/item/bodypart/affecting = L.get_bodypart(check_zone(user.zone_selected)) + if(!affecting) + to_chat(user, "The limb is missing!") + return + if(!L.can_inject(user, TRUE, user.zone_selected, FALSE, TRUE)) //stopped by clothing, like patches + return + if(affecting.status != BODYPART_ORGANIC) + to_chat(user, "Medicine won't work on a robotic limb!") + return + + if(L == user) + L.visible_message("[user] attempts to [apply_method] [src] on [user.p_them()]self.") if(self_delay) - if(!do_mob(user, M, self_delay)) + if(!do_mob(user, L, self_delay)) return if(!reagents || !reagents.total_volume) return - to_chat(M, "You [apply_method] yourself with [src].") + to_chat(L, "You [apply_method] yourself with [src].") else - log_combat(user, M, "attempted to apply", src, reagents.log_list()) - M.visible_message("[user] attempts to [apply_method] [src] on [M].", \ - "[user] attempts to [apply_method] [src] on [M].") - if(!do_mob(user, M)) + log_combat(user, L, "attempted to apply", src, reagents.log_list()) + L.visible_message("[user] attempts to [apply_method] [src] on [L].", \ + "[user] attempts to [apply_method] [src] on [L].") + if(!do_mob(user, L)) return if(!reagents || !reagents.total_volume) return - M.visible_message("[user] [apply_method]s [M] down with [src].", \ - "[user] [apply_method]s [M] down with [src].") + L.visible_message("[user] [apply_method]s [L] down with [src].", \ + "[user] [apply_method]s [L] down with [src].") if(!reagents || !reagents.total_volume) return else - log_combat(user, M, "applied", src, reagents.log_list()) + log_combat(user, L, "applied", src, reagents.log_list()) playsound(src, 'sound/effects/spray2.ogg', 50, 1, -6) var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1) - reagents.reaction(M, apply_type, fraction) - reagents.trans_to(M, amount_per_transfer_from_this) + reagents.reaction(L, apply_type, fraction) + reagents.trans_to(L, amount_per_transfer_from_this) return /obj/item/reagent_containers/medspray/styptic diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 38880f669f..d4880aa085 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -186,7 +186,6 @@ /obj/item/reagent_containers/pill/antirad_plus name = "prussian blue pill" desc = "Used to treat heavy radition poisoning." - icon = 'modular_citadel/icons/obj/modularpills.dmi' icon_state = "prussian_blue" list_reagents = list("prussian_blue" = 25, "water" = 10) roundstart = 1 @@ -194,7 +193,6 @@ /obj/item/reagent_containers/pill/mutarad name = "radiation treatment deluxe pill" desc = "Used to treat heavy radition poisoning and genetic defects." - icon = 'modular_citadel/icons/obj/modularpills.dmi' icon_state = "anit_rad_fixgene" list_reagents = list("prussian_blue" = 15, "potass_iodide" = 15, "mutadone" = 15, "water" = 5) roundstart = 1 diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index cc83eb28f6..6bdae6225a 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -104,7 +104,7 @@ var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) // transfer from, transfer to - who cares? to_chat(user, "You fill [src] with [trans] units of the solution. It now contains [reagents.total_volume] units.") - if (reagents.total_volume >= reagents.maximum_volume) + if (round(reagents.total_volume, 0.1) >= reagents.maximum_volume) mode=!mode update_icon() @@ -307,7 +307,7 @@ var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) to_chat(user, "You soak the [src] with [trans] units of the solution. It now contains [reagents.total_volume] units.") - if (reagents.total_volume >= reagents.maximum_volume) + if (round(reagents.total_volume,1) >= reagents.maximum_volume) mode=!mode update_icon() @@ -323,8 +323,9 @@ rounded_vol = "empty" if(reagents && reagents.total_volume) - if(volume/reagents.total_volume == 1) + if(volume/round(reagents.total_volume, 1) == 1) rounded_vol="full" + mode = SYRINGE_INJECT icon_state = "[rounded_vol]" item_state = "syringe_[rounded_vol]" diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 19afab2e6e..216ecd9654 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -39,6 +39,10 @@ else qdel(src) +/////////////// +//Water Tanks// +/////////////// + /obj/structure/reagent_dispensers/watertank name = "water tank" desc = "A water tank." @@ -57,12 +61,52 @@ reagent_id = "firefighting_foam" tank_volume = 500 +/obj/structure/reagent_dispensers/water_cooler + name = "liquid cooler" + desc = "A machine that dispenses liquid to drink." + icon = 'icons/obj/vending.dmi' + icon_state = "water_cooler" + anchored = TRUE + tank_volume = 500 + var/paper_cups = 25 //Paper cups left from the cooler + +/obj/structure/reagent_dispensers/water_cooler/examine(mob/user) + ..() + if (paper_cups > 1) + to_chat(user, "There are [paper_cups] paper cups left.") + else if (paper_cups == 1) + to_chat(user, "There is one paper cup left.") + else + to_chat(user, "There are no paper cups left.") + +/obj/structure/reagent_dispensers/water_cooler/attack_hand(mob/living/user) + . = ..() + if(.) + return + if(!paper_cups) + to_chat(user, "There aren't any cups left!") + return + user.visible_message("[user] takes a cup from [src].", "You take a paper cup from [src].") + var/obj/item/reagent_containers/food/drinks/sillycup/S = new(get_turf(src)) + user.put_in_hands(S) + paper_cups-- + +////////////// +//Fuel Tanks// +////////////// + /obj/structure/reagent_dispensers/fueltank name = "fuel tank" desc = "A tank full of industrial welding fuel. Do not consume." icon_state = "fuel" reagent_id = "welding_fuel" +/obj/structure/reagent_dispensers/fueltank/high //Unused - Good for ghost roles + name = "high-capacity fuel tank" + desc = "A now illegal tank, full of highly pressurized industrial welding fuel. Do not consume or have a open flame close to this tank." + icon_state = "fuel_high" + tank_volume = 3000 + /obj/structure/reagent_dispensers/fueltank/boom() explosion(get_turf(src), 0, 1, 5, flame_range = 5) qdel(src) @@ -117,6 +161,9 @@ return return ..() +/////////////////// +//Misc Dispenders// +/////////////////// /obj/structure/reagent_dispensers/peppertank name = "pepper spray refiller" @@ -131,36 +178,24 @@ if(prob(1)) desc = "IT'S PEPPER TIME, BITCH!" - -/obj/structure/reagent_dispensers/water_cooler - name = "liquid cooler" - desc = "A machine that dispenses liquid to drink." - icon = 'icons/obj/vending.dmi' - icon_state = "water_cooler" +/obj/structure/reagent_dispensers/virusfood + name = "virus food dispenser" + desc = "A dispenser of low-potency virus mutagenic." + icon_state = "virus_food" anchored = TRUE - tank_volume = 500 - var/paper_cups = 25 //Paper cups left from the cooler + density = FALSE + reagent_id = "virusfood" -/obj/structure/reagent_dispensers/water_cooler/examine(mob/user) - ..() - if (paper_cups > 1) - to_chat(user, "There are [paper_cups] paper cups left.") - else if (paper_cups == 1) - to_chat(user, "There is one paper cup left.") - else - to_chat(user, "There are no paper cups left.") +/obj/structure/reagent_dispensers/cooking_oil + name = "vat of cooking oil" + desc = "A huge metal vat with a tap on the front. Filled with cooking oil for use in frying food." + icon_state = "vat" + anchored = TRUE + reagent_id = "cooking_oil" -/obj/structure/reagent_dispensers/water_cooler/attack_hand(mob/living/user) - . = ..() - if(.) - return - if(!paper_cups) - to_chat(user, "There aren't any cups left!") - return - user.visible_message("[user] takes a cup from [src].", "You take a paper cup from [src].") - var/obj/item/reagent_containers/food/drinks/sillycup/S = new(get_turf(src)) - user.put_in_hands(S) - paper_cups-- +//////// +//Kegs// +//////// /obj/structure/reagent_dispensers/beerkeg name = "beer keg" @@ -173,19 +208,44 @@ if(!QDELETED(src)) qdel(src) +/obj/structure/reagent_dispensers/keg + name = "keg" + desc = "A keg." + icon = 'modular_citadel/icons/obj/objects.dmi' + icon_state = "keg" + reagent_id = "water" -/obj/structure/reagent_dispensers/virusfood - name = "virus food dispenser" - desc = "A dispenser of low-potency virus mutagenic." - icon_state = "virus_food" - anchored = TRUE - density = FALSE - reagent_id = "virusfood" +/obj/structure/reagent_dispensers/keg/mead + name = "keg of mead" + desc = "A keg of mead." + icon_state = "orangekeg" + reagent_id = "mead" +/obj/structure/reagent_dispensers/keg/aphro + name = "keg of aphrodisiac" + desc = "A keg of aphrodisiac." + icon_state = "pinkkeg" + reagent_id = "aphro" -/obj/structure/reagent_dispensers/cooking_oil - name = "vat of cooking oil" - desc = "A huge metal vat with a tap on the front. Filled with cooking oil for use in frying food." - icon_state = "vat" - anchored = TRUE - reagent_id = "cooking_oil" +/obj/structure/reagent_dispensers/keg/aphro/strong + name = "keg of strong aphrodisiac" + desc = "A keg of strong and addictive aphrodisiac." + reagent_id = "aphro+" + +/obj/structure/reagent_dispensers/keg/milk + name = "keg of milk" + desc = "It's not quite what you were hoping for." + icon_state = "whitekeg" + reagent_id = "milk" + +/obj/structure/reagent_dispensers/keg/semen + name = "keg of semen" + desc = "Dear lord, where did this even come from?" + icon_state = "whitekeg" + reagent_id = "semen" + +/obj/structure/reagent_dispensers/keg/gargle + name = "keg of pan galactic gargleblaster" + desc = "A keg of... wow that's a long name." + icon_state = "bluekeg" + reagent_id = "gargleblaster" \ No newline at end of file diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index 082b1a7d11..5edddd64c2 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -111,14 +111,7 @@ stuff_mob_in(target, user) /obj/machinery/disposal/proc/stuff_mob_in(mob/living/target, mob/living/user) - if(!iscarbon(user) && !user.ventcrawler) //only carbon and ventcrawlers can climb into disposal by themselves. - return - if(!isturf(user.loc)) //No magically doing it from inside closets - return - if(target.buckled || target.has_buckled_mobs()) - return - if(target.mob_size > MOB_SIZE_HUMAN) - to_chat(user, "[target] doesn't fit inside [src]!") + if(!can_stuff_mob_in(target, user)) return add_fingerprint(user) if(user == target) @@ -137,6 +130,19 @@ target.LAssailant = user update_icon() +/obj/machinery/disposal/proc/can_stuff_mob_in(mob/living/target, mob/living/user, pushing = FALSE) + if(!pushing && !iscarbon(user) && !user.ventcrawler) //only carbon and ventcrawlers can climb into disposal by themselves. + return FALSE + if(!isturf(user.loc)) //No magically doing it from inside closets + return FALSE + if(target.buckled || target.has_buckled_mobs()) + return FALSE + if(target.mob_size > MOB_SIZE_HUMAN) + if(!pushing) + to_chat(user, "[target] doesn't fit inside [src]!") + return FALSE + return TRUE + /obj/machinery/disposal/relaymove(mob/user) attempt_escape(user) @@ -265,6 +271,7 @@ desc = "A pneumatic waste disposal unit." icon_state = "disposal" var/datum/oracle_ui/themed/nano/ui + obj_flags = CAN_BE_HIT | USES_TGUI | SHOVABLE_ONTO /obj/machinery/disposal/bin/Initialize(mapload, obj/structure/disposalconstruct/make_from) . = ..() @@ -276,7 +283,7 @@ /obj/machinery/disposal/bin/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/storage/bag/trash)) //Not doing component overrides because this is a specific type. var/obj/item/storage/bag/trash/T = I - GET_COMPONENT_FROM(STR, /datum/component/storage, T) + var/datum/component/storage/STR = T.GetComponent(/datum/component/storage) to_chat(user, "You empty the bag.") for(var/obj/item/O in T.contents) STR.remove_from_storage(O,src) @@ -305,7 +312,7 @@ if(Adjacent(user)) return TRUE return ..() - + /obj/machinery/disposal/bin/oui_data(mob/user) var/list/data = list() @@ -360,6 +367,17 @@ else return ..() +/obj/machinery/disposal/bin/shove_act(mob/living/target, mob/living/user) + if(!can_stuff_mob_in(target, user, TRUE)) + return FALSE + target.Knockdown(SHOVE_KNOCKDOWN_SOLID) + target.forceMove(src) + user.visible_message("[user.name] shoves [target.name] into \the [src]!", + "You shove [target.name] into \the [src]!", null, COMBAT_MESSAGE_RANGE) + log_combat(user, target, "shoved", "into [src] (disposal bin)") + return TRUE + + /obj/machinery/disposal/bin/flush() ..() full_pressure = FALSE diff --git a/code/modules/recycling/disposal/construction.dm b/code/modules/recycling/disposal/construction.dm index 624d5e0e05..348e687e03 100644 --- a/code/modules/recycling/disposal/construction.dm +++ b/code/modules/recycling/disposal/construction.dm @@ -29,7 +29,7 @@ pipename = initial(pipe_type.name) if(flip) - GET_COMPONENT(rotcomp,/datum/component/simple_rotation) + var/datum/component/simple_rotation/rotcomp = GetComponent(/datum/component/simple_rotation) rotcomp.BaseRot(null,ROTATION_FLIP) update_icon() diff --git a/code/modules/research/designs/electronics_designs.dm b/code/modules/research/designs/electronics_designs.dm index 552976824d..818e80beea 100644 --- a/code/modules/research/designs/electronics_designs.dm +++ b/code/modules/research/designs/electronics_designs.dm @@ -131,3 +131,30 @@ category = list("Misc") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE +/datum/design/xenobio_upgrade + name = "owo" + desc = "someone's bussin" + build_type = PROTOLATHE + materials = list(MAT_METAL = 300, MAT_GLASS = 100) + category = list("Electronics") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/xenobio_upgrade/xenobiomonkeys + name = "Xenobiology console monkey upgrade disk" + desc = "This disk will add the ability to remotely recycle monkeys via the Xenobiology console." + id = "xenobio_monkeys" + build_path = /obj/item/disk/xenobio_console_upgrade/monkey + +/datum/design/xenobio_upgrade/xenobioslimebasic + name = "Xenobiology console basic slime upgrade disk" + desc = "This disk will add the ability to remotely manipulate slimes via the Xenobiology console." + id = "xenobio_slimebasic" + build_path = /obj/item/disk/xenobio_console_upgrade/slimebasic + +/datum/design/xenobio_upgrade/xenobioslimeadv + name = "Xenobiology console advanced slime upgrade disk" + desc = "This disk will add the ability to remotely feed slimes potions via the Xenobiology console, and lift the restrictions on the number of slimes that can be stored inside the Xenobiology console. This includes the contents of the basic slime upgrade disk." + id = "xenobio_slimeadv" + build_path = /obj/item/disk/xenobio_console_upgrade/slimeadv + + diff --git a/code/modules/research/designs/machine_desings/machine_designs_all_misc.dm b/code/modules/research/designs/machine_desings/machine_designs_all_misc.dm index 31723cde07..b4d67315ba 100644 --- a/code/modules/research/designs/machine_desings/machine_designs_all_misc.dm +++ b/code/modules/research/designs/machine_desings/machine_designs_all_misc.dm @@ -98,3 +98,11 @@ build_path = /obj/item/circuitboard/machine/vr_sleeper departmental_flags = DEPARTMENTAL_FLAG_ALL category = list ("Medical Machinery") + +/datum/design/board/autoylathe + name = "Machine Design (Autoylathe)" + desc = "The circuit board for an autoylathe." + id = "autoylathe" + build_path = /obj/item/circuitboard/machine/autoylathe + departmental_flags = DEPARTMENTAL_FLAG_ALL + category = list("Misc. Machinery") diff --git a/code/modules/research/designs/machine_desings/machine_designs_medical.dm b/code/modules/research/designs/machine_desings/machine_designs_medical.dm index 65b3d74f71..2f95954e01 100644 --- a/code/modules/research/designs/machine_desings/machine_designs_medical.dm +++ b/code/modules/research/designs/machine_desings/machine_designs_medical.dm @@ -89,3 +89,11 @@ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_ENGINEERING build_path = /obj/item/circuitboard/machine/clonescanner category = list("Medical Machinery") + +/datum/design/board/bloodbankgen + name = "Machine Design (Blood Bank Generator Board)" + desc = "The circuit board for a blood bank generator." + id = "bloodbankgen" + build_path = /obj/item/circuitboard/machine/bloodbankgen + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + category = list ("Medical Machinery") diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index d3db4f75b3..e70362553c 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -192,6 +192,16 @@ category = list("Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL +/datum/design/bsblood_bag + name = "Blue Space Empty Blood Bag" + desc = "A large sterilized plastic bag for blood." + id = "bsblood_bag" + build_path = /obj/item/reagent_containers/blood/bluespace + build_type = PROTOLATHE + materials = list(MAT_GLASS = 2500, MAT_PLASTIC = 4500, MAT_BLUESPACE = 250) + category = list("Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + /datum/design/cloning_disk name = "Cloning Data Disk" desc = "Produce additional disks for storing genetic data." @@ -524,6 +534,17 @@ category = list("Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL +/datum/design/cybernetic_heart_u + name = "Upgraded Cybernetic Heart" + desc = "An upgraded cybernetic heart" + id = "cybernetic_heart_u" + build_type = PROTOLATHE | MECHFAB + construction_time = 50 + materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 500) + build_path = /obj/item/organ/heart/cybernetic/upgraded + category = list("Misc", "Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + /datum/design/cybernetic_liver_u name = "Upgraded Cybernetic Liver" desc = "An upgraded cybernetic liver" @@ -580,63 +601,34 @@ /datum/design/retractor_adv name = "Advanced Retractor" - desc = "A high-class, premium retractor, featuring precision crafted, silver-plated hook-ends and an electrum handle." + desc = "An almagation of rods and gears, able to function as both a surgical clamp and retractor. " id = "retractor_adv" build_type = PROTOLATHE materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 1500, MAT_GOLD = 1000) - build_path = /obj/item/retractor/adv - category = list("Medical Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE - -/datum/design/hemostat_adv - name = "Advanced Hemostat" - desc = "An exceptionally fine pair of arterial forceps. These appear to be plated in electrum and feel soft to the touch." - id = "hemostat_adv" - build_type = PROTOLATHE - materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 1000, MAT_GOLD = 1500) - build_path = /obj/item/hemostat/adv - category = list("Medical Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE - -/datum/design/cautery_adv - name = "Electrocautery" //This is based on real-life science. - desc = "A high-tech unipolar Electrocauter. This tiny device contains an extremely powerful microbattery that uses arcs of electricity to painlessly sear wounds shut. It seems to recharge with the user's body-heat. Wow!" - id = "cautery_adv" - build_type = PROTOLATHE - materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 1000, MAT_GOLD = 1500) - build_path = /obj/item/cautery/adv + build_path = /obj/item/retractor/advanced category = list("Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE /datum/design/surgicaldrill_adv - name = "Surgical Autodrill" - desc = "With a diamond tip and built-in depth and safety sensors, this drill alerts the user before overpenetrating a patient's skull or tooth. There also appears to be a disable switch." + name = "Surgical Laser Drill" + desc = "It projects a high power laser used for medical applications." id = "surgicaldrill_adv" build_type = PROTOLATHE materials = list(MAT_METAL = 2500, MAT_GLASS = 2500, MAT_SILVER = 6000, MAT_GOLD = 5500, MAT_DIAMOND = 3500) - build_path = /obj/item/surgicaldrill/adv + build_path = /obj/item/surgicaldrill/advanced category = list("Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE /datum/design/scalpel_adv - name = "Precision Scalpel" - desc = "A perfectly balanced electrum scalpel with a silicon-coated edge to eliminate wear and tear." + name = "Laser Scalpel" + desc = "An advanced scalpel which uses laser technology to cut." id = "scalpel_adv" build_type = PROTOLATHE materials = list(MAT_METAL = 1500, MAT_GLASS = 1500, MAT_SILVER = 4000, MAT_GOLD = 2500) - build_path = /obj/item/scalpel/adv + build_path = /obj/item/scalpel/advanced category = list("Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE -/datum/design/circular_saw_adv - name = "Diamond-Grit Circular Saw" - desc = "For those Assistants with REALLY thick skulls." - id = "circular_saw_adv" - build_type = PROTOLATHE - materials = list(MAT_METAL = 7500, MAT_GLASS = 6000, MAT_SILVER = 6500, MAT_GOLD = 7500, MAT_DIAMOND = 4500) - build_path = /obj/item/circular_saw/adv - category = list("Medical Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE ///////////////////////////////////////// //////////Alien Surgery Tools//////////// @@ -702,6 +694,28 @@ category = list("Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL +/datum/design/cybernetic_ears + name = "Cybernetic Ears" + desc = "A pair of cybernetic ears." + id = "cybernetic_ears" + build_type = PROTOLATHE | MECHFAB + construction_time = 30 + materials = list(MAT_METAL = 250, MAT_GLASS = 400) + build_path = /obj/item/organ/ears/cybernetic + category = list("Misc", "Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + +/datum/design/cybernetic_ears_u + name = "Upgraded Cybernetic Ears" + desc = "A pair of upgraded cybernetic ears." + id = "cybernetic_ears_u" + build_type = PROTOLATHE | MECHFAB + construction_time = 40 + materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 500) + build_path = /obj/item/organ/ears/cybernetic/upgraded + category = list("Misc", "Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + ///////////////////// ///Surgery Designs/// ///////////////////// @@ -714,6 +728,23 @@ research_icon_state = "surgery_any" var/surgery +/datum/design/surgery/experimental_dissection + name = "Advanced Dissection" + desc = "A surgical procedure which analyzes the biology of a corpse, and automatically adds new findings to the research database." + id = "surgery_adv_dissection" + surgery = /datum/surgery/advanced/experimental_dissection/adv + research_icon_state = "surgery_chest" + +/datum/design/surgery/experimental_dissection/exp + name = "Experimental Dissection" + id = "surgery_exp_dissection" + surgery = /datum/surgery/advanced/experimental_dissection/exp + +/datum/design/surgery/experimental_dissection/ext + name = "Extraterrestrial Dissection" + id = "surgery_ext_dissection" + surgery = /datum/surgery/advanced/experimental_dissection/alien + /datum/design/surgery/lobotomy name = "Lobotomy" desc = "An invasive surgical procedure which guarantees removal of almost all brain traumas, but might cause another permanent trauma in return." @@ -735,13 +766,49 @@ surgery = /datum/surgery/advanced/viral_bonding research_icon_state = "surgery_chest" -/datum/design/surgery/reconstruction - name = "Reconstruction" - desc = "A surgical procedure that gradually repairs damage done to a body without the assistance of chemicals. Unlike classic medicine, it is effective on corpses." - id = "surgery_reconstruction" - surgery = /datum/surgery/advanced/reconstruction +/datum/design/surgery/healing + name = "Tend Wounds" + desc = "An upgraded version of the original surgery." + id = "surgery_healing_base" //holder because travis cries otherwise. Not used in techweb unlocks. research_icon_state = "surgery_chest" +/datum/design/surgery/healing/brute_upgrade + name = "Tend Wounds (Brute) Upgrade" + surgery = /datum/surgery/healing/brute/upgraded + id = "surgery_heal_brute_upgrade" + +/datum/design/surgery/healing/brute_upgrade_2 + name = "Tend Wounds (Brute) Upgrade" + surgery = /datum/surgery/healing/brute/upgraded/femto + id = "surgery_heal_brute_upgrade_femto" + +/datum/design/surgery/healing/burn_upgrade + name = "Tend Wounds (Burn) Upgrade" + surgery = /datum/surgery/healing/burn/upgraded + id = "surgery_heal_burn_upgrade" + +/datum/design/surgery/healing/burn_upgrade_2 + name = "Tend Wounds (Burn) Upgrade" + surgery = /datum/surgery/healing/brute/upgraded/femto + id = "surgery_heal_burn_upgrade_femto" + +/datum/design/surgery/healing/combo + name = "Tend Wounds (Mixture)" + desc = "A surgical procedure that repairs both bruises and burns. Repair efficiency is not as high as the individual surgeries but it is faster." + surgery = /datum/surgery/healing/combo + id = "surgery_heal_combo" + +/datum/design/surgery/healing/combo_upgrade + name = "Tend Wounds (Mixture) Upgrade" + surgery = /datum/surgery/healing/combo/upgraded + id = "surgery_heal_combo_upgrade" + +/datum/design/surgery/healing/combo_upgrade_2 + name = "Tend Wounds (Mixture) Upgrade" + desc = "A surgical procedure that repairs both bruises and burns faster than their individual counterparts. It is more effective than both the individual surgeries." + surgery = /datum/surgery/healing/combo/upgraded/femto + id = "surgery_heal_combo_upgrade_femto" + /datum/design/surgery/surgery_toxinhealing name = "Body Rejuvenation" desc = "A surgical procedure that helps deal with oxygen deprecation, and treat toxic damaged. Works on corpses and alive alike without chemicals." @@ -784,6 +851,29 @@ surgery = /datum/surgery/advanced/bioware/vein_threading research_icon_state = "surgery_chest" +/datum/design/surgery/muscled_veins + name = "Vein Muscle Membrane" + desc = "A surgical procedure which adds a muscled membrane to blood vessels, allowing them to pump blood without a heart." + id = "surgery_muscled_veins" + surgery = /datum/surgery/advanced/bioware/muscled_veins + research_icon_state = "surgery_chest" + +/datum/design/surgery/ligament_hook + name = "Ligament Hook" + desc = "A surgical procedure which reshapes the connections between torso and limbs, making it so limbs can be attached manually if severed. \ + However this weakens the connection, making them easier to detach as well." + id = "surgery_ligament_hook" + surgery = /datum/surgery/advanced/bioware/ligament_hook + research_icon_state = "surgery_chest" + +/datum/design/surgery/ligament_reinforcement + name = "Ligament Reinforcement" + desc = "A surgical procedure which adds a protective tissue and bone cage around the connections between the torso and limbs, preventing dismemberment. \ + However, the nerve connections as a result are more easily interrupted, making it easier to disable limbs with damage." + id = "surgery_ligament_reinforcement" + surgery = /datum/surgery/advanced/bioware/ligament_reinforcement + research_icon_state = "surgery_chest" + /datum/design/surgery/necrotic_revival name = "Necrotic Revival" desc = "An experimental surgical procedure that stimulates the growth of a Romerol tumor inside the patient's brain. Requires zombie powder or rezadone." diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 214ef36afe..d69dda37ca 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -47,10 +47,32 @@ build_path = /obj/item/ammo_box/magazine/wt550m9/wtic departmental_flags = DEPARTMENTAL_FLAG_SECURITY +/datum/design/mag_oldsmg/tx_mag + name = "WT-550 Semi-Auto SMG Uranium Magazine (4.6x30mm TX)" + desc = "A 20 round uranium tipped magazine for the out of date security WT-550 Semi-Auto SMG." + id = "mag_oldsmg_tx" + materials = list(MAT_METAL = 6000, MAT_SILVER = 600, MAT_URANIUM = 2000) + build_path = /obj/item/ammo_box/magazine/wt550m9/wttx + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/mag_oldsmg/rubber_mag + name = "WT-550 Semi-Auto SMG rubberbullets Magazine (4.6x30mm rubber)" + desc = "A 20 round rubber shots magazine for the out of date security WT-550 Semi-Auto SMG" + id = "mag_oldsmg_rubber" + materials = list(MAT_METAL = 6000) + build_path = /obj/item/ammo_box/magazine/wt550m9/wtrubber + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + ////////////// //Ammo Shells/ ////////////// +/datum/design/beanbag_slug/sec + id = "sec_beanbag" + build_type = PROTOLATHE + category = list("Ammo") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + /datum/design/rubbershot/sec id = "sec_rshot" build_type = PROTOLATHE @@ -89,7 +111,7 @@ materials = list(MAT_METAL = 200) build_path = /obj/item/ammo_casing/shotgun/stunslug category = list("Ammo") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY + departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_SCIENCE /datum/design/techshell name = "Unloaded Technological Shotshell" @@ -123,7 +145,7 @@ materials = list(MAT_METAL = 500, MAT_GLASS = 300) build_path = /obj/item/firing_pin/test_range category = list("Firing Pins") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY + departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_SCIENCE /datum/design/pin_mindshield name = "Mindshield Firing Pin" @@ -219,7 +241,7 @@ reagents_list = list("radium" = 20) build_path = /obj/item/gun/energy/floragun category = list("Weapons") - departmental_flags = DEPARTMENTAL_FLAG_SERVICE + departmental_flags = DEPARTMENTAL_FLAG_SERVICE | DEPARTMENTAL_FLAG_SCIENCE /datum/design/xray name = "X-ray Laser Gun" @@ -293,7 +315,7 @@ materials = list(MAT_METAL = 2000, MAT_PLASMA = 500) build_path = /obj/item/grenade/chem_grenade/pyro category = list("Weapons") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL + departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE /datum/design/cryo_grenade name = "Cryo Grenade" @@ -303,7 +325,7 @@ materials = list(MAT_METAL = 2000, MAT_SILVER = 500) build_path = /obj/item/grenade/chem_grenade/cryo category = list("Weapons") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL + departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE /datum/design/adv_grenade name = "Advanced Release Grenade" @@ -313,7 +335,7 @@ materials = list(MAT_METAL = 3000, MAT_GLASS = 500) build_path = /obj/item/grenade/chem_grenade/adv_release category = list("Weapons") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL + departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE ////////// //MISC//// diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index e56350a280..0bcd0c5984 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -422,7 +422,7 @@ if(exp == SCANTYPE_OBLITERATE) visible_message("[exp_on] activates the crushing mechanism, [exp_on] is destroyed!") if(linked_console.linked_lathe) - GET_COMPONENT_FROM(linked_materials, /datum/component/material_container, linked_console.linked_lathe) + var/datum/component/material_container/linked_materials = linked_console.linked_lathe.GetComponent(/datum/component/material_container) for(var/material in exp_on.materials) linked_materials.insert_amount( min((linked_materials.max_amount - linked_materials.total_amount), (exp_on.materials[material])), material) if(prob(EFFECT_PROB_LOW) && criticalReaction) diff --git a/code/modules/research/nanites/nanite_programs/healing.dm b/code/modules/research/nanites/nanite_programs/healing.dm index 8aab7f1e2b..1113f11e87 100644 --- a/code/modules/research/nanites/nanite_programs/healing.dm +++ b/code/modules/research/nanites/nanite_programs/healing.dm @@ -72,14 +72,16 @@ /datum/nanite_program/brain_heal/check_conditions() if(iscarbon(host_mob)) var/mob/living/carbon/C = host_mob - if(length(C.get_traumas())) - return ..() - if(host_mob.getBrainLoss()) + for(var/X in C.get_traumas()) + var/datum/brain_trauma/BT = X + if(BT.resilience <= TRAUMA_RESILIENCE_BASIC) + return ..() + if(host_mob.getOrganLoss(ORGAN_SLOT_BRAIN)) return ..() return FALSE /datum/nanite_program/brain_heal/active_effect() - host_mob.adjustBrainLoss(-1, TRUE) + host_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1, TRUE) if(iscarbon(host_mob) && prob(10)) var/mob/living/carbon/C = host_mob C.cure_trauma_type(resilience = TRAUMA_RESILIENCE_BASIC) @@ -193,14 +195,16 @@ /datum/nanite_program/brain_heal_advanced/check_conditions() if(iscarbon(host_mob)) var/mob/living/carbon/C = host_mob - if(length(C.get_traumas())) - return ..() - if(host_mob.getBrainLoss()) + for(var/X in C.get_traumas()) + var/datum/brain_trauma/BT = X + if(BT.resilience <= TRAUMA_RESILIENCE_LOBOTOMY) + return ..() + if(host_mob.getOrganLoss(ORGAN_SLOT_BRAIN)) return ..() return FALSE - + /datum/nanite_program/brain_heal_advanced/active_effect() - host_mob.adjustBrainLoss(-2, TRUE) + host_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -2, TRUE) if(iscarbon(host_mob) && prob(10)) var/mob/living/carbon/C = host_mob C.cure_trauma_type(resilience = TRAUMA_RESILIENCE_LOBOTOMY) @@ -232,7 +236,7 @@ if(!C.getorgan(/obj/item/organ/heart)) //what are we even shocking return FALSE var/obj/item/organ/brain/BR = C.getorgan(/obj/item/organ/brain) - if(QDELETED(BR) || BR.damaged_brain) + if(QDELETED(BR) || BR.brain_death || (BR.organ_flags & ORGAN_FAILING) || C.suiciding) return FALSE if(C.get_ghost()) return FALSE @@ -252,7 +256,7 @@ SEND_SIGNAL(C, COMSIG_LIVING_MINOR_SHOCK) var/tplus = world.time - C.timeofdeath if(tplus > 600) - C.adjustBrainLoss( max(0, ((1800 - tplus) / 1800 * 150)), 150) + C.adjustOrganLoss(ORGAN_SLOT_BRAIN, max(0, ((1800 - tplus) / 1800 * 150)), 150) log_game("[C] has been successfully defibrillated by nanites.") else playsound(C, 'sound/machines/defib_failed.ogg', 50, 0) diff --git a/code/modules/research/nanites/nanite_programs/rogue.dm b/code/modules/research/nanites/nanite_programs/rogue.dm index f64c7e8781..287aed36fe 100644 --- a/code/modules/research/nanites/nanite_programs/rogue.dm +++ b/code/modules/research/nanites/nanite_programs/rogue.dm @@ -59,7 +59,7 @@ /datum/nanite_program/brain_decay/active_effect() if(prob(4)) host_mob.hallucination = min(15, host_mob.hallucination) - host_mob.adjustBrainLoss(1) + host_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1) //Generic brain-affecting programs can also decay into this /datum/nanite_program/brain_misfire diff --git a/code/modules/research/research_disk.dm b/code/modules/research/research_disk.dm index 2ec2398d88..02865dc5bb 100644 --- a/code/modules/research/research_disk.dm +++ b/code/modules/research/research_disk.dm @@ -29,3 +29,12 @@ /obj/item/disk/tech_disk/illegal/Initialize() . = ..() stored_research = new /datum/techweb/syndicate + +/obj/item/disk/tech_disk/abductor + name = "Gray technology disk" + desc = "You feel like it's not Gray because of its color." + materials = list() + +/obj/item/disk/tech_disk/abductor/Initialize() + . = ..() + stored_research = new /datum/techweb/abductor diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm index af004c4701..12fe64463d 100644 --- a/code/modules/research/stock_parts.dm +++ b/code/modules/research/stock_parts.dm @@ -13,6 +13,7 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi var/works_from_distance = FALSE var/pshoom_or_beepboopblorpzingshadashwoosh = 'sound/items/rped.ogg' var/alt_sound = null + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE //cutting down on exploits /obj/item/storage/part_replacer/pre_attack(obj/machinery/T, mob/living/user, params) if(!istype(T) || !T.component_parts) @@ -42,7 +43,7 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi /obj/item/storage/part_replacer/bluespace name = "bluespace rapid part exchange device" - desc = "A version of the RPED that allows for replacement of parts and scanning from a distance, along with higher capacity for parts." + desc = "A version of the RPED that allows for replacement of parts and scanning from a distance, along with higher capacity for parts. Definitely not just a BSRPED painted orange." icon_state = "BS_RPED" w_class = WEIGHT_CLASS_NORMAL works_from_distance = TRUE @@ -51,12 +52,10 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi component_type = /datum/component/storage/concrete/bluespace/rped /obj/item/storage/part_replacer/cyborg - name = "rapid part exchange device" - desc = "Special mechanical module made to store, sort, and apply standard machine parts." icon_state = "borgrped" - item_state = "RPED" - lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' - righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' + +/obj/item/storage/part_replacer/bluespace/cyborg + icon_state = "borg_BS_RPED" /proc/cmp_rped_sort(obj/item/A, obj/item/B) return B.get_part_rating() - A.get_part_rating() @@ -67,6 +66,7 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi icon = 'icons/obj/stock_parts.dmi' w_class = WEIGHT_CLASS_SMALL var/rating = 1 + rad_flags = RAD_NO_CONTAMINATE /obj/item/stock_parts/Initialize() . = ..() diff --git a/code/modules/research/techweb/_techweb.dm b/code/modules/research/techweb/_techweb.dm index cd5a190fd6..1e554f112f 100644 --- a/code/modules/research/techweb/_techweb.dm +++ b/code/modules/research/techweb/_techweb.dm @@ -49,6 +49,14 @@ var/datum/techweb_node/syndicate_basic/Node = new() research_node(Node, TRUE) +/datum/techweb/abductor + id = "ABDUCTOR" + organization = "Aliens" + +/datum/techweb/abductor/New() + var/datum/techweb_node/alientech/Node = new() + research_node(Node, TRUE) + /datum/techweb/science //Global science techweb for RND consoles. id = "SCIENCE" organization = "Nanotrasen" @@ -364,3 +372,7 @@ /datum/techweb/specialized/autounlocking/exofab allowed_buildtypes = MECHFAB + +/datum/techweb/specialized/autounlocking/autoylathe + design_autounlock_buildtypes = AUTOYLATHE + allowed_buildtypes = AUTOYLATHE diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 3721e7943e..fdf887d259 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -10,7 +10,7 @@ // Default research tech, prevents bricking design_ids = list("basic_matter_bin", "basic_cell", "basic_scanning", "basic_capacitor", "basic_micro_laser", "micro_mani", "destructive_analyzer", "circuit_imprinter", "experimentor", "rdconsole", "design_disk", "tech_disk", "rdserver", "rdservercontrol", "mechfab", - "space_heater", "xlarge_beaker", "sec_rshot", "sec_bshot", "sec_slug", "sec_Islug", "sec_dart", "sec_38", "sec_38lethal", + "space_heater", "xlarge_beaker", "sec_beanbag", "sec_rshot", "sec_bshot", "sec_slug", "sec_Islug", "sec_dart", "sec_38", "sec_38lethal", "rglass","plasteel","plastitanium","plasmaglass","plasmareinforcedglass","titaniumglass","plastitaniumglass") /datum/techweb_node/mmi @@ -60,7 +60,7 @@ display_name = "Biological Technology" description = "What makes us tick." //the MC, silly! prereq_ids = list("base") - design_ids = list("medicalkit", "chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "blood_bag") + design_ids = list("medicalkit", "chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "blood_bag", "bloodbankgen") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 @@ -96,7 +96,7 @@ display_name = "Advanced Surgery Tools" description = "Refined and improved redesigns for the run-of-the-mill medical utensils." prereq_ids = list("adv_biotech", "adv_surgery") - design_ids = list("drapes", "retractor_adv", "hemostat_adv", "cautery_adv", "surgicaldrill_adv", "scalpel_adv", "circular_saw_adv") + design_ids = list("drapes", "retractor_adv", "surgicaldrill_adv", "scalpel_adv") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 @@ -110,12 +110,21 @@ export_price = 5000 /////////////////////////Advanced Surgery///////////////////////// +/datum/techweb_node/imp_wt_surgery + id = "imp_wt_surgery" + display_name = "Improved Wound-Tending Surgery" + description = "Who would have known being more gentle with a hemostat decreases patient pain?" + prereq_ids = list("biotech") + design_ids = list("surgery_heal_brute_upgrade","surgery_heal_burn_upgrade") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) + export_price = 1000 + /datum/techweb_node/adv_surgery id = "adv_surgery" display_name = "Advanced Surgery" description = "When simple medicine doesn't cut it." - prereq_ids = list("adv_biotech") - design_ids = list("surgery_lobotomy", "surgery_reconstruction", "surgery_toxinhealing", "organbox") + prereq_ids = list("imp_wt_surgery") + design_ids = list("surgery_revival", "surgery_lobotomy", "surgery_heal_brute_upgrade_femto","surgery_heal_burn_upgrade_femto", "surgery_heal_combo", "surgery_toxinhealing", "organbox", "surgery_adv_dissection") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 @@ -124,7 +133,7 @@ display_name = "Experimental Surgery" description = "When evolution isn't fast enough." prereq_ids = list("adv_surgery") - design_ids = list("surgery_revival","surgery_pacify","surgery_vein_thread","surgery_nerve_splice","surgery_nerve_ground","surgery_viral_bond") + design_ids = list("surgery_pacify","surgery_vein_thread","surgery_muscled_veins","surgery_nerve_splice","surgery_nerve_ground","surgery_ligament_hook","surgery_ligament_reinforcement","surgery_viral_bond", "surgery_exp_dissection", "surgery_heal_combo_upgrade") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) export_price = 5000 @@ -133,7 +142,7 @@ display_name = "Alien Surgery" description = "Abductors did nothing wrong." prereq_ids = list("exp_surgery", "alientech") - design_ids = list("surgery_brainwashing","surgery_zombie") + design_ids = list("surgery_brainwashing","surgery_zombie", "surgery_ext_dissection", "surgery_heal_combo_upgrade_femto") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000) export_price = 5000 @@ -272,7 +281,7 @@ display_name = "Bluespace Pockets" description = "Studies into the mysterious alternate dimension known as bluespace and how to place items in the threads of reality." prereq_ids = list("adv_power", "adv_bluespace", "adv_biotech", "adv_plasma") - design_ids = list( "bluespacebodybag","bag_holding", "bluespace_pod", "borg_upgrade_trashofholding", "blutrash", "satchel_holding") + design_ids = list( "bluespacebodybag","bag_holding", "bluespace_pod", "borg_upgrade_trashofholding", "blutrash", "satchel_holding", "bsblood_bag") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5500) export_price = 5000 @@ -517,8 +526,17 @@ display_name = "Cybernetic Organs" description = "We have the technology to rebuild him." prereq_ids = list("adv_biotech") - design_ids = list("cybernetic_heart", "cybernetic_liver", "cybernetic_liver_u", "cybernetic_lungs", "cybernetic_lungs_u", "cybernetic_tongue") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + design_ids = list("cybernetic_ears", "cybernetic_heart", "cybernetic_liver", "cybernetic_lungs", "cybernetic_tongue") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) + export_price = 5000 + +/datum/techweb_node/cyber_organs_upgraded + id = "cyber_organs_upgraded" + display_name = "Upgraded Cybernetic Organs" + description = "We have the technology to upgrade him." + prereq_ids = list("cyber_organs") + design_ids = list("cybernetic_ears_u", "cybernetic_heart_u", "cybernetic_liver_u", "cybernetic_lungs_u") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500) export_price = 5000 /datum/techweb_node/cyber_implants @@ -998,7 +1016,7 @@ description = "Things used by the greys." prereq_ids = list("biotech","engineering") boost_item_paths = list(/obj/item/gun/energy/alien, /obj/item/scalpel/alien, /obj/item/hemostat/alien, /obj/item/retractor/alien, /obj/item/circular_saw/alien, - /obj/item/cautery/alien, /obj/item/surgicaldrill/alien, /obj/item/screwdriver/abductor, /obj/item/wrench/abductor, /obj/item/crowbar/abductor, /obj/item/multitool/abductor, + /obj/item/cautery/alien, /obj/item/surgicaldrill/alien, /obj/item/screwdriver/abductor, /obj/item/wrench/abductor, /obj/item/crowbar/abductor, /obj/item/multitool/abductor, /obj/item/stock_parts/cell/infinite/abductor, /obj/item/weldingtool/abductor, /obj/item/wirecutters/abductor, /obj/item/circuitboard/machine/abductor, /obj/item/abductor_baton, /obj/item/abductor, /obj/item/stack/sheet/mineral/abductor) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) export_price = 20000 @@ -1009,26 +1027,19 @@ id = "alien_bio" display_name = "Alien Biological Tools" description = "Advanced biological tools." - prereq_ids = list("alientech", "adv_biotech") + prereq_ids = list("alientech", "advance_surgerytools") design_ids = list("alien_scalpel", "alien_hemostat", "alien_retractor", "alien_saw", "alien_drill", "alien_cautery") - boost_item_paths = list(/obj/item/gun/energy/alien, /obj/item/scalpel/alien, /obj/item/hemostat/alien, /obj/item/retractor/alien, /obj/item/circular_saw/alien, - /obj/item/cautery/alien, /obj/item/surgicaldrill/alien, /obj/item/screwdriver/abductor, /obj/item/wrench/abductor, /obj/item/crowbar/abductor, /obj/item/multitool/abductor, - /obj/item/weldingtool/abductor, /obj/item/wirecutters/abductor, /obj/item/circuitboard/machine/abductor, /obj/item/abductor_baton, /obj/item/abductor) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - export_price = 20000 - hidden = TRUE + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) + export_price = 10000 /datum/techweb_node/alien_engi id = "alien_engi" display_name = "Alien Engineering" description = "Alien engineering tools" - prereq_ids = list("alientech", "adv_engi") + prereq_ids = list("alientech", "exp_tools") design_ids = list("alien_wrench", "alien_wirecutters", "alien_screwdriver", "alien_crowbar", "alien_welder", "alien_multitool") - boost_item_paths = list(/obj/item/screwdriver/abductor, /obj/item/wrench/abductor, /obj/item/crowbar/abductor, /obj/item/multitool/abductor, - /obj/item/weldingtool/abductor, /obj/item/wirecutters/abductor, /obj/item/circuitboard/machine/abductor, /obj/item/abductor_baton, /obj/item/abductor) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - export_price = 20000 - hidden = TRUE + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) + export_price = 10000 /datum/techweb_node/syndicate_basic id = "syndicate_basic" @@ -1045,7 +1056,7 @@ boost_item_paths = list() for(var/path in GLOB.uplink_items) var/datum/uplink_item/UI = new path - if(!UI.item) + if(!UI.item || !UI.illegal_tech) continue boost_item_paths |= UI.item //allows deconning to unlock. diff --git a/code/modules/research/xenobiology/crossbreeding/_misc.dm b/code/modules/research/xenobiology/crossbreeding/_misc.dm index b28f1676a1..0099fe143d 100644 --- a/code/modules/research/xenobiology/crossbreeding/_misc.dm +++ b/code/modules/research/xenobiology/crossbreeding/_misc.dm @@ -58,9 +58,7 @@ var/mob/living/carbon/human/H = M if(H.mind && !HAS_TRAIT(H, TRAIT_AGEUSIA)) to_chat(H,"That didn't taste very good...") //No disgust, though. It's just not good tasting. - GET_COMPONENT_FROM(mood, /datum/component/mood, H) - if(mood) - mood.add_event(null,"gross_food", /datum/mood_event/gross_food) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "gross_food", /datum/mood_event/gross_food) last_check_time = world.time return ..() diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index b9e7122d07..6ad4ec34f8 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -64,10 +64,9 @@ var/interrupted = FALSE var/mob/target var/icon/bluespace - var/datum/weakref/redirect_component /datum/status_effect/slimerecall/on_apply() - redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/resistField)))) + RegisterSignal(owner, COMSIG_LIVING_RESIST, .proc/resistField) to_chat(owner, "You feel a sudden tug from an unknown force, and feel a pull to bluespace!") to_chat(owner, "Resist if you wish avoid the force!") bluespace = icon('icons/effects/effects.dmi',"chronofield") @@ -77,9 +76,9 @@ /datum/status_effect/slimerecall/proc/resistField() interrupted = TRUE owner.remove_status_effect(src) + /datum/status_effect/slimerecall/on_remove() - qdel(redirect_component.resolve()) - redirect_component = null + UnregisterSignal(owner, COMSIG_LIVING_RESIST) owner.cut_overlay(bluespace) if(interrupted || !ismob(target)) to_chat(owner, "The bluespace tug fades away, and you feel that the force has passed you by.") @@ -98,10 +97,9 @@ duration = -1 //Will remove self when block breaks. alert_type = /obj/screen/alert/status_effect/freon/stasis var/obj/structure/ice_stasis/cube - var/datum/weakref/redirect_component /datum/status_effect/frozenstasis/on_apply() - redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/breakCube)))) + RegisterSignal(owner, COMSIG_LIVING_RESIST, .proc/breakCube) cube = new /obj/structure/ice_stasis(get_turf(owner)) owner.forceMove(cube) owner.status_flags |= GODMODE @@ -118,8 +116,7 @@ if(cube) qdel(cube) owner.status_flags &= ~GODMODE - qdel(redirect_component.resolve()) - redirect_component = null + UnregisterSignal(owner, COMSIG_LIVING_RESIST) /datum/status_effect/slime_clone id = "slime_cloned" diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm index 4753abff97..1b2f43c518 100644 --- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm +++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm @@ -27,9 +27,9 @@ return 0 charge_tick = 0 var/mob/living/M = loc - if(istype(M) && M.blood_volume >= 20) + if(istype(M) && M.blood_volume >= 5) charges++ - M.blood_volume -= 20 + M.blood_volume -= 5 if(charges == 1) recharge_newshot() return 1 diff --git a/code/modules/research/xenobiology/crossbreeding/consuming.dm b/code/modules/research/xenobiology/crossbreeding/consuming.dm index 0b2d60da8c..d6536f4fdd 100644 --- a/code/modules/research/xenobiology/crossbreeding/consuming.dm +++ b/code/modules/research/xenobiology/crossbreeding/consuming.dm @@ -119,7 +119,7 @@ Consuming extracts: M.adjustToxLoss(-5, forced=1) //To heal slimepeople. M.adjustOxyLoss(-5) M.adjustCloneLoss(-5) - M.adjustBrainLoss(-5) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -5) /obj/item/slimecross/consuming/blue colour = "blue" diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index 5aebd1bafa..641b7e7dcb 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -29,12 +29,11 @@ var/datum/action/innate/slime_scan/scan_action var/datum/action/innate/feed_potion/potion_action - var/datum/component/redirect/listener - var/list/stored_slimes var/obj/item/slimepotion/slime/current_potion - var/max_slimes = 5 + var/max_slimes = 1 var/monkeys = 0 + var/upgradetier = 0 icon_screen = "slime_comp" icon_keyboard = "rd_key" @@ -50,7 +49,7 @@ scan_action = new potion_action = new stored_slimes = list() - listener = AddComponent(/datum/component/redirect, list(COMSIG_ATOM_CONTENTS_DEL = CALLBACK(src, .proc/on_contents_del))) + RegisterSignal(src, COMSIG_ATOM_CONTENTS_DEL, .proc/on_contents_del) /obj/machinery/computer/camera_advanced/xenobio/Destroy() stored_slimes = null @@ -108,6 +107,22 @@ stored_slimes -= deleted /obj/machinery/computer/camera_advanced/xenobio/attackby(obj/item/O, mob/user, params) + if(istype(O, /obj/item/disk/xenobio_console_upgrade)) + var/obj/item/disk/xenobio_console_upgrade/diskthing = O + var/successfulupgrade = FALSE + for(var/I in diskthing.upgradetypes) + if(upgradetier & I) + continue + else + upgradetier |= I + successfulupgrade = TRUE + if(I == XENOBIO_UPGRADE_SLIMEADV) + max_slimes = 10 + if(successfulupgrade) + to_chat(user, "You have successfully upgraded [src] with [O].") + else + to_chat(user, "[src] already has the contents of [O] installed!") + return if(istype(O, /obj/item/reagent_containers/food/snacks/monkeycube) && (upgradetier & XENOBIO_UPGRADE_MONKEYS)) //CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS monkeys++ to_chat(user, "You feed [O] to [src]. It now has [monkeys] monkey cubes stored.") @@ -266,3 +281,29 @@ break else to_chat(owner, "Target is not near a camera. Cannot proceed.") + +/obj/item/disk/xenobio_console_upgrade + name = "Xenobiology console upgrade disk" + desc = "Allan please add detail." + icon_state = "datadisk5" + var/list/upgradetypes = list() + +/obj/item/disk/xenobio_console_upgrade/admin + name = "Xenobio all access thing" + desc = "'the consoles are literally useless!!!!!!!!!!!!!!!'" + upgradetypes = list(XENOBIO_UPGRADE_SLIMEBASIC, XENOBIO_UPGRADE_SLIMEADV, XENOBIO_UPGRADE_MONKEYS) + +/obj/item/disk/xenobio_console_upgrade/monkey + name = "Xenobiology console monkey upgrade disk" + desc = "This disk will add the ability to remotely recycle monkeys via the Xenobiology console." + upgradetypes = list(XENOBIO_UPGRADE_MONKEYS) + +/obj/item/disk/xenobio_console_upgrade/slimebasic + name = "Xenobiology console basic slime upgrade disk" + desc = "This disk will add the ability to remotely manipulate slimes via the Xenobiology console." + upgradetypes = list(XENOBIO_UPGRADE_SLIMEBASIC) + +/obj/item/disk/xenobio_console_upgrade/slimeadv + name = "Xenobiology console advanced slime upgrade disk" + desc = "This disk will add the ability to remotely feed slimes potions via the Xenobiology console, and lift the restrictions on the number of slimes that can be stored inside the Xenobiology console. This includes the contents of the basic slime upgrade disk." + upgradetypes = list(XENOBIO_UPGRADE_SLIMEBASIC, XENOBIO_UPGRADE_SLIMEADV) diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 7acbaaac1c..2894ce2108 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -325,7 +325,7 @@ if(SLIME_ACTIVATE_MAJOR) var/turf/open/T = get_turf(user) if(istype(T)) - T.atmos_spawn_air("nitrogen=40;TEMP=2.7") + T.atmos_spawn_air("n2=40;TEMP=2.7") to_chat(user, "You activate [src], and icy air bursts out of your skin!") return 900 @@ -523,7 +523,8 @@ /obj/item/slime_extract/pyrite/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) if(SLIME_ACTIVATE_MINOR) - var/chosen = pick(difflist(subtypesof(/obj/item/toy/crayon),typesof(/obj/item/toy/crayon/spraycan))) + var/blacklisted_cans = list(/obj/item/toy/crayon/spraycan/borg, /obj/item/toy/crayon/spraycan/infinite) + var/chosen = pick(subtypesof(/obj/item/toy/crayon/spraycan) - blacklisted_cans) var/obj/item/O = new chosen(null) if(!user.put_in_active_hand(O)) O.forceMove(user.drop_location()) @@ -680,7 +681,7 @@ var/list/candidates = pollCandidatesForMob("Do you want to play as [SM.name]?", ROLE_SENTIENCE, null, ROLE_SENTIENCE, 50, SM, POLL_IGNORE_SENTIENCE_POTION) // see poll_ignore.dm if(LAZYLEN(candidates)) var/mob/dead/observer/C = pick(candidates) - SM.key = C.key + C.transfer_ckey(SM, FALSE) SM.mind.enslave_mind_to_creator(user) SM.sentience_act() to_chat(SM, "All at once it makes sense: you know what you are and who you are! Self awareness is yours!") @@ -704,7 +705,7 @@ desc = "A miraculous chemical mix that grants human like intelligence to living beings. It has been modified with Syndicate technology to also grant an internal radio implant to the target and authenticate with identification systems." /obj/item/slimepotion/slime/sentience/nuclear/after_success(mob/living/user, mob/living/simple_animal/SM) - var/obj/item/implant/radio/syndicate/imp = new(src) + var/obj/item/implant/radio/syndicate/imp = new imp.implant(SM, user) SM.access_card = new /obj/item/card/id/syndicate(SM) @@ -968,7 +969,7 @@ to_chat(user, "You feed the potion to [M].") to_chat(M, "Your mind tingles as you are fed the potion. You can hear radio waves now!") - var/obj/item/implant/radio/slime/imp = new(src) + var/obj/item/implant/radio/slime/imp = new imp.implant(M, user) qdel(src) diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm new file mode 100644 index 0000000000..0d4d2b6ad6 --- /dev/null +++ b/code/modules/ruins/spaceruin_code/hilbertshotel.dm @@ -0,0 +1,529 @@ +GLOBAL_VAR_INIT(hhStorageTurf, null) +GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337) + +/obj/item/hilbertshotel + name = "Hilbert's Hotel" + desc = "A sphere of what appears to be an intricate network of bluespace. Observing it in detail seems to give you a headache as you try to comprehend the infinite amount of infinitesimally distinct points on its surface." + icon_state = "hilbertshotel" + w_class = WEIGHT_CLASS_SMALL + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + var/datum/map_template/hilbertshotel/hotelRoomTemp + var/datum/map_template/hilbertshotel/empty/hotelRoomTempEmpty + var/datum/map_template/hilbertshotel/lore/hotelRoomTempLore + var/list/activeRooms = list() + var/list/storedRooms = list() + var/storageTurf + //Lore Stuff + var/ruinSpawned = FALSE + var/mysteryRoom + +/obj/item/hilbertshotel/Initialize() + . = ..() + //Load templates + hotelRoomTemp = new() + hotelRoomTempEmpty = new() + hotelRoomTempLore = new() + var/area/currentArea = get_area(src) + if(currentArea.type == /area/ruin/space/has_grav/hilbertresearchfacility) + ruinSpawned = TRUE + +/obj/item/hilbertshotel/Destroy() + ejectRooms() + return ..() + +/obj/item/hilbertshotel/attack(mob/living/M, mob/living/user) + if(M.mind) + to_chat(user, "You invite [M] to the hotel.") + promptAndCheckIn(M) + else + to_chat(user, "[M] is not intelligent enough to understand how to use this device!") + +/obj/item/hilbertshotel/attack_self(mob/user) + . = ..() + promptAndCheckIn(user) + +/obj/item/hilbertshotel/proc/promptAndCheckIn(mob/user) + var/chosenRoomNumber = input(user, "What number room will you be checking into?", "Room Number") as null|num + if(!chosenRoomNumber) + return + if(chosenRoomNumber > SHORT_REAL_LIMIT) + to_chat(user, "You have to check out the first [SHORT_REAL_LIMIT] rooms before you can go to a higher numbered one!") + return + if((chosenRoomNumber < 1) || (chosenRoomNumber != round(chosenRoomNumber))) + to_chat(user, "That is not a valid room number!") + return + if(ismob(loc)) + if(user == loc) //Not always the same as user + forceMove(get_turf(user)) + if(!storageTurf) //Blame subsystems for not allowing this to be in Initialize + if(!GLOB.hhStorageTurf) + var/datum/map_template/hilbertshotelstorage/storageTemp = new() + var/datum/turf_reservation/storageReservation = SSmapping.RequestBlockReservation(3, 3) + storageTemp.load(locate(storageReservation.bottom_left_coords[1], storageReservation.bottom_left_coords[2], storageReservation.bottom_left_coords[3])) + GLOB.hhStorageTurf = locate(storageReservation.bottom_left_coords[1]+1, storageReservation.bottom_left_coords[2]+1, storageReservation.bottom_left_coords[3]) + else + storageTurf = GLOB.hhStorageTurf + if(tryActiveRoom(chosenRoomNumber, user)) + return + if(tryStoredRoom(chosenRoomNumber, user)) + return + sendToNewRoom(chosenRoomNumber, user) + + +/obj/item/hilbertshotel/proc/tryActiveRoom(var/roomNumber, var/mob/user) + if(activeRooms["[roomNumber]"]) + var/datum/turf_reservation/roomReservation = activeRooms["[roomNumber]"] + do_sparks(3, FALSE, get_turf(user)) + user.forceMove(locate(roomReservation.bottom_left_coords[1] + hotelRoomTemp.landingZoneRelativeX, roomReservation.bottom_left_coords[2] + hotelRoomTemp.landingZoneRelativeY, roomReservation.bottom_left_coords[3])) + return TRUE + else + return FALSE + +/obj/item/hilbertshotel/proc/tryStoredRoom(var/roomNumber, var/mob/user) + if(storedRooms["[roomNumber]"]) + var/datum/turf_reservation/roomReservation = SSmapping.RequestBlockReservation(hotelRoomTemp.width, hotelRoomTemp.height) + hotelRoomTempEmpty.load(locate(roomReservation.bottom_left_coords[1], roomReservation.bottom_left_coords[2], roomReservation.bottom_left_coords[3])) + var/turfNumber = 1 + for(var/i=0, iAs the sphere breaks apart, you're suddenly ejected into the depths of space!") + var/max = world.maxx-TRANSITIONEDGE + var/min = 1+TRANSITIONEDGE + var/list/possible_transtitons = list() + for(var/AZ in SSmapping.z_list) + var/datum/space_level/D = AZ + if (D.linkage == CROSSLINKED) + possible_transtitons += D.z_value + var/_z = pick(possible_transtitons) + var/_x = rand(min,max) + var/_y = rand(min,max) + var/turf/T = locate(_x, _y, _z) + A.forceMove(T) + qdel(room) + + if(storedRooms.len) + for(var/x in storedRooms) + var/list/atomList = storedRooms[x] + for(var/atom/movable/A in atomList) + var/max = world.maxx-TRANSITIONEDGE + var/min = 1+TRANSITIONEDGE + var/list/possible_transtitons = list() + for(var/AZ in SSmapping.z_list) + var/datum/space_level/D = AZ + if (D.linkage == CROSSLINKED) + possible_transtitons += D.z_value + var/_z = pick(possible_transtitons) + var/_x = rand(min,max) + var/_y = rand(min,max) + var/turf/T = locate(_x, _y, _z) + A.forceMove(T) + +//Template Stuff +/datum/map_template/hilbertshotel + name = "Hilbert's Hotel Room" + mappath = '_maps/templates/hilbertshotel.dmm' + var/landingZoneRelativeX = 2 + var/landingZoneRelativeY = 8 + +/datum/map_template/hilbertshotel/empty + name = "Empty Hilbert's Hotel Room" + mappath = '_maps/templates/hilbertshotelempty.dmm' + +/datum/map_template/hilbertshotel/lore + name = "Doctor Hilbert's Deathbed" + mappath = '_maps/templates/hilbertshotellore.dmm' + +/datum/map_template/hilbertshotelstorage + name = "Hilbert's Hotel Storage" + mappath = '_maps/templates/hilbertshotelstorage.dmm' + + +//Turfs and Areas +/turf/closed/indestructible/hotelwall + name = "hotel wall" + desc = "A wall designed to protect the security of the hotel's guests." + icon_state = "hotelwall" + canSmoothWith = list(/turf/closed/indestructible/hotelwall) + explosion_block = INFINITY + +/turf/open/indestructible/hotelwood + desc = "Stylish dark wood with extra reinforcement. Secured firmly to the floor to prevent tampering." + icon_state = "wood" + footstep = FOOTSTEP_WOOD + tiled_dirt = FALSE + +/turf/open/indestructible/hoteltile + desc = "Smooth tile with extra reinforcement. Secured firmly to the floor to prevent tampering." + icon_state = "showroomfloor" + footstep = FOOTSTEP_FLOOR + tiled_dirt = FALSE + +/turf/open/space/bluespace + name = "\proper bluespace hyperzone" + icon_state = "bluespace" + baseturfs = /turf/open/space/bluespace + flags_1 = NOJAUNT_1 + explosion_block = INFINITY + var/obj/item/hilbertshotel/parentSphere + +/turf/open/space/bluespace/Entered(atom/movable/A) + . = ..() + A.forceMove(get_turf(parentSphere)) + +/turf/closed/indestructible/hoteldoor + name = "Hotel Door" + icon_state = "hoteldoor" + explosion_block = INFINITY + var/obj/item/hilbertshotel/parentSphere + +/turf/closed/indestructible/hoteldoor/proc/promptExit(mob/living/user) + if(!isliving(user)) + return + if(!user.mind) + return + if(!parentSphere) + to_chat(user, "The door seems to be malfunctioning and refuses to operate!") + return + if(alert(user, "Hilbert's Hotel would like to remind you that while we will do everything we can to protect the belongings you leave behind, we make no guarantees of their safety while you're gone, especially that of the health of any living creatures. With that in mind, are you ready to leave?", "Exit", "Leave", "Stay") == "Leave") + if(!user.canmove || (get_dist(get_turf(src), get_turf(user)) > 1)) //no teleporting around if they're dead or moved away during the prompt. + return + user.forceMove(get_turf(parentSphere)) + do_sparks(3, FALSE, get_turf(user)) + +/turf/closed/indestructible/hoteldoor/attack_ghost(mob/dead/observer/user) + if(!isobserver(user) || !parentSphere) + return ..() + user.forceMove(get_turf(parentSphere)) + +//If only this could be simplified... +/turf/closed/indestructible/hoteldoor/attack_tk(mob/user) + return //need to be close. + +/turf/closed/indestructible/hoteldoor/attack_hand(mob/user) + promptExit(user) + +/turf/closed/indestructible/hoteldoor/attack_animal(mob/user) + promptExit(user) + +/turf/closed/indestructible/hoteldoor/attack_paw(mob/user) + promptExit(user) + +/turf/closed/indestructible/hoteldoor/attack_hulk(mob/living/carbon/human/user, does_attack_animation) + promptExit(user) + +/turf/closed/indestructible/hoteldoor/attack_larva(mob/user) + promptExit(user) + +/turf/closed/indestructible/hoteldoor/attack_slime(mob/user) + promptExit(user) + +/turf/closed/indestructible/hoteldoor/attack_robot(mob/user) + if(get_dist(get_turf(src), get_turf(user)) <= 1) + promptExit(user) + +/turf/closed/indestructible/hoteldoor/AltClick(mob/user) + . = ..() + if(get_dist(get_turf(src), get_turf(user)) <= 1) + to_chat(user, "You peak through the door's bluespace peephole...") + user.reset_perspective(parentSphere) + user.set_machine(src) + var/datum/action/peepholeCancel/PHC = new + user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 1) + PHC.Grant(user) + +/turf/closed/indestructible/hoteldoor/check_eye(mob/user) + if(get_dist(get_turf(src), get_turf(user)) >= 2) + user.unset_machine() + for(var/datum/action/peepholeCancel/PHC in user.actions) + PHC.Trigger() + +/datum/action/peepholeCancel + name = "Cancel View" + desc = "Stop looking through the bluespace peephole." + button_icon_state = "cancel_peephole" + +/datum/action/peepholeCancel/Trigger() + . = ..() + to_chat(owner, "You move away from the peephole.") + owner.reset_perspective() + owner.clear_fullscreen("remote_view", 0) + qdel(src) + +/area/hilbertshotel + name = "Hilbert's Hotel Room" + icon_state = "hilbertshotel" + requires_power = FALSE + has_gravity = TRUE + noteleport = TRUE + hidden = TRUE + unique = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED + ambientsounds = list('sound/ambience/servicebell.ogg') + var/roomnumber = 0 + var/obj/item/hilbertshotel/parentSphere + var/datum/turf_reservation/reservation + var/turf/storageTurf + +/area/hilbertshotel/Entered(atom/movable/AM) + . = ..() + if(istype(AM, /obj/item/hilbertshotel)) + relocate(AM) + var/list/obj/item/hilbertshotel/hotels = AM.GetAllContents(/obj/item/hilbertshotel) + for(var/obj/item/hilbertshotel/H in hotels) + if(parentSphere == H) + relocate(H) + +/area/hilbertshotel/proc/relocate(obj/item/hilbertshotel/H) + if(prob(0.135685)) //Because screw you + qdel(H) + return + var/turf/targetturf = find_safe_turf() + if(!targetturf) + if(GLOB.blobstart.len > 0) + targetturf = get_turf(pick(GLOB.blobstart)) + else + CRASH("Unable to find a blobstart landmark") + var/turf/T = get_turf(H) + var/area/A = T.loc + log_game("[H] entered itself. Moving it to [loc_name(targetturf)].") + message_admins("[H] entered itself. Moving it to [ADMIN_VERBOSEJMP(targetturf)].") + for(var/mob/M in A) + to_chat(M, "[H] almost implodes in upon itself, but quickly rebounds, shooting off into a random point in space!") + H.forceMove(targetturf) + +/area/hilbertshotel/Exited(atom/movable/AM) + . = ..() + if(ismob(AM)) + var/mob/M = AM + if(M.mind) + var/stillPopulated = FALSE + var/list/currentLivingMobs = GetAllContents(/mob/living) //Got to catch anyone hiding in anything + for(var/mob/living/L in currentLivingMobs) //Check to see if theres any sentient mobs left. + if(L.mind) + stillPopulated = TRUE + break + if(!stillPopulated) + storeRoom() + +/area/hilbertshotel/proc/storeRoom() + var/roomSize = (reservation.top_right_coords[1]-reservation.bottom_left_coords[1]+1)*(reservation.top_right_coords[2]-reservation.bottom_left_coords[2]+1) + var/storage[roomSize] + var/turfNumber = 1 + var/obj/item/abstracthotelstorage/storageObj = new(storageTurf) + storageObj.roomNumber = roomnumber + storageObj.parentSphere = parentSphere + storageObj.name = "Room [roomnumber] Storage" + for(var/i=0, i") if(isnull(N)) return ..() N.nanite_volume = -2 @@ -205,10 +208,11 @@ O.emp_act(EMP_HEAVY) /datum/reagent/fermi/nanite_b_goneTox - name = "Naninte bain" + name = "Electromagnetic crystals" id = "nanite_b_goneTox" - description = "Poorly made, and shocks you!" - metabolization_rate = 1 + description = "Causes items upon the patient to sometimes short out, as well as causing a shock in the patient, if the residual charge between the crystals builds up to sufficient quantities" + metabolization_rate = 0.5 + chemical_flags = REAGENT_INVISIBLE //Increases shock events. /datum/reagent/fermi/nanite_b_goneTox/on_mob_life(mob/living/carbon/C)//Damages the taker if their purity is low. Extended use of impure chemicals will make the original die. (thus can't be spammed unless you've very good) @@ -246,8 +250,7 @@ if((method==VAPOR) && (!C.wear_mask)) if(prob(20)) to_chat(C, "You can feel your lungs burning!") - var/obj/item/organ/lungs/L = C.getorganslot(ORGAN_SLOT_LUNGS) - L.adjustLungLoss(acidstr*2, C) + C.adjustOrganLoss(ORGAN_SLOT_LUNGS, acidstr*2) C.apply_damage(acidstr/5, BURN, target) C.acid_act(acidstr, volume) ..() @@ -274,7 +277,7 @@ name = "Fermis Test Reagent" id = "fermiTest" description = "You should be really careful with this...! Also, how did you get this?" - addProc = TRUE + chemical_flags = REAGENT_FORCEONNEW can_synth = FALSE /datum/reagent/fermi/fermiTest/on_new(datum/reagents/holder) @@ -305,22 +308,6 @@ playsound(get_turf(M), 'modular_citadel/sound/voice/merowr.ogg', 50, 1) holder.clear_reagents() -/datum/reagent/fermi/fermiTox - name = "FermiTox" - id = "fermiTox" - description = "You should be really careful with this...! Also, how did you get this? You shouldn't have this!" - data = "merge" - color = "FFFFFF" - can_synth = FALSE - -//I'm concerned this is too weak, but I also don't want deathmixes. -/datum/reagent/fermi/fermiTox/on_mob_life(mob/living/carbon/C, method) - if(C.dna && istype(C.dna.species, /datum/species/jelly)) - C.adjustToxLoss(-2) - else - C.adjustToxLoss(2) - ..() - /datum/reagent/fermi/acidic_buffer name = "Acidic buffer" id = "acidic_buffer" @@ -331,9 +318,11 @@ //Consumes self on addition and shifts pH /datum/reagent/fermi/acidic_buffer/on_new(datapH) + if(holder.has_reagent("stabilizing_agent")) + return ..() data = datapH if(LAZYLEN(holder.reagent_list) == 1) - return + return ..() holder.pH = ((holder.pH * holder.total_volume)+(pH * (volume)))/(holder.total_volume + (volume)) var/list/seen = viewers(5, get_turf(holder)) for(var/mob/M in seen) @@ -351,9 +340,11 @@ can_synth = TRUE /datum/reagent/fermi/basic_buffer/on_new(datapH) + if(holder.has_reagent("stabilizing_agent")) + return ..() data = datapH if(LAZYLEN(holder.reagent_list) == 1) - return + return ..() holder.pH = ((holder.pH * holder.total_volume)+(pH * (volume)))/(holder.total_volume + (volume)) var/list/seen = viewers(5, get_turf(holder)) for(var/mob/M in seen) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm index b717948a20..4949cc6ecf 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm @@ -6,9 +6,9 @@ color = "#68e83a" pH = 8.6 overdose_threshold = 35 - ImpureChem = "yamerol_tox" - InverseChemVal = 0.4 - InverseChem = "yamerol_tox" + impure_chem = "yamerol_tox" + inverse_chem_val = 0.4 + inverse_chem = "yamerol_tox" can_synth = TRUE /datum/reagent/fermi/yamerol/on_mob_life(mob/living/carbon/C) @@ -16,9 +16,9 @@ var/obj/item/organ/lungs/L = C.getorganslot(ORGAN_SLOT_LUNGS) if(T) - T.adjustTongueLoss(C, -2)//Fix the inputs me! + T.applyOrganDamage(-2) if(L) - L.adjustLungLoss(-5, C) + C.adjustOrganLoss(ORGAN_SLOT_LUNGS, -5) C.adjustOxyLoss(-2) else C.adjustOxyLoss(-10) @@ -65,31 +65,87 @@ holder.remove_reagent(src.id, "10") if(!C.getorganslot(ORGAN_SLOT_LUNGS)) - var/obj/item/organ/lungs/L = new() + var/obj/item/organ/lungs/yamerol/L = new() L.Insert(C) - to_chat(C, "You feel your lungs reform in your chest.") + to_chat(C, "You feel the yamerol merge in your chest.") holder.remove_reagent(src.id, "10") C.adjustOxyLoss(-3) ..() -/datum/reagent/fermi/yamerol_tox - name = "Yamerol" +/datum/reagent/impure/yamerol_tox + name = "Yamer oh no" id = "yamerol_tox" - description = "For when you've trouble speaking or breathing, just yell YAMEROL! A chem that helps soothe any congestion problems and at high concentrations restores damaged lungs and tongues!" + description = "A dangerous, cloying toxin that stucks to a patient’s respiratory system, damaging their tongue, lungs and causing suffocation." taste_description = "a weird, syrupy flavour, yamero" color = "#68e83a" pH = 8.6 -/datum/reagent/fermi/yamerol_tox/on_mob_life(mob/living/carbon/C) +/datum/reagent/impure/yamerol_tox/on_mob_life(mob/living/carbon/C) var/obj/item/organ/tongue/T = C.getorganslot(ORGAN_SLOT_TONGUE) var/obj/item/organ/lungs/L = C.getorganslot(ORGAN_SLOT_LUNGS) if(T) - T.adjustTongueLoss(C, 1) + T.applyOrganDamage(1) if(L) - L.adjustLungLoss(4, C) + C.adjustOrganLoss(ORGAN_SLOT_LUNGS, 4) C.adjustOxyLoss(3) else C.adjustOxyLoss(10) ..() + + +/datum/reagent/synthtissue + name = "Synthtissue" + id = "synthtissue" + description = "Synthetic tissue used for grafting onto damaged organs during surgery, or for treating limb damage. Has a very tight growth window between 305-320, any higher and the temperature will cause the cells to die. Additionally, growth time is considerably long, so chemists are encouraged to leave beakers with said reaction ongoing, while they tend to their other duties." + pH = 7.6 + metabolization_rate = 0.05 //Give them time to graft + data = list("grown_volume" = 0, "injected_vol" = 0) + +/datum/reagent/synthtissue/reaction_mob(mob/living/M, method=TOUCH, reac_volume,show_message = 1) + if(iscarbon(M)) + var/target = M.zone_selected + if (M.stat == DEAD) + show_message = 0 + if(method in list(PATCH, TOUCH)) + M.apply_damage(reac_volume*-1.5, BRUTE, target) + M.apply_damage(reac_volume*-1.5, BURN, target) + if(show_message) + to_chat(M, "You feel your [target] heal! It stings like hell!") + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine) + if(method==INJECT) + data["injected_vol"] = reac_volume + ..() + +/datum/reagent/synthtissue/on_mob_life(mob/living/carbon/C) + if(!iscarbon(C)) + return ..() + if(data["injected_vol"] > 14) + if(data["grown_volume"] > 175) //I don't think this is even possible, but damn to I want to see if someone can (bare in mind it takes 2s to grow 0.05u) + if(volume >= 14) + if(C.regenerate_organs(only_one = TRUE)) + C.reagents.remove_reagent(id, 15) + to_chat(C, "You feel something reform inside of you!") + + data["injected_vol"] -= metabolization_rate + ..() + +/datum/reagent/synthtissue/on_merge(passed_data) + if(!passed_data) + return ..() + if(passed_data["grown_volume"] > data["grown_volume"]) + data["grown_volume"] = passed_data["grown_volume"] + if(iscarbon(holder.my_atom)) + data["injected_vol"] = data["injected_vol"] + passed_data["injected_vol"] + passed_data["injected_vol"] = 0 + ..() + +/datum/reagent/synthtissue/on_new(passed_data) + if(!passed_data) + return ..() + if(passed_data["grown_volume"] > data["grown_volume"]) + data["grown_volume"] = passed_data["grown_volume"] + ..() + +//NEEDS ON_MOB_DEAD() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm index 00063c22d4..c8ebde11d9 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1,11 +1,3 @@ -/datum/reagent/space_cleaner/reaction_obj(obj/O, reac_volume) - if(istype(O, /obj/effect/decal/cleanable) || istype(O, /obj/item/projectile/bullet/reusable/foam_dart) || istype(O, /obj/item/ammo_casing/caseless/foam_dart)) - qdel(O) - else - if(O) - O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - /datum/reagent/syndicateadrenals name = "Syndicate Adrenaline" id = "syndicateadrenals" diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index d993322fcb..7fcae0eb13 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -2,15 +2,33 @@ mix_sound = 'sound/effects/bubbles.ogg' //Called for every reaction step -/datum/chemical_reaction/proc/FermiCreate(holder) +/datum/chemical_reaction/proc/FermiCreate(datum/reagents/holder, added_volume, added_purity) return //Called when reaction STOP_PROCESSING -/datum/chemical_reaction/proc/FermiFinish(datum/reagents/holder) +/datum/chemical_reaction/proc/FermiFinish(datum/reagents/holder, var/atom/my_atom, reactVol) + if(clear_conversion == REACTION_CLEAR_IMPURE | REACTION_CLEAR_INVERSE) + for(var/id in results) + var/datum/reagent/R = my_atom.reagents.has_reagent("[id]") + if(R.purity == 1) + continue + + var/cached_volume = R.volume + if(clear_conversion == REACTION_CLEAR_INVERSE && R.inverse_chem) + if(R.inverse_chem_val > R.purity) + my_atom.reagents.remove_reagent(R.id, cached_volume, FALSE) + my_atom.reagents.add_reagent(R.inverse_chem, cached_volume, FALSE, other_purity = 1) + + else if (clear_conversion == REACTION_CLEAR_IMPURE && R.impure_chem) + var/impureVol = cached_volume * (1 - R.purity) + my_atom.reagents.remove_reagent(R.id, (impureVol), FALSE) + my_atom.reagents.add_reagent(R.impure_chem, impureVol, FALSE, other_purity = 1) + R.cached_purity = R.purity + R.purity = 1 return //Called when temperature is above a certain threshold, or if purity is too low. -/datum/chemical_reaction/proc/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH, Exploding = FALSE) +/datum/chemical_reaction/proc/FermiExplode(datum/reagents/R0, var/atom/my_atom, volume, temp, pH, Exploding = FALSE) if (Exploding == TRUE) return @@ -24,26 +42,32 @@ if (500 to 750) for(var/turf/turf in range(1,T)) new /obj/effect/hotspot(turf) + volume*=1.1 if (751 to 1100) for(var/turf/turf in range(2,T)) new /obj/effect/hotspot(turf) + volume*=1.2 if (1101 to 1500) //If you're crafty for(var/turf/turf in range(3,T)) new /obj/effect/hotspot(turf) + volume*=1.3 if (1501 to 2500) //requested for(var/turf/turf in range(4,T)) new /obj/effect/hotspot(turf) + volume*=1.4 if (2501 to 5000) for(var/turf/turf in range(5,T)) new /obj/effect/hotspot(turf) + volume*=1.5 if (5001 to INFINITY) for(var/turf/turf in range(6,T)) new /obj/effect/hotspot(turf) + volume*=1.6 message_admins("Fermi explosion at [T], with a temperature of [temp], pH of [pH], Impurity tot of [ImpureTot].") @@ -52,7 +76,7 @@ var/datum/effect_system/smoke_spread/chem/s = new() R.my_atom = my_atom //Give the gas a fingerprint - for (var/datum/reagent/reagent in my_atom.reagents.reagent_list) //make gas for reagents, has to be done this way, otherwise it never stops Exploding + for (var/datum/reagent/reagent in R0.reagent_list) //make gas for reagents, has to be done this way, otherwise it never stops Exploding R.add_reagent(reagent.id, reagent.volume/3) //Seems fine? I think I fixed the infinite explosion bug. if (reagent.purity < 0.6) @@ -66,7 +90,7 @@ if (pH > 10) //if alkaline, small explosion. var/datum/effect_system/reagents_explosion/e = new() - e.set_up(round((volume/30)*(pH-9)), T, 0, 0) + e.set_up(round((volume/28)*(pH-9)), T, 0, 0) e.start() if(!ImpureTot == 0) //If impure, v.small emp (0.6 or less) @@ -80,8 +104,8 @@ /datum/chemical_reaction/fermi/eigenstate name = "Eigenstasium" id = "eigenstate" - results = list("eigenstate" = 0.1) - required_reagents = list("bluespace" = 0.1, "stable_plasma" = 0.1, "sugar" = 0.1) + results = list("eigenstate" = 1) + required_reagents = list("bluespace" = 1, "stable_plasma" = 1, "sugar" = 1) mix_message = "the reaction zaps suddenly!" //FermiChem vars: OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions @@ -114,8 +138,8 @@ /datum/chemical_reaction/fermi/SDGF name = "Synthetic-derived growth factor" id = "SDGF" - results = list("SDGF" = 0.3) - required_reagents = list("stable_plasma" = 0.15, "clonexadone" = 0.15, "uranium" = 0.15, "synthflesh" = 0.15) + results = list("SDGF" = 3) + required_reagents = list("stable_plasma" = 1.5, "clonexadone" = 1.5, "uranium" = 1.5, "synthflesh" = 1.5) mix_message = "the reaction gives off a blorble!" required_temp = 1 //FermiChem vars: @@ -137,12 +161,16 @@ /datum/chemical_reaction/fermi/SDGF/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH)//Spawns an angery teratoma! var/turf/T = get_turf(my_atom) - var/mob/living/simple_animal/slime/S = new(T,"green") - 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" - S.rabid = 1//Make them an angery boi - S.color = "#810010" + var/amount_to_spawn = round((volume/100), 1) + 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") + 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" + S.rabid = 1//Make them an angery boi + S.color = "#810010" my_atom.reagents.clear_reagents() var/list/seen = viewers(8, get_turf(my_atom)) for(var/mob/M in seen) @@ -151,8 +179,8 @@ /datum/chemical_reaction/fermi/breast_enlarger name = "Sucubus milk" id = "breast_enlarger" - results = list("breast_enlarger" = 0.8) - required_reagents = list("salglu_solution" = 0.1, "milk" = 0.1, "synthflesh" = 0.2, "silicon" = 0.3, "aphro" = 0.3) + results = list("breast_enlarger" = 8) + required_reagents = list("salglu_solution" = 1, "milk" = 1, "synthflesh" = 2, "silicon" = 3, "aphro" = 3) mix_message = "the reaction gives off a mist of milk." //FermiChem vars: OptimalTempMin = 200 @@ -191,8 +219,8 @@ /datum/chemical_reaction/fermi/penis_enlarger name = "Incubus draft" id = "penis_enlarger" - results = list("penis_enlarger" = 0.8) - required_reagents = list("blood" = 0.5, "synthflesh" = 0.2, "carbon" = 0.2, "aphro" = 0.2, "salglu_solution" = 0.1,) + results = list("penis_enlarger" = 8) + required_reagents = list("blood" = 5, "synthflesh" = 2, "carbon" = 2, "aphro" = 2, "salglu_solution" = 1) mix_message = "the reaction gives off a spicy mist." //FermiChem vars: OptimalTempMin = 200 @@ -230,8 +258,8 @@ /datum/chemical_reaction/fermi/astral name = "Astrogen" id = "astral" - results = list("astral" = 0.5) - required_reagents = list("eigenstate" = 0.1, "plasma" = 0.3, "synaptizine" = 0.1, "aluminium" = 0.5) + results = list("astral" = 5) + required_reagents = list("eigenstate" = 1, "plasma" = 3, "synaptizine" = 1, "aluminium" = 5) //FermiChem vars: OptimalTempMin = 700 OptimalTempMax = 800 @@ -253,10 +281,10 @@ /datum/chemical_reaction/fermi/enthrall/ //check this name = "MKUltra" id = "enthrall" - results = list("enthrall" = 0.5) + results = list("enthrall" = 5) //required_reagents = list("iron" = 1, "iodine" = 1) Test vars - //required_reagents = list("cocoa" = 0.1, "astral" = 0.1, "mindbreaker" = 0.1, "psicodine" = 0.1, "happiness" = 0.1) - required_reagents = list("cocoa" = 0.1, "bluespace" = 0.1, "mindbreaker" = 0.1, "psicodine" = 0.1, "happiness" = 0.1) //TEMPORARY UNTIL HEADMINS GIVE THE OKAY FOR MK USE. + //required_reagents = list("cocoa" = 1, "astral" = 1, "mindbreaker" = 1, "psicodine" = 1, "happiness" = 1) + required_reagents = list("cocoa" = 1, "bluespace" = 1, "mindbreaker" = 1, "psicodine" = 1, "happiness" = 1) //TEMPORARY UNTIL HEADMINS GIVE THE OKAY FOR MK USE. required_catalysts = list("blood" = 1) mix_message = "the reaction gives off a burgundy plume of smoke!" //FermiChem vars: @@ -299,10 +327,10 @@ //So slimes can play too. /datum/chemical_reaction/fermi/enthrall/slime - required_catalysts = list("slimejelly" = 1) + required_catalysts = list("jellyblood" = 1) /datum/chemical_reaction/fermi/enthrall/slime/FermiFinish(datum/reagents/holder, var/atom/my_atom) - var/datum/reagent/toxin/slimejelly/B = locate(/datum/reagent/toxin/slimejelly) in my_atom.reagents.reagent_list//The one line change. + var/datum/reagent/blood/jellyblood/B = locate(/datum/reagent/blood/jellyblood) in my_atom.reagents.reagent_list//The one line change. var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in my_atom.reagents.reagent_list if(!B.data) var/list/seen = viewers(5, get_turf(my_atom)) @@ -332,8 +360,8 @@ /datum/chemical_reaction/fermi/hatmium // done name = "Hat growth serum" id = "hatmium" - results = list("hatmium" = 0.5) - required_reagents = list("ethanol" = 0.1, "nutriment" = 0.3, "cooking_oil" = 0.2, "iron" = 0.1, "gold" = 0.3) + results = list("hatmium" = 5) + required_reagents = list("ethanol" = 1, "nutriment" = 3, "cooking_oil" = 2, "iron" = 1, "gold" = 3) //mix_message = "" //FermiChem vars: OptimalTempMin = 500 @@ -353,18 +381,22 @@ PurityMin = 0.5 /datum/chemical_reaction/fermi/hatmium/FermiExplode(src, var/atom/my_atom, volume, temp, pH) - var/obj/item/clothing/head/hattip/hat = new /obj/item/clothing/head/hattip(get_turf(my_atom)) - hat.animate_atom_living() + var/amount_to_spawn = round((volume/100), 1) + if(amount_to_spawn <= 0) + amount_to_spawn = 1 + for(var/i in 1 to amount_to_spawn) + var/obj/item/clothing/head/hattip/hat = new /obj/item/clothing/head/hattip(get_turf(my_atom)) + hat.animate_atom_living() var/list/seen = viewers(8, get_turf(my_atom)) for(var/mob/M in seen) - to_chat(M, "The makes an off sounding pop, as a hat suddenly climbs out of the beaker!") + to_chat(M, "The [my_atom] makes an off sounding pop, as a hat suddenly climbs out of it!") my_atom.reagents.clear_reagents() /datum/chemical_reaction/fermi/furranium name = "Furranium" id = "furranium" - results = list("furranium" = 0.5) - required_reagents = list("aphro" = 0.1, "moonsugar" = 0.1, "silver" = 0.2, "salglu_solution" = 0.1) + results = list("furranium" = 5) + required_reagents = list("aphro" = 1, "moonsugar" = 1, "silver" = 2, "salglu_solution" = 1) mix_message = "You think you can hear a howl come from the beaker." //FermiChem vars: OptimalTempMin = 350 @@ -383,7 +415,7 @@ PurityMin = 0.3 /datum/chemical_reaction/fermi/furranium/organic - required_reagents = list("aphro" = 0.1, "catnip" = 0.1, "silver" = 0.2, "salglu_solution" = 0.1) + required_reagents = list("aphro" = 1, "catnip" = 1, "silver" = 2, "salglu_solution" = 1) //FOR INSTANT REACTIONS - DO NOT MULTIPLY LIMIT BY 10. //There's a weird rounding error or something ugh. @@ -414,14 +446,14 @@ /datum/chemical_reaction/fermi/acidic_buffer//done test name = "Acetic acid buffer" id = "acidic_buffer" - results = list("acidic_buffer" = 2) //acetic acid - required_reagents = list("salglu_solution" = 0.2, "ethanol" = 0.6, "oxygen" = 0.6, "water" = 0.6) + results = list("acidic_buffer" = 10) //acetic acid + required_reagents = list("salglu_solution" = 1, "ethanol" = 3, "oxygen" = 3, "water" = 3) //FermiChem vars: OptimalTempMin = 250 OptimalTempMax = 500 ExplodeTemp = 9999 //check to see overflow doesn't happen! - OptimalpHMin = 2 - OptimalpHMax = 6 + OptimalpHMin = 0 + OptimalpHMax = 14 ReactpHLim = 0 //CatalystFact = 0 //To do 1 CurveSharpT = 4 @@ -441,15 +473,15 @@ /datum/chemical_reaction/fermi/basic_buffer//done test name = "Ethyl Ethanoate buffer" id = "basic_buffer" - results = list("basic_buffer" = 1.5) - required_reagents = list("acidic_buffer" = 0.5, "ethanol" = 0.5, "water" = 0.5) + results = list("basic_buffer" = 5) + required_reagents = list("lye" = 1, "ethanol" = 2, "water" = 2) required_catalysts = list("sacid" = 1) //vagely acetic - //FermiChem vars:x + //FermiChem vars: OptimalTempMin = 250 OptimalTempMax = 500 ExplodeTemp = 9999 //check to see overflow doesn't happen! - OptimalpHMin = 5 - OptimalpHMax = 12 + OptimalpHMin = 0 + OptimalpHMax = 14 ReactpHLim = 0 //CatalystFact = 0 //To do 1 CurveSharpT = 4 @@ -473,8 +505,8 @@ /datum/chemical_reaction/fermi/secretcatchem //DONE name = "secretcatchem" id = "secretcatchem" - results = list("secretcatchem" = 0.5) - required_reagents = list("stable_plasma" = 0.1, "sugar" = 0.1, "cream" = 0.1, "clonexadone" = 0.1)//Yes this will make a plushie if you don't lucky guess. It'll eat all your reagents too. + results = list("secretcatchem" = 5) + required_reagents = list("stable_plasma" = 1, "sugar" = 1, "cream" = 1, "clonexadone" = 1)//Yes this will make a plushie if you don't lucky guess. It'll eat all your reagents too. required_catalysts = list("SDGF" = 1) required_temp = 600 mix_message = "the reaction gives off a meow!" @@ -507,7 +539,7 @@ RateUpLim += (rand(1, 1000)/100) PurityMin += (rand(-1, 1)/10) var/additions = list("aluminium", "silver", "gold", "plasma", "silicon", "uranium", "milk") - required_reagents[pick(additions)] = rand(0.1, 0.5)//weird + required_reagents[pick(additions)] = rand(1, 5)//weird /datum/chemical_reaction/fermi/secretcatchem/FermiFinish(datum/reagents/holder, var/atom/my_atom) SSblackbox.record_feedback("tally", "catgirlium")//log @@ -526,8 +558,8 @@ /datum/chemical_reaction/fermi/yamerol//done test name = "Yamerol" id = "yamerol" - results = list("yamerol" = 1.5) - required_reagents = list("perfluorodecalin" = 0.5, "salbutamol" = 0.5, "water" = 0.5) + results = list("yamerol" = 3) + required_reagents = list("perfluorodecalin" = 1, "salbutamol" = 1, "water" = 1) //FermiChem vars: OptimalTempMin = 300 OptimalTempMax = 500 diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm index 02f2db7c1e..6221bdde18 100644 --- a/modular_citadel/code/modules/reagents/objects/items.dm +++ b/modular_citadel/code/modules/reagents/objects/items.dm @@ -1,12 +1,12 @@ /obj/item/fermichem/pHbooklet - name = "pH indicator booklet" - desc = "A booklet containing paper soaked in universal indicator." - icon_state = "pHbooklet" - icon = 'modular_citadel/icons/obj/FermiChem.dmi' - item_flags = NOBLUDGEON - var/numberOfPages = 50 - resistance_flags = FLAMMABLE - w_class = WEIGHT_CLASS_TINY + name = "pH indicator booklet" + desc = "A booklet containing paper soaked in universal indicator." + icon_state = "pHbooklet" + icon = 'icons/obj/chemical.dmi' + item_flags = NOBLUDGEON + var/numberOfPages = 50 + resistance_flags = FLAMMABLE + w_class = WEIGHT_CLASS_TINY //A little janky with pockets /obj/item/fermichem/pHbooklet/attack_hand(mob/user) @@ -29,7 +29,7 @@ to_chat(user, "[src] is empty!") add_fingerprint(user) return - . = ..() + . = ..() if(. & COMPONENT_NO_INTERACT) return var/I = user.get_active_held_item() @@ -37,86 +37,86 @@ user.put_in_active_hand(src) /obj/item/fermichem/pHbooklet/MouseDrop() - var/mob/living/user = usr - if(numberOfPages >= 1) - var/obj/item/fermichem/pHpaper/P = new /obj/item/fermichem/pHpaper - P.add_fingerprint(user) - P.forceMove(user) - user.put_in_active_hand(P) - to_chat(user, "You take [P] out of \the [src].") - numberOfPages-- - playsound(user.loc, 'sound/items/poster_ripped.ogg', 50, 1) - add_fingerprint(user) - if(numberOfPages == 0) - icon_state = "pHbookletEmpty" - return - else - to_chat(user, "[src] is empty!") - add_fingerprint(user) - return - ..() + var/mob/living/user = usr + if(numberOfPages >= 1) + var/obj/item/fermichem/pHpaper/P = new /obj/item/fermichem/pHpaper + P.add_fingerprint(user) + P.forceMove(user) + user.put_in_active_hand(P) + to_chat(user, "You take [P] out of \the [src].") + numberOfPages-- + playsound(user.loc, 'sound/items/poster_ripped.ogg', 50, 1) + add_fingerprint(user) + if(numberOfPages == 0) + icon_state = "pHbookletEmpty" + return + else + to_chat(user, "[src] is empty!") + add_fingerprint(user) + return + ..() /obj/item/fermichem/pHpaper - name = "pH indicator strip" - desc = "A piece of paper that will change colour depending on the pH of a solution." - icon_state = "pHpaper" - icon = 'modular_citadel/icons/obj/FermiChem.dmi' - item_flags = NOBLUDGEON - color = "#f5c352" - var/used = FALSE - resistance_flags = FLAMMABLE - w_class = WEIGHT_CLASS_TINY + name = "pH indicator strip" + desc = "A piece of paper that will change colour depending on the pH of a solution." + icon_state = "pHpaper" + icon = 'icons/obj/chemical.dmi' + item_flags = NOBLUDGEON + color = "#f5c352" + var/used = FALSE + resistance_flags = FLAMMABLE + w_class = WEIGHT_CLASS_TINY /obj/item/fermichem/pHpaper/afterattack(obj/item/reagent_containers/cont, mob/user, proximity) - if(!istype(cont)) - return - if(used == TRUE) - to_chat(user, "[user] has already been used!") - return - if(!LAZYLEN(cont.reagents.reagent_list)) - return - switch(round(cont.reagents.pH, 1)) - if(14 to INFINITY) - color = "#462c83" - if(13 to 14) - color = "#63459b" - if(12 to 13) - color = "#5a51a2" - if(11 to 12) - color = "#3853a4" - if(10 to 11) - color = "#3f93cf" - if(9 to 10) - color = "#0bb9b7" - if(8 to 9) - color = "#23b36e" - if(7 to 8) - color = "#3aa651" - if(6 to 7) - color = "#4cb849" - if(5 to 6) - color = "#b5d335" - if(4 to 5) - color = "#f7ec1e" - if(3 to 4) - color = "#fbc314" - if(2 to 3) - color = "#f26724" - if(1 to 2) - color = "#ef1d26" - if(-INFINITY to 1) - color = "#c6040c" - desc += " The paper looks to be around a pH of [round(cont.reagents.pH, 1)]" - used = TRUE + if(!istype(cont)) + return + if(used == TRUE) + to_chat(user, "[user] has already been used!") + return + if(!LAZYLEN(cont.reagents.reagent_list)) + return + switch(round(cont.reagents.pH, 1)) + if(14 to INFINITY) + color = "#462c83" + if(13 to 14) + color = "#63459b" + if(12 to 13) + color = "#5a51a2" + if(11 to 12) + color = "#3853a4" + if(10 to 11) + color = "#3f93cf" + if(9 to 10) + color = "#0bb9b7" + if(8 to 9) + color = "#23b36e" + if(7 to 8) + color = "#3aa651" + if(6 to 7) + color = "#4cb849" + if(5 to 6) + color = "#b5d335" + if(4 to 5) + color = "#f7ec1e" + if(3 to 4) + color = "#fbc314" + if(2 to 3) + color = "#f26724" + if(1 to 2) + color = "#ef1d26" + if(-INFINITY to 1) + color = "#c6040c" + desc += " The paper looks to be around a pH of [round(cont.reagents.pH, 1)]" + used = TRUE /obj/item/fermichem/pHmeter - name = "Chemistry Analyser" - desc = "A a electrode attached to a small circuit box that will tell you the pH of a solution. The screen currently displays nothing." - icon_state = "pHmeter" - icon = 'modular_citadel/icons/obj/FermiChem.dmi' - resistance_flags = FLAMMABLE - w_class = WEIGHT_CLASS_TINY - var/scanmode = 1 + name = "Chemistry Analyser" + desc = "A a electrode attached to a small circuit box that will tell you the pH of a solution. The screen currently displays nothing." + icon_state = "pHmeter" + icon = 'icons/obj/chemical.dmi' + resistance_flags = FLAMMABLE + w_class = WEIGHT_CLASS_TINY + var/scanmode = 1 /obj/item/fermichem/pHmeter/attack_self(mob/user) if(!scanmode) @@ -127,21 +127,21 @@ scanmode = 0 /obj/item/fermichem/pHmeter/afterattack(atom/A, mob/user, proximity) - . = ..() - if(!istype(A, /obj/item/reagent_containers)) - return - var/obj/item/reagent_containers/cont = A - if(LAZYLEN(cont.reagents.reagent_list) == null) - return - var/out_message - to_chat(user, "The chemistry meter beeps and displays:") - out_message += "Total volume: [round(cont.volume, 0.01)] Total pH: [round(cont.reagents.pH, 0.1)]\n" - if(cont.reagents.fermiIsReacting) - out_message += "A reaction appears to be occuring currently.\n" - out_message += "Chemicals found in the beaker:\n" - for(var/datum/reagent/R in cont.reagents.reagent_list) - out_message += "[R.volume]u of [R.name], Purity: [R.purity], [(scanmode?"[(R.overdose_threshold?"Overdose: [R.overdose_threshold]u, ":"")][(R.addiction_threshold?"Addiction: [R.addiction_threshold]u, ":"")]Base pH: [R.pH].":".")]\n" - if(scanmode) - out_message += "Analysis: [R.description]\n" - to_chat(user, "[out_message]") - desc = "An electrode attached to a small circuit box that will analyse a beaker. It can be toggled to give a reduced or extended report. The screen currently displays [round(cont.reagents.pH, 0.1)]." + . = ..() + if(!istype(A, /obj/item/reagent_containers)) + return + var/obj/item/reagent_containers/cont = A + if(LAZYLEN(cont.reagents.reagent_list) == null) + return + var/out_message + to_chat(user, "The chemistry meter beeps and displays:") + out_message += "Total volume: [round(cont.volume, 0.01)] Total pH: [round(cont.reagents.pH, 0.1)]\n" + if(cont.reagents.fermiIsReacting) + out_message += "A reaction appears to be occuring currently.\n" + out_message += "Chemicals found in the beaker:\n" + for(var/datum/reagent/R in cont.reagents.reagent_list) + out_message += "[R.volume]u of [R.name], Purity: [R.purity], [(scanmode?"[(R.overdose_threshold?"Overdose: [R.overdose_threshold]u, ":"")][(R.addiction_threshold?"Addiction: [R.addiction_threshold]u, ":"")]Base pH: [R.pH].":".")]\n" + if(scanmode) + out_message += "Analysis: [R.description]\n" + to_chat(user, "[out_message]") + desc = "An electrode attached to a small circuit box that will analyse a beaker. It can be toggled to give a reduced or extended report. The screen currently displays [round(cont.reagents.pH, 0.1)]." diff --git a/modular_citadel/code/modules/reagents/reagent container/cit_kegs.dm b/modular_citadel/code/modules/reagents/reagent container/cit_kegs.dm deleted file mode 100644 index d40dba8a3f..0000000000 --- a/modular_citadel/code/modules/reagents/reagent container/cit_kegs.dm +++ /dev/null @@ -1,41 +0,0 @@ -/obj/structure/reagent_dispensers/keg - name = "keg" - desc = "A keg." - icon = 'modular_citadel/icons/obj/objects.dmi' - icon_state = "keg" - reagent_id = "water" - -/obj/structure/reagent_dispensers/keg/mead - name = "keg of mead" - desc = "A keg of mead." - icon_state = "orangekeg" - reagent_id = "mead" - -/obj/structure/reagent_dispensers/keg/aphro - name = "keg of aphrodisiac" - desc = "A keg of aphrodisiac." - icon_state = "pinkkeg" - reagent_id = "aphro" - -/obj/structure/reagent_dispensers/keg/aphro/strong - name = "keg of strong aphrodisiac" - desc = "A keg of strong and addictive aphrodisiac." - reagent_id = "aphro+" - -/obj/structure/reagent_dispensers/keg/milk - name = "keg of milk" - desc = "It's not quite what you were hoping for." - icon_state = "whitekeg" - reagent_id = "milk" - -/obj/structure/reagent_dispensers/keg/semen - name = "keg of semen" - desc = "Dear lord, where did this even come from?" - icon_state = "whitekeg" - reagent_id = "semen" - -/obj/structure/reagent_dispensers/keg/gargle - name = "keg of pan galactic gargleblaster" - desc = "A keg of... wow that's a long name." - icon_state = "bluekeg" - reagent_id = "gargleblaster" \ No newline at end of file diff --git a/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm b/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm deleted file mode 100755 index 9e7da03f9b..0000000000 --- a/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm +++ /dev/null @@ -1,296 +0,0 @@ -#define HYPO_SPRAY 0 -#define HYPO_INJECT 1 - -#define WAIT_SPRAY 25 -#define WAIT_INJECT 25 -#define SELF_SPRAY 15 -#define SELF_INJECT 15 - -#define DELUXE_WAIT_SPRAY 20 -#define DELUXE_WAIT_INJECT 20 -#define DELUXE_SELF_SPRAY 10 -#define DELUXE_SELF_INJECT 10 - -#define COMBAT_WAIT_SPRAY 0 -#define COMBAT_WAIT_INJECT 0 -#define COMBAT_SELF_SPRAY 0 -#define COMBAT_SELF_INJECT 0 - -//A vial-loaded hypospray. Cartridge-based! -/obj/item/hypospray/mkii - name = "hypospray mk.II" - icon = 'modular_citadel/icons/obj/hypospraymkii.dmi' - icon_state = "hypo2" - desc = "A new development from DeForest Medical, this hypospray takes 30-unit vials as the drug supply for easy swapping." - w_class = WEIGHT_CLASS_TINY - var/list/allowed_containers = list(/obj/item/reagent_containers/glass/bottle/vial/tiny, /obj/item/reagent_containers/glass/bottle/vial/small) - var/mode = HYPO_INJECT - var/obj/item/reagent_containers/glass/bottle/vial/vial - var/start_vial = /obj/item/reagent_containers/glass/bottle/vial/small - var/spawnwithvial = TRUE - var/inject_wait = WAIT_INJECT - var/spray_wait = WAIT_SPRAY - var/spray_self = SELF_SPRAY - var/inject_self = SELF_INJECT - var/quickload = FALSE - var/penetrates = FALSE - -/obj/item/hypospray/mkii/brute - start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/bicaridine - -/obj/item/hypospray/mkii/toxin - start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/antitoxin - -/obj/item/hypospray/mkii/oxygen - start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/dexalin - -/obj/item/hypospray/mkii/burn - start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/kelotane - -/obj/item/hypospray/mkii/tricord - start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/tricord - -/obj/item/hypospray/mkii/enlarge - spawnwithvial = FALSE - -/obj/item/hypospray/mkii/CMO - name = "hypospray mk.II deluxe" - allowed_containers = list(/obj/item/reagent_containers/glass/bottle/vial/tiny, /obj/item/reagent_containers/glass/bottle/vial/small, /obj/item/reagent_containers/glass/bottle/vial/large) - icon_state = "cmo2" - desc = "The Deluxe Hypospray can take larger-size vials. It also acts faster and delivers more reagents per spray." - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF - start_vial = /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/CMO - inject_wait = DELUXE_WAIT_INJECT - spray_wait = DELUXE_WAIT_SPRAY - spray_self = DELUXE_SELF_SPRAY - inject_self = DELUXE_SELF_INJECT - -/obj/item/hypospray/mkii/CMO/combat - name = "combat hypospray mk.II" - desc = "A combat-ready deluxe hypospray that acts almost instantly. It can be tactically reloaded by using a vial on it." - icon_state = "combat2" - start_vial = /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/combat - inject_wait = COMBAT_WAIT_INJECT - spray_wait = COMBAT_WAIT_SPRAY - spray_self = COMBAT_SELF_SPRAY - inject_self = COMBAT_SELF_INJECT - quickload = TRUE - penetrates = TRUE - -/obj/item/hypospray/mkii/Initialize() - . = ..() - if(!spawnwithvial) - update_icon() - return - if(start_vial) - vial = new start_vial - update_icon() - -/obj/item/hypospray/mkii/update_icon() - ..() - icon_state = "[initial(icon_state)][vial ? "" : "-e"]" - if(ismob(loc)) - var/mob/M = loc - M.update_inv_hands() - return - -/obj/item/hypospray/mkii/examine(mob/user) - . = ..() - to_chat(user, "[vial] has [vial.reagents.total_volume]u remaining.") - to_chat(user, "[src] is set to [mode ? "Inject" : "Spray"] contents on application.") - -/obj/item/hypospray/mkii/proc/unload_hypo(obj/item/I, mob/user) - if((istype(I, /obj/item/reagent_containers/glass/bottle/vial))) - var/obj/item/reagent_containers/glass/bottle/vial/V = I - V.forceMove(user.loc) - user.put_in_hands(V) - to_chat(user, "You remove [vial] from [src].") - vial = null - update_icon() - playsound(loc, 'sound/weapons/empty.ogg', 50, 1) - else - to_chat(user, "This hypo isn't loaded!") - return - -/obj/item/hypospray/mkii/attackby(obj/item/I, mob/living/user) - if((istype(I, /obj/item/reagent_containers/glass/bottle/vial) && vial != null)) - if(!quickload) - to_chat(user, "[src] can not hold more than one vial!") - return FALSE - unload_hypo(vial, user) - if((istype(I, /obj/item/reagent_containers/glass/bottle/vial))) - var/obj/item/reagent_containers/glass/bottle/vial/V = I - if(!is_type_in_list(V, allowed_containers)) - to_chat(user, "[src] doesn't accept this type of vial.") - return FALSE - if(!user.transferItemToLoc(V,src)) - return FALSE - vial = V - user.visible_message("[user] has loaded a vial into [src].","You have loaded [vial] into [src].") - update_icon() - playsound(loc, 'sound/weapons/autoguninsert.ogg', 35, 1) - return TRUE - else - to_chat(user, "This doesn't fit in [src].") - return FALSE - return FALSE - -/obj/item/hypospray/mkii/AltClick(mob/user) - if(vial) - vial.attack_self(user) - -// Gunna allow this for now, still really don't approve - Pooj -/obj/item/hypospray/mkii/emag_act(mob/user) - . = ..() - if(obj_flags & EMAGGED) - to_chat(user, "[src] happens to be already overcharged.") - return - inject_wait = COMBAT_WAIT_INJECT - spray_wait = COMBAT_WAIT_SPRAY - spray_self = COMBAT_SELF_INJECT - inject_self = COMBAT_SELF_SPRAY - penetrates = TRUE - to_chat(user, "You overcharge [src]'s control circuit.") - obj_flags |= EMAGGED - return TRUE - -/obj/item/hypospray/mkii/attack_hand(mob/user) - . = ..() //Don't bother changing this or removing it from containers will break. - -/obj/item/hypospray/mkii/attack(obj/item/I, mob/user, params) - return - -/obj/item/hypospray/mkii/afterattack(atom/target, mob/user, proximity) - if(!vial) - return - - if(!proximity) - return - - if(!ismob(target)) - return - - var/mob/living/L - if(isliving(target)) - L = target - if(!penetrates && !L.can_inject(user, 1)) //This check appears another four times, since otherwise the penetrating sprays will break in do_mob. - return - - if(!L && !target.is_injectable()) //only checks on non-living mobs, due to how can_inject() handles - to_chat(user, "You cannot directly fill [target]!") - return - - if(target.reagents.total_volume >= target.reagents.maximum_volume) - to_chat(user, "[target] is full.") - return - - if(ishuman(L)) - var/obj/item/bodypart/affecting = L.get_bodypart(check_zone(user.zone_selected)) - if(!affecting) - to_chat(user, "The limb is missing!") - return - if(affecting.status != BODYPART_ORGANIC) - to_chat(user, "Medicine won't work on a robotic limb!") - return - - var/contained = vial.reagents.log_list() - log_combat(user, L, "attemped to inject", src, addition="which had [contained]") -//Always log attemped injections for admins - if(vial != null) - switch(mode) - if(HYPO_INJECT) - if(L) //living mob - if(L != user) - L.visible_message("[user] is trying to inject [L] with [src]!", \ - "[user] is trying to inject [L] with [src]!") - if(!do_mob(user, L, inject_wait)) - return - if(!penetrates && !L.can_inject(user, 1)) - return - if(!vial.reagents.total_volume) - return - if(L.reagents.total_volume >= L.reagents.maximum_volume) - return - L.visible_message("[user] uses the [src] on [L]!", \ - "[user] uses the [src] on [L]!") - else - if(!do_mob(user, L, inject_self)) - return - if(!penetrates && !L.can_inject(user, 1)) - return - if(!vial.reagents.total_volume) - return - if(L.reagents.total_volume >= L.reagents.maximum_volume) - return - log_attack("[user.name] ([user.ckey]) applied [src] to [L.name] ([L.ckey]), which had [contained] (INTENT: [uppertext(user.a_intent)]) (MODE: [src.mode])") - L.log_message("applied [src] to themselves ([contained]).", INDIVIDUAL_ATTACK_LOG) - - var/fraction = min(vial.amount_per_transfer_from_this/vial.reagents.total_volume, 1) - vial.reagents.reaction(L, INJECT, fraction) - vial.reagents.trans_to(target, vial.amount_per_transfer_from_this) - if(vial.amount_per_transfer_from_this >= 15) - playsound(loc,'sound/items/hypospray_long.ogg',50, 1, -1) - if(vial.amount_per_transfer_from_this < 15) - playsound(loc, pick('sound/items/hypospray.ogg','sound/items/hypospray2.ogg'), 50, 1, -1) - to_chat(user, "You inject [vial.amount_per_transfer_from_this] units of the solution. The hypospray's cartridge now contains [vial.reagents.total_volume] units.") - - if(HYPO_SPRAY) - if(L) //living mob - if(L != user) - L.visible_message("[user] is trying to spray [L] with [src]!", \ - "[user] is trying to spray [L] with [src]!") - if(!do_mob(user, L, spray_wait)) - return - if(!penetrates && !L.can_inject(user, 1)) - return - if(!vial.reagents.total_volume) - return - if(L.reagents.total_volume >= L.reagents.maximum_volume) - return - L.visible_message("[user] uses the [src] on [L]!", \ - "[user] uses the [src] on [L]!") - else - if(!do_mob(user, L, spray_self)) - return - if(!penetrates && !L.can_inject(user, 1)) - return - if(!vial.reagents.total_volume) - return - if(L.reagents.total_volume >= L.reagents.maximum_volume) - return - log_attack("[user.name] ([user.ckey]) applied [src] to [L.name] ([L.ckey]), which had [contained] (INTENT: [uppertext(user.a_intent)]) (MODE: [src.mode])") - L.log_message("applied [src] to themselves ([contained]).", INDIVIDUAL_ATTACK_LOG) - var/fraction = min(vial.amount_per_transfer_from_this/vial.reagents.total_volume, 1) - vial.reagents.reaction(L, PATCH, fraction) - vial.reagents.trans_to(target, vial.amount_per_transfer_from_this) - if(vial.amount_per_transfer_from_this >= 15) - playsound(loc,'sound/items/hypospray_long.ogg',50, 1, -1) - if(vial.amount_per_transfer_from_this < 15) - playsound(loc, pick('sound/items/hypospray.ogg','sound/items/hypospray2.ogg'), 50, 1, -1) - to_chat(user, "You spray [vial.amount_per_transfer_from_this] units of the solution. The hypospray's cartridge now contains [vial.reagents.total_volume] units.") - else - to_chat(user, "[src] doesn't work here!") - return - -/obj/item/hypospray/mkii/attack_self(mob/living/user) - if(user) - if(user.incapacitated()) - return - else if(!vial) - to_chat(user, "This Hypo needs to be loaded first!") - return - else - unload_hypo(vial,user) - -/obj/item/hypospray/mkii/verb/modes() - set name = "Toggle Application Mode" - set category = "Object" - set src in usr - var/mob/M = usr - switch(mode) - if(HYPO_SPRAY) - mode = HYPO_INJECT - to_chat(M, "[src] is now set to inject contents on application.") - if(HYPO_INJECT) - mode = HYPO_SPRAY - to_chat(M, "[src] is now set to spray contents on application.") diff --git a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm index c4c1cff1e7..df3922dc09 100644 --- a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm +++ b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm @@ -2,7 +2,7 @@ /datum/reagent/consumable/semen name = "Semen" id = "semen" - description = "Sperm from some animal. Useless for anything but insemination, really." + description = "Sperm from some animal. I bet you'll drink this out of a bucket someday." taste_description = "something salty" taste_mult = 2 //Not very overpowering flavor data = list("donor"=null,"viruses"=null,"donor_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null) @@ -39,7 +39,9 @@ add_blood_DNA(list("Non-human DNA" = "A+")) /obj/effect/decal/cleanable/semen/replace_decal(obj/effect/decal/cleanable/semen/S) - S.add_blood_DNA(return_blood_DNA()) + if(S.blood_DNA) + blood_DNA |= S.blood_DNA.Copy() + ..() /datum/reagent/consumable/femcum name = "Female Ejaculate" @@ -71,7 +73,8 @@ add_blood_DNA(list("Non-human DNA" = "A+")) /obj/effect/decal/cleanable/femcum/replace_decal(obj/effect/decal/cleanable/femcum/F) - F.add_blood_DNA(return_blood_DNA()) + if(F.blood_DNA) + blood_DNA |= F.blood_DNA.Copy() ..() /datum/reagent/consumable/femcum/reaction_turf(turf/T, reac_volume) @@ -138,16 +141,16 @@ /datum/reagent/drug/aphrodisiacplus/addiction_act_stage2(mob/living/M) if(prob(30)) - M.adjustBrainLoss(2) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2) ..() /datum/reagent/drug/aphrodisiacplus/addiction_act_stage3(mob/living/M) if(prob(30)) - M.adjustBrainLoss(3) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3) ..() /datum/reagent/drug/aphrodisiacplus/addiction_act_stage4(mob/living/M) if(prob(30)) - M.adjustBrainLoss(4) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 4) ..() /datum/reagent/drug/aphrodisiacplus/overdose_process(mob/living/M) diff --git a/modular_citadel/code/modules/research/designs/machine_designs.dm b/modular_citadel/code/modules/research/designs/machine_designs.dm deleted file mode 100644 index 6a1331dddc..0000000000 --- a/modular_citadel/code/modules/research/designs/machine_designs.dm +++ /dev/null @@ -1,6 +0,0 @@ -/datum/design/board/autoylathe - name = "Machine Design (Autoylathe)" - desc = "The circuit board for an autoylathe." - id = "autoylathe" - build_path = /obj/item/circuitboard/machine/autoylathe - category = list("Misc. Machinery") diff --git a/modular_citadel/code/modules/research/designs/weapon_designs.dm b/modular_citadel/code/modules/research/designs/weapon_designs.dm deleted file mode 100644 index b27cedbcc2..0000000000 --- a/modular_citadel/code/modules/research/designs/weapon_designs.dm +++ /dev/null @@ -1,7 +0,0 @@ -/datum/design/mag_oldsmg/rubber_mag - name = "WT-550 Semi-Auto SMG rubberbullets Magazine (4.6x30mm rubber)" - desc = "A 20 round rubber shots magazine for the out of date security WT-550 Semi-Auto SMG" - id = "mag_oldsmg_rubber" - materials = list(MAT_METAL = 6000) - build_path = /obj/item/ammo_box/magazine/wt550m9/wtrubber - departmental_flags = DEPARTMENTAL_FLAG_SECURITY diff --git a/modular_citadel/code/modules/research/designs/weapon_designs/weapon_designs.dm b/modular_citadel/code/modules/research/designs/weapon_designs/weapon_designs.dm deleted file mode 100644 index 6246b9e24e..0000000000 --- a/modular_citadel/code/modules/research/designs/weapon_designs/weapon_designs.dm +++ /dev/null @@ -1,7 +0,0 @@ -/datum/design/mag_oldsmg/tx_mag - name = "WT-550 Semi-Auto SMG Uranium Magazine (4.6x30mm TX)" - desc = "A 20 round uranium tipped magazine for the out of date security WT-550 Semi-Auto SMG." - id = "mag_oldsmg_tx" - materials = list(MAT_METAL = 6000, MAT_SILVER = 600, MAT_URANIUM = 2000) - build_path = /obj/item/ammo_box/magazine/wt550m9/wttx - departmental_flags = DEPARTMENTAL_FLAG_SECURITY diff --git a/modular_citadel/code/modules/research/designs/xenobio_designs.dm b/modular_citadel/code/modules/research/designs/xenobio_designs.dm deleted file mode 100644 index 45ed8e83a0..0000000000 --- a/modular_citadel/code/modules/research/designs/xenobio_designs.dm +++ /dev/null @@ -1,25 +0,0 @@ -/datum/design/xenobio_upgrade - name = "owo" - desc = "someone's bussin" - build_type = PROTOLATHE - materials = list(MAT_METAL = 300, MAT_GLASS = 100) - category = list("Electronics") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - -/datum/design/xenobio_upgrade/xenobiomonkeys - name = "Xenobiology console monkey upgrade disk" - desc = "This disk will add the ability to remotely recycle monkeys via the Xenobiology console." - id = "xenobio_monkeys" - build_path = /obj/item/disk/xenobio_console_upgrade/monkey - -/datum/design/xenobio_upgrade/xenobioslimebasic - name = "Xenobiology console basic slime upgrade disk" - desc = "This disk will add the ability to remotely manipulate slimes via the Xenobiology console." - id = "xenobio_slimebasic" - build_path = /obj/item/disk/xenobio_console_upgrade/slimebasic - -/datum/design/xenobio_upgrade/xenobioslimeadv - name = "Xenobiology console advanced slime upgrade disk" - desc = "This disk will add the ability to remotely feed slimes potions via the Xenobiology console, and lift the restrictions on the number of slimes that can be stored inside the Xenobiology console. This includes the contents of the basic slime upgrade disk." - id = "xenobio_slimeadv" - build_path = /obj/item/disk/xenobio_console_upgrade/slimeadv diff --git a/modular_citadel/code/modules/research/techweb/_techweb.dm b/modular_citadel/code/modules/research/techweb/_techweb.dm deleted file mode 100644 index 1c96229594..0000000000 --- a/modular_citadel/code/modules/research/techweb/_techweb.dm +++ /dev/null @@ -1,3 +0,0 @@ -/datum/techweb/specialized/autounlocking/autoylathe - design_autounlock_buildtypes = AUTOYLATHE - allowed_buildtypes = AUTOYLATHE diff --git a/modular_citadel/code/modules/research/techweb/all_nodes.dm b/modular_citadel/code/modules/research/techweb/all_nodes.dm deleted file mode 100644 index c0ddaceaf7..0000000000 --- a/modular_citadel/code/modules/research/techweb/all_nodes.dm +++ /dev/null @@ -1,36 +0,0 @@ -/datum/techweb_node/bluespace_basic/New() - . = ..() - design_ids += "xenobio_monkeys" - -/datum/techweb_node/practical_bluespace/New() - . = ..() - design_ids += "xenobio_slimebasic" - -/datum/techweb_node/adv_bluespace/New() - . = ..() - design_ids += "xenobio_slimeadv" - -/datum/techweb_node/ballistic_weapons/New() - . = ..() - design_ids += "mag_oldsmg_rubber" - -/datum/techweb_node/computer_board_gaming - id = "computer_board_gaming" - display_name = "Games and Toys" - description = "For the slackers on the station." - prereq_ids = list("comptech") - design_ids = list("arcade_battle", "arcade_orion", "arcade_minesweeper", "slotmachine", "autoylathe") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) - export_price = 5000 - -/datum/techweb_node/ballistic_weapons - design_ids = list("mag_oldsmg", "mag_oldsmg_ap", "mag_oldsmg_ic", "mag_oldsmg_tx") - -/datum/techweb_node/advanced_illegl_ballistics - id = "advanced_illegal_ballistics" - display_name = "Advanced Illegal Ballistics" - description = "Advanced Ballistic for Illegal weaponds." - design_ids = list("10mm","10mmap","10mminc","10mmhp","pistolm9mm","m45","bolt_clip") - prereq_ids = list("ballistic_weapons","syndicate_basic","explosive_weapons") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 25000) //This gives sec lethal mags/clips for guns form traitors or space. - export_price = 7000 diff --git a/modular_citadel/code/modules/research/techweb/all_nodes.dme.dm b/modular_citadel/code/modules/research/techweb/all_nodes.dme.dm deleted file mode 100644 index d968cfdcc7..0000000000 --- a/modular_citadel/code/modules/research/techweb/all_nodes.dme.dm +++ /dev/null @@ -1,33 +0,0 @@ -/datum/techweb_node/bluespace_basic/New() - . = ..() - design_ids += "xenobio_monkeys" - -/datum/techweb_node/practical_bluespace/New() - . = ..() - design_ids += "xenobio_slimebasic" - -/datum/techweb_node/adv_bluespace/New() - . = ..() - design_ids += "xenobio_slimeadv" - -/datum/techweb_node/ballistic_weapons/New() - . = ..() - design_ids += "mag_oldsmg_rubber" - -/datum/techweb_node/computer_board_gaming - id = "computer_board_gaming" - display_name = "Games and Toys" - description = "For the slackers on the station." - prereq_ids = list("comptech") - design_ids = list("arcade_battle", "arcade_orion", "slotmachine", "autoylathe") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) - export_price = 5000 - -/datum/techweb_node/advanced_illegl_ballistics - id = "advanced_illegal_ballistics" - display_name = "Advanced Illegal Ballistics - description = "Advanced Ballistic for Illegal weaponds." - design_ids = list("10mm","10mmap","10mminc","10mmhp","9mm","point_45","bolt_clip") - prereq_ids = list("ballistic_weapons","syndicate_basic","explosive_weapons") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 25000) //This gives sec lethal mags/clips for guns form traitors or space. - export_price = 7000 diff --git a/modular_citadel/code/modules/research/xenobiology/xenobio_camera.dm b/modular_citadel/code/modules/research/xenobiology/xenobio_camera.dm deleted file mode 100644 index b700626a1d..0000000000 --- a/modular_citadel/code/modules/research/xenobiology/xenobio_camera.dm +++ /dev/null @@ -1,48 +0,0 @@ -/obj/machinery/computer/camera_advanced/xenobio - max_slimes = 1 - var/upgradetier = 0 - -/obj/machinery/computer/camera_advanced/xenobio/attackby(obj/item/O, mob/user, params) - if(istype(O, /obj/item/disk/xenobio_console_upgrade)) - var/obj/item/disk/xenobio_console_upgrade/diskthing = O - var/successfulupgrade = FALSE - for(var/I in diskthing.upgradetypes) - if(upgradetier & I) - continue - else - upgradetier |= I - successfulupgrade = TRUE - if(I == XENOBIO_UPGRADE_SLIMEADV) - max_slimes = 10 - if(successfulupgrade) - to_chat(user, "You have successfully upgraded [src] with [O].") - else - to_chat(user, "[src] already has the contents of [O] installed!") - return - . = ..() - -/obj/item/disk/xenobio_console_upgrade - name = "Xenobiology console upgrade disk" - desc = "Allan please add detail." - icon_state = "datadisk5" - var/list/upgradetypes = list() - -/obj/item/disk/xenobio_console_upgrade/admin - name = "Xenobio all access thing" - desc = "'the consoles are literally useless!!!!!!!!!!!!!!!'" - upgradetypes = list(XENOBIO_UPGRADE_SLIMEBASIC, XENOBIO_UPGRADE_SLIMEADV, XENOBIO_UPGRADE_MONKEYS) - -/obj/item/disk/xenobio_console_upgrade/monkey - name = "Xenobiology console monkey upgrade disk" - desc = "This disk will add the ability to remotely recycle monkeys via the Xenobiology console." - upgradetypes = list(XENOBIO_UPGRADE_MONKEYS) - -/obj/item/disk/xenobio_console_upgrade/slimebasic - name = "Xenobiology console basic slime upgrade disk" - desc = "This disk will add the ability to remotely manipulate slimes via the Xenobiology console." - upgradetypes = list(XENOBIO_UPGRADE_SLIMEBASIC) - -/obj/item/disk/xenobio_console_upgrade/slimeadv - name = "Xenobiology console advanced slime upgrade disk" - desc = "This disk will add the ability to remotely feed slimes potions via the Xenobiology console, and lift the restrictions on the number of slimes that can be stored inside the Xenobiology console. This includes the contents of the basic slime upgrade disk." - upgradetypes = list(XENOBIO_UPGRADE_SLIMEBASIC, XENOBIO_UPGRADE_SLIMEADV) diff --git a/modular_citadel/code/modules/vehicles/secway.dm b/modular_citadel/code/modules/vehicles/secway.dm index 85c1de15e2..9320da6dc8 100644 --- a/modular_citadel/code/modules/vehicles/secway.dm +++ b/modular_citadel/code/modules/vehicles/secway.dm @@ -24,7 +24,7 @@ if(H.sprinting && charge) charge-- new_speed = chargespeed - GET_COMPONENT(D, /datum/component/riding) + var/datum/component/riding/D = GetComponent(/datum/component/riding) D.vehicle_move_delay = new_speed for(var/i in progressbars_by_rider) var/datum/progressbar/B = progressbars_by_rider[i] diff --git a/modular_citadel/icons/eutactic/item/hypereutactic.dmi b/modular_citadel/icons/eutactic/item/hypereutactic.dmi deleted file mode 100644 index 90a665f676..0000000000 Binary files a/modular_citadel/icons/eutactic/item/hypereutactic.dmi and /dev/null differ diff --git a/modular_citadel/icons/eutactic/item/noneutactic.dmi b/modular_citadel/icons/eutactic/item/noneutactic.dmi deleted file mode 100644 index 9d8b9fd1dd..0000000000 Binary files a/modular_citadel/icons/eutactic/item/noneutactic.dmi and /dev/null differ diff --git a/modular_citadel/icons/eutactic/mob/hypereutactic_left.dmi b/modular_citadel/icons/eutactic/mob/hypereutactic_left.dmi deleted file mode 100644 index ca94055113..0000000000 Binary files a/modular_citadel/icons/eutactic/mob/hypereutactic_left.dmi and /dev/null differ diff --git a/modular_citadel/icons/eutactic/mob/hypereutactic_right.dmi b/modular_citadel/icons/eutactic/mob/hypereutactic_right.dmi deleted file mode 100644 index a9b90da740..0000000000 Binary files a/modular_citadel/icons/eutactic/mob/hypereutactic_right.dmi and /dev/null differ diff --git a/modular_citadel/icons/eutactic/mob/noneutactic_left.dmi b/modular_citadel/icons/eutactic/mob/noneutactic_left.dmi deleted file mode 100644 index a426597146..0000000000 Binary files a/modular_citadel/icons/eutactic/mob/noneutactic_left.dmi and /dev/null differ diff --git a/modular_citadel/icons/eutactic/mob/noneutactic_right.dmi b/modular_citadel/icons/eutactic/mob/noneutactic_right.dmi deleted file mode 100644 index aab77c5fd4..0000000000 Binary files a/modular_citadel/icons/eutactic/mob/noneutactic_right.dmi and /dev/null differ diff --git a/modular_citadel/icons/firstaid.dmi b/modular_citadel/icons/firstaid.dmi index 8c603c8762..d061adf9f2 100644 Binary files a/modular_citadel/icons/firstaid.dmi and b/modular_citadel/icons/firstaid.dmi differ diff --git a/modular_citadel/icons/lavaknight/item/head.dmi b/modular_citadel/icons/lavaknight/item/head.dmi deleted file mode 100644 index 950d4894e9..0000000000 Binary files a/modular_citadel/icons/lavaknight/item/head.dmi and /dev/null differ diff --git a/modular_citadel/icons/lavaknight/item/suit.dmi b/modular_citadel/icons/lavaknight/item/suit.dmi deleted file mode 100644 index 49cd14b666..0000000000 Binary files a/modular_citadel/icons/lavaknight/item/suit.dmi and /dev/null differ diff --git a/modular_citadel/icons/lavaknight/mob/head.dmi b/modular_citadel/icons/lavaknight/mob/head.dmi deleted file mode 100644 index 5084c9c66f..0000000000 Binary files a/modular_citadel/icons/lavaknight/mob/head.dmi and /dev/null differ diff --git a/modular_citadel/icons/lavaknight/mob/suit.dmi b/modular_citadel/icons/lavaknight/mob/suit.dmi deleted file mode 100644 index ed51ceaaa4..0000000000 Binary files a/modular_citadel/icons/lavaknight/mob/suit.dmi and /dev/null differ diff --git a/modular_citadel/icons/misc/misc.dmi b/modular_citadel/icons/misc/misc.dmi deleted file mode 100644 index cf74d73796..0000000000 Binary files a/modular_citadel/icons/misc/misc.dmi and /dev/null differ diff --git a/modular_citadel/icons/mob/64x32_effects.dmi b/modular_citadel/icons/mob/64x32_effects.dmi index 7db65a8fc3..a11b3584a3 100644 Binary files a/modular_citadel/icons/mob/64x32_effects.dmi and b/modular_citadel/icons/mob/64x32_effects.dmi differ diff --git a/modular_citadel/icons/mob/citadel/glasses.dmi b/modular_citadel/icons/mob/citadel/glasses.dmi deleted file mode 100644 index cf74d73796..0000000000 Binary files a/modular_citadel/icons/mob/citadel/glasses.dmi and /dev/null differ diff --git a/modular_citadel/icons/mob/citadel/head.dmi b/modular_citadel/icons/mob/citadel/head.dmi deleted file mode 100644 index cf74d73796..0000000000 Binary files a/modular_citadel/icons/mob/citadel/head.dmi and /dev/null differ diff --git a/modular_citadel/icons/mob/citadel/masks.dmi b/modular_citadel/icons/mob/citadel/masks.dmi deleted file mode 100644 index cf74d73796..0000000000 Binary files a/modular_citadel/icons/mob/citadel/masks.dmi and /dev/null differ diff --git a/modular_citadel/icons/mob/citadel/shoes.dmi b/modular_citadel/icons/mob/citadel/shoes.dmi deleted file mode 100644 index cf74d73796..0000000000 Binary files a/modular_citadel/icons/mob/citadel/shoes.dmi and /dev/null differ diff --git a/modular_citadel/icons/mob/clothing/fed hats n modern.dmi b/modular_citadel/icons/mob/clothing/fed hats n modern.dmi deleted file mode 100644 index ab8682b785..0000000000 Binary files a/modular_citadel/icons/mob/clothing/fed hats n modern.dmi and /dev/null differ diff --git a/modular_citadel/icons/mob/clothing/fedcoats.dmi b/modular_citadel/icons/mob/clothing/fedcoats.dmi deleted file mode 100644 index 6554b3a45d..0000000000 Binary files a/modular_citadel/icons/mob/clothing/fedcoats.dmi and /dev/null differ diff --git a/modular_citadel/icons/mob/digishoes.dmi b/modular_citadel/icons/mob/digishoes.dmi index a499db6262..a8e6c49423 100644 Binary files a/modular_citadel/icons/mob/digishoes.dmi and b/modular_citadel/icons/mob/digishoes.dmi differ diff --git a/modular_citadel/icons/mob/mam_ears.dmi b/modular_citadel/icons/mob/mam_ears.dmi index a23716562e..fcc124c695 100644 Binary files a/modular_citadel/icons/mob/mam_ears.dmi and b/modular_citadel/icons/mob/mam_ears.dmi differ diff --git a/modular_citadel/icons/mob/mam_markings.dmi b/modular_citadel/icons/mob/mam_markings.dmi index dce56de556..d61baa4a51 100644 Binary files a/modular_citadel/icons/mob/mam_markings.dmi and b/modular_citadel/icons/mob/mam_markings.dmi differ diff --git a/modular_citadel/icons/mob/mam_snouts.dmi b/modular_citadel/icons/mob/mam_snouts.dmi index d2cb9b7286..d0f5d56314 100644 Binary files a/modular_citadel/icons/mob/mam_snouts.dmi and b/modular_citadel/icons/mob/mam_snouts.dmi differ diff --git a/modular_citadel/icons/mob/mam_tails.dmi b/modular_citadel/icons/mob/mam_tails.dmi index b16de1c0de..e4bd5119b6 100644 Binary files a/modular_citadel/icons/mob/mam_tails.dmi and b/modular_citadel/icons/mob/mam_tails.dmi differ diff --git a/modular_citadel/icons/mob/taur_canine.dmi b/modular_citadel/icons/mob/taur_canine.dmi index 0242d2e673..15d6214446 100644 Binary files a/modular_citadel/icons/mob/taur_canine.dmi and b/modular_citadel/icons/mob/taur_canine.dmi differ diff --git a/modular_citadel/icons/mob/taur_hooved.dmi b/modular_citadel/icons/mob/taur_hooved.dmi index e9860f2014..63e604b430 100644 Binary files a/modular_citadel/icons/mob/taur_hooved.dmi and b/modular_citadel/icons/mob/taur_hooved.dmi differ diff --git a/modular_citadel/icons/mob/taur_naga.dmi b/modular_citadel/icons/mob/taur_naga.dmi index 1ca4509db7..7214ec7073 100644 Binary files a/modular_citadel/icons/mob/taur_naga.dmi and b/modular_citadel/icons/mob/taur_naga.dmi differ diff --git a/modular_citadel/icons/mob/uniform_digi.dmi b/modular_citadel/icons/mob/uniform_digi.dmi index aea900d110..513ebce439 100644 Binary files a/modular_citadel/icons/mob/uniform_digi.dmi and b/modular_citadel/icons/mob/uniform_digi.dmi differ diff --git a/modular_citadel/icons/mob/werenerd.dmi b/modular_citadel/icons/mob/werenerd.dmi deleted file mode 100644 index 706d4248f8..0000000000 Binary files a/modular_citadel/icons/mob/werenerd.dmi and /dev/null differ diff --git a/modular_citadel/icons/mob/werenerdleap.dmi b/modular_citadel/icons/mob/werenerdleap.dmi deleted file mode 100644 index eb5339733b..0000000000 Binary files a/modular_citadel/icons/mob/werenerdleap.dmi and /dev/null differ diff --git a/modular_citadel/icons/obj/FermiChem.dmi b/modular_citadel/icons/obj/FermiChem.dmi deleted file mode 100644 index de7a86d574..0000000000 Binary files a/modular_citadel/icons/obj/FermiChem.dmi and /dev/null differ diff --git a/modular_citadel/icons/obj/clothing/trek_item_icon.dmi b/modular_citadel/icons/obj/clothing/trek_item_icon.dmi index ed3286615b..570acbf4cf 100644 Binary files a/modular_citadel/icons/obj/clothing/trek_item_icon.dmi and b/modular_citadel/icons/obj/clothing/trek_item_icon.dmi differ diff --git a/modular_citadel/icons/obj/guns/OVERRIDE_energy.dmi b/modular_citadel/icons/obj/guns/OVERRIDE_energy.dmi deleted file mode 100644 index 9a902e0dff..0000000000 Binary files a/modular_citadel/icons/obj/guns/OVERRIDE_energy.dmi and /dev/null differ diff --git a/modular_citadel/icons/obj/guns/energy.dmi b/modular_citadel/icons/obj/guns/energy.dmi new file mode 100644 index 0000000000..482ec04d94 Binary files /dev/null and b/modular_citadel/icons/obj/guns/energy.dmi differ diff --git a/modular_citadel/icons/obj/hypospraymkii.dmi b/modular_citadel/icons/obj/hypospraymkii.dmi deleted file mode 100755 index 3f32219d84..0000000000 Binary files a/modular_citadel/icons/obj/hypospraymkii.dmi and /dev/null differ diff --git a/modular_citadel/icons/obj/id.dmi b/modular_citadel/icons/obj/id.dmi deleted file mode 100644 index 653542e93d..0000000000 Binary files a/modular_citadel/icons/obj/id.dmi and /dev/null differ diff --git a/modular_citadel/icons/obj/modularpills.dmi b/modular_citadel/icons/obj/modularpills.dmi deleted file mode 100644 index 78095d82c0..0000000000 Binary files a/modular_citadel/icons/obj/modularpills.dmi and /dev/null differ diff --git a/modular_citadel/icons/obj/structures.dmi b/modular_citadel/icons/obj/structures.dmi deleted file mode 100644 index cf74d73796..0000000000 Binary files a/modular_citadel/icons/obj/structures.dmi and /dev/null differ diff --git a/modular_citadel/icons/obj/vial.dmi b/modular_citadel/icons/obj/vial.dmi deleted file mode 100755 index 8d1fefe470..0000000000 Binary files a/modular_citadel/icons/obj/vial.dmi and /dev/null differ diff --git a/modular_citadel/interface/skin.dmf b/modular_citadel/interface/skin.dmf index c5b5138609..025a53bdca 100644 --- a/modular_citadel/interface/skin.dmf +++ b/modular_citadel/interface/skin.dmf @@ -54,7 +54,7 @@ window "mainwindow" size = 640x440 anchor1 = none anchor2 = none - background-color = #eeeeee + background-color = #242424 is-default = true saved-params = "pos;size;is-minimized;is-maximized" icon = 'icons\\ss13_64.png' @@ -66,7 +66,7 @@ window "mainwindow" size = 637x440 anchor1 = 0,0 anchor2 = 100,100 - background-color = #eeeeee + background-color = #272727 saved-params = "splitter" left = "mapwindow" right = "infowindow" @@ -78,7 +78,7 @@ window "mainwindow" size = 200x200 anchor1 = none anchor2 = none - background-color = #ffffff + background-color = #272727 is-visible = false saved-params = "" elem "tooltip" @@ -87,7 +87,7 @@ window "mainwindow" size = 999x999 anchor1 = none anchor2 = none - background-color = #ffffff + background-color = #272727 is-visible = false saved-params = "" @@ -119,7 +119,7 @@ window "infowindow" size = 640x480 anchor1 = none anchor2 = none - background-color = #eeeeee + background-color = #242424 saved-params = "pos;size;is-minimized;is-maximized" is-pane = true elem "info" @@ -128,6 +128,7 @@ window "infowindow" size = 640x445 anchor1 = 0,0 anchor2 = 100,100 + background-color = #272727 saved-params = "splitter" left = "statwindow" right = "outputwindow" @@ -138,7 +139,8 @@ window "infowindow" size = 104x20 anchor1 = 3,0 anchor2 = 19,0 - background-color = #90b3dd + text-color = #e0e0e0 + background-color = #40628a saved-params = "is-checked" text = "Changelog" command = "changelog" @@ -148,7 +150,8 @@ window "infowindow" size = 100x20 anchor1 = 19,0 anchor2 = 34,0 - background-color = #90b3dd + text-color = #e0e0e0 + background-color = #40628a saved-params = "is-checked" text = "Rules" command = "rules" @@ -158,7 +161,8 @@ window "infowindow" size = 100x20 anchor1 = 34,0 anchor2 = 50,0 - background-color = #90b3dd + text-color = #e0e0e0 + background-color = #40628a saved-params = "is-checked" text = "Wiki" command = "wiki" @@ -168,7 +172,8 @@ window "infowindow" size = 100x20 anchor1 = 50,0 anchor2 = 66,0 - background-color = #90b3dd + text-color = #e0e0e0 + background-color = #40628a saved-params = "is-checked" text = "Forum" command = "forum" @@ -178,7 +183,8 @@ window "infowindow" size = 100x20 anchor1 = 66,0 anchor2 = 81,0 - background-color = #90b3dd + text-color = #e0e0e0 + background-color = #40628a saved-params = "is-checked" text = "GitHub" command = "github" @@ -189,7 +195,8 @@ window "infowindow" anchor1 = 81,0 anchor2 = 97,0 font-size = 8 - background-color = #ef7f7f + text-color = #e0e0e0 + background-color = #A92c2c saved-params = "is-checked" text = "Report Issue" command = "report-issue" @@ -201,7 +208,7 @@ window "outputwindow" size = 640x480 anchor1 = none anchor2 = none - background-color = #eeeeee + background-color = #272727 saved-params = "pos;size;is-minimized;is-maximized" titlebar = false statusbar = false @@ -225,7 +232,8 @@ window "outputwindow" size = 37x20 anchor1 = 100,100 anchor2 = none - background-color = #eeeeee + text-color = #e0e0e0 + background-color = #272727 saved-params = "is-checked" text = "Chat" command = ".winset \"say.is-checked=true ? input.command=\"!say \\\"\" : input.command=\"" @@ -237,7 +245,7 @@ window "outputwindow" size = 640x456 anchor1 = 0,0 anchor2 = 100,100 - background-color = #ffffff + background-color = #272727 is-visible = false is-disabled = true saved-params = "" @@ -248,6 +256,8 @@ window "outputwindow" size = 640x456 anchor1 = 0,0 anchor2 = 100,100 + text-color = #e0e0e0 + background-color = #272727 is-default = true saved-params = "" @@ -258,7 +268,7 @@ window "statwindow" size = 640x480 anchor1 = none anchor2 = none - background-color = #eeeeee + background-color = #242424 saved-params = "pos;size;is-minimized;is-maximized" is-pane = true elem "stat" @@ -267,9 +277,14 @@ window "statwindow" size = 640x480 anchor1 = 0,0 anchor2 = 100,100 + text-color = #e0e0e0 + background-color = #272727 is-default = true saved-params = "" - tab-background-color = #eeeeee + tab-text-color = #e0e0e0 + tab-background-color = #242424 + prefix-color = #e0e0e0 + suffix-color = #e0e0e0 window "preferences_window" elem "preferences_window" diff --git a/sound/FermiChem/SoundSources.txt b/sound/FermiChem/SoundSources.txt index bd45f866f5..1420814d4a 100644 --- a/sound/FermiChem/SoundSources.txt +++ b/sound/FermiChem/SoundSources.txt @@ -6,5 +6,6 @@ heatacid.ogg - from https://freesound.org/people/klankbeeld/sounds/233697/ from bubbles2.ogg from fuse.ogg bufferadd.ogg- https://freesound.org/people/toiletrolltube/sounds/181483/ +heatdamn.ogg - from https://freesound.org/people/klankbeeld/sounds/233697/ Work is licensed under the Creative Commons and Attribution License. \ No newline at end of file diff --git a/sound/FermiChem/heatdam.ogg b/sound/FermiChem/heatdam.ogg new file mode 100644 index 0000000000..ab8492e966 Binary files /dev/null and b/sound/FermiChem/heatdam.ogg differ diff --git a/sound/ambience/servicebell.ogg b/sound/ambience/servicebell.ogg new file mode 100644 index 0000000000..f55c7d5a75 Binary files /dev/null and b/sound/ambience/servicebell.ogg differ diff --git a/sound/creatures/goose1.ogg b/sound/creatures/goose1.ogg new file mode 100644 index 0000000000..3d605ad622 Binary files /dev/null and b/sound/creatures/goose1.ogg differ diff --git a/sound/creatures/goose2.ogg b/sound/creatures/goose2.ogg new file mode 100644 index 0000000000..735faba791 Binary files /dev/null and b/sound/creatures/goose2.ogg differ diff --git a/sound/creatures/goose3.ogg b/sound/creatures/goose3.ogg new file mode 100644 index 0000000000..1aeec77369 Binary files /dev/null and b/sound/creatures/goose3.ogg differ diff --git a/sound/creatures/goose4.ogg b/sound/creatures/goose4.ogg new file mode 100644 index 0000000000..699f143bd3 Binary files /dev/null and b/sound/creatures/goose4.ogg differ diff --git a/sound/spookoween/ahaha.ogg b/sound/spookoween/ahaha.ogg new file mode 100644 index 0000000000..2e830ad6c7 Binary files /dev/null and b/sound/spookoween/ahaha.ogg differ diff --git a/sound/vore/LICENSE.txt b/sound/vore/LICENSE.txt index ce95152f5d..a1e539b762 100644 --- a/sound/vore/LICENSE.txt +++ b/sound/vore/LICENSE.txt @@ -1 +1,3 @@ -Audio work within these folders are © Poojawa 2017, all rights reserved. \ No newline at end of file +Audio work within these folders are © Poojawa 2017, all rights reserved. + +Artist work by ChemicalCrux \ No newline at end of file diff --git a/sound/vore/pred/death_01.ogg b/sound/vore/pred/death_01.ogg index 63ace65beb..231884ef54 100644 Binary files a/sound/vore/pred/death_01.ogg and b/sound/vore/pred/death_01.ogg differ diff --git a/sound/vore/pred/death_02.ogg b/sound/vore/pred/death_02.ogg index 4185f6fb20..5de3e4148c 100644 Binary files a/sound/vore/pred/death_02.ogg and b/sound/vore/pred/death_02.ogg differ diff --git a/sound/vore/pred/death_03.ogg b/sound/vore/pred/death_03.ogg index a9e5d769df..4ffa271af7 100644 Binary files a/sound/vore/pred/death_03.ogg and b/sound/vore/pred/death_03.ogg differ diff --git a/sound/vore/pred/death_04.ogg b/sound/vore/pred/death_04.ogg index 4deb6d5ec8..a4c0e91be6 100644 Binary files a/sound/vore/pred/death_04.ogg and b/sound/vore/pred/death_04.ogg differ diff --git a/sound/vore/pred/death_05.ogg b/sound/vore/pred/death_05.ogg index 9c359627c3..aeec557758 100644 Binary files a/sound/vore/pred/death_05.ogg and b/sound/vore/pred/death_05.ogg differ diff --git a/sound/vore/pred/death_06.ogg b/sound/vore/pred/death_06.ogg index 3d0fd0f58c..f5b077ebd4 100644 Binary files a/sound/vore/pred/death_06.ogg and b/sound/vore/pred/death_06.ogg differ diff --git a/sound/vore/pred/death_07.ogg b/sound/vore/pred/death_07.ogg index 98454abac9..afaaab65bb 100644 Binary files a/sound/vore/pred/death_07.ogg and b/sound/vore/pred/death_07.ogg differ diff --git a/sound/vore/pred/death_08.ogg b/sound/vore/pred/death_08.ogg index 068d6b8355..b1b8479ea8 100644 Binary files a/sound/vore/pred/death_08.ogg and b/sound/vore/pred/death_08.ogg differ diff --git a/sound/vore/pred/death_09.ogg b/sound/vore/pred/death_09.ogg index a4ad821c16..1454deafad 100644 Binary files a/sound/vore/pred/death_09.ogg and b/sound/vore/pred/death_09.ogg differ diff --git a/sound/vore/pred/death_10.ogg b/sound/vore/pred/death_10.ogg index b67868442f..f0e23e1d54 100644 Binary files a/sound/vore/pred/death_10.ogg and b/sound/vore/pred/death_10.ogg differ diff --git a/sound/vore/pred/death_11.ogg b/sound/vore/pred/death_11.ogg index db125edf80..43e80467e0 100644 Binary files a/sound/vore/pred/death_11.ogg and b/sound/vore/pred/death_11.ogg differ diff --git a/sound/vore/pred/death_12.ogg b/sound/vore/pred/death_12.ogg index ab4c548744..5ec6029998 100644 Binary files a/sound/vore/pred/death_12.ogg and b/sound/vore/pred/death_12.ogg differ diff --git a/sound/vore/pred/death_13.ogg b/sound/vore/pred/death_13.ogg index 008941942f..9073bac4f2 100644 Binary files a/sound/vore/pred/death_13.ogg and b/sound/vore/pred/death_13.ogg differ diff --git a/sound/vore/pred/digest_01.ogg b/sound/vore/pred/digest_01.ogg index 09e6805e90..20b6d1d43a 100644 Binary files a/sound/vore/pred/digest_01.ogg and b/sound/vore/pred/digest_01.ogg differ diff --git a/sound/vore/pred/digest_02.ogg b/sound/vore/pred/digest_02.ogg index d6852aeb9a..7fc41e2305 100644 Binary files a/sound/vore/pred/digest_02.ogg and b/sound/vore/pred/digest_02.ogg differ diff --git a/sound/vore/pred/digest_03.ogg b/sound/vore/pred/digest_03.ogg index 9e85de831e..98b032c7cb 100644 Binary files a/sound/vore/pred/digest_03.ogg and b/sound/vore/pred/digest_03.ogg differ diff --git a/sound/vore/pred/digest_04.ogg b/sound/vore/pred/digest_04.ogg index b35da498d3..ed494e813c 100644 Binary files a/sound/vore/pred/digest_04.ogg and b/sound/vore/pred/digest_04.ogg differ diff --git a/sound/vore/pred/digest_05.ogg b/sound/vore/pred/digest_05.ogg index 60ea067a91..53bb4814f7 100644 Binary files a/sound/vore/pred/digest_05.ogg and b/sound/vore/pred/digest_05.ogg differ diff --git a/sound/vore/pred/digest_06.ogg b/sound/vore/pred/digest_06.ogg index 4dcf50b699..787c336282 100644 Binary files a/sound/vore/pred/digest_06.ogg and b/sound/vore/pred/digest_06.ogg differ diff --git a/sound/vore/pred/digest_07.ogg b/sound/vore/pred/digest_07.ogg index 4d8fefd100..f63d4c633a 100644 Binary files a/sound/vore/pred/digest_07.ogg and b/sound/vore/pred/digest_07.ogg differ diff --git a/sound/vore/pred/digest_08.ogg b/sound/vore/pred/digest_08.ogg index da8b3fa963..dbbda3b517 100644 Binary files a/sound/vore/pred/digest_08.ogg and b/sound/vore/pred/digest_08.ogg differ diff --git a/sound/vore/pred/digest_09.ogg b/sound/vore/pred/digest_09.ogg index 072efb17fb..1877f1ca05 100644 Binary files a/sound/vore/pred/digest_09.ogg and b/sound/vore/pred/digest_09.ogg differ diff --git a/sound/vore/pred/digest_10.ogg b/sound/vore/pred/digest_10.ogg index fb69e4fd1a..3e22b8b2fb 100644 Binary files a/sound/vore/pred/digest_10.ogg and b/sound/vore/pred/digest_10.ogg differ diff --git a/sound/vore/pred/digest_11.ogg b/sound/vore/pred/digest_11.ogg index 611882b6d3..089d4ee7e4 100644 Binary files a/sound/vore/pred/digest_11.ogg and b/sound/vore/pred/digest_11.ogg differ diff --git a/sound/vore/pred/digest_12.ogg b/sound/vore/pred/digest_12.ogg index c9e004afb7..76a9134646 100644 Binary files a/sound/vore/pred/digest_12.ogg and b/sound/vore/pred/digest_12.ogg differ diff --git a/sound/vore/pred/digest_13.ogg b/sound/vore/pred/digest_13.ogg index 45a9d59f52..12b1c6bb18 100644 Binary files a/sound/vore/pred/digest_13.ogg and b/sound/vore/pred/digest_13.ogg differ diff --git a/sound/vore/pred/digest_14.ogg b/sound/vore/pred/digest_14.ogg index 9815d172ca..c68231585c 100644 Binary files a/sound/vore/pred/digest_14.ogg and b/sound/vore/pred/digest_14.ogg differ diff --git a/sound/vore/pred/digest_15.ogg b/sound/vore/pred/digest_15.ogg index d2e44ecc86..32aecca35b 100644 Binary files a/sound/vore/pred/digest_15.ogg and b/sound/vore/pred/digest_15.ogg differ diff --git a/sound/vore/pred/digest_16.ogg b/sound/vore/pred/digest_16.ogg index 84faa4bd99..d112913570 100644 Binary files a/sound/vore/pred/digest_16.ogg and b/sound/vore/pred/digest_16.ogg differ diff --git a/sound/vore/pred/digest_17.ogg b/sound/vore/pred/digest_17.ogg index 0dd6fd4989..d23c4c6ddc 100644 Binary files a/sound/vore/pred/digest_17.ogg and b/sound/vore/pred/digest_17.ogg differ diff --git a/sound/vore/pred/digest_18.ogg b/sound/vore/pred/digest_18.ogg index a9fa5b51f9..ae8ac9f74f 100644 Binary files a/sound/vore/pred/digest_18.ogg and b/sound/vore/pred/digest_18.ogg differ diff --git a/sound/vore/pred/escape.ogg b/sound/vore/pred/escape.ogg index a823fc1284..fc093a5acf 100644 Binary files a/sound/vore/pred/escape.ogg and b/sound/vore/pred/escape.ogg differ diff --git a/sound/vore/pred/insertion_01.ogg b/sound/vore/pred/insertion_01.ogg index 6a8e7e3ff0..4ca8b6e425 100644 Binary files a/sound/vore/pred/insertion_01.ogg and b/sound/vore/pred/insertion_01.ogg differ diff --git a/sound/vore/pred/insertion_02.ogg b/sound/vore/pred/insertion_02.ogg index c6e4f96d94..a23cfaf201 100644 Binary files a/sound/vore/pred/insertion_02.ogg and b/sound/vore/pred/insertion_02.ogg differ diff --git a/sound/vore/pred/loop.ogg b/sound/vore/pred/loop.ogg index afd6e6003d..5f0994251a 100644 Binary files a/sound/vore/pred/loop.ogg and b/sound/vore/pred/loop.ogg differ diff --git a/sound/vore/pred/schlorp.ogg b/sound/vore/pred/schlorp.ogg index c9cd5a3413..eefb9dd71e 100644 Binary files a/sound/vore/pred/schlorp.ogg and b/sound/vore/pred/schlorp.ogg differ diff --git a/sound/vore/pred/squish _02.ogg b/sound/vore/pred/squish _02.ogg index 2e3effb4d7..846f0a2ece 100644 Binary files a/sound/vore/pred/squish _02.ogg and b/sound/vore/pred/squish _02.ogg differ diff --git a/sound/vore/pred/squish _03.ogg b/sound/vore/pred/squish _03.ogg index 24b5f9ce02..568aa81a3d 100644 Binary files a/sound/vore/pred/squish _03.ogg and b/sound/vore/pred/squish _03.ogg differ diff --git a/sound/vore/pred/squish_01.ogg b/sound/vore/pred/squish_01.ogg index 17dc83ed98..bc014b811d 100644 Binary files a/sound/vore/pred/squish_01.ogg and b/sound/vore/pred/squish_01.ogg differ diff --git a/sound/vore/pred/squish_02.ogg b/sound/vore/pred/squish_02.ogg index febc4c106e..8d92bfd19e 100644 Binary files a/sound/vore/pred/squish_02.ogg and b/sound/vore/pred/squish_02.ogg differ diff --git a/sound/vore/pred/squish_03.ogg b/sound/vore/pred/squish_03.ogg index c1b544806b..f62bf7ff60 100644 Binary files a/sound/vore/pred/squish_03.ogg and b/sound/vore/pred/squish_03.ogg differ diff --git a/sound/vore/pred/squish_04.ogg b/sound/vore/pred/squish_04.ogg index e764ba051b..47037d9a3a 100644 Binary files a/sound/vore/pred/squish_04.ogg and b/sound/vore/pred/squish_04.ogg differ diff --git a/sound/vore/pred/stomachmove.ogg b/sound/vore/pred/stomachmove.ogg index 3a9ed98dae..4e11cc03ed 100644 Binary files a/sound/vore/pred/stomachmove.ogg and b/sound/vore/pred/stomachmove.ogg differ diff --git a/sound/vore/pred/struggle_01.ogg b/sound/vore/pred/struggle_01.ogg index aea5581889..96c569b0f9 100644 Binary files a/sound/vore/pred/struggle_01.ogg and b/sound/vore/pred/struggle_01.ogg differ diff --git a/sound/vore/pred/struggle_02.ogg b/sound/vore/pred/struggle_02.ogg index 526abd0a9e..2f0d3324f1 100644 Binary files a/sound/vore/pred/struggle_02.ogg and b/sound/vore/pred/struggle_02.ogg differ diff --git a/sound/vore/pred/struggle_03.ogg b/sound/vore/pred/struggle_03.ogg index f3300a8bf3..9632817010 100644 Binary files a/sound/vore/pred/struggle_03.ogg and b/sound/vore/pred/struggle_03.ogg differ diff --git a/sound/vore/pred/struggle_04.ogg b/sound/vore/pred/struggle_04.ogg index 9efa23eaa9..7a30de3baf 100644 Binary files a/sound/vore/pred/struggle_04.ogg and b/sound/vore/pred/struggle_04.ogg differ diff --git a/sound/vore/pred/struggle_05.ogg b/sound/vore/pred/struggle_05.ogg index ec4d006880..0bae93d50f 100644 Binary files a/sound/vore/pred/struggle_05.ogg and b/sound/vore/pred/struggle_05.ogg differ diff --git a/sound/vore/pred/swallow_01.ogg b/sound/vore/pred/swallow_01.ogg index 1767daf0e8..45a0008586 100644 Binary files a/sound/vore/pred/swallow_01.ogg and b/sound/vore/pred/swallow_01.ogg differ diff --git a/sound/vore/pred/swallow_02.ogg b/sound/vore/pred/swallow_02.ogg index dd906bfad8..8f9bcb2e84 100644 Binary files a/sound/vore/pred/swallow_02.ogg and b/sound/vore/pred/swallow_02.ogg differ diff --git a/sound/vore/pred/taurswallow.ogg b/sound/vore/pred/taurswallow.ogg index 697947fb49..c700f71803 100644 Binary files a/sound/vore/pred/taurswallow.ogg and b/sound/vore/pred/taurswallow.ogg differ diff --git a/sound/vore/prey/death_01.ogg b/sound/vore/prey/death_01.ogg index fb73f520d8..539a873a7e 100644 Binary files a/sound/vore/prey/death_01.ogg and b/sound/vore/prey/death_01.ogg differ diff --git a/sound/vore/prey/death_02.ogg b/sound/vore/prey/death_02.ogg index 96a4004691..4dd1a285ea 100644 Binary files a/sound/vore/prey/death_02.ogg and b/sound/vore/prey/death_02.ogg differ diff --git a/sound/vore/prey/death_03.ogg b/sound/vore/prey/death_03.ogg index faae0c0cad..30a3622c86 100644 Binary files a/sound/vore/prey/death_03.ogg and b/sound/vore/prey/death_03.ogg differ diff --git a/sound/vore/prey/death_04.ogg b/sound/vore/prey/death_04.ogg index 7a7230e11c..ff983c2c31 100644 Binary files a/sound/vore/prey/death_04.ogg and b/sound/vore/prey/death_04.ogg differ diff --git a/sound/vore/prey/death_05.ogg b/sound/vore/prey/death_05.ogg index 91e351a62c..44b8603048 100644 Binary files a/sound/vore/prey/death_05.ogg and b/sound/vore/prey/death_05.ogg differ diff --git a/sound/vore/prey/death_06.ogg b/sound/vore/prey/death_06.ogg index 59f5f5cde9..836a4fd18c 100644 Binary files a/sound/vore/prey/death_06.ogg and b/sound/vore/prey/death_06.ogg differ diff --git a/sound/vore/prey/death_07.ogg b/sound/vore/prey/death_07.ogg index 6a8ef68561..2406fea727 100644 Binary files a/sound/vore/prey/death_07.ogg and b/sound/vore/prey/death_07.ogg differ diff --git a/sound/vore/prey/death_08.ogg b/sound/vore/prey/death_08.ogg index 1991706d94..0d7627dfae 100644 Binary files a/sound/vore/prey/death_08.ogg and b/sound/vore/prey/death_08.ogg differ diff --git a/sound/vore/prey/death_09.ogg b/sound/vore/prey/death_09.ogg index c209e5f112..fa00a29d31 100644 Binary files a/sound/vore/prey/death_09.ogg and b/sound/vore/prey/death_09.ogg differ diff --git a/sound/vore/prey/death_10.ogg b/sound/vore/prey/death_10.ogg index ccf51389f1..738e7cf909 100644 Binary files a/sound/vore/prey/death_10.ogg and b/sound/vore/prey/death_10.ogg differ diff --git a/sound/vore/prey/death_11.ogg b/sound/vore/prey/death_11.ogg index b8089d0d88..bfd47945ae 100644 Binary files a/sound/vore/prey/death_11.ogg and b/sound/vore/prey/death_11.ogg differ diff --git a/sound/vore/prey/death_12.ogg b/sound/vore/prey/death_12.ogg index b39a17b9aa..e6e800b2da 100644 Binary files a/sound/vore/prey/death_12.ogg and b/sound/vore/prey/death_12.ogg differ diff --git a/sound/vore/prey/death_13.ogg b/sound/vore/prey/death_13.ogg index 375e1ec72f..c9b79887d7 100644 Binary files a/sound/vore/prey/death_13.ogg and b/sound/vore/prey/death_13.ogg differ diff --git a/sound/vore/prey/digest_01.ogg b/sound/vore/prey/digest_01.ogg index 0340773865..a1d13f7fb7 100644 Binary files a/sound/vore/prey/digest_01.ogg and b/sound/vore/prey/digest_01.ogg differ diff --git a/sound/vore/prey/digest_02.ogg b/sound/vore/prey/digest_02.ogg index 837e894f80..443d23c194 100644 Binary files a/sound/vore/prey/digest_02.ogg and b/sound/vore/prey/digest_02.ogg differ diff --git a/sound/vore/prey/digest_03.ogg b/sound/vore/prey/digest_03.ogg index 6f5db33b78..eb798b66ff 100644 Binary files a/sound/vore/prey/digest_03.ogg and b/sound/vore/prey/digest_03.ogg differ diff --git a/sound/vore/prey/digest_04.ogg b/sound/vore/prey/digest_04.ogg index b4184cd2a9..a2c2c3e1ac 100644 Binary files a/sound/vore/prey/digest_04.ogg and b/sound/vore/prey/digest_04.ogg differ diff --git a/sound/vore/prey/digest_05.ogg b/sound/vore/prey/digest_05.ogg index 79209df1f5..752a6d48f3 100644 Binary files a/sound/vore/prey/digest_05.ogg and b/sound/vore/prey/digest_05.ogg differ diff --git a/sound/vore/prey/digest_06.ogg b/sound/vore/prey/digest_06.ogg index 193167c50d..f2e80b919f 100644 Binary files a/sound/vore/prey/digest_06.ogg and b/sound/vore/prey/digest_06.ogg differ diff --git a/sound/vore/prey/digest_07.ogg b/sound/vore/prey/digest_07.ogg index 1092c3d5e0..6a2ff70ff8 100644 Binary files a/sound/vore/prey/digest_07.ogg and b/sound/vore/prey/digest_07.ogg differ diff --git a/sound/vore/prey/digest_08.ogg b/sound/vore/prey/digest_08.ogg index ef6aa1dcab..4e55f4671d 100644 Binary files a/sound/vore/prey/digest_08.ogg and b/sound/vore/prey/digest_08.ogg differ diff --git a/sound/vore/prey/digest_09.ogg b/sound/vore/prey/digest_09.ogg index db0a07d2b8..452e6b4a2e 100644 Binary files a/sound/vore/prey/digest_09.ogg and b/sound/vore/prey/digest_09.ogg differ diff --git a/sound/vore/prey/digest_10.ogg b/sound/vore/prey/digest_10.ogg index 788350acc6..4c5dc2e333 100644 Binary files a/sound/vore/prey/digest_10.ogg and b/sound/vore/prey/digest_10.ogg differ diff --git a/sound/vore/prey/digest_11.ogg b/sound/vore/prey/digest_11.ogg index 9f00271cd3..e94c0af656 100644 Binary files a/sound/vore/prey/digest_11.ogg and b/sound/vore/prey/digest_11.ogg differ diff --git a/sound/vore/prey/digest_12.ogg b/sound/vore/prey/digest_12.ogg index 4a7e360688..cb212fed1c 100644 Binary files a/sound/vore/prey/digest_12.ogg and b/sound/vore/prey/digest_12.ogg differ diff --git a/sound/vore/prey/digest_13.ogg b/sound/vore/prey/digest_13.ogg index 890c65ab08..9fd292184e 100644 Binary files a/sound/vore/prey/digest_13.ogg and b/sound/vore/prey/digest_13.ogg differ diff --git a/sound/vore/prey/digest_14.ogg b/sound/vore/prey/digest_14.ogg index de54440ea5..24279d4712 100644 Binary files a/sound/vore/prey/digest_14.ogg and b/sound/vore/prey/digest_14.ogg differ diff --git a/sound/vore/prey/digest_15.ogg b/sound/vore/prey/digest_15.ogg index 52ad557e84..2bf555ba41 100644 Binary files a/sound/vore/prey/digest_15.ogg and b/sound/vore/prey/digest_15.ogg differ diff --git a/sound/vore/prey/digest_16.ogg b/sound/vore/prey/digest_16.ogg index f2ff139651..98edd6fb61 100644 Binary files a/sound/vore/prey/digest_16.ogg and b/sound/vore/prey/digest_16.ogg differ diff --git a/sound/vore/prey/digest_17.ogg b/sound/vore/prey/digest_17.ogg index fa8ac42ae4..2ff5c173e1 100644 Binary files a/sound/vore/prey/digest_17.ogg and b/sound/vore/prey/digest_17.ogg differ diff --git a/sound/vore/prey/digest_18.ogg b/sound/vore/prey/digest_18.ogg index f6fa631ad3..6a1ae78fb8 100644 Binary files a/sound/vore/prey/digest_18.ogg and b/sound/vore/prey/digest_18.ogg differ diff --git a/sound/vore/prey/escape.ogg b/sound/vore/prey/escape.ogg index 9947f53013..621997a56d 100644 Binary files a/sound/vore/prey/escape.ogg and b/sound/vore/prey/escape.ogg differ diff --git a/sound/vore/prey/insertion_01.ogg b/sound/vore/prey/insertion_01.ogg index e8ec89cd9e..5a3b942bb3 100644 Binary files a/sound/vore/prey/insertion_01.ogg and b/sound/vore/prey/insertion_01.ogg differ diff --git a/sound/vore/prey/insertion_02.ogg b/sound/vore/prey/insertion_02.ogg index e21b6b23e8..2d35094522 100644 Binary files a/sound/vore/prey/insertion_02.ogg and b/sound/vore/prey/insertion_02.ogg differ diff --git a/sound/vore/prey/loop.ogg b/sound/vore/prey/loop.ogg index a6a040e501..1584482d92 100644 Binary files a/sound/vore/prey/loop.ogg and b/sound/vore/prey/loop.ogg differ diff --git a/sound/vore/prey/schlorp.ogg b/sound/vore/prey/schlorp.ogg index c9cd5a3413..d1895ee26a 100644 Binary files a/sound/vore/prey/schlorp.ogg and b/sound/vore/prey/schlorp.ogg differ diff --git a/sound/vore/prey/squish_01.ogg b/sound/vore/prey/squish_01.ogg index d1b3285381..2785a4a080 100644 Binary files a/sound/vore/prey/squish_01.ogg and b/sound/vore/prey/squish_01.ogg differ diff --git a/sound/vore/prey/squish_02.ogg b/sound/vore/prey/squish_02.ogg index f754a258f4..f5671f7165 100644 Binary files a/sound/vore/prey/squish_02.ogg and b/sound/vore/prey/squish_02.ogg differ diff --git a/sound/vore/prey/squish_03.ogg b/sound/vore/prey/squish_03.ogg index 9a01dcd2e9..1e8f2bb896 100644 Binary files a/sound/vore/prey/squish_03.ogg and b/sound/vore/prey/squish_03.ogg differ diff --git a/sound/vore/prey/squish_04.ogg b/sound/vore/prey/squish_04.ogg index d7c96b5bee..2e618890a9 100644 Binary files a/sound/vore/prey/squish_04.ogg and b/sound/vore/prey/squish_04.ogg differ diff --git a/sound/vore/prey/stomachmove.ogg b/sound/vore/prey/stomachmove.ogg index 1a32c7a217..e4e004b072 100644 Binary files a/sound/vore/prey/stomachmove.ogg and b/sound/vore/prey/stomachmove.ogg differ diff --git a/sound/vore/prey/struggle_01.ogg b/sound/vore/prey/struggle_01.ogg index ca90ed4f19..de0f3ad8bd 100644 Binary files a/sound/vore/prey/struggle_01.ogg and b/sound/vore/prey/struggle_01.ogg differ diff --git a/sound/vore/prey/struggle_02.ogg b/sound/vore/prey/struggle_02.ogg index 711c488db2..2695ab0adf 100644 Binary files a/sound/vore/prey/struggle_02.ogg and b/sound/vore/prey/struggle_02.ogg differ diff --git a/sound/vore/prey/struggle_03.ogg b/sound/vore/prey/struggle_03.ogg index d7e4e5f0bb..17dd8bec8a 100644 Binary files a/sound/vore/prey/struggle_03.ogg and b/sound/vore/prey/struggle_03.ogg differ diff --git a/sound/vore/prey/struggle_04.ogg b/sound/vore/prey/struggle_04.ogg index 4e6532a0fc..8631853509 100644 Binary files a/sound/vore/prey/struggle_04.ogg and b/sound/vore/prey/struggle_04.ogg differ diff --git a/sound/vore/prey/struggle_05.ogg b/sound/vore/prey/struggle_05.ogg index 6399d69adc..233addec0b 100644 Binary files a/sound/vore/prey/struggle_05.ogg and b/sound/vore/prey/struggle_05.ogg differ diff --git a/sound/vore/prey/swallow_01.ogg b/sound/vore/prey/swallow_01.ogg index 86e14ef7af..3da3fef66a 100644 Binary files a/sound/vore/prey/swallow_01.ogg and b/sound/vore/prey/swallow_01.ogg differ diff --git a/sound/vore/prey/swallow_02.ogg b/sound/vore/prey/swallow_02.ogg index dbfad7750a..30d9a4e44d 100644 Binary files a/sound/vore/prey/swallow_02.ogg and b/sound/vore/prey/swallow_02.ogg differ diff --git a/sound/vore/prey/taurswallow.ogg b/sound/vore/prey/taurswallow.ogg index 925ac9229c..f5b5706b36 100644 Binary files a/sound/vore/prey/taurswallow.ogg and b/sound/vore/prey/taurswallow.ogg differ diff --git a/modular_citadel/sound/vox/_comma.ogg b/sound/vox/_comma.ogg similarity index 100% rename from modular_citadel/sound/vox/_comma.ogg rename to sound/vox/_comma.ogg diff --git a/modular_citadel/sound/vox/_period.ogg b/sound/vox/_period.ogg similarity index 100% rename from modular_citadel/sound/vox/_period.ogg rename to sound/vox/_period.ogg diff --git a/modular_citadel/sound/vox/a.ogg b/sound/vox/a.ogg similarity index 100% rename from modular_citadel/sound/vox/a.ogg rename to sound/vox/a.ogg diff --git a/modular_citadel/sound/vox/accelerating.ogg b/sound/vox/accelerating.ogg similarity index 100% rename from modular_citadel/sound/vox/accelerating.ogg rename to sound/vox/accelerating.ogg diff --git a/modular_citadel/sound/vox/accelerator.ogg b/sound/vox/accelerator.ogg similarity index 100% rename from modular_citadel/sound/vox/accelerator.ogg rename to sound/vox/accelerator.ogg diff --git a/modular_citadel/sound/vox/accepted.ogg b/sound/vox/accepted.ogg similarity index 100% rename from modular_citadel/sound/vox/accepted.ogg rename to sound/vox/accepted.ogg diff --git a/modular_citadel/sound/vox/access.ogg b/sound/vox/access.ogg similarity index 100% rename from modular_citadel/sound/vox/access.ogg rename to sound/vox/access.ogg diff --git a/modular_citadel/sound/vox/acknowledge.ogg b/sound/vox/acknowledge.ogg similarity index 100% rename from modular_citadel/sound/vox/acknowledge.ogg rename to sound/vox/acknowledge.ogg diff --git a/modular_citadel/sound/vox/acknowledged.ogg b/sound/vox/acknowledged.ogg similarity index 100% rename from modular_citadel/sound/vox/acknowledged.ogg rename to sound/vox/acknowledged.ogg diff --git a/modular_citadel/sound/vox/acquired.ogg b/sound/vox/acquired.ogg similarity index 100% rename from modular_citadel/sound/vox/acquired.ogg rename to sound/vox/acquired.ogg diff --git a/modular_citadel/sound/vox/acquisition.ogg b/sound/vox/acquisition.ogg similarity index 100% rename from modular_citadel/sound/vox/acquisition.ogg rename to sound/vox/acquisition.ogg diff --git a/modular_citadel/sound/vox/across.ogg b/sound/vox/across.ogg similarity index 100% rename from modular_citadel/sound/vox/across.ogg rename to sound/vox/across.ogg diff --git a/modular_citadel/sound/vox/activate.ogg b/sound/vox/activate.ogg similarity index 100% rename from modular_citadel/sound/vox/activate.ogg rename to sound/vox/activate.ogg diff --git a/modular_citadel/sound/vox/activated.ogg b/sound/vox/activated.ogg similarity index 100% rename from modular_citadel/sound/vox/activated.ogg rename to sound/vox/activated.ogg diff --git a/modular_citadel/sound/vox/activity.ogg b/sound/vox/activity.ogg similarity index 100% rename from modular_citadel/sound/vox/activity.ogg rename to sound/vox/activity.ogg diff --git a/modular_citadel/sound/vox/adios.ogg b/sound/vox/adios.ogg similarity index 100% rename from modular_citadel/sound/vox/adios.ogg rename to sound/vox/adios.ogg diff --git a/modular_citadel/sound/vox/administration.ogg b/sound/vox/administration.ogg similarity index 100% rename from modular_citadel/sound/vox/administration.ogg rename to sound/vox/administration.ogg diff --git a/modular_citadel/sound/vox/advanced.ogg b/sound/vox/advanced.ogg similarity index 100% rename from modular_citadel/sound/vox/advanced.ogg rename to sound/vox/advanced.ogg diff --git a/modular_citadel/sound/vox/after.ogg b/sound/vox/after.ogg similarity index 100% rename from modular_citadel/sound/vox/after.ogg rename to sound/vox/after.ogg diff --git a/modular_citadel/sound/vox/agent.ogg b/sound/vox/agent.ogg similarity index 100% rename from modular_citadel/sound/vox/agent.ogg rename to sound/vox/agent.ogg diff --git a/modular_citadel/sound/vox/alarm.ogg b/sound/vox/alarm.ogg similarity index 100% rename from modular_citadel/sound/vox/alarm.ogg rename to sound/vox/alarm.ogg diff --git a/modular_citadel/sound/vox/alert.ogg b/sound/vox/alert.ogg similarity index 100% rename from modular_citadel/sound/vox/alert.ogg rename to sound/vox/alert.ogg diff --git a/modular_citadel/sound/vox/alien.ogg b/sound/vox/alien.ogg similarity index 100% rename from modular_citadel/sound/vox/alien.ogg rename to sound/vox/alien.ogg diff --git a/modular_citadel/sound/vox/aligned.ogg b/sound/vox/aligned.ogg similarity index 100% rename from modular_citadel/sound/vox/aligned.ogg rename to sound/vox/aligned.ogg diff --git a/modular_citadel/sound/vox/all.ogg b/sound/vox/all.ogg similarity index 100% rename from modular_citadel/sound/vox/all.ogg rename to sound/vox/all.ogg diff --git a/modular_citadel/sound/vox/alpha.ogg b/sound/vox/alpha.ogg similarity index 100% rename from modular_citadel/sound/vox/alpha.ogg rename to sound/vox/alpha.ogg diff --git a/modular_citadel/sound/vox/am.ogg b/sound/vox/am.ogg similarity index 100% rename from modular_citadel/sound/vox/am.ogg rename to sound/vox/am.ogg diff --git a/modular_citadel/sound/vox/amigo.ogg b/sound/vox/amigo.ogg similarity index 100% rename from modular_citadel/sound/vox/amigo.ogg rename to sound/vox/amigo.ogg diff --git a/modular_citadel/sound/vox/ammunition.ogg b/sound/vox/ammunition.ogg similarity index 100% rename from modular_citadel/sound/vox/ammunition.ogg rename to sound/vox/ammunition.ogg diff --git a/modular_citadel/sound/vox/an.ogg b/sound/vox/an.ogg similarity index 100% rename from modular_citadel/sound/vox/an.ogg rename to sound/vox/an.ogg diff --git a/modular_citadel/sound/vox/and.ogg b/sound/vox/and.ogg similarity index 100% rename from modular_citadel/sound/vox/and.ogg rename to sound/vox/and.ogg diff --git a/modular_citadel/sound/vox/announcement.ogg b/sound/vox/announcement.ogg similarity index 100% rename from modular_citadel/sound/vox/announcement.ogg rename to sound/vox/announcement.ogg diff --git a/modular_citadel/sound/vox/anomalous.ogg b/sound/vox/anomalous.ogg similarity index 100% rename from modular_citadel/sound/vox/anomalous.ogg rename to sound/vox/anomalous.ogg diff --git a/modular_citadel/sound/vox/antenna.ogg b/sound/vox/antenna.ogg similarity index 100% rename from modular_citadel/sound/vox/antenna.ogg rename to sound/vox/antenna.ogg diff --git a/modular_citadel/sound/vox/any.ogg b/sound/vox/any.ogg similarity index 100% rename from modular_citadel/sound/vox/any.ogg rename to sound/vox/any.ogg diff --git a/modular_citadel/sound/vox/apprehend.ogg b/sound/vox/apprehend.ogg similarity index 100% rename from modular_citadel/sound/vox/apprehend.ogg rename to sound/vox/apprehend.ogg diff --git a/modular_citadel/sound/vox/approach.ogg b/sound/vox/approach.ogg similarity index 100% rename from modular_citadel/sound/vox/approach.ogg rename to sound/vox/approach.ogg diff --git a/modular_citadel/sound/vox/are.ogg b/sound/vox/are.ogg similarity index 100% rename from modular_citadel/sound/vox/are.ogg rename to sound/vox/are.ogg diff --git a/modular_citadel/sound/vox/area.ogg b/sound/vox/area.ogg similarity index 100% rename from modular_citadel/sound/vox/area.ogg rename to sound/vox/area.ogg diff --git a/modular_citadel/sound/vox/arm.ogg b/sound/vox/arm.ogg similarity index 100% rename from modular_citadel/sound/vox/arm.ogg rename to sound/vox/arm.ogg diff --git a/modular_citadel/sound/vox/armed.ogg b/sound/vox/armed.ogg similarity index 100% rename from modular_citadel/sound/vox/armed.ogg rename to sound/vox/armed.ogg diff --git a/modular_citadel/sound/vox/armor.ogg b/sound/vox/armor.ogg similarity index 100% rename from modular_citadel/sound/vox/armor.ogg rename to sound/vox/armor.ogg diff --git a/modular_citadel/sound/vox/armory.ogg b/sound/vox/armory.ogg similarity index 100% rename from modular_citadel/sound/vox/armory.ogg rename to sound/vox/armory.ogg diff --git a/modular_citadel/sound/vox/arrest.ogg b/sound/vox/arrest.ogg similarity index 100% rename from modular_citadel/sound/vox/arrest.ogg rename to sound/vox/arrest.ogg diff --git a/modular_citadel/sound/vox/ass.ogg b/sound/vox/ass.ogg similarity index 100% rename from modular_citadel/sound/vox/ass.ogg rename to sound/vox/ass.ogg diff --git a/modular_citadel/sound/vox/at.ogg b/sound/vox/at.ogg similarity index 100% rename from modular_citadel/sound/vox/at.ogg rename to sound/vox/at.ogg diff --git a/modular_citadel/sound/vox/atomic.ogg b/sound/vox/atomic.ogg similarity index 100% rename from modular_citadel/sound/vox/atomic.ogg rename to sound/vox/atomic.ogg diff --git a/modular_citadel/sound/vox/attention.ogg b/sound/vox/attention.ogg similarity index 100% rename from modular_citadel/sound/vox/attention.ogg rename to sound/vox/attention.ogg diff --git a/modular_citadel/sound/vox/authorize.ogg b/sound/vox/authorize.ogg similarity index 100% rename from modular_citadel/sound/vox/authorize.ogg rename to sound/vox/authorize.ogg diff --git a/modular_citadel/sound/vox/authorized.ogg b/sound/vox/authorized.ogg similarity index 100% rename from modular_citadel/sound/vox/authorized.ogg rename to sound/vox/authorized.ogg diff --git a/modular_citadel/sound/vox/automatic.ogg b/sound/vox/automatic.ogg similarity index 100% rename from modular_citadel/sound/vox/automatic.ogg rename to sound/vox/automatic.ogg diff --git a/modular_citadel/sound/vox/away.ogg b/sound/vox/away.ogg similarity index 100% rename from modular_citadel/sound/vox/away.ogg rename to sound/vox/away.ogg diff --git a/modular_citadel/sound/vox/b.ogg b/sound/vox/b.ogg similarity index 100% rename from modular_citadel/sound/vox/b.ogg rename to sound/vox/b.ogg diff --git a/modular_citadel/sound/vox/back.ogg b/sound/vox/back.ogg similarity index 100% rename from modular_citadel/sound/vox/back.ogg rename to sound/vox/back.ogg diff --git a/modular_citadel/sound/vox/backman.ogg b/sound/vox/backman.ogg similarity index 100% rename from modular_citadel/sound/vox/backman.ogg rename to sound/vox/backman.ogg diff --git a/modular_citadel/sound/vox/bad.ogg b/sound/vox/bad.ogg similarity index 100% rename from modular_citadel/sound/vox/bad.ogg rename to sound/vox/bad.ogg diff --git a/modular_citadel/sound/vox/bag.ogg b/sound/vox/bag.ogg similarity index 100% rename from modular_citadel/sound/vox/bag.ogg rename to sound/vox/bag.ogg diff --git a/modular_citadel/sound/vox/bailey.ogg b/sound/vox/bailey.ogg similarity index 100% rename from modular_citadel/sound/vox/bailey.ogg rename to sound/vox/bailey.ogg diff --git a/modular_citadel/sound/vox/barracks.ogg b/sound/vox/barracks.ogg similarity index 100% rename from modular_citadel/sound/vox/barracks.ogg rename to sound/vox/barracks.ogg diff --git a/modular_citadel/sound/vox/base.ogg b/sound/vox/base.ogg similarity index 100% rename from modular_citadel/sound/vox/base.ogg rename to sound/vox/base.ogg diff --git a/modular_citadel/sound/vox/bay.ogg b/sound/vox/bay.ogg similarity index 100% rename from modular_citadel/sound/vox/bay.ogg rename to sound/vox/bay.ogg diff --git a/modular_citadel/sound/vox/be.ogg b/sound/vox/be.ogg similarity index 100% rename from modular_citadel/sound/vox/be.ogg rename to sound/vox/be.ogg diff --git a/modular_citadel/sound/vox/been.ogg b/sound/vox/been.ogg similarity index 100% rename from modular_citadel/sound/vox/been.ogg rename to sound/vox/been.ogg diff --git a/modular_citadel/sound/vox/before.ogg b/sound/vox/before.ogg similarity index 100% rename from modular_citadel/sound/vox/before.ogg rename to sound/vox/before.ogg diff --git a/modular_citadel/sound/vox/beyond.ogg b/sound/vox/beyond.ogg similarity index 100% rename from modular_citadel/sound/vox/beyond.ogg rename to sound/vox/beyond.ogg diff --git a/modular_citadel/sound/vox/biohazard.ogg b/sound/vox/biohazard.ogg similarity index 100% rename from modular_citadel/sound/vox/biohazard.ogg rename to sound/vox/biohazard.ogg diff --git a/modular_citadel/sound/vox/biological.ogg b/sound/vox/biological.ogg similarity index 100% rename from modular_citadel/sound/vox/biological.ogg rename to sound/vox/biological.ogg diff --git a/modular_citadel/sound/vox/birdwell.ogg b/sound/vox/birdwell.ogg similarity index 100% rename from modular_citadel/sound/vox/birdwell.ogg rename to sound/vox/birdwell.ogg diff --git a/modular_citadel/sound/vox/bizwarn.ogg b/sound/vox/bizwarn.ogg similarity index 100% rename from modular_citadel/sound/vox/bizwarn.ogg rename to sound/vox/bizwarn.ogg diff --git a/modular_citadel/sound/vox/black.ogg b/sound/vox/black.ogg similarity index 100% rename from modular_citadel/sound/vox/black.ogg rename to sound/vox/black.ogg diff --git a/modular_citadel/sound/vox/blast.ogg b/sound/vox/blast.ogg similarity index 100% rename from modular_citadel/sound/vox/blast.ogg rename to sound/vox/blast.ogg diff --git a/modular_citadel/sound/vox/blocked.ogg b/sound/vox/blocked.ogg similarity index 100% rename from modular_citadel/sound/vox/blocked.ogg rename to sound/vox/blocked.ogg diff --git a/modular_citadel/sound/vox/bloop.ogg b/sound/vox/bloop.ogg similarity index 100% rename from modular_citadel/sound/vox/bloop.ogg rename to sound/vox/bloop.ogg diff --git a/modular_citadel/sound/vox/blue.ogg b/sound/vox/blue.ogg similarity index 100% rename from modular_citadel/sound/vox/blue.ogg rename to sound/vox/blue.ogg diff --git a/modular_citadel/sound/vox/bottom.ogg b/sound/vox/bottom.ogg similarity index 100% rename from modular_citadel/sound/vox/bottom.ogg rename to sound/vox/bottom.ogg diff --git a/modular_citadel/sound/vox/bravo.ogg b/sound/vox/bravo.ogg similarity index 100% rename from modular_citadel/sound/vox/bravo.ogg rename to sound/vox/bravo.ogg diff --git a/modular_citadel/sound/vox/breach.ogg b/sound/vox/breach.ogg similarity index 100% rename from modular_citadel/sound/vox/breach.ogg rename to sound/vox/breach.ogg diff --git a/modular_citadel/sound/vox/breached.ogg b/sound/vox/breached.ogg similarity index 100% rename from modular_citadel/sound/vox/breached.ogg rename to sound/vox/breached.ogg diff --git a/modular_citadel/sound/vox/break.ogg b/sound/vox/break.ogg similarity index 100% rename from modular_citadel/sound/vox/break.ogg rename to sound/vox/break.ogg diff --git a/modular_citadel/sound/vox/bridge.ogg b/sound/vox/bridge.ogg similarity index 100% rename from modular_citadel/sound/vox/bridge.ogg rename to sound/vox/bridge.ogg diff --git a/modular_citadel/sound/vox/bust.ogg b/sound/vox/bust.ogg similarity index 100% rename from modular_citadel/sound/vox/bust.ogg rename to sound/vox/bust.ogg diff --git a/modular_citadel/sound/vox/but.ogg b/sound/vox/but.ogg similarity index 100% rename from modular_citadel/sound/vox/but.ogg rename to sound/vox/but.ogg diff --git a/modular_citadel/sound/vox/button.ogg b/sound/vox/button.ogg similarity index 100% rename from modular_citadel/sound/vox/button.ogg rename to sound/vox/button.ogg diff --git a/modular_citadel/sound/vox/buzwarn.ogg b/sound/vox/buzwarn.ogg similarity index 100% rename from modular_citadel/sound/vox/buzwarn.ogg rename to sound/vox/buzwarn.ogg diff --git a/modular_citadel/sound/vox/bypass.ogg b/sound/vox/bypass.ogg similarity index 100% rename from modular_citadel/sound/vox/bypass.ogg rename to sound/vox/bypass.ogg diff --git a/modular_citadel/sound/vox/c.ogg b/sound/vox/c.ogg similarity index 100% rename from modular_citadel/sound/vox/c.ogg rename to sound/vox/c.ogg diff --git a/modular_citadel/sound/vox/cable.ogg b/sound/vox/cable.ogg similarity index 100% rename from modular_citadel/sound/vox/cable.ogg rename to sound/vox/cable.ogg diff --git a/modular_citadel/sound/vox/call.ogg b/sound/vox/call.ogg similarity index 100% rename from modular_citadel/sound/vox/call.ogg rename to sound/vox/call.ogg diff --git a/modular_citadel/sound/vox/called.ogg b/sound/vox/called.ogg similarity index 100% rename from modular_citadel/sound/vox/called.ogg rename to sound/vox/called.ogg diff --git a/modular_citadel/sound/vox/canal.ogg b/sound/vox/canal.ogg similarity index 100% rename from modular_citadel/sound/vox/canal.ogg rename to sound/vox/canal.ogg diff --git a/modular_citadel/sound/vox/cap.ogg b/sound/vox/cap.ogg similarity index 100% rename from modular_citadel/sound/vox/cap.ogg rename to sound/vox/cap.ogg diff --git a/modular_citadel/sound/vox/captain.ogg b/sound/vox/captain.ogg similarity index 100% rename from modular_citadel/sound/vox/captain.ogg rename to sound/vox/captain.ogg diff --git a/modular_citadel/sound/vox/capture.ogg b/sound/vox/capture.ogg similarity index 100% rename from modular_citadel/sound/vox/capture.ogg rename to sound/vox/capture.ogg diff --git a/modular_citadel/sound/vox/captured.ogg b/sound/vox/captured.ogg similarity index 100% rename from modular_citadel/sound/vox/captured.ogg rename to sound/vox/captured.ogg diff --git a/modular_citadel/sound/vox/ceiling.ogg b/sound/vox/ceiling.ogg similarity index 100% rename from modular_citadel/sound/vox/ceiling.ogg rename to sound/vox/ceiling.ogg diff --git a/modular_citadel/sound/vox/celsius.ogg b/sound/vox/celsius.ogg similarity index 100% rename from modular_citadel/sound/vox/celsius.ogg rename to sound/vox/celsius.ogg diff --git a/modular_citadel/sound/vox/center.ogg b/sound/vox/center.ogg similarity index 100% rename from modular_citadel/sound/vox/center.ogg rename to sound/vox/center.ogg diff --git a/modular_citadel/sound/vox/centi.ogg b/sound/vox/centi.ogg similarity index 100% rename from modular_citadel/sound/vox/centi.ogg rename to sound/vox/centi.ogg diff --git a/modular_citadel/sound/vox/central.ogg b/sound/vox/central.ogg similarity index 100% rename from modular_citadel/sound/vox/central.ogg rename to sound/vox/central.ogg diff --git a/modular_citadel/sound/vox/chamber.ogg b/sound/vox/chamber.ogg similarity index 100% rename from modular_citadel/sound/vox/chamber.ogg rename to sound/vox/chamber.ogg diff --git a/modular_citadel/sound/vox/charlie.ogg b/sound/vox/charlie.ogg similarity index 100% rename from modular_citadel/sound/vox/charlie.ogg rename to sound/vox/charlie.ogg diff --git a/modular_citadel/sound/vox/check.ogg b/sound/vox/check.ogg similarity index 100% rename from modular_citadel/sound/vox/check.ogg rename to sound/vox/check.ogg diff --git a/modular_citadel/sound/vox/checkpoint.ogg b/sound/vox/checkpoint.ogg similarity index 100% rename from modular_citadel/sound/vox/checkpoint.ogg rename to sound/vox/checkpoint.ogg diff --git a/modular_citadel/sound/vox/chemical.ogg b/sound/vox/chemical.ogg similarity index 100% rename from modular_citadel/sound/vox/chemical.ogg rename to sound/vox/chemical.ogg diff --git a/modular_citadel/sound/vox/cleanup.ogg b/sound/vox/cleanup.ogg similarity index 100% rename from modular_citadel/sound/vox/cleanup.ogg rename to sound/vox/cleanup.ogg diff --git a/modular_citadel/sound/vox/clear.ogg b/sound/vox/clear.ogg similarity index 100% rename from modular_citadel/sound/vox/clear.ogg rename to sound/vox/clear.ogg diff --git a/modular_citadel/sound/vox/clearance.ogg b/sound/vox/clearance.ogg similarity index 100% rename from modular_citadel/sound/vox/clearance.ogg rename to sound/vox/clearance.ogg diff --git a/modular_citadel/sound/vox/close.ogg b/sound/vox/close.ogg similarity index 100% rename from modular_citadel/sound/vox/close.ogg rename to sound/vox/close.ogg diff --git a/modular_citadel/sound/vox/clown.ogg b/sound/vox/clown.ogg similarity index 100% rename from modular_citadel/sound/vox/clown.ogg rename to sound/vox/clown.ogg diff --git a/modular_citadel/sound/vox/code.ogg b/sound/vox/code.ogg similarity index 100% rename from modular_citadel/sound/vox/code.ogg rename to sound/vox/code.ogg diff --git a/modular_citadel/sound/vox/coded.ogg b/sound/vox/coded.ogg similarity index 100% rename from modular_citadel/sound/vox/coded.ogg rename to sound/vox/coded.ogg diff --git a/modular_citadel/sound/vox/collider.ogg b/sound/vox/collider.ogg similarity index 100% rename from modular_citadel/sound/vox/collider.ogg rename to sound/vox/collider.ogg diff --git a/modular_citadel/sound/vox/comma.ogg b/sound/vox/comma.ogg similarity index 100% rename from modular_citadel/sound/vox/comma.ogg rename to sound/vox/comma.ogg diff --git a/modular_citadel/sound/vox/command.ogg b/sound/vox/command.ogg similarity index 100% rename from modular_citadel/sound/vox/command.ogg rename to sound/vox/command.ogg diff --git a/modular_citadel/sound/vox/communication.ogg b/sound/vox/communication.ogg similarity index 100% rename from modular_citadel/sound/vox/communication.ogg rename to sound/vox/communication.ogg diff --git a/modular_citadel/sound/vox/complex.ogg b/sound/vox/complex.ogg similarity index 100% rename from modular_citadel/sound/vox/complex.ogg rename to sound/vox/complex.ogg diff --git a/modular_citadel/sound/vox/computer.ogg b/sound/vox/computer.ogg similarity index 100% rename from modular_citadel/sound/vox/computer.ogg rename to sound/vox/computer.ogg diff --git a/modular_citadel/sound/vox/condition.ogg b/sound/vox/condition.ogg similarity index 100% rename from modular_citadel/sound/vox/condition.ogg rename to sound/vox/condition.ogg diff --git a/modular_citadel/sound/vox/containment.ogg b/sound/vox/containment.ogg similarity index 100% rename from modular_citadel/sound/vox/containment.ogg rename to sound/vox/containment.ogg diff --git a/modular_citadel/sound/vox/contamination.ogg b/sound/vox/contamination.ogg similarity index 100% rename from modular_citadel/sound/vox/contamination.ogg rename to sound/vox/contamination.ogg diff --git a/modular_citadel/sound/vox/control.ogg b/sound/vox/control.ogg similarity index 100% rename from modular_citadel/sound/vox/control.ogg rename to sound/vox/control.ogg diff --git a/modular_citadel/sound/vox/coolant.ogg b/sound/vox/coolant.ogg similarity index 100% rename from modular_citadel/sound/vox/coolant.ogg rename to sound/vox/coolant.ogg diff --git a/modular_citadel/sound/vox/coomer.ogg b/sound/vox/coomer.ogg similarity index 100% rename from modular_citadel/sound/vox/coomer.ogg rename to sound/vox/coomer.ogg diff --git a/modular_citadel/sound/vox/core.ogg b/sound/vox/core.ogg similarity index 100% rename from modular_citadel/sound/vox/core.ogg rename to sound/vox/core.ogg diff --git a/modular_citadel/sound/vox/correct.ogg b/sound/vox/correct.ogg similarity index 100% rename from modular_citadel/sound/vox/correct.ogg rename to sound/vox/correct.ogg diff --git a/modular_citadel/sound/vox/corridor.ogg b/sound/vox/corridor.ogg similarity index 100% rename from modular_citadel/sound/vox/corridor.ogg rename to sound/vox/corridor.ogg diff --git a/modular_citadel/sound/vox/crew.ogg b/sound/vox/crew.ogg similarity index 100% rename from modular_citadel/sound/vox/crew.ogg rename to sound/vox/crew.ogg diff --git a/modular_citadel/sound/vox/cross.ogg b/sound/vox/cross.ogg similarity index 100% rename from modular_citadel/sound/vox/cross.ogg rename to sound/vox/cross.ogg diff --git a/modular_citadel/sound/vox/cryogenic.ogg b/sound/vox/cryogenic.ogg similarity index 100% rename from modular_citadel/sound/vox/cryogenic.ogg rename to sound/vox/cryogenic.ogg diff --git a/modular_citadel/sound/vox/d.ogg b/sound/vox/d.ogg similarity index 100% rename from modular_citadel/sound/vox/d.ogg rename to sound/vox/d.ogg diff --git a/modular_citadel/sound/vox/dadeda.ogg b/sound/vox/dadeda.ogg similarity index 100% rename from modular_citadel/sound/vox/dadeda.ogg rename to sound/vox/dadeda.ogg diff --git a/modular_citadel/sound/vox/damage.ogg b/sound/vox/damage.ogg similarity index 100% rename from modular_citadel/sound/vox/damage.ogg rename to sound/vox/damage.ogg diff --git a/modular_citadel/sound/vox/damaged.ogg b/sound/vox/damaged.ogg similarity index 100% rename from modular_citadel/sound/vox/damaged.ogg rename to sound/vox/damaged.ogg diff --git a/modular_citadel/sound/vox/danger.ogg b/sound/vox/danger.ogg similarity index 100% rename from modular_citadel/sound/vox/danger.ogg rename to sound/vox/danger.ogg diff --git a/modular_citadel/sound/vox/day.ogg b/sound/vox/day.ogg similarity index 100% rename from modular_citadel/sound/vox/day.ogg rename to sound/vox/day.ogg diff --git a/modular_citadel/sound/vox/deactivated.ogg b/sound/vox/deactivated.ogg similarity index 100% rename from modular_citadel/sound/vox/deactivated.ogg rename to sound/vox/deactivated.ogg diff --git a/modular_citadel/sound/vox/decompression.ogg b/sound/vox/decompression.ogg similarity index 100% rename from modular_citadel/sound/vox/decompression.ogg rename to sound/vox/decompression.ogg diff --git a/modular_citadel/sound/vox/decontamination.ogg b/sound/vox/decontamination.ogg similarity index 100% rename from modular_citadel/sound/vox/decontamination.ogg rename to sound/vox/decontamination.ogg diff --git a/modular_citadel/sound/vox/deeoo.ogg b/sound/vox/deeoo.ogg similarity index 100% rename from modular_citadel/sound/vox/deeoo.ogg rename to sound/vox/deeoo.ogg diff --git a/modular_citadel/sound/vox/defense.ogg b/sound/vox/defense.ogg similarity index 100% rename from modular_citadel/sound/vox/defense.ogg rename to sound/vox/defense.ogg diff --git a/modular_citadel/sound/vox/degrees.ogg b/sound/vox/degrees.ogg similarity index 100% rename from modular_citadel/sound/vox/degrees.ogg rename to sound/vox/degrees.ogg diff --git a/modular_citadel/sound/vox/delta.ogg b/sound/vox/delta.ogg similarity index 100% rename from modular_citadel/sound/vox/delta.ogg rename to sound/vox/delta.ogg diff --git a/modular_citadel/sound/vox/denied.ogg b/sound/vox/denied.ogg similarity index 100% rename from modular_citadel/sound/vox/denied.ogg rename to sound/vox/denied.ogg diff --git a/modular_citadel/sound/vox/deploy.ogg b/sound/vox/deploy.ogg similarity index 100% rename from modular_citadel/sound/vox/deploy.ogg rename to sound/vox/deploy.ogg diff --git a/modular_citadel/sound/vox/deployed.ogg b/sound/vox/deployed.ogg similarity index 100% rename from modular_citadel/sound/vox/deployed.ogg rename to sound/vox/deployed.ogg diff --git a/modular_citadel/sound/vox/destroy.ogg b/sound/vox/destroy.ogg similarity index 100% rename from modular_citadel/sound/vox/destroy.ogg rename to sound/vox/destroy.ogg diff --git a/modular_citadel/sound/vox/destroyed.ogg b/sound/vox/destroyed.ogg similarity index 100% rename from modular_citadel/sound/vox/destroyed.ogg rename to sound/vox/destroyed.ogg diff --git a/modular_citadel/sound/vox/detain.ogg b/sound/vox/detain.ogg similarity index 100% rename from modular_citadel/sound/vox/detain.ogg rename to sound/vox/detain.ogg diff --git a/modular_citadel/sound/vox/detected.ogg b/sound/vox/detected.ogg similarity index 100% rename from modular_citadel/sound/vox/detected.ogg rename to sound/vox/detected.ogg diff --git a/modular_citadel/sound/vox/detonation.ogg b/sound/vox/detonation.ogg similarity index 100% rename from modular_citadel/sound/vox/detonation.ogg rename to sound/vox/detonation.ogg diff --git a/modular_citadel/sound/vox/device.ogg b/sound/vox/device.ogg similarity index 100% rename from modular_citadel/sound/vox/device.ogg rename to sound/vox/device.ogg diff --git a/modular_citadel/sound/vox/did.ogg b/sound/vox/did.ogg similarity index 100% rename from modular_citadel/sound/vox/did.ogg rename to sound/vox/did.ogg diff --git a/modular_citadel/sound/vox/die.ogg b/sound/vox/die.ogg similarity index 100% rename from modular_citadel/sound/vox/die.ogg rename to sound/vox/die.ogg diff --git a/modular_citadel/sound/vox/dimensional.ogg b/sound/vox/dimensional.ogg similarity index 100% rename from modular_citadel/sound/vox/dimensional.ogg rename to sound/vox/dimensional.ogg diff --git a/modular_citadel/sound/vox/dirt.ogg b/sound/vox/dirt.ogg similarity index 100% rename from modular_citadel/sound/vox/dirt.ogg rename to sound/vox/dirt.ogg diff --git a/modular_citadel/sound/vox/disengaged.ogg b/sound/vox/disengaged.ogg similarity index 100% rename from modular_citadel/sound/vox/disengaged.ogg rename to sound/vox/disengaged.ogg diff --git a/modular_citadel/sound/vox/dish.ogg b/sound/vox/dish.ogg similarity index 100% rename from modular_citadel/sound/vox/dish.ogg rename to sound/vox/dish.ogg diff --git a/modular_citadel/sound/vox/disposal.ogg b/sound/vox/disposal.ogg similarity index 100% rename from modular_citadel/sound/vox/disposal.ogg rename to sound/vox/disposal.ogg diff --git a/modular_citadel/sound/vox/distance.ogg b/sound/vox/distance.ogg similarity index 100% rename from modular_citadel/sound/vox/distance.ogg rename to sound/vox/distance.ogg diff --git a/modular_citadel/sound/vox/distortion.ogg b/sound/vox/distortion.ogg similarity index 100% rename from modular_citadel/sound/vox/distortion.ogg rename to sound/vox/distortion.ogg diff --git a/modular_citadel/sound/vox/do.ogg b/sound/vox/do.ogg similarity index 100% rename from modular_citadel/sound/vox/do.ogg rename to sound/vox/do.ogg diff --git a/modular_citadel/sound/vox/doctor.ogg b/sound/vox/doctor.ogg similarity index 100% rename from modular_citadel/sound/vox/doctor.ogg rename to sound/vox/doctor.ogg diff --git a/modular_citadel/sound/vox/doop.ogg b/sound/vox/doop.ogg similarity index 100% rename from modular_citadel/sound/vox/doop.ogg rename to sound/vox/doop.ogg diff --git a/modular_citadel/sound/vox/door.ogg b/sound/vox/door.ogg similarity index 100% rename from modular_citadel/sound/vox/door.ogg rename to sound/vox/door.ogg diff --git a/modular_citadel/sound/vox/down.ogg b/sound/vox/down.ogg similarity index 100% rename from modular_citadel/sound/vox/down.ogg rename to sound/vox/down.ogg diff --git a/modular_citadel/sound/vox/dual.ogg b/sound/vox/dual.ogg similarity index 100% rename from modular_citadel/sound/vox/dual.ogg rename to sound/vox/dual.ogg diff --git a/modular_citadel/sound/vox/duct.ogg b/sound/vox/duct.ogg similarity index 100% rename from modular_citadel/sound/vox/duct.ogg rename to sound/vox/duct.ogg diff --git a/modular_citadel/sound/vox/e.ogg b/sound/vox/e.ogg similarity index 100% rename from modular_citadel/sound/vox/e.ogg rename to sound/vox/e.ogg diff --git a/modular_citadel/sound/vox/east.ogg b/sound/vox/east.ogg similarity index 100% rename from modular_citadel/sound/vox/east.ogg rename to sound/vox/east.ogg diff --git a/modular_citadel/sound/vox/echo.ogg b/sound/vox/echo.ogg similarity index 100% rename from modular_citadel/sound/vox/echo.ogg rename to sound/vox/echo.ogg diff --git a/modular_citadel/sound/vox/ed.ogg b/sound/vox/ed.ogg similarity index 100% rename from modular_citadel/sound/vox/ed.ogg rename to sound/vox/ed.ogg diff --git a/modular_citadel/sound/vox/effect.ogg b/sound/vox/effect.ogg similarity index 100% rename from modular_citadel/sound/vox/effect.ogg rename to sound/vox/effect.ogg diff --git a/modular_citadel/sound/vox/egress.ogg b/sound/vox/egress.ogg similarity index 100% rename from modular_citadel/sound/vox/egress.ogg rename to sound/vox/egress.ogg diff --git a/modular_citadel/sound/vox/eight.ogg b/sound/vox/eight.ogg similarity index 100% rename from modular_citadel/sound/vox/eight.ogg rename to sound/vox/eight.ogg diff --git a/modular_citadel/sound/vox/eighteen.ogg b/sound/vox/eighteen.ogg similarity index 100% rename from modular_citadel/sound/vox/eighteen.ogg rename to sound/vox/eighteen.ogg diff --git a/modular_citadel/sound/vox/eighty.ogg b/sound/vox/eighty.ogg similarity index 100% rename from modular_citadel/sound/vox/eighty.ogg rename to sound/vox/eighty.ogg diff --git a/modular_citadel/sound/vox/electric.ogg b/sound/vox/electric.ogg similarity index 100% rename from modular_citadel/sound/vox/electric.ogg rename to sound/vox/electric.ogg diff --git a/modular_citadel/sound/vox/electromagnetic.ogg b/sound/vox/electromagnetic.ogg similarity index 100% rename from modular_citadel/sound/vox/electromagnetic.ogg rename to sound/vox/electromagnetic.ogg diff --git a/modular_citadel/sound/vox/elevator.ogg b/sound/vox/elevator.ogg similarity index 100% rename from modular_citadel/sound/vox/elevator.ogg rename to sound/vox/elevator.ogg diff --git a/modular_citadel/sound/vox/eleven.ogg b/sound/vox/eleven.ogg similarity index 100% rename from modular_citadel/sound/vox/eleven.ogg rename to sound/vox/eleven.ogg diff --git a/modular_citadel/sound/vox/eliminate.ogg b/sound/vox/eliminate.ogg similarity index 100% rename from modular_citadel/sound/vox/eliminate.ogg rename to sound/vox/eliminate.ogg diff --git a/modular_citadel/sound/vox/emergency.ogg b/sound/vox/emergency.ogg similarity index 100% rename from modular_citadel/sound/vox/emergency.ogg rename to sound/vox/emergency.ogg diff --git a/modular_citadel/sound/vox/enemy.ogg b/sound/vox/enemy.ogg similarity index 100% rename from modular_citadel/sound/vox/enemy.ogg rename to sound/vox/enemy.ogg diff --git a/modular_citadel/sound/vox/energy.ogg b/sound/vox/energy.ogg similarity index 100% rename from modular_citadel/sound/vox/energy.ogg rename to sound/vox/energy.ogg diff --git a/modular_citadel/sound/vox/engage.ogg b/sound/vox/engage.ogg similarity index 100% rename from modular_citadel/sound/vox/engage.ogg rename to sound/vox/engage.ogg diff --git a/modular_citadel/sound/vox/engaged.ogg b/sound/vox/engaged.ogg similarity index 100% rename from modular_citadel/sound/vox/engaged.ogg rename to sound/vox/engaged.ogg diff --git a/modular_citadel/sound/vox/engine.ogg b/sound/vox/engine.ogg similarity index 100% rename from modular_citadel/sound/vox/engine.ogg rename to sound/vox/engine.ogg diff --git a/modular_citadel/sound/vox/enter.ogg b/sound/vox/enter.ogg similarity index 100% rename from modular_citadel/sound/vox/enter.ogg rename to sound/vox/enter.ogg diff --git a/modular_citadel/sound/vox/entry.ogg b/sound/vox/entry.ogg similarity index 100% rename from modular_citadel/sound/vox/entry.ogg rename to sound/vox/entry.ogg diff --git a/modular_citadel/sound/vox/environment.ogg b/sound/vox/environment.ogg similarity index 100% rename from modular_citadel/sound/vox/environment.ogg rename to sound/vox/environment.ogg diff --git a/modular_citadel/sound/vox/error.ogg b/sound/vox/error.ogg similarity index 100% rename from modular_citadel/sound/vox/error.ogg rename to sound/vox/error.ogg diff --git a/modular_citadel/sound/vox/escape.ogg b/sound/vox/escape.ogg similarity index 100% rename from modular_citadel/sound/vox/escape.ogg rename to sound/vox/escape.ogg diff --git a/modular_citadel/sound/vox/evacuate.ogg b/sound/vox/evacuate.ogg similarity index 100% rename from modular_citadel/sound/vox/evacuate.ogg rename to sound/vox/evacuate.ogg diff --git a/modular_citadel/sound/vox/exchange.ogg b/sound/vox/exchange.ogg similarity index 100% rename from modular_citadel/sound/vox/exchange.ogg rename to sound/vox/exchange.ogg diff --git a/modular_citadel/sound/vox/exit.ogg b/sound/vox/exit.ogg similarity index 100% rename from modular_citadel/sound/vox/exit.ogg rename to sound/vox/exit.ogg diff --git a/modular_citadel/sound/vox/expect.ogg b/sound/vox/expect.ogg similarity index 100% rename from modular_citadel/sound/vox/expect.ogg rename to sound/vox/expect.ogg diff --git a/modular_citadel/sound/vox/experiment.ogg b/sound/vox/experiment.ogg similarity index 100% rename from modular_citadel/sound/vox/experiment.ogg rename to sound/vox/experiment.ogg diff --git a/modular_citadel/sound/vox/experimental.ogg b/sound/vox/experimental.ogg similarity index 100% rename from modular_citadel/sound/vox/experimental.ogg rename to sound/vox/experimental.ogg diff --git a/modular_citadel/sound/vox/explode.ogg b/sound/vox/explode.ogg similarity index 100% rename from modular_citadel/sound/vox/explode.ogg rename to sound/vox/explode.ogg diff --git a/modular_citadel/sound/vox/explosion.ogg b/sound/vox/explosion.ogg similarity index 100% rename from modular_citadel/sound/vox/explosion.ogg rename to sound/vox/explosion.ogg diff --git a/modular_citadel/sound/vox/exposure.ogg b/sound/vox/exposure.ogg similarity index 100% rename from modular_citadel/sound/vox/exposure.ogg rename to sound/vox/exposure.ogg diff --git a/modular_citadel/sound/vox/exterminate.ogg b/sound/vox/exterminate.ogg similarity index 100% rename from modular_citadel/sound/vox/exterminate.ogg rename to sound/vox/exterminate.ogg diff --git a/modular_citadel/sound/vox/extinguish.ogg b/sound/vox/extinguish.ogg similarity index 100% rename from modular_citadel/sound/vox/extinguish.ogg rename to sound/vox/extinguish.ogg diff --git a/modular_citadel/sound/vox/extinguisher.ogg b/sound/vox/extinguisher.ogg similarity index 100% rename from modular_citadel/sound/vox/extinguisher.ogg rename to sound/vox/extinguisher.ogg diff --git a/modular_citadel/sound/vox/extreme.ogg b/sound/vox/extreme.ogg similarity index 100% rename from modular_citadel/sound/vox/extreme.ogg rename to sound/vox/extreme.ogg diff --git a/modular_citadel/sound/vox/f.ogg b/sound/vox/f.ogg similarity index 100% rename from modular_citadel/sound/vox/f.ogg rename to sound/vox/f.ogg diff --git a/modular_citadel/sound/vox/face.ogg b/sound/vox/face.ogg similarity index 100% rename from modular_citadel/sound/vox/face.ogg rename to sound/vox/face.ogg diff --git a/modular_citadel/sound/vox/facility.ogg b/sound/vox/facility.ogg similarity index 100% rename from modular_citadel/sound/vox/facility.ogg rename to sound/vox/facility.ogg diff --git a/modular_citadel/sound/vox/fahrenheit.ogg b/sound/vox/fahrenheit.ogg similarity index 100% rename from modular_citadel/sound/vox/fahrenheit.ogg rename to sound/vox/fahrenheit.ogg diff --git a/modular_citadel/sound/vox/failed.ogg b/sound/vox/failed.ogg similarity index 100% rename from modular_citadel/sound/vox/failed.ogg rename to sound/vox/failed.ogg diff --git a/modular_citadel/sound/vox/failure.ogg b/sound/vox/failure.ogg similarity index 100% rename from modular_citadel/sound/vox/failure.ogg rename to sound/vox/failure.ogg diff --git a/modular_citadel/sound/vox/farthest.ogg b/sound/vox/farthest.ogg similarity index 100% rename from modular_citadel/sound/vox/farthest.ogg rename to sound/vox/farthest.ogg diff --git a/modular_citadel/sound/vox/fast.ogg b/sound/vox/fast.ogg similarity index 100% rename from modular_citadel/sound/vox/fast.ogg rename to sound/vox/fast.ogg diff --git a/modular_citadel/sound/vox/feet.ogg b/sound/vox/feet.ogg similarity index 100% rename from modular_citadel/sound/vox/feet.ogg rename to sound/vox/feet.ogg diff --git a/modular_citadel/sound/vox/field.ogg b/sound/vox/field.ogg similarity index 100% rename from modular_citadel/sound/vox/field.ogg rename to sound/vox/field.ogg diff --git a/modular_citadel/sound/vox/fifteen.ogg b/sound/vox/fifteen.ogg similarity index 100% rename from modular_citadel/sound/vox/fifteen.ogg rename to sound/vox/fifteen.ogg diff --git a/modular_citadel/sound/vox/fifth.ogg b/sound/vox/fifth.ogg similarity index 100% rename from modular_citadel/sound/vox/fifth.ogg rename to sound/vox/fifth.ogg diff --git a/modular_citadel/sound/vox/fifty.ogg b/sound/vox/fifty.ogg similarity index 100% rename from modular_citadel/sound/vox/fifty.ogg rename to sound/vox/fifty.ogg diff --git a/modular_citadel/sound/vox/final.ogg b/sound/vox/final.ogg similarity index 100% rename from modular_citadel/sound/vox/final.ogg rename to sound/vox/final.ogg diff --git a/modular_citadel/sound/vox/fine.ogg b/sound/vox/fine.ogg similarity index 100% rename from modular_citadel/sound/vox/fine.ogg rename to sound/vox/fine.ogg diff --git a/modular_citadel/sound/vox/fire.ogg b/sound/vox/fire.ogg similarity index 100% rename from modular_citadel/sound/vox/fire.ogg rename to sound/vox/fire.ogg diff --git a/modular_citadel/sound/vox/first.ogg b/sound/vox/first.ogg similarity index 100% rename from modular_citadel/sound/vox/first.ogg rename to sound/vox/first.ogg diff --git a/modular_citadel/sound/vox/five.ogg b/sound/vox/five.ogg similarity index 100% rename from modular_citadel/sound/vox/five.ogg rename to sound/vox/five.ogg diff --git a/modular_citadel/sound/vox/flag.ogg b/sound/vox/flag.ogg similarity index 100% rename from modular_citadel/sound/vox/flag.ogg rename to sound/vox/flag.ogg diff --git a/modular_citadel/sound/vox/flooding.ogg b/sound/vox/flooding.ogg similarity index 100% rename from modular_citadel/sound/vox/flooding.ogg rename to sound/vox/flooding.ogg diff --git a/modular_citadel/sound/vox/floor.ogg b/sound/vox/floor.ogg similarity index 100% rename from modular_citadel/sound/vox/floor.ogg rename to sound/vox/floor.ogg diff --git a/modular_citadel/sound/vox/fool.ogg b/sound/vox/fool.ogg similarity index 100% rename from modular_citadel/sound/vox/fool.ogg rename to sound/vox/fool.ogg diff --git a/modular_citadel/sound/vox/for.ogg b/sound/vox/for.ogg similarity index 100% rename from modular_citadel/sound/vox/for.ogg rename to sound/vox/for.ogg diff --git a/modular_citadel/sound/vox/forbidden.ogg b/sound/vox/forbidden.ogg similarity index 100% rename from modular_citadel/sound/vox/forbidden.ogg rename to sound/vox/forbidden.ogg diff --git a/modular_citadel/sound/vox/force.ogg b/sound/vox/force.ogg similarity index 100% rename from modular_citadel/sound/vox/force.ogg rename to sound/vox/force.ogg diff --git a/modular_citadel/sound/vox/forms.ogg b/sound/vox/forms.ogg similarity index 100% rename from modular_citadel/sound/vox/forms.ogg rename to sound/vox/forms.ogg diff --git a/modular_citadel/sound/vox/found.ogg b/sound/vox/found.ogg similarity index 100% rename from modular_citadel/sound/vox/found.ogg rename to sound/vox/found.ogg diff --git a/modular_citadel/sound/vox/four.ogg b/sound/vox/four.ogg similarity index 100% rename from modular_citadel/sound/vox/four.ogg rename to sound/vox/four.ogg diff --git a/modular_citadel/sound/vox/fourteen.ogg b/sound/vox/fourteen.ogg similarity index 100% rename from modular_citadel/sound/vox/fourteen.ogg rename to sound/vox/fourteen.ogg diff --git a/modular_citadel/sound/vox/fourth.ogg b/sound/vox/fourth.ogg similarity index 100% rename from modular_citadel/sound/vox/fourth.ogg rename to sound/vox/fourth.ogg diff --git a/modular_citadel/sound/vox/fourty.ogg b/sound/vox/fourty.ogg similarity index 100% rename from modular_citadel/sound/vox/fourty.ogg rename to sound/vox/fourty.ogg diff --git a/modular_citadel/sound/vox/foxtrot.ogg b/sound/vox/foxtrot.ogg similarity index 100% rename from modular_citadel/sound/vox/foxtrot.ogg rename to sound/vox/foxtrot.ogg diff --git a/modular_citadel/sound/vox/freeman.ogg b/sound/vox/freeman.ogg similarity index 100% rename from modular_citadel/sound/vox/freeman.ogg rename to sound/vox/freeman.ogg diff --git a/modular_citadel/sound/vox/freezer.ogg b/sound/vox/freezer.ogg similarity index 100% rename from modular_citadel/sound/vox/freezer.ogg rename to sound/vox/freezer.ogg diff --git a/modular_citadel/sound/vox/from.ogg b/sound/vox/from.ogg similarity index 100% rename from modular_citadel/sound/vox/from.ogg rename to sound/vox/from.ogg diff --git a/modular_citadel/sound/vox/front.ogg b/sound/vox/front.ogg similarity index 100% rename from modular_citadel/sound/vox/front.ogg rename to sound/vox/front.ogg diff --git a/modular_citadel/sound/vox/fuel.ogg b/sound/vox/fuel.ogg similarity index 100% rename from modular_citadel/sound/vox/fuel.ogg rename to sound/vox/fuel.ogg diff --git a/modular_citadel/sound/vox/g.ogg b/sound/vox/g.ogg similarity index 100% rename from modular_citadel/sound/vox/g.ogg rename to sound/vox/g.ogg diff --git a/modular_citadel/sound/vox/gay.ogg b/sound/vox/gay.ogg similarity index 100% rename from modular_citadel/sound/vox/gay.ogg rename to sound/vox/gay.ogg diff --git a/modular_citadel/sound/vox/get.ogg b/sound/vox/get.ogg similarity index 100% rename from modular_citadel/sound/vox/get.ogg rename to sound/vox/get.ogg diff --git a/modular_citadel/sound/vox/go.ogg b/sound/vox/go.ogg similarity index 100% rename from modular_citadel/sound/vox/go.ogg rename to sound/vox/go.ogg diff --git a/modular_citadel/sound/vox/going.ogg b/sound/vox/going.ogg similarity index 100% rename from modular_citadel/sound/vox/going.ogg rename to sound/vox/going.ogg diff --git a/modular_citadel/sound/vox/good.ogg b/sound/vox/good.ogg similarity index 100% rename from modular_citadel/sound/vox/good.ogg rename to sound/vox/good.ogg diff --git a/modular_citadel/sound/vox/goodbye.ogg b/sound/vox/goodbye.ogg similarity index 100% rename from modular_citadel/sound/vox/goodbye.ogg rename to sound/vox/goodbye.ogg diff --git a/modular_citadel/sound/vox/gordon.ogg b/sound/vox/gordon.ogg similarity index 100% rename from modular_citadel/sound/vox/gordon.ogg rename to sound/vox/gordon.ogg diff --git a/modular_citadel/sound/vox/got.ogg b/sound/vox/got.ogg similarity index 100% rename from modular_citadel/sound/vox/got.ogg rename to sound/vox/got.ogg diff --git a/modular_citadel/sound/vox/government.ogg b/sound/vox/government.ogg similarity index 100% rename from modular_citadel/sound/vox/government.ogg rename to sound/vox/government.ogg diff --git a/modular_citadel/sound/vox/granted.ogg b/sound/vox/granted.ogg similarity index 100% rename from modular_citadel/sound/vox/granted.ogg rename to sound/vox/granted.ogg diff --git a/modular_citadel/sound/vox/great.ogg b/sound/vox/great.ogg similarity index 100% rename from modular_citadel/sound/vox/great.ogg rename to sound/vox/great.ogg diff --git a/modular_citadel/sound/vox/green.ogg b/sound/vox/green.ogg similarity index 100% rename from modular_citadel/sound/vox/green.ogg rename to sound/vox/green.ogg diff --git a/modular_citadel/sound/vox/grenade.ogg b/sound/vox/grenade.ogg similarity index 100% rename from modular_citadel/sound/vox/grenade.ogg rename to sound/vox/grenade.ogg diff --git a/modular_citadel/sound/vox/guard.ogg b/sound/vox/guard.ogg similarity index 100% rename from modular_citadel/sound/vox/guard.ogg rename to sound/vox/guard.ogg diff --git a/modular_citadel/sound/vox/gulf.ogg b/sound/vox/gulf.ogg similarity index 100% rename from modular_citadel/sound/vox/gulf.ogg rename to sound/vox/gulf.ogg diff --git a/modular_citadel/sound/vox/gun.ogg b/sound/vox/gun.ogg similarity index 100% rename from modular_citadel/sound/vox/gun.ogg rename to sound/vox/gun.ogg diff --git a/modular_citadel/sound/vox/guthrie.ogg b/sound/vox/guthrie.ogg similarity index 100% rename from modular_citadel/sound/vox/guthrie.ogg rename to sound/vox/guthrie.ogg diff --git a/modular_citadel/sound/vox/handling.ogg b/sound/vox/handling.ogg similarity index 100% rename from modular_citadel/sound/vox/handling.ogg rename to sound/vox/handling.ogg diff --git a/modular_citadel/sound/vox/hangar.ogg b/sound/vox/hangar.ogg similarity index 100% rename from modular_citadel/sound/vox/hangar.ogg rename to sound/vox/hangar.ogg diff --git a/modular_citadel/sound/vox/has.ogg b/sound/vox/has.ogg similarity index 100% rename from modular_citadel/sound/vox/has.ogg rename to sound/vox/has.ogg diff --git a/modular_citadel/sound/vox/have.ogg b/sound/vox/have.ogg similarity index 100% rename from modular_citadel/sound/vox/have.ogg rename to sound/vox/have.ogg diff --git a/modular_citadel/sound/vox/hazard.ogg b/sound/vox/hazard.ogg similarity index 100% rename from modular_citadel/sound/vox/hazard.ogg rename to sound/vox/hazard.ogg diff --git a/modular_citadel/sound/vox/head.ogg b/sound/vox/head.ogg similarity index 100% rename from modular_citadel/sound/vox/head.ogg rename to sound/vox/head.ogg diff --git a/modular_citadel/sound/vox/health.ogg b/sound/vox/health.ogg similarity index 100% rename from modular_citadel/sound/vox/health.ogg rename to sound/vox/health.ogg diff --git a/modular_citadel/sound/vox/heat.ogg b/sound/vox/heat.ogg similarity index 100% rename from modular_citadel/sound/vox/heat.ogg rename to sound/vox/heat.ogg diff --git a/modular_citadel/sound/vox/helicopter.ogg b/sound/vox/helicopter.ogg similarity index 100% rename from modular_citadel/sound/vox/helicopter.ogg rename to sound/vox/helicopter.ogg diff --git a/modular_citadel/sound/vox/helium.ogg b/sound/vox/helium.ogg similarity index 100% rename from modular_citadel/sound/vox/helium.ogg rename to sound/vox/helium.ogg diff --git a/modular_citadel/sound/vox/hello.ogg b/sound/vox/hello.ogg similarity index 100% rename from modular_citadel/sound/vox/hello.ogg rename to sound/vox/hello.ogg diff --git a/modular_citadel/sound/vox/help.ogg b/sound/vox/help.ogg similarity index 100% rename from modular_citadel/sound/vox/help.ogg rename to sound/vox/help.ogg diff --git a/modular_citadel/sound/vox/here.ogg b/sound/vox/here.ogg similarity index 100% rename from modular_citadel/sound/vox/here.ogg rename to sound/vox/here.ogg diff --git a/modular_citadel/sound/vox/hide.ogg b/sound/vox/hide.ogg similarity index 100% rename from modular_citadel/sound/vox/hide.ogg rename to sound/vox/hide.ogg diff --git a/modular_citadel/sound/vox/high.ogg b/sound/vox/high.ogg similarity index 100% rename from modular_citadel/sound/vox/high.ogg rename to sound/vox/high.ogg diff --git a/modular_citadel/sound/vox/highest.ogg b/sound/vox/highest.ogg similarity index 100% rename from modular_citadel/sound/vox/highest.ogg rename to sound/vox/highest.ogg diff --git a/modular_citadel/sound/vox/hit.ogg b/sound/vox/hit.ogg similarity index 100% rename from modular_citadel/sound/vox/hit.ogg rename to sound/vox/hit.ogg diff --git a/modular_citadel/sound/vox/holds.ogg b/sound/vox/holds.ogg similarity index 100% rename from modular_citadel/sound/vox/holds.ogg rename to sound/vox/holds.ogg diff --git a/modular_citadel/sound/vox/hole.ogg b/sound/vox/hole.ogg similarity index 100% rename from modular_citadel/sound/vox/hole.ogg rename to sound/vox/hole.ogg diff --git a/modular_citadel/sound/vox/hostile.ogg b/sound/vox/hostile.ogg similarity index 100% rename from modular_citadel/sound/vox/hostile.ogg rename to sound/vox/hostile.ogg diff --git a/modular_citadel/sound/vox/hot.ogg b/sound/vox/hot.ogg similarity index 100% rename from modular_citadel/sound/vox/hot.ogg rename to sound/vox/hot.ogg diff --git a/modular_citadel/sound/vox/hotel.ogg b/sound/vox/hotel.ogg similarity index 100% rename from modular_citadel/sound/vox/hotel.ogg rename to sound/vox/hotel.ogg diff --git a/modular_citadel/sound/vox/hour.ogg b/sound/vox/hour.ogg similarity index 100% rename from modular_citadel/sound/vox/hour.ogg rename to sound/vox/hour.ogg diff --git a/modular_citadel/sound/vox/hours.ogg b/sound/vox/hours.ogg similarity index 100% rename from modular_citadel/sound/vox/hours.ogg rename to sound/vox/hours.ogg diff --git a/modular_citadel/sound/vox/hundred.ogg b/sound/vox/hundred.ogg similarity index 100% rename from modular_citadel/sound/vox/hundred.ogg rename to sound/vox/hundred.ogg diff --git a/modular_citadel/sound/vox/hydro.ogg b/sound/vox/hydro.ogg similarity index 100% rename from modular_citadel/sound/vox/hydro.ogg rename to sound/vox/hydro.ogg diff --git a/modular_citadel/sound/vox/i.ogg b/sound/vox/i.ogg similarity index 100% rename from modular_citadel/sound/vox/i.ogg rename to sound/vox/i.ogg diff --git a/modular_citadel/sound/vox/idiot.ogg b/sound/vox/idiot.ogg similarity index 100% rename from modular_citadel/sound/vox/idiot.ogg rename to sound/vox/idiot.ogg diff --git a/modular_citadel/sound/vox/illegal.ogg b/sound/vox/illegal.ogg similarity index 100% rename from modular_citadel/sound/vox/illegal.ogg rename to sound/vox/illegal.ogg diff --git a/modular_citadel/sound/vox/immediate.ogg b/sound/vox/immediate.ogg similarity index 100% rename from modular_citadel/sound/vox/immediate.ogg rename to sound/vox/immediate.ogg diff --git a/modular_citadel/sound/vox/immediately.ogg b/sound/vox/immediately.ogg similarity index 100% rename from modular_citadel/sound/vox/immediately.ogg rename to sound/vox/immediately.ogg diff --git a/modular_citadel/sound/vox/in.ogg b/sound/vox/in.ogg similarity index 100% rename from modular_citadel/sound/vox/in.ogg rename to sound/vox/in.ogg diff --git a/modular_citadel/sound/vox/inches.ogg b/sound/vox/inches.ogg similarity index 100% rename from modular_citadel/sound/vox/inches.ogg rename to sound/vox/inches.ogg diff --git a/modular_citadel/sound/vox/india.ogg b/sound/vox/india.ogg similarity index 100% rename from modular_citadel/sound/vox/india.ogg rename to sound/vox/india.ogg diff --git a/modular_citadel/sound/vox/ing.ogg b/sound/vox/ing.ogg similarity index 100% rename from modular_citadel/sound/vox/ing.ogg rename to sound/vox/ing.ogg diff --git a/modular_citadel/sound/vox/inoperative.ogg b/sound/vox/inoperative.ogg similarity index 100% rename from modular_citadel/sound/vox/inoperative.ogg rename to sound/vox/inoperative.ogg diff --git a/modular_citadel/sound/vox/inside.ogg b/sound/vox/inside.ogg similarity index 100% rename from modular_citadel/sound/vox/inside.ogg rename to sound/vox/inside.ogg diff --git a/modular_citadel/sound/vox/inspection.ogg b/sound/vox/inspection.ogg similarity index 100% rename from modular_citadel/sound/vox/inspection.ogg rename to sound/vox/inspection.ogg diff --git a/modular_citadel/sound/vox/inspector.ogg b/sound/vox/inspector.ogg similarity index 100% rename from modular_citadel/sound/vox/inspector.ogg rename to sound/vox/inspector.ogg diff --git a/modular_citadel/sound/vox/interchange.ogg b/sound/vox/interchange.ogg similarity index 100% rename from modular_citadel/sound/vox/interchange.ogg rename to sound/vox/interchange.ogg diff --git a/modular_citadel/sound/vox/intruder.ogg b/sound/vox/intruder.ogg similarity index 100% rename from modular_citadel/sound/vox/intruder.ogg rename to sound/vox/intruder.ogg diff --git a/modular_citadel/sound/vox/invallid.ogg b/sound/vox/invallid.ogg similarity index 100% rename from modular_citadel/sound/vox/invallid.ogg rename to sound/vox/invallid.ogg diff --git a/modular_citadel/sound/vox/invasion.ogg b/sound/vox/invasion.ogg similarity index 100% rename from modular_citadel/sound/vox/invasion.ogg rename to sound/vox/invasion.ogg diff --git a/modular_citadel/sound/vox/is.ogg b/sound/vox/is.ogg similarity index 100% rename from modular_citadel/sound/vox/is.ogg rename to sound/vox/is.ogg diff --git a/modular_citadel/sound/vox/it.ogg b/sound/vox/it.ogg similarity index 100% rename from modular_citadel/sound/vox/it.ogg rename to sound/vox/it.ogg diff --git a/modular_citadel/sound/vox/johnson.ogg b/sound/vox/johnson.ogg similarity index 100% rename from modular_citadel/sound/vox/johnson.ogg rename to sound/vox/johnson.ogg diff --git a/modular_citadel/sound/vox/juliet.ogg b/sound/vox/juliet.ogg similarity index 100% rename from modular_citadel/sound/vox/juliet.ogg rename to sound/vox/juliet.ogg diff --git a/modular_citadel/sound/vox/key.ogg b/sound/vox/key.ogg similarity index 100% rename from modular_citadel/sound/vox/key.ogg rename to sound/vox/key.ogg diff --git a/modular_citadel/sound/vox/kill.ogg b/sound/vox/kill.ogg similarity index 100% rename from modular_citadel/sound/vox/kill.ogg rename to sound/vox/kill.ogg diff --git a/modular_citadel/sound/vox/kilo.ogg b/sound/vox/kilo.ogg similarity index 100% rename from modular_citadel/sound/vox/kilo.ogg rename to sound/vox/kilo.ogg diff --git a/modular_citadel/sound/vox/kit.ogg b/sound/vox/kit.ogg similarity index 100% rename from modular_citadel/sound/vox/kit.ogg rename to sound/vox/kit.ogg diff --git a/modular_citadel/sound/vox/lab.ogg b/sound/vox/lab.ogg similarity index 100% rename from modular_citadel/sound/vox/lab.ogg rename to sound/vox/lab.ogg diff --git a/modular_citadel/sound/vox/lambda.ogg b/sound/vox/lambda.ogg similarity index 100% rename from modular_citadel/sound/vox/lambda.ogg rename to sound/vox/lambda.ogg diff --git a/modular_citadel/sound/vox/laser.ogg b/sound/vox/laser.ogg similarity index 100% rename from modular_citadel/sound/vox/laser.ogg rename to sound/vox/laser.ogg diff --git a/modular_citadel/sound/vox/last.ogg b/sound/vox/last.ogg similarity index 100% rename from modular_citadel/sound/vox/last.ogg rename to sound/vox/last.ogg diff --git a/modular_citadel/sound/vox/launch.ogg b/sound/vox/launch.ogg similarity index 100% rename from modular_citadel/sound/vox/launch.ogg rename to sound/vox/launch.ogg diff --git a/modular_citadel/sound/vox/leak.ogg b/sound/vox/leak.ogg similarity index 100% rename from modular_citadel/sound/vox/leak.ogg rename to sound/vox/leak.ogg diff --git a/modular_citadel/sound/vox/leave.ogg b/sound/vox/leave.ogg similarity index 100% rename from modular_citadel/sound/vox/leave.ogg rename to sound/vox/leave.ogg diff --git a/modular_citadel/sound/vox/left.ogg b/sound/vox/left.ogg similarity index 100% rename from modular_citadel/sound/vox/left.ogg rename to sound/vox/left.ogg diff --git a/modular_citadel/sound/vox/legal.ogg b/sound/vox/legal.ogg similarity index 100% rename from modular_citadel/sound/vox/legal.ogg rename to sound/vox/legal.ogg diff --git a/modular_citadel/sound/vox/level.ogg b/sound/vox/level.ogg similarity index 100% rename from modular_citadel/sound/vox/level.ogg rename to sound/vox/level.ogg diff --git a/modular_citadel/sound/vox/lever.ogg b/sound/vox/lever.ogg similarity index 100% rename from modular_citadel/sound/vox/lever.ogg rename to sound/vox/lever.ogg diff --git a/modular_citadel/sound/vox/lie.ogg b/sound/vox/lie.ogg similarity index 100% rename from modular_citadel/sound/vox/lie.ogg rename to sound/vox/lie.ogg diff --git a/modular_citadel/sound/vox/lieutenant.ogg b/sound/vox/lieutenant.ogg similarity index 100% rename from modular_citadel/sound/vox/lieutenant.ogg rename to sound/vox/lieutenant.ogg diff --git a/modular_citadel/sound/vox/life.ogg b/sound/vox/life.ogg similarity index 100% rename from modular_citadel/sound/vox/life.ogg rename to sound/vox/life.ogg diff --git a/modular_citadel/sound/vox/light.ogg b/sound/vox/light.ogg similarity index 100% rename from modular_citadel/sound/vox/light.ogg rename to sound/vox/light.ogg diff --git a/modular_citadel/sound/vox/lima.ogg b/sound/vox/lima.ogg similarity index 100% rename from modular_citadel/sound/vox/lima.ogg rename to sound/vox/lima.ogg diff --git a/modular_citadel/sound/vox/liquid.ogg b/sound/vox/liquid.ogg similarity index 100% rename from modular_citadel/sound/vox/liquid.ogg rename to sound/vox/liquid.ogg diff --git a/modular_citadel/sound/vox/loading.ogg b/sound/vox/loading.ogg similarity index 100% rename from modular_citadel/sound/vox/loading.ogg rename to sound/vox/loading.ogg diff --git a/modular_citadel/sound/vox/locate.ogg b/sound/vox/locate.ogg similarity index 100% rename from modular_citadel/sound/vox/locate.ogg rename to sound/vox/locate.ogg diff --git a/modular_citadel/sound/vox/located.ogg b/sound/vox/located.ogg similarity index 100% rename from modular_citadel/sound/vox/located.ogg rename to sound/vox/located.ogg diff --git a/modular_citadel/sound/vox/location.ogg b/sound/vox/location.ogg similarity index 100% rename from modular_citadel/sound/vox/location.ogg rename to sound/vox/location.ogg diff --git a/modular_citadel/sound/vox/lock.ogg b/sound/vox/lock.ogg similarity index 100% rename from modular_citadel/sound/vox/lock.ogg rename to sound/vox/lock.ogg diff --git a/modular_citadel/sound/vox/locked.ogg b/sound/vox/locked.ogg similarity index 100% rename from modular_citadel/sound/vox/locked.ogg rename to sound/vox/locked.ogg diff --git a/modular_citadel/sound/vox/locker.ogg b/sound/vox/locker.ogg similarity index 100% rename from modular_citadel/sound/vox/locker.ogg rename to sound/vox/locker.ogg diff --git a/modular_citadel/sound/vox/lockout.ogg b/sound/vox/lockout.ogg similarity index 100% rename from modular_citadel/sound/vox/lockout.ogg rename to sound/vox/lockout.ogg diff --git a/modular_citadel/sound/vox/lower.ogg b/sound/vox/lower.ogg similarity index 100% rename from modular_citadel/sound/vox/lower.ogg rename to sound/vox/lower.ogg diff --git a/modular_citadel/sound/vox/lowest.ogg b/sound/vox/lowest.ogg similarity index 100% rename from modular_citadel/sound/vox/lowest.ogg rename to sound/vox/lowest.ogg diff --git a/modular_citadel/sound/vox/magnetic.ogg b/sound/vox/magnetic.ogg similarity index 100% rename from modular_citadel/sound/vox/magnetic.ogg rename to sound/vox/magnetic.ogg diff --git a/modular_citadel/sound/vox/main.ogg b/sound/vox/main.ogg similarity index 100% rename from modular_citadel/sound/vox/main.ogg rename to sound/vox/main.ogg diff --git a/modular_citadel/sound/vox/maintenance.ogg b/sound/vox/maintenance.ogg similarity index 100% rename from modular_citadel/sound/vox/maintenance.ogg rename to sound/vox/maintenance.ogg diff --git a/modular_citadel/sound/vox/malfunction.ogg b/sound/vox/malfunction.ogg similarity index 100% rename from modular_citadel/sound/vox/malfunction.ogg rename to sound/vox/malfunction.ogg diff --git a/modular_citadel/sound/vox/man.ogg b/sound/vox/man.ogg similarity index 100% rename from modular_citadel/sound/vox/man.ogg rename to sound/vox/man.ogg diff --git a/modular_citadel/sound/vox/mass.ogg b/sound/vox/mass.ogg similarity index 100% rename from modular_citadel/sound/vox/mass.ogg rename to sound/vox/mass.ogg diff --git a/modular_citadel/sound/vox/materials.ogg b/sound/vox/materials.ogg similarity index 100% rename from modular_citadel/sound/vox/materials.ogg rename to sound/vox/materials.ogg diff --git a/modular_citadel/sound/vox/maximum.ogg b/sound/vox/maximum.ogg similarity index 100% rename from modular_citadel/sound/vox/maximum.ogg rename to sound/vox/maximum.ogg diff --git a/modular_citadel/sound/vox/may.ogg b/sound/vox/may.ogg similarity index 100% rename from modular_citadel/sound/vox/may.ogg rename to sound/vox/may.ogg diff --git a/modular_citadel/sound/vox/med.ogg b/sound/vox/med.ogg similarity index 100% rename from modular_citadel/sound/vox/med.ogg rename to sound/vox/med.ogg diff --git a/modular_citadel/sound/vox/medical.ogg b/sound/vox/medical.ogg similarity index 100% rename from modular_citadel/sound/vox/medical.ogg rename to sound/vox/medical.ogg diff --git a/modular_citadel/sound/vox/men.ogg b/sound/vox/men.ogg similarity index 100% rename from modular_citadel/sound/vox/men.ogg rename to sound/vox/men.ogg diff --git a/modular_citadel/sound/vox/mercy.ogg b/sound/vox/mercy.ogg similarity index 100% rename from modular_citadel/sound/vox/mercy.ogg rename to sound/vox/mercy.ogg diff --git a/modular_citadel/sound/vox/mesa.ogg b/sound/vox/mesa.ogg similarity index 100% rename from modular_citadel/sound/vox/mesa.ogg rename to sound/vox/mesa.ogg diff --git a/modular_citadel/sound/vox/message.ogg b/sound/vox/message.ogg similarity index 100% rename from modular_citadel/sound/vox/message.ogg rename to sound/vox/message.ogg diff --git a/modular_citadel/sound/vox/meter.ogg b/sound/vox/meter.ogg similarity index 100% rename from modular_citadel/sound/vox/meter.ogg rename to sound/vox/meter.ogg diff --git a/modular_citadel/sound/vox/micro.ogg b/sound/vox/micro.ogg similarity index 100% rename from modular_citadel/sound/vox/micro.ogg rename to sound/vox/micro.ogg diff --git a/modular_citadel/sound/vox/middle.ogg b/sound/vox/middle.ogg similarity index 100% rename from modular_citadel/sound/vox/middle.ogg rename to sound/vox/middle.ogg diff --git a/modular_citadel/sound/vox/mike.ogg b/sound/vox/mike.ogg similarity index 100% rename from modular_citadel/sound/vox/mike.ogg rename to sound/vox/mike.ogg diff --git a/modular_citadel/sound/vox/miles.ogg b/sound/vox/miles.ogg similarity index 100% rename from modular_citadel/sound/vox/miles.ogg rename to sound/vox/miles.ogg diff --git a/modular_citadel/sound/vox/military.ogg b/sound/vox/military.ogg similarity index 100% rename from modular_citadel/sound/vox/military.ogg rename to sound/vox/military.ogg diff --git a/modular_citadel/sound/vox/milli.ogg b/sound/vox/milli.ogg similarity index 100% rename from modular_citadel/sound/vox/milli.ogg rename to sound/vox/milli.ogg diff --git a/modular_citadel/sound/vox/million.ogg b/sound/vox/million.ogg similarity index 100% rename from modular_citadel/sound/vox/million.ogg rename to sound/vox/million.ogg diff --git a/modular_citadel/sound/vox/minefield.ogg b/sound/vox/minefield.ogg similarity index 100% rename from modular_citadel/sound/vox/minefield.ogg rename to sound/vox/minefield.ogg diff --git a/modular_citadel/sound/vox/minimum.ogg b/sound/vox/minimum.ogg similarity index 100% rename from modular_citadel/sound/vox/minimum.ogg rename to sound/vox/minimum.ogg diff --git a/modular_citadel/sound/vox/minutes.ogg b/sound/vox/minutes.ogg similarity index 100% rename from modular_citadel/sound/vox/minutes.ogg rename to sound/vox/minutes.ogg diff --git a/modular_citadel/sound/vox/mister.ogg b/sound/vox/mister.ogg similarity index 100% rename from modular_citadel/sound/vox/mister.ogg rename to sound/vox/mister.ogg diff --git a/modular_citadel/sound/vox/mode.ogg b/sound/vox/mode.ogg similarity index 100% rename from modular_citadel/sound/vox/mode.ogg rename to sound/vox/mode.ogg diff --git a/modular_citadel/sound/vox/motor.ogg b/sound/vox/motor.ogg similarity index 100% rename from modular_citadel/sound/vox/motor.ogg rename to sound/vox/motor.ogg diff --git a/modular_citadel/sound/vox/motorpool.ogg b/sound/vox/motorpool.ogg similarity index 100% rename from modular_citadel/sound/vox/motorpool.ogg rename to sound/vox/motorpool.ogg diff --git a/modular_citadel/sound/vox/move.ogg b/sound/vox/move.ogg similarity index 100% rename from modular_citadel/sound/vox/move.ogg rename to sound/vox/move.ogg diff --git a/modular_citadel/sound/vox/must.ogg b/sound/vox/must.ogg similarity index 100% rename from modular_citadel/sound/vox/must.ogg rename to sound/vox/must.ogg diff --git a/modular_citadel/sound/vox/nearest.ogg b/sound/vox/nearest.ogg similarity index 100% rename from modular_citadel/sound/vox/nearest.ogg rename to sound/vox/nearest.ogg diff --git a/modular_citadel/sound/vox/nice.ogg b/sound/vox/nice.ogg similarity index 100% rename from modular_citadel/sound/vox/nice.ogg rename to sound/vox/nice.ogg diff --git a/modular_citadel/sound/vox/nine.ogg b/sound/vox/nine.ogg similarity index 100% rename from modular_citadel/sound/vox/nine.ogg rename to sound/vox/nine.ogg diff --git a/modular_citadel/sound/vox/nineteen.ogg b/sound/vox/nineteen.ogg similarity index 100% rename from modular_citadel/sound/vox/nineteen.ogg rename to sound/vox/nineteen.ogg diff --git a/modular_citadel/sound/vox/ninety.ogg b/sound/vox/ninety.ogg similarity index 100% rename from modular_citadel/sound/vox/ninety.ogg rename to sound/vox/ninety.ogg diff --git a/modular_citadel/sound/vox/no.ogg b/sound/vox/no.ogg similarity index 100% rename from modular_citadel/sound/vox/no.ogg rename to sound/vox/no.ogg diff --git a/modular_citadel/sound/vox/nominal.ogg b/sound/vox/nominal.ogg similarity index 100% rename from modular_citadel/sound/vox/nominal.ogg rename to sound/vox/nominal.ogg diff --git a/modular_citadel/sound/vox/north.ogg b/sound/vox/north.ogg similarity index 100% rename from modular_citadel/sound/vox/north.ogg rename to sound/vox/north.ogg diff --git a/modular_citadel/sound/vox/not.ogg b/sound/vox/not.ogg similarity index 100% rename from modular_citadel/sound/vox/not.ogg rename to sound/vox/not.ogg diff --git a/modular_citadel/sound/vox/november.ogg b/sound/vox/november.ogg similarity index 100% rename from modular_citadel/sound/vox/november.ogg rename to sound/vox/november.ogg diff --git a/modular_citadel/sound/vox/now.ogg b/sound/vox/now.ogg similarity index 100% rename from modular_citadel/sound/vox/now.ogg rename to sound/vox/now.ogg diff --git a/modular_citadel/sound/vox/number.ogg b/sound/vox/number.ogg similarity index 100% rename from modular_citadel/sound/vox/number.ogg rename to sound/vox/number.ogg diff --git a/modular_citadel/sound/vox/objective.ogg b/sound/vox/objective.ogg similarity index 100% rename from modular_citadel/sound/vox/objective.ogg rename to sound/vox/objective.ogg diff --git a/modular_citadel/sound/vox/observation.ogg b/sound/vox/observation.ogg similarity index 100% rename from modular_citadel/sound/vox/observation.ogg rename to sound/vox/observation.ogg diff --git a/modular_citadel/sound/vox/of.ogg b/sound/vox/of.ogg similarity index 100% rename from modular_citadel/sound/vox/of.ogg rename to sound/vox/of.ogg diff --git a/modular_citadel/sound/vox/officer.ogg b/sound/vox/officer.ogg similarity index 100% rename from modular_citadel/sound/vox/officer.ogg rename to sound/vox/officer.ogg diff --git a/modular_citadel/sound/vox/ok.ogg b/sound/vox/ok.ogg similarity index 100% rename from modular_citadel/sound/vox/ok.ogg rename to sound/vox/ok.ogg diff --git a/modular_citadel/sound/vox/on.ogg b/sound/vox/on.ogg similarity index 100% rename from modular_citadel/sound/vox/on.ogg rename to sound/vox/on.ogg diff --git a/modular_citadel/sound/vox/one.ogg b/sound/vox/one.ogg similarity index 100% rename from modular_citadel/sound/vox/one.ogg rename to sound/vox/one.ogg diff --git a/modular_citadel/sound/vox/open.ogg b/sound/vox/open.ogg similarity index 100% rename from modular_citadel/sound/vox/open.ogg rename to sound/vox/open.ogg diff --git a/modular_citadel/sound/vox/operating.ogg b/sound/vox/operating.ogg similarity index 100% rename from modular_citadel/sound/vox/operating.ogg rename to sound/vox/operating.ogg diff --git a/modular_citadel/sound/vox/operations.ogg b/sound/vox/operations.ogg similarity index 100% rename from modular_citadel/sound/vox/operations.ogg rename to sound/vox/operations.ogg diff --git a/modular_citadel/sound/vox/operative.ogg b/sound/vox/operative.ogg similarity index 100% rename from modular_citadel/sound/vox/operative.ogg rename to sound/vox/operative.ogg diff --git a/modular_citadel/sound/vox/option.ogg b/sound/vox/option.ogg similarity index 100% rename from modular_citadel/sound/vox/option.ogg rename to sound/vox/option.ogg diff --git a/modular_citadel/sound/vox/order.ogg b/sound/vox/order.ogg similarity index 100% rename from modular_citadel/sound/vox/order.ogg rename to sound/vox/order.ogg diff --git a/modular_citadel/sound/vox/organic.ogg b/sound/vox/organic.ogg similarity index 100% rename from modular_citadel/sound/vox/organic.ogg rename to sound/vox/organic.ogg diff --git a/modular_citadel/sound/vox/oscar.ogg b/sound/vox/oscar.ogg similarity index 100% rename from modular_citadel/sound/vox/oscar.ogg rename to sound/vox/oscar.ogg diff --git a/modular_citadel/sound/vox/out.ogg b/sound/vox/out.ogg similarity index 100% rename from modular_citadel/sound/vox/out.ogg rename to sound/vox/out.ogg diff --git a/modular_citadel/sound/vox/outside.ogg b/sound/vox/outside.ogg similarity index 100% rename from modular_citadel/sound/vox/outside.ogg rename to sound/vox/outside.ogg diff --git a/modular_citadel/sound/vox/over.ogg b/sound/vox/over.ogg similarity index 100% rename from modular_citadel/sound/vox/over.ogg rename to sound/vox/over.ogg diff --git a/modular_citadel/sound/vox/overload.ogg b/sound/vox/overload.ogg similarity index 100% rename from modular_citadel/sound/vox/overload.ogg rename to sound/vox/overload.ogg diff --git a/modular_citadel/sound/vox/override.ogg b/sound/vox/override.ogg similarity index 100% rename from modular_citadel/sound/vox/override.ogg rename to sound/vox/override.ogg diff --git a/modular_citadel/sound/vox/pacify.ogg b/sound/vox/pacify.ogg similarity index 100% rename from modular_citadel/sound/vox/pacify.ogg rename to sound/vox/pacify.ogg diff --git a/modular_citadel/sound/vox/pain.ogg b/sound/vox/pain.ogg similarity index 100% rename from modular_citadel/sound/vox/pain.ogg rename to sound/vox/pain.ogg diff --git a/modular_citadel/sound/vox/pal.ogg b/sound/vox/pal.ogg similarity index 100% rename from modular_citadel/sound/vox/pal.ogg rename to sound/vox/pal.ogg diff --git a/modular_citadel/sound/vox/panel.ogg b/sound/vox/panel.ogg similarity index 100% rename from modular_citadel/sound/vox/panel.ogg rename to sound/vox/panel.ogg diff --git a/modular_citadel/sound/vox/percent.ogg b/sound/vox/percent.ogg similarity index 100% rename from modular_citadel/sound/vox/percent.ogg rename to sound/vox/percent.ogg diff --git a/modular_citadel/sound/vox/perimeter.ogg b/sound/vox/perimeter.ogg similarity index 100% rename from modular_citadel/sound/vox/perimeter.ogg rename to sound/vox/perimeter.ogg diff --git a/modular_citadel/sound/vox/period.ogg b/sound/vox/period.ogg similarity index 100% rename from modular_citadel/sound/vox/period.ogg rename to sound/vox/period.ogg diff --git a/modular_citadel/sound/vox/permitted.ogg b/sound/vox/permitted.ogg similarity index 100% rename from modular_citadel/sound/vox/permitted.ogg rename to sound/vox/permitted.ogg diff --git a/modular_citadel/sound/vox/personnel.ogg b/sound/vox/personnel.ogg similarity index 100% rename from modular_citadel/sound/vox/personnel.ogg rename to sound/vox/personnel.ogg diff --git a/modular_citadel/sound/vox/pipe.ogg b/sound/vox/pipe.ogg similarity index 100% rename from modular_citadel/sound/vox/pipe.ogg rename to sound/vox/pipe.ogg diff --git a/modular_citadel/sound/vox/plant.ogg b/sound/vox/plant.ogg similarity index 100% rename from modular_citadel/sound/vox/plant.ogg rename to sound/vox/plant.ogg diff --git a/modular_citadel/sound/vox/platform.ogg b/sound/vox/platform.ogg similarity index 100% rename from modular_citadel/sound/vox/platform.ogg rename to sound/vox/platform.ogg diff --git a/modular_citadel/sound/vox/please.ogg b/sound/vox/please.ogg similarity index 100% rename from modular_citadel/sound/vox/please.ogg rename to sound/vox/please.ogg diff --git a/modular_citadel/sound/vox/point.ogg b/sound/vox/point.ogg similarity index 100% rename from modular_citadel/sound/vox/point.ogg rename to sound/vox/point.ogg diff --git a/modular_citadel/sound/vox/portal.ogg b/sound/vox/portal.ogg similarity index 100% rename from modular_citadel/sound/vox/portal.ogg rename to sound/vox/portal.ogg diff --git a/modular_citadel/sound/vox/power.ogg b/sound/vox/power.ogg similarity index 100% rename from modular_citadel/sound/vox/power.ogg rename to sound/vox/power.ogg diff --git a/modular_citadel/sound/vox/presence.ogg b/sound/vox/presence.ogg similarity index 100% rename from modular_citadel/sound/vox/presence.ogg rename to sound/vox/presence.ogg diff --git a/modular_citadel/sound/vox/press.ogg b/sound/vox/press.ogg similarity index 100% rename from modular_citadel/sound/vox/press.ogg rename to sound/vox/press.ogg diff --git a/modular_citadel/sound/vox/primary.ogg b/sound/vox/primary.ogg similarity index 100% rename from modular_citadel/sound/vox/primary.ogg rename to sound/vox/primary.ogg diff --git a/modular_citadel/sound/vox/proceed.ogg b/sound/vox/proceed.ogg similarity index 100% rename from modular_citadel/sound/vox/proceed.ogg rename to sound/vox/proceed.ogg diff --git a/modular_citadel/sound/vox/processing.ogg b/sound/vox/processing.ogg similarity index 100% rename from modular_citadel/sound/vox/processing.ogg rename to sound/vox/processing.ogg diff --git a/modular_citadel/sound/vox/progress.ogg b/sound/vox/progress.ogg similarity index 100% rename from modular_citadel/sound/vox/progress.ogg rename to sound/vox/progress.ogg diff --git a/modular_citadel/sound/vox/proper.ogg b/sound/vox/proper.ogg similarity index 100% rename from modular_citadel/sound/vox/proper.ogg rename to sound/vox/proper.ogg diff --git a/modular_citadel/sound/vox/propulsion.ogg b/sound/vox/propulsion.ogg similarity index 100% rename from modular_citadel/sound/vox/propulsion.ogg rename to sound/vox/propulsion.ogg diff --git a/modular_citadel/sound/vox/prosecute.ogg b/sound/vox/prosecute.ogg similarity index 100% rename from modular_citadel/sound/vox/prosecute.ogg rename to sound/vox/prosecute.ogg diff --git a/modular_citadel/sound/vox/protective.ogg b/sound/vox/protective.ogg similarity index 100% rename from modular_citadel/sound/vox/protective.ogg rename to sound/vox/protective.ogg diff --git a/modular_citadel/sound/vox/push.ogg b/sound/vox/push.ogg similarity index 100% rename from modular_citadel/sound/vox/push.ogg rename to sound/vox/push.ogg diff --git a/modular_citadel/sound/vox/quantum.ogg b/sound/vox/quantum.ogg similarity index 100% rename from modular_citadel/sound/vox/quantum.ogg rename to sound/vox/quantum.ogg diff --git a/modular_citadel/sound/vox/quebec.ogg b/sound/vox/quebec.ogg similarity index 100% rename from modular_citadel/sound/vox/quebec.ogg rename to sound/vox/quebec.ogg diff --git a/modular_citadel/sound/vox/question.ogg b/sound/vox/question.ogg similarity index 100% rename from modular_citadel/sound/vox/question.ogg rename to sound/vox/question.ogg diff --git a/modular_citadel/sound/vox/questioning.ogg b/sound/vox/questioning.ogg similarity index 100% rename from modular_citadel/sound/vox/questioning.ogg rename to sound/vox/questioning.ogg diff --git a/modular_citadel/sound/vox/quick.ogg b/sound/vox/quick.ogg similarity index 100% rename from modular_citadel/sound/vox/quick.ogg rename to sound/vox/quick.ogg diff --git a/modular_citadel/sound/vox/quit.ogg b/sound/vox/quit.ogg similarity index 100% rename from modular_citadel/sound/vox/quit.ogg rename to sound/vox/quit.ogg diff --git a/modular_citadel/sound/vox/radiation.ogg b/sound/vox/radiation.ogg similarity index 100% rename from modular_citadel/sound/vox/radiation.ogg rename to sound/vox/radiation.ogg diff --git a/modular_citadel/sound/vox/radioactive.ogg b/sound/vox/radioactive.ogg similarity index 100% rename from modular_citadel/sound/vox/radioactive.ogg rename to sound/vox/radioactive.ogg diff --git a/modular_citadel/sound/vox/rads.ogg b/sound/vox/rads.ogg similarity index 100% rename from modular_citadel/sound/vox/rads.ogg rename to sound/vox/rads.ogg diff --git a/modular_citadel/sound/vox/rapid.ogg b/sound/vox/rapid.ogg similarity index 100% rename from modular_citadel/sound/vox/rapid.ogg rename to sound/vox/rapid.ogg diff --git a/modular_citadel/sound/vox/reach.ogg b/sound/vox/reach.ogg similarity index 100% rename from modular_citadel/sound/vox/reach.ogg rename to sound/vox/reach.ogg diff --git a/modular_citadel/sound/vox/reached.ogg b/sound/vox/reached.ogg similarity index 100% rename from modular_citadel/sound/vox/reached.ogg rename to sound/vox/reached.ogg diff --git a/modular_citadel/sound/vox/reactor.ogg b/sound/vox/reactor.ogg similarity index 100% rename from modular_citadel/sound/vox/reactor.ogg rename to sound/vox/reactor.ogg diff --git a/modular_citadel/sound/vox/red.ogg b/sound/vox/red.ogg similarity index 100% rename from modular_citadel/sound/vox/red.ogg rename to sound/vox/red.ogg diff --git a/modular_citadel/sound/vox/relay.ogg b/sound/vox/relay.ogg similarity index 100% rename from modular_citadel/sound/vox/relay.ogg rename to sound/vox/relay.ogg diff --git a/modular_citadel/sound/vox/released.ogg b/sound/vox/released.ogg similarity index 100% rename from modular_citadel/sound/vox/released.ogg rename to sound/vox/released.ogg diff --git a/modular_citadel/sound/vox/remaining.ogg b/sound/vox/remaining.ogg similarity index 100% rename from modular_citadel/sound/vox/remaining.ogg rename to sound/vox/remaining.ogg diff --git a/modular_citadel/sound/vox/renegade.ogg b/sound/vox/renegade.ogg similarity index 100% rename from modular_citadel/sound/vox/renegade.ogg rename to sound/vox/renegade.ogg diff --git a/modular_citadel/sound/vox/repair.ogg b/sound/vox/repair.ogg similarity index 100% rename from modular_citadel/sound/vox/repair.ogg rename to sound/vox/repair.ogg diff --git a/modular_citadel/sound/vox/report.ogg b/sound/vox/report.ogg similarity index 100% rename from modular_citadel/sound/vox/report.ogg rename to sound/vox/report.ogg diff --git a/modular_citadel/sound/vox/reports.ogg b/sound/vox/reports.ogg similarity index 100% rename from modular_citadel/sound/vox/reports.ogg rename to sound/vox/reports.ogg diff --git a/modular_citadel/sound/vox/required.ogg b/sound/vox/required.ogg similarity index 100% rename from modular_citadel/sound/vox/required.ogg rename to sound/vox/required.ogg diff --git a/modular_citadel/sound/vox/research.ogg b/sound/vox/research.ogg similarity index 100% rename from modular_citadel/sound/vox/research.ogg rename to sound/vox/research.ogg diff --git a/modular_citadel/sound/vox/reset.ogg b/sound/vox/reset.ogg similarity index 100% rename from modular_citadel/sound/vox/reset.ogg rename to sound/vox/reset.ogg diff --git a/modular_citadel/sound/vox/resevoir.ogg b/sound/vox/resevoir.ogg similarity index 100% rename from modular_citadel/sound/vox/resevoir.ogg rename to sound/vox/resevoir.ogg diff --git a/modular_citadel/sound/vox/resistance.ogg b/sound/vox/resistance.ogg similarity index 100% rename from modular_citadel/sound/vox/resistance.ogg rename to sound/vox/resistance.ogg diff --git a/modular_citadel/sound/vox/returned.ogg b/sound/vox/returned.ogg similarity index 100% rename from modular_citadel/sound/vox/returned.ogg rename to sound/vox/returned.ogg diff --git a/modular_citadel/sound/vox/right.ogg b/sound/vox/right.ogg similarity index 100% rename from modular_citadel/sound/vox/right.ogg rename to sound/vox/right.ogg diff --git a/modular_citadel/sound/vox/rocket.ogg b/sound/vox/rocket.ogg similarity index 100% rename from modular_citadel/sound/vox/rocket.ogg rename to sound/vox/rocket.ogg diff --git a/modular_citadel/sound/vox/roger.ogg b/sound/vox/roger.ogg similarity index 100% rename from modular_citadel/sound/vox/roger.ogg rename to sound/vox/roger.ogg diff --git a/modular_citadel/sound/vox/romeo.ogg b/sound/vox/romeo.ogg similarity index 100% rename from modular_citadel/sound/vox/romeo.ogg rename to sound/vox/romeo.ogg diff --git a/modular_citadel/sound/vox/room.ogg b/sound/vox/room.ogg similarity index 100% rename from modular_citadel/sound/vox/room.ogg rename to sound/vox/room.ogg diff --git a/modular_citadel/sound/vox/round.ogg b/sound/vox/round.ogg similarity index 100% rename from modular_citadel/sound/vox/round.ogg rename to sound/vox/round.ogg diff --git a/modular_citadel/sound/vox/run.ogg b/sound/vox/run.ogg similarity index 100% rename from modular_citadel/sound/vox/run.ogg rename to sound/vox/run.ogg diff --git a/modular_citadel/sound/vox/safe.ogg b/sound/vox/safe.ogg similarity index 100% rename from modular_citadel/sound/vox/safe.ogg rename to sound/vox/safe.ogg diff --git a/modular_citadel/sound/vox/safety.ogg b/sound/vox/safety.ogg similarity index 100% rename from modular_citadel/sound/vox/safety.ogg rename to sound/vox/safety.ogg diff --git a/modular_citadel/sound/vox/sargeant.ogg b/sound/vox/sargeant.ogg similarity index 100% rename from modular_citadel/sound/vox/sargeant.ogg rename to sound/vox/sargeant.ogg diff --git a/modular_citadel/sound/vox/satellite.ogg b/sound/vox/satellite.ogg similarity index 100% rename from modular_citadel/sound/vox/satellite.ogg rename to sound/vox/satellite.ogg diff --git a/modular_citadel/sound/vox/save.ogg b/sound/vox/save.ogg similarity index 100% rename from modular_citadel/sound/vox/save.ogg rename to sound/vox/save.ogg diff --git a/modular_citadel/sound/vox/science.ogg b/sound/vox/science.ogg similarity index 100% rename from modular_citadel/sound/vox/science.ogg rename to sound/vox/science.ogg diff --git a/modular_citadel/sound/vox/scores.ogg b/sound/vox/scores.ogg similarity index 100% rename from modular_citadel/sound/vox/scores.ogg rename to sound/vox/scores.ogg diff --git a/modular_citadel/sound/vox/scream.ogg b/sound/vox/scream.ogg similarity index 100% rename from modular_citadel/sound/vox/scream.ogg rename to sound/vox/scream.ogg diff --git a/modular_citadel/sound/vox/screen.ogg b/sound/vox/screen.ogg similarity index 100% rename from modular_citadel/sound/vox/screen.ogg rename to sound/vox/screen.ogg diff --git a/modular_citadel/sound/vox/search.ogg b/sound/vox/search.ogg similarity index 100% rename from modular_citadel/sound/vox/search.ogg rename to sound/vox/search.ogg diff --git a/modular_citadel/sound/vox/second.ogg b/sound/vox/second.ogg similarity index 100% rename from modular_citadel/sound/vox/second.ogg rename to sound/vox/second.ogg diff --git a/modular_citadel/sound/vox/secondary.ogg b/sound/vox/secondary.ogg similarity index 100% rename from modular_citadel/sound/vox/secondary.ogg rename to sound/vox/secondary.ogg diff --git a/modular_citadel/sound/vox/seconds.ogg b/sound/vox/seconds.ogg similarity index 100% rename from modular_citadel/sound/vox/seconds.ogg rename to sound/vox/seconds.ogg diff --git a/modular_citadel/sound/vox/sector.ogg b/sound/vox/sector.ogg similarity index 100% rename from modular_citadel/sound/vox/sector.ogg rename to sound/vox/sector.ogg diff --git a/modular_citadel/sound/vox/secure.ogg b/sound/vox/secure.ogg similarity index 100% rename from modular_citadel/sound/vox/secure.ogg rename to sound/vox/secure.ogg diff --git a/modular_citadel/sound/vox/secured.ogg b/sound/vox/secured.ogg similarity index 100% rename from modular_citadel/sound/vox/secured.ogg rename to sound/vox/secured.ogg diff --git a/modular_citadel/sound/vox/security.ogg b/sound/vox/security.ogg similarity index 100% rename from modular_citadel/sound/vox/security.ogg rename to sound/vox/security.ogg diff --git a/modular_citadel/sound/vox/select.ogg b/sound/vox/select.ogg similarity index 100% rename from modular_citadel/sound/vox/select.ogg rename to sound/vox/select.ogg diff --git a/modular_citadel/sound/vox/selected.ogg b/sound/vox/selected.ogg similarity index 100% rename from modular_citadel/sound/vox/selected.ogg rename to sound/vox/selected.ogg diff --git a/modular_citadel/sound/vox/service.ogg b/sound/vox/service.ogg similarity index 100% rename from modular_citadel/sound/vox/service.ogg rename to sound/vox/service.ogg diff --git a/modular_citadel/sound/vox/seven.ogg b/sound/vox/seven.ogg similarity index 100% rename from modular_citadel/sound/vox/seven.ogg rename to sound/vox/seven.ogg diff --git a/modular_citadel/sound/vox/seventeen.ogg b/sound/vox/seventeen.ogg similarity index 100% rename from modular_citadel/sound/vox/seventeen.ogg rename to sound/vox/seventeen.ogg diff --git a/modular_citadel/sound/vox/seventy.ogg b/sound/vox/seventy.ogg similarity index 100% rename from modular_citadel/sound/vox/seventy.ogg rename to sound/vox/seventy.ogg diff --git a/modular_citadel/sound/vox/severe.ogg b/sound/vox/severe.ogg similarity index 100% rename from modular_citadel/sound/vox/severe.ogg rename to sound/vox/severe.ogg diff --git a/modular_citadel/sound/vox/sewage.ogg b/sound/vox/sewage.ogg similarity index 100% rename from modular_citadel/sound/vox/sewage.ogg rename to sound/vox/sewage.ogg diff --git a/modular_citadel/sound/vox/sewer.ogg b/sound/vox/sewer.ogg similarity index 100% rename from modular_citadel/sound/vox/sewer.ogg rename to sound/vox/sewer.ogg diff --git a/modular_citadel/sound/vox/shield.ogg b/sound/vox/shield.ogg similarity index 100% rename from modular_citadel/sound/vox/shield.ogg rename to sound/vox/shield.ogg diff --git a/modular_citadel/sound/vox/shipment.ogg b/sound/vox/shipment.ogg similarity index 100% rename from modular_citadel/sound/vox/shipment.ogg rename to sound/vox/shipment.ogg diff --git a/modular_citadel/sound/vox/shock.ogg b/sound/vox/shock.ogg similarity index 100% rename from modular_citadel/sound/vox/shock.ogg rename to sound/vox/shock.ogg diff --git a/modular_citadel/sound/vox/shoot.ogg b/sound/vox/shoot.ogg similarity index 100% rename from modular_citadel/sound/vox/shoot.ogg rename to sound/vox/shoot.ogg diff --git a/modular_citadel/sound/vox/shower.ogg b/sound/vox/shower.ogg similarity index 100% rename from modular_citadel/sound/vox/shower.ogg rename to sound/vox/shower.ogg diff --git a/modular_citadel/sound/vox/shut.ogg b/sound/vox/shut.ogg similarity index 100% rename from modular_citadel/sound/vox/shut.ogg rename to sound/vox/shut.ogg diff --git a/modular_citadel/sound/vox/side.ogg b/sound/vox/side.ogg similarity index 100% rename from modular_citadel/sound/vox/side.ogg rename to sound/vox/side.ogg diff --git a/modular_citadel/sound/vox/sierra.ogg b/sound/vox/sierra.ogg similarity index 100% rename from modular_citadel/sound/vox/sierra.ogg rename to sound/vox/sierra.ogg diff --git a/modular_citadel/sound/vox/sight.ogg b/sound/vox/sight.ogg similarity index 100% rename from modular_citadel/sound/vox/sight.ogg rename to sound/vox/sight.ogg diff --git a/modular_citadel/sound/vox/silo.ogg b/sound/vox/silo.ogg similarity index 100% rename from modular_citadel/sound/vox/silo.ogg rename to sound/vox/silo.ogg diff --git a/modular_citadel/sound/vox/six.ogg b/sound/vox/six.ogg similarity index 100% rename from modular_citadel/sound/vox/six.ogg rename to sound/vox/six.ogg diff --git a/modular_citadel/sound/vox/sixteen.ogg b/sound/vox/sixteen.ogg similarity index 100% rename from modular_citadel/sound/vox/sixteen.ogg rename to sound/vox/sixteen.ogg diff --git a/modular_citadel/sound/vox/sixty.ogg b/sound/vox/sixty.ogg similarity index 100% rename from modular_citadel/sound/vox/sixty.ogg rename to sound/vox/sixty.ogg diff --git a/modular_citadel/sound/vox/slime.ogg b/sound/vox/slime.ogg similarity index 100% rename from modular_citadel/sound/vox/slime.ogg rename to sound/vox/slime.ogg diff --git a/modular_citadel/sound/vox/slow.ogg b/sound/vox/slow.ogg similarity index 100% rename from modular_citadel/sound/vox/slow.ogg rename to sound/vox/slow.ogg diff --git a/modular_citadel/sound/vox/soldier.ogg b/sound/vox/soldier.ogg similarity index 100% rename from modular_citadel/sound/vox/soldier.ogg rename to sound/vox/soldier.ogg diff --git a/modular_citadel/sound/vox/some.ogg b/sound/vox/some.ogg similarity index 100% rename from modular_citadel/sound/vox/some.ogg rename to sound/vox/some.ogg diff --git a/modular_citadel/sound/vox/someone.ogg b/sound/vox/someone.ogg similarity index 100% rename from modular_citadel/sound/vox/someone.ogg rename to sound/vox/someone.ogg diff --git a/modular_citadel/sound/vox/something.ogg b/sound/vox/something.ogg similarity index 100% rename from modular_citadel/sound/vox/something.ogg rename to sound/vox/something.ogg diff --git a/modular_citadel/sound/vox/son.ogg b/sound/vox/son.ogg similarity index 100% rename from modular_citadel/sound/vox/son.ogg rename to sound/vox/son.ogg diff --git a/modular_citadel/sound/vox/sorry.ogg b/sound/vox/sorry.ogg similarity index 100% rename from modular_citadel/sound/vox/sorry.ogg rename to sound/vox/sorry.ogg diff --git a/modular_citadel/sound/vox/south.ogg b/sound/vox/south.ogg similarity index 100% rename from modular_citadel/sound/vox/south.ogg rename to sound/vox/south.ogg diff --git a/modular_citadel/sound/vox/squad.ogg b/sound/vox/squad.ogg similarity index 100% rename from modular_citadel/sound/vox/squad.ogg rename to sound/vox/squad.ogg diff --git a/modular_citadel/sound/vox/square.ogg b/sound/vox/square.ogg similarity index 100% rename from modular_citadel/sound/vox/square.ogg rename to sound/vox/square.ogg diff --git a/modular_citadel/sound/vox/stairway.ogg b/sound/vox/stairway.ogg similarity index 100% rename from modular_citadel/sound/vox/stairway.ogg rename to sound/vox/stairway.ogg diff --git a/modular_citadel/sound/vox/status.ogg b/sound/vox/status.ogg similarity index 100% rename from modular_citadel/sound/vox/status.ogg rename to sound/vox/status.ogg diff --git a/modular_citadel/sound/vox/sterile.ogg b/sound/vox/sterile.ogg similarity index 100% rename from modular_citadel/sound/vox/sterile.ogg rename to sound/vox/sterile.ogg diff --git a/modular_citadel/sound/vox/sterilization.ogg b/sound/vox/sterilization.ogg similarity index 100% rename from modular_citadel/sound/vox/sterilization.ogg rename to sound/vox/sterilization.ogg diff --git a/modular_citadel/sound/vox/stolen.ogg b/sound/vox/stolen.ogg similarity index 100% rename from modular_citadel/sound/vox/stolen.ogg rename to sound/vox/stolen.ogg diff --git a/modular_citadel/sound/vox/storage.ogg b/sound/vox/storage.ogg similarity index 100% rename from modular_citadel/sound/vox/storage.ogg rename to sound/vox/storage.ogg diff --git a/modular_citadel/sound/vox/sub.ogg b/sound/vox/sub.ogg similarity index 100% rename from modular_citadel/sound/vox/sub.ogg rename to sound/vox/sub.ogg diff --git a/modular_citadel/sound/vox/subsurface.ogg b/sound/vox/subsurface.ogg similarity index 100% rename from modular_citadel/sound/vox/subsurface.ogg rename to sound/vox/subsurface.ogg diff --git a/modular_citadel/sound/vox/sudden.ogg b/sound/vox/sudden.ogg similarity index 100% rename from modular_citadel/sound/vox/sudden.ogg rename to sound/vox/sudden.ogg diff --git a/modular_citadel/sound/vox/suit.ogg b/sound/vox/suit.ogg similarity index 100% rename from modular_citadel/sound/vox/suit.ogg rename to sound/vox/suit.ogg diff --git a/modular_citadel/sound/vox/superconducting.ogg b/sound/vox/superconducting.ogg similarity index 100% rename from modular_citadel/sound/vox/superconducting.ogg rename to sound/vox/superconducting.ogg diff --git a/modular_citadel/sound/vox/supercooled.ogg b/sound/vox/supercooled.ogg similarity index 100% rename from modular_citadel/sound/vox/supercooled.ogg rename to sound/vox/supercooled.ogg diff --git a/modular_citadel/sound/vox/supply.ogg b/sound/vox/supply.ogg similarity index 100% rename from modular_citadel/sound/vox/supply.ogg rename to sound/vox/supply.ogg diff --git a/modular_citadel/sound/vox/surface.ogg b/sound/vox/surface.ogg similarity index 100% rename from modular_citadel/sound/vox/surface.ogg rename to sound/vox/surface.ogg diff --git a/modular_citadel/sound/vox/surrender.ogg b/sound/vox/surrender.ogg similarity index 100% rename from modular_citadel/sound/vox/surrender.ogg rename to sound/vox/surrender.ogg diff --git a/modular_citadel/sound/vox/surround.ogg b/sound/vox/surround.ogg similarity index 100% rename from modular_citadel/sound/vox/surround.ogg rename to sound/vox/surround.ogg diff --git a/modular_citadel/sound/vox/surrounded.ogg b/sound/vox/surrounded.ogg similarity index 100% rename from modular_citadel/sound/vox/surrounded.ogg rename to sound/vox/surrounded.ogg diff --git a/modular_citadel/sound/vox/switch.ogg b/sound/vox/switch.ogg similarity index 100% rename from modular_citadel/sound/vox/switch.ogg rename to sound/vox/switch.ogg diff --git a/modular_citadel/sound/vox/system.ogg b/sound/vox/system.ogg similarity index 100% rename from modular_citadel/sound/vox/system.ogg rename to sound/vox/system.ogg diff --git a/modular_citadel/sound/vox/systems.ogg b/sound/vox/systems.ogg similarity index 100% rename from modular_citadel/sound/vox/systems.ogg rename to sound/vox/systems.ogg diff --git a/modular_citadel/sound/vox/tactical.ogg b/sound/vox/tactical.ogg similarity index 100% rename from modular_citadel/sound/vox/tactical.ogg rename to sound/vox/tactical.ogg diff --git a/modular_citadel/sound/vox/take.ogg b/sound/vox/take.ogg similarity index 100% rename from modular_citadel/sound/vox/take.ogg rename to sound/vox/take.ogg diff --git a/modular_citadel/sound/vox/talk.ogg b/sound/vox/talk.ogg similarity index 100% rename from modular_citadel/sound/vox/talk.ogg rename to sound/vox/talk.ogg diff --git a/modular_citadel/sound/vox/tango.ogg b/sound/vox/tango.ogg similarity index 100% rename from modular_citadel/sound/vox/tango.ogg rename to sound/vox/tango.ogg diff --git a/modular_citadel/sound/vox/tank.ogg b/sound/vox/tank.ogg similarity index 100% rename from modular_citadel/sound/vox/tank.ogg rename to sound/vox/tank.ogg diff --git a/modular_citadel/sound/vox/target.ogg b/sound/vox/target.ogg similarity index 100% rename from modular_citadel/sound/vox/target.ogg rename to sound/vox/target.ogg diff --git a/modular_citadel/sound/vox/team.ogg b/sound/vox/team.ogg similarity index 100% rename from modular_citadel/sound/vox/team.ogg rename to sound/vox/team.ogg diff --git a/modular_citadel/sound/vox/temperature.ogg b/sound/vox/temperature.ogg similarity index 100% rename from modular_citadel/sound/vox/temperature.ogg rename to sound/vox/temperature.ogg diff --git a/modular_citadel/sound/vox/temporal.ogg b/sound/vox/temporal.ogg similarity index 100% rename from modular_citadel/sound/vox/temporal.ogg rename to sound/vox/temporal.ogg diff --git a/modular_citadel/sound/vox/ten.ogg b/sound/vox/ten.ogg similarity index 100% rename from modular_citadel/sound/vox/ten.ogg rename to sound/vox/ten.ogg diff --git a/modular_citadel/sound/vox/terminal.ogg b/sound/vox/terminal.ogg similarity index 100% rename from modular_citadel/sound/vox/terminal.ogg rename to sound/vox/terminal.ogg diff --git a/modular_citadel/sound/vox/terminated.ogg b/sound/vox/terminated.ogg similarity index 100% rename from modular_citadel/sound/vox/terminated.ogg rename to sound/vox/terminated.ogg diff --git a/modular_citadel/sound/vox/termination.ogg b/sound/vox/termination.ogg similarity index 100% rename from modular_citadel/sound/vox/termination.ogg rename to sound/vox/termination.ogg diff --git a/modular_citadel/sound/vox/test.ogg b/sound/vox/test.ogg similarity index 100% rename from modular_citadel/sound/vox/test.ogg rename to sound/vox/test.ogg diff --git a/modular_citadel/sound/vox/that.ogg b/sound/vox/that.ogg similarity index 100% rename from modular_citadel/sound/vox/that.ogg rename to sound/vox/that.ogg diff --git a/modular_citadel/sound/vox/the.ogg b/sound/vox/the.ogg similarity index 100% rename from modular_citadel/sound/vox/the.ogg rename to sound/vox/the.ogg diff --git a/modular_citadel/sound/vox/then.ogg b/sound/vox/then.ogg similarity index 100% rename from modular_citadel/sound/vox/then.ogg rename to sound/vox/then.ogg diff --git a/modular_citadel/sound/vox/there.ogg b/sound/vox/there.ogg similarity index 100% rename from modular_citadel/sound/vox/there.ogg rename to sound/vox/there.ogg diff --git a/modular_citadel/sound/vox/third.ogg b/sound/vox/third.ogg similarity index 100% rename from modular_citadel/sound/vox/third.ogg rename to sound/vox/third.ogg diff --git a/modular_citadel/sound/vox/thirteen.ogg b/sound/vox/thirteen.ogg similarity index 100% rename from modular_citadel/sound/vox/thirteen.ogg rename to sound/vox/thirteen.ogg diff --git a/modular_citadel/sound/vox/thirty.ogg b/sound/vox/thirty.ogg similarity index 100% rename from modular_citadel/sound/vox/thirty.ogg rename to sound/vox/thirty.ogg diff --git a/modular_citadel/sound/vox/this.ogg b/sound/vox/this.ogg similarity index 100% rename from modular_citadel/sound/vox/this.ogg rename to sound/vox/this.ogg diff --git a/modular_citadel/sound/vox/those.ogg b/sound/vox/those.ogg similarity index 100% rename from modular_citadel/sound/vox/those.ogg rename to sound/vox/those.ogg diff --git a/modular_citadel/sound/vox/thousand.ogg b/sound/vox/thousand.ogg similarity index 100% rename from modular_citadel/sound/vox/thousand.ogg rename to sound/vox/thousand.ogg diff --git a/modular_citadel/sound/vox/threat.ogg b/sound/vox/threat.ogg similarity index 100% rename from modular_citadel/sound/vox/threat.ogg rename to sound/vox/threat.ogg diff --git a/modular_citadel/sound/vox/three.ogg b/sound/vox/three.ogg similarity index 100% rename from modular_citadel/sound/vox/three.ogg rename to sound/vox/three.ogg diff --git a/modular_citadel/sound/vox/through.ogg b/sound/vox/through.ogg similarity index 100% rename from modular_citadel/sound/vox/through.ogg rename to sound/vox/through.ogg diff --git a/modular_citadel/sound/vox/time.ogg b/sound/vox/time.ogg similarity index 100% rename from modular_citadel/sound/vox/time.ogg rename to sound/vox/time.ogg diff --git a/modular_citadel/sound/vox/to.ogg b/sound/vox/to.ogg similarity index 100% rename from modular_citadel/sound/vox/to.ogg rename to sound/vox/to.ogg diff --git a/modular_citadel/sound/vox/top.ogg b/sound/vox/top.ogg similarity index 100% rename from modular_citadel/sound/vox/top.ogg rename to sound/vox/top.ogg diff --git a/modular_citadel/sound/vox/topside.ogg b/sound/vox/topside.ogg similarity index 100% rename from modular_citadel/sound/vox/topside.ogg rename to sound/vox/topside.ogg diff --git a/modular_citadel/sound/vox/touch.ogg b/sound/vox/touch.ogg similarity index 100% rename from modular_citadel/sound/vox/touch.ogg rename to sound/vox/touch.ogg diff --git a/modular_citadel/sound/vox/towards.ogg b/sound/vox/towards.ogg similarity index 100% rename from modular_citadel/sound/vox/towards.ogg rename to sound/vox/towards.ogg diff --git a/modular_citadel/sound/vox/track.ogg b/sound/vox/track.ogg similarity index 100% rename from modular_citadel/sound/vox/track.ogg rename to sound/vox/track.ogg diff --git a/modular_citadel/sound/vox/train.ogg b/sound/vox/train.ogg similarity index 100% rename from modular_citadel/sound/vox/train.ogg rename to sound/vox/train.ogg diff --git a/modular_citadel/sound/vox/transportation.ogg b/sound/vox/transportation.ogg similarity index 100% rename from modular_citadel/sound/vox/transportation.ogg rename to sound/vox/transportation.ogg diff --git a/modular_citadel/sound/vox/truck.ogg b/sound/vox/truck.ogg similarity index 100% rename from modular_citadel/sound/vox/truck.ogg rename to sound/vox/truck.ogg diff --git a/modular_citadel/sound/vox/tunnel.ogg b/sound/vox/tunnel.ogg similarity index 100% rename from modular_citadel/sound/vox/tunnel.ogg rename to sound/vox/tunnel.ogg diff --git a/modular_citadel/sound/vox/turn.ogg b/sound/vox/turn.ogg similarity index 100% rename from modular_citadel/sound/vox/turn.ogg rename to sound/vox/turn.ogg diff --git a/modular_citadel/sound/vox/turret.ogg b/sound/vox/turret.ogg similarity index 100% rename from modular_citadel/sound/vox/turret.ogg rename to sound/vox/turret.ogg diff --git a/modular_citadel/sound/vox/twelve.ogg b/sound/vox/twelve.ogg similarity index 100% rename from modular_citadel/sound/vox/twelve.ogg rename to sound/vox/twelve.ogg diff --git a/modular_citadel/sound/vox/twenty.ogg b/sound/vox/twenty.ogg similarity index 100% rename from modular_citadel/sound/vox/twenty.ogg rename to sound/vox/twenty.ogg diff --git a/modular_citadel/sound/vox/two.ogg b/sound/vox/two.ogg similarity index 100% rename from modular_citadel/sound/vox/two.ogg rename to sound/vox/two.ogg diff --git a/modular_citadel/sound/vox/unauthorized.ogg b/sound/vox/unauthorized.ogg similarity index 100% rename from modular_citadel/sound/vox/unauthorized.ogg rename to sound/vox/unauthorized.ogg diff --git a/modular_citadel/sound/vox/under.ogg b/sound/vox/under.ogg similarity index 100% rename from modular_citadel/sound/vox/under.ogg rename to sound/vox/under.ogg diff --git a/modular_citadel/sound/vox/uniform.ogg b/sound/vox/uniform.ogg similarity index 100% rename from modular_citadel/sound/vox/uniform.ogg rename to sound/vox/uniform.ogg diff --git a/modular_citadel/sound/vox/unlocked.ogg b/sound/vox/unlocked.ogg similarity index 100% rename from modular_citadel/sound/vox/unlocked.ogg rename to sound/vox/unlocked.ogg diff --git a/modular_citadel/sound/vox/until.ogg b/sound/vox/until.ogg similarity index 100% rename from modular_citadel/sound/vox/until.ogg rename to sound/vox/until.ogg diff --git a/modular_citadel/sound/vox/up.ogg b/sound/vox/up.ogg similarity index 100% rename from modular_citadel/sound/vox/up.ogg rename to sound/vox/up.ogg diff --git a/modular_citadel/sound/vox/upper.ogg b/sound/vox/upper.ogg similarity index 100% rename from modular_citadel/sound/vox/upper.ogg rename to sound/vox/upper.ogg diff --git a/modular_citadel/sound/vox/uranium.ogg b/sound/vox/uranium.ogg similarity index 100% rename from modular_citadel/sound/vox/uranium.ogg rename to sound/vox/uranium.ogg diff --git a/modular_citadel/sound/vox/us.ogg b/sound/vox/us.ogg similarity index 100% rename from modular_citadel/sound/vox/us.ogg rename to sound/vox/us.ogg diff --git a/modular_citadel/sound/vox/usa.ogg b/sound/vox/usa.ogg similarity index 100% rename from modular_citadel/sound/vox/usa.ogg rename to sound/vox/usa.ogg diff --git a/modular_citadel/sound/vox/use.ogg b/sound/vox/use.ogg similarity index 100% rename from modular_citadel/sound/vox/use.ogg rename to sound/vox/use.ogg diff --git a/modular_citadel/sound/vox/used.ogg b/sound/vox/used.ogg similarity index 100% rename from modular_citadel/sound/vox/used.ogg rename to sound/vox/used.ogg diff --git a/modular_citadel/sound/vox/user.ogg b/sound/vox/user.ogg similarity index 100% rename from modular_citadel/sound/vox/user.ogg rename to sound/vox/user.ogg diff --git a/modular_citadel/sound/vox/vacate.ogg b/sound/vox/vacate.ogg similarity index 100% rename from modular_citadel/sound/vox/vacate.ogg rename to sound/vox/vacate.ogg diff --git a/modular_citadel/sound/vox/valid.ogg b/sound/vox/valid.ogg similarity index 100% rename from modular_citadel/sound/vox/valid.ogg rename to sound/vox/valid.ogg diff --git a/modular_citadel/sound/vox/vapor.ogg b/sound/vox/vapor.ogg similarity index 100% rename from modular_citadel/sound/vox/vapor.ogg rename to sound/vox/vapor.ogg diff --git a/modular_citadel/sound/vox/vent.ogg b/sound/vox/vent.ogg similarity index 100% rename from modular_citadel/sound/vox/vent.ogg rename to sound/vox/vent.ogg diff --git a/modular_citadel/sound/vox/ventillation.ogg b/sound/vox/ventillation.ogg similarity index 100% rename from modular_citadel/sound/vox/ventillation.ogg rename to sound/vox/ventillation.ogg diff --git a/modular_citadel/sound/vox/victor.ogg b/sound/vox/victor.ogg similarity index 100% rename from modular_citadel/sound/vox/victor.ogg rename to sound/vox/victor.ogg diff --git a/modular_citadel/sound/vox/violated.ogg b/sound/vox/violated.ogg similarity index 100% rename from modular_citadel/sound/vox/violated.ogg rename to sound/vox/violated.ogg diff --git a/modular_citadel/sound/vox/violation.ogg b/sound/vox/violation.ogg similarity index 100% rename from modular_citadel/sound/vox/violation.ogg rename to sound/vox/violation.ogg diff --git a/modular_citadel/sound/vox/voltage.ogg b/sound/vox/voltage.ogg similarity index 100% rename from modular_citadel/sound/vox/voltage.ogg rename to sound/vox/voltage.ogg diff --git a/modular_citadel/sound/vox/vox_login.ogg b/sound/vox/vox_login.ogg similarity index 100% rename from modular_citadel/sound/vox/vox_login.ogg rename to sound/vox/vox_login.ogg diff --git a/modular_citadel/sound/vox/walk.ogg b/sound/vox/walk.ogg similarity index 100% rename from modular_citadel/sound/vox/walk.ogg rename to sound/vox/walk.ogg diff --git a/modular_citadel/sound/vox/wall.ogg b/sound/vox/wall.ogg similarity index 100% rename from modular_citadel/sound/vox/wall.ogg rename to sound/vox/wall.ogg diff --git a/modular_citadel/sound/vox/want.ogg b/sound/vox/want.ogg similarity index 100% rename from modular_citadel/sound/vox/want.ogg rename to sound/vox/want.ogg diff --git a/modular_citadel/sound/vox/wanted.ogg b/sound/vox/wanted.ogg similarity index 100% rename from modular_citadel/sound/vox/wanted.ogg rename to sound/vox/wanted.ogg diff --git a/modular_citadel/sound/vox/warm.ogg b/sound/vox/warm.ogg similarity index 100% rename from modular_citadel/sound/vox/warm.ogg rename to sound/vox/warm.ogg diff --git a/modular_citadel/sound/vox/warn.ogg b/sound/vox/warn.ogg similarity index 100% rename from modular_citadel/sound/vox/warn.ogg rename to sound/vox/warn.ogg diff --git a/modular_citadel/sound/vox/warning.ogg b/sound/vox/warning.ogg similarity index 100% rename from modular_citadel/sound/vox/warning.ogg rename to sound/vox/warning.ogg diff --git a/modular_citadel/sound/vox/waste.ogg b/sound/vox/waste.ogg similarity index 100% rename from modular_citadel/sound/vox/waste.ogg rename to sound/vox/waste.ogg diff --git a/modular_citadel/sound/vox/water.ogg b/sound/vox/water.ogg similarity index 100% rename from modular_citadel/sound/vox/water.ogg rename to sound/vox/water.ogg diff --git a/modular_citadel/sound/vox/we.ogg b/sound/vox/we.ogg similarity index 100% rename from modular_citadel/sound/vox/we.ogg rename to sound/vox/we.ogg diff --git a/modular_citadel/sound/vox/weapon.ogg b/sound/vox/weapon.ogg similarity index 100% rename from modular_citadel/sound/vox/weapon.ogg rename to sound/vox/weapon.ogg diff --git a/modular_citadel/sound/vox/west.ogg b/sound/vox/west.ogg similarity index 100% rename from modular_citadel/sound/vox/west.ogg rename to sound/vox/west.ogg diff --git a/modular_citadel/sound/vox/whiskey.ogg b/sound/vox/whiskey.ogg similarity index 100% rename from modular_citadel/sound/vox/whiskey.ogg rename to sound/vox/whiskey.ogg diff --git a/modular_citadel/sound/vox/white.ogg b/sound/vox/white.ogg similarity index 100% rename from modular_citadel/sound/vox/white.ogg rename to sound/vox/white.ogg diff --git a/modular_citadel/sound/vox/wilco.ogg b/sound/vox/wilco.ogg similarity index 100% rename from modular_citadel/sound/vox/wilco.ogg rename to sound/vox/wilco.ogg diff --git a/modular_citadel/sound/vox/will.ogg b/sound/vox/will.ogg similarity index 100% rename from modular_citadel/sound/vox/will.ogg rename to sound/vox/will.ogg diff --git a/modular_citadel/sound/vox/with.ogg b/sound/vox/with.ogg similarity index 100% rename from modular_citadel/sound/vox/with.ogg rename to sound/vox/with.ogg diff --git a/modular_citadel/sound/vox/without.ogg b/sound/vox/without.ogg similarity index 100% rename from modular_citadel/sound/vox/without.ogg rename to sound/vox/without.ogg diff --git a/modular_citadel/sound/vox/woop.ogg b/sound/vox/woop.ogg similarity index 100% rename from modular_citadel/sound/vox/woop.ogg rename to sound/vox/woop.ogg diff --git a/modular_citadel/sound/vox/xeno.ogg b/sound/vox/xeno.ogg similarity index 100% rename from modular_citadel/sound/vox/xeno.ogg rename to sound/vox/xeno.ogg diff --git a/modular_citadel/sound/vox/yankee.ogg b/sound/vox/yankee.ogg similarity index 100% rename from modular_citadel/sound/vox/yankee.ogg rename to sound/vox/yankee.ogg diff --git a/modular_citadel/sound/vox/yards.ogg b/sound/vox/yards.ogg similarity index 100% rename from modular_citadel/sound/vox/yards.ogg rename to sound/vox/yards.ogg diff --git a/modular_citadel/sound/vox/year.ogg b/sound/vox/year.ogg similarity index 100% rename from modular_citadel/sound/vox/year.ogg rename to sound/vox/year.ogg diff --git a/modular_citadel/sound/vox/yellow.ogg b/sound/vox/yellow.ogg similarity index 100% rename from modular_citadel/sound/vox/yellow.ogg rename to sound/vox/yellow.ogg diff --git a/modular_citadel/sound/vox/yes.ogg b/sound/vox/yes.ogg similarity index 100% rename from modular_citadel/sound/vox/yes.ogg rename to sound/vox/yes.ogg diff --git a/modular_citadel/sound/vox/you.ogg b/sound/vox/you.ogg similarity index 100% rename from modular_citadel/sound/vox/you.ogg rename to sound/vox/you.ogg diff --git a/modular_citadel/sound/vox/your.ogg b/sound/vox/your.ogg similarity index 100% rename from modular_citadel/sound/vox/your.ogg rename to sound/vox/your.ogg diff --git a/modular_citadel/sound/vox/yourself.ogg b/sound/vox/yourself.ogg similarity index 100% rename from modular_citadel/sound/vox/yourself.ogg rename to sound/vox/yourself.ogg diff --git a/modular_citadel/sound/vox/zero.ogg b/sound/vox/zero.ogg similarity index 100% rename from modular_citadel/sound/vox/zero.ogg rename to sound/vox/zero.ogg diff --git a/modular_citadel/sound/vox/zone.ogg b/sound/vox/zone.ogg similarity index 100% rename from modular_citadel/sound/vox/zone.ogg rename to sound/vox/zone.ogg diff --git a/modular_citadel/sound/vox/zulu.ogg b/sound/vox/zulu.ogg similarity index 100% rename from modular_citadel/sound/vox/zulu.ogg rename to sound/vox/zulu.ogg diff --git a/sound/weapons/neovgre_laser.ogg b/sound/weapons/neovgre_laser.ogg new file mode 100644 index 0000000000..da97117ae8 Binary files /dev/null and b/sound/weapons/neovgre_laser.ogg differ diff --git a/strings/dwarf_replacement.json b/strings/dwarf_replacement.json new file mode 100644 index 0000000000..2049c5ab26 --- /dev/null +++ b/strings/dwarf_replacement.json @@ -0,0 +1,1461 @@ +{ + + "dwarf": { + "ability": "abeelitie", + "about": "aboot", + "above": "abuin", + "abroad": "abraid", + "absorb": "drack", + "absorbing": "drackin'", + "absorbs": "dracks", + "accuse": "delate", + "accused": "delated", + "across": "athwart", + "act": "ect", + "acts": "ects", + "add": "eik", + "added": "eikit", + "adds": "eiks", + "admit": "admeet", + "admits": "admeets", + "afraid": "feart", + "africa": "afrikey", + "after": "efter", + "against": "agin", + "alarm": "alairm", + "ale": "yill", + "all": "a'", + "allow": "allou", + "almost": "naur", + "along": "yont", + "aloof": "abeich", + "aloud": "lood out", + "also": "an a'", + "always": "aye", + "amazed": "dumfoundert", + "america": "amerikie", + "amidst": "'midst", + "among": [ + "'mang", + "amang" + ], + "amount": [ + "amoont", + "feck" + ], + "and": "an'", + "animal": "beist", + "animals": "beists", + "ankle": "cuit", + "ankles": "cuits", + "announce": "annoonce", + "announces": "annoonces", + "another": "anither", + "answered": "answert", + "ant": "eemock", + "ants": "eemocks", + "anxiety": "anxeeitie", + "any": "ony", + "anybody": "aebodie", + "apprentice": "prentice", + "apprentices": "prentices", + "are": "ar", + "aren't": "arena", + "arm": "airm", + "arrange": "dispone", + "arranged": "dispon'd", + "arranges": "dispones", + "arrest": "lift", + "arrested": "liftit", + "arrests": "lifts", + "arse": "erse", + "arses": "erses", + "artificial": "artifeicial", + "ash": "ase", + "ashes": "ase", + "aside": "ascient", + "ask": "aks", + "asked": "akst", + "asks": "aks", + "ass": "erse", + "asses": "erses", + "asshole": "hurdie", + "ate": "ett", + "aunt": "auntie", + "author": "owthor", + "awaken": "awauken", + "awakens": "awaukens", + "away": "awa", + "awful": "awfu", + "awfully": "awfy", + "awkward": "thrawart", + "awry": [ + "aglae", + "ajee" + ], + "axe": "aix", + "axle": "aixle", + "back": "hint", + "bacon": "ham", + "bad": "ill", + "bags": "begs", + "bake": "bak", + "baked": "bakken", + "bakes": "baks", + "bald": "beld", + "ball": "baw", + "balls": "baws", + "bar": "baur", + "barber's": "baurber's", + "barber": "baurber", + "barbers": "baurbers", + "bastard": "bas", + "bat": "flichtermoose", + "baton": "rung", + "batons": "rungs", + "bats": "flichtermooses", + "beach": "foreland", + "beard": "bairds", + "beards": "bairds", + "beautiful": "bonnie", + "because": "kis", + "become": "set", + "becomes": "sets", + "bed": "scratcher", + "beds": "scratchers", + "bee's": "skep-bee's", + "bee": "skep-bee", + "bees": "skep-bees", + "beetle": "clock", + "beetles": "clocks", + "before": "afore", + "began": "begoud", + "being": "bein", + "belong": "belang", + "belonged": "belangit", + "belongs": "belangs", + "below": "ablo", + "beneath": "inunner", + "bent": "bowlt", + "besides": "forby", + "between": "atween", + "beware": "bewaur", + "bilberry": "blaeberry", + "bind": "thirl", + "binds": "thirls", + "bird": "burd", + "birds": "burdies", + "biscuit": "bannock", + "biscuits": "bannocks", + "bitch": "bick", + "bitches": "bicks", + "bitching": "bickerin'", + "bitter": "wersh", + "blackbird": "bleckie", + "blackbirds": "bleckies", + "blame": "wyse", + "blamed": "wysed", + "blames": "wyses", + "blast": "tout", + "blind": "blinnd", + "blood": "bluid", + "bloody": "bluidy", + "blue": "blae", + "boil": "bile", + "boils": "biles", + "bold": "bauld", + "bolder": "baulder", + "boldest": "bauldest", + "boldly": "baudly", + "bolt": "bowt", + "bone": "bane", + "bones": "banes", + "bony": "bainie", + "book": "beuk", + "books": "beuks", + "boot": "buit", + "borrow": "borrae", + "borrowed": "borraed", + "borrowing": "borrain'", + "borrows": "borraes", + "both": "baith", + "bother": "fash", + "box": [ + "boax", + "kist" + ], + "boy": "laddie", + "boys": "laddies", + "brawl": "brulyie", + "breath": "braith", + "brew": "broo", + "broad": "braid", + "broke": "bruck", + "broken": "brustit", + "brood": "bairntime", + "broom": "besom", + "brooms": "besoms", + "broth": "brose", + "brother's": "brither's", + "brother": "brither", + "brothers": "brithers", + "brown": "broon", + "bucket": "backit", + "buckets": "backits", + "build": "big", + "built": "biggit", + "bump": "bumfle", + "buried": "yirdit", + "burnt": "brunt", + "bury": "birrie", + "busy": "bizzie", + "butcher": "flesher", + "butt": "dowp", + "buttocks": "dowp", + "button": "gornal", + "buttons": "gornals", + "butts": "bahookies", + "by": "bi", + "call": "ca'", + "called": "caad", + "calls": "ca'", + "came": "cam", + "can't": "cannae", + "cap": "kaip", + "caps": "kaips", + "captain's": "chief's", + "captain": "chief", + "car": "caur", + "card": "kerd", + "cards": "kerds", + "careful": "canny", + "careless": "feckless", + "carpenter": "jyner", + "carpenters": "jyners", + "carpet": "cairpet", + "carried": "cairiet", + "carries": "cairies", + "carry": "cairie", + "cart": "cairt", + "cash": "clink", + "cat's": "cheetie's", + "cat": "cheetie", + "catch": "kep", + "catched": "keppit", + "cats": "cheeties", + "caught": "keppit", + "cause": "gar", + "caused": "gart", + "certainly": "fairly", + "chance": "chaunce", + "chances": "chaunces", + "change": "chynge", + "changed": "chynged", + "changeling": "chyngelin'", + "chatter": "blether", + "cheer": "chear", + "cheerful": "chearfu'", + "cheerless": "chearless", + "cheers": "chears", + "cheery": "cheary", + "chest": "kist", + "chests": "kist", + "chick": "pout", + "chicks": "pouts", + "child": "bairn", + "chilly": "snell", + "chimney": "chimley", + "chimneys": "chimleys", + "choose": "chuise", + "chooses": "chuises", + "chosen": "chuist", + "christmas": "Yule", + "chunk": "dod", + "chunks": "dods", + "church": "kirk", + "cigarette": "baccie", + "cigarettes": "baccies", + "city": "ceity", + "clean": "clane", + "cloth": "cloot", + "clothes": "claes", + "cold": "cauld", + "comb": "kaim", + "commotion": "stramash", + "concerning": "anent", + "consider": "see", + "conspicuous": "kenspeckle", + "cool": "cuil", + "corner": "neuk", + "correctly": "swash", + "cosy": "codgie", + "cottage": "but and ben", + "cough": "hoast", + "could": "coud", + "couldn't": "coudnae", + "couldnt": "coudnae", + "country": "kintra", + "cow": "coo", + "crate": "kist", + "crates": "kists", + "creak": "jarg", + "creaked": "jarg'd", + "creaking": "jargin'", + "creaks": "jargs", + "creature": "cretter", + "creatures": "cretters", + "cries": "girns", + "critter": "cretter", + "critters": "cretters", + "crooked": "cruikit", + "crow": "corbie", + "crowbar": "louder", + "crowbars": "louders", + "crowd": "byke", + "cruel": "fell", + "crush": "brousle", + "crusher": "brousler", + "cry": "greet", + "crying": "greetin", + "cuff": "shackle", + "cuffed": "shackled", + "cuffing": "shackling", + "cuffs": "shangies", + "cup": "tassie", + "cut": "sned", + "cute": "gainin", + "cuts": "sneds", + "cutters": "sheers", + "daft": "dunderheided", + "damage": "skaith", + "dare": "daur", + "dared": "durst", + "daren't": "daurnae", + "darent": "daurnae", + "dares": "daurs", + "dark": "daurk", + "darken": "daurken", + "dawn": "cockcrow", + "dead": "deid", + "deaf": "deif", + "deafen": "deave", + "death": "dead", + "deaths": "deads", + "delightful": "lichtsome", + "delve": "del", + "deny": "forsay", + "depressed": "dumpie", + "describe": "descrive", + "devil": "de'il", + "didn't": "didnae", + "didnt": "didnae", + "die": "dee", + "died": "dee'd", + "dies": "dees", + "difficult": "difeecult", + "dig": "howk", + "directed": "airtit", + "directions": "airts", + "dirty": "clarty", + "discover": "diskiver", + "discovered": "diskiver'd", + "discovers": "diskivers", + "disgust": [ + "sconner", + "scunner" + ], + "disgusting": "scunnersome", + "dishonest": "unhonest", + "dive": "dyve", + "dives": "dyves", + "diving": "dyvin'", + "do": "dae", + "does": "dis", + "dog": [ + "dug", + "tyke" + ], + "dogs": "tykes", + "don't": "dinnae", + "done": "duin", + "dont": "dinnae", + "doom": "deim", + "doomed": "deim'd", + "door": "dorr", + "doors": "dorrs", + "doubt": "dout", + "doubted": "doutit", + "doubting": "doutin'", + "doubts": "douts", + "dough": "daugh", + "dove": "doo", + "down": "doun", + "downfall": "dounfaa", + "downtrodden": "dounhauden", + "drain": "stank", + "dread": "dreid", + "dream": "draim", + "dreams": "draims", + "drew": "draw", + "drink": "beb", + "drinks": "bebs", + "drip": "dreep", + "drive": "caw", + "drone": "bum", + "drones": "bums", + "drop": "drap", + "drown": "droun", + "drowned": "drount", + "drowning": "drounin'", + "drowns": "drouns", + "drug": "drog", + "drugs": "drogs", + "drunk": "drunken", + "drunkard": "sot", + "dry": "freuch", + "duck": "dook", + "ducked": "douked", + "dusk": "gloaming", + "dust": "stoor", + "dusty": "stourie", + "dwell": "wone", + "dying": "diein'", + "each": "ilk", + "eagle": [ + "aigle", + "earn" + ], + "eagles": "earns", + "ear": "lug", + "early": "earlie", + "earth": "yird", + "east": "aist", + "eastern": "eastlin", + "easternmost": "eastmaist", + "eastmost": "eastmaist", + "eastward": "aistart", + "eat": "aet", + "eaten": "etten", + "eats": "aets", + "eden": "aidin", + "edinburgh": "auld reekie", + "eight": "eighct", + "eighteen": "aughten", + "else": "ense", + "empty": [ + "empie", + "toom" + ], + "end": "en", + "endure": "thole", + "engine's": "ingine's", + "engine": "ingine", + "engineer's": "ingineer's", + "engineer": "ingineer", + "engineers'": "ingineers'", + "engineers": "ingineers", + "engines": "ingines", + "english": "soothron", + "enough's": "eneuch's", + "enough": "eneuch", + "equal": "match", + "escaped": "gat awa", + "eternal": "ayebidin", + "even": "e'en", + "evening": "e'en", + "ever": "iver", + "every": "ilka", + "everything": "iveriehott", + "everywhere": "aa wey", + "ewe": "yowe", + "example": "ensaumple", + "extraordinarily": "unco", + "extremely": "unco", + "eye": "ee", + "eyebrow": "e'ebrie", + "eyebrows": "e'ebries", + "eyes": "een", + "fall": "fa'", + "fallen": "fa'n", + "falling": "faain", + "falls": "fa's", + "false": "fause", + "family": "faimly", + "far": "faur", + "fart": "pump", + "farther": "faurer", + "farts": "pumps", + "father": "faither", + "fault": [ + "blame", + "faut" + ], + "faults": "fauts", + "feeble": "doweless", + "feed": "beet", + "fellow": "chiel", + "fetch": "fuish", + "fetched": "fuishen", + "fetches": "fuishes", + "few": "puckle", + "fight": "fecht", + "fill": "ful", + "filled": "fult", + "find": "fin", + "fine": "braw", + "finely": "brawlie", + "fish": "fush", + "flake": "flichan", + "flakes": "flichans", + "flap": "flaff", + "flapped": "flaff'd", + "flapping": "flaffin", + "flaps": "flaffs", + "flea": "flaich", + "fleas": "flaich", + "flood": "speat", + "flour": "floor", + "flown": "flewn", + "flutter": "flitter", + "fluttered": "flittered", + "fluttering": "flittering", + "flutters": "flitter", + "fly": "flee", + "foam": "faem", + "folk": "fowk", + "food": "fuid", + "foot": "fuit", + "for": "fur", + "forget": "forgit", + "forgets": "forgits", + "forgive": "forgie", + "forgives": "forgies", + "forgot": "forgat", + "forsake": "forhou", + "forward": "forrit", + "fought": "feuchen", + "foul": "fyle", + "found": "funnd", + "four": "fower", + "fox": "tod", + "friend": "pal", + "friends": "mukkers", + "from": "fae", + "front": "foreside", + "frown": "glunch", + "frowned": "glunch'd", + "full": "stowed oot", + "fumble": "ficher", + "fumbled": "ficher'd", + "fumbles": "fichers", + "further": "farder", + "furthest": "benmaist", + "fussy": "fykie", + "gate": "yett", + "get": "git", + "gets": "gits", + "ghost": "ghaist", + "ghostdrone": "ghaistbum", + "ghostdrones": "ghaistbums", + "ghosts": "ghaists", + "gibberish": "blethers", + "girl": "lassie", + "girls": "lassies ", + "give": "gie", + "given": "gied", + "gives": "gies", + "glare": "glower", + "glared": "glower'd", + "glove": "gluive", + "gloves": "gluives", + "glow": "glowe", + "glows": "glowes", + "go": "gae", + "goat": "gait", + "goats": "gaits", + "goes": "gaes", + "going": "gaein", + "gone": "gaen", + "good": [ + "braw", + "guid" + ], + "goodbye": "fare ye weel", + "gosh": "jings", + "got": "gat", + "grandmother": "aulddame", + "great": [ + "braw", + "stoatin" + ], + "grin": "gandge", + "grip": "yoke", + "groin": "lisk", + "grow": "growe", + "grown": "growed", + "grows": "growes", + "guard": "waird", + "guess": "jalouse", + "guest": "caa'er", + "guests": "caa'ers", + "had": "haed", + "hadn't": "haednae", + "hadnt": "haednae", + "haggling": "priggin", + "half": "hauf", + "halfwit": "haiverel", + "halfwits": "haiverel", + "hall": "haa", + "halt": "stoppit", + "hammer": "haimer", + "hammers": "haimers", + "hand": "haun", + "handcuff": "haundshackle", + "handcuffed": "haundshackled", + "handcuffing": "haundshackling", + "handcuffs": "shangies", + "handle": "haunnle", + "hands": "hauns", + "hang": "hing", + "happy": "blythe", + "hard": "haurd", + "hardly": "haurdlie", + "harm": "skaith", + "harvest": "hairst", + "harvests": "hairsts", + "have": "hae", + "haven't": "hinna", + "havent": "hinna", + "head": "heid", + "healthy": "brosie", + "heard": "haurd", + "heart": "hert", + "hearty": "herty", + "hedgehog": "hurchin", + "hedgehogs": "hurchins", + "hello": "hullo", + "helmet": "helm", + "helmets": "helms", + "help": "hulp", + "helped": "helpit", + "hen": "chuck", + "hens": "chucks", + "hid": "dern'd", + "hidden": "dern'd", + "hide": "dern", + "hides": "derns", + "high": "hie", + "highest": "hiest", + "highland": "hielan'", + "highlands": "hielands", + "hit": "clout", + "hits": "clouts", + "hoarse": "hersh", + "holy": "halie", + "home": "hame", + "honey": "hinnie", + "hope": "houpe", + "hopes": "houpes", + "horrible": "gruesome", + "hot": "het", + "house": "hoose", + "how": "howfur", + "howl": "yowl", + "howled": "yowled", + "howling": "yowling", + "howls": "yowls", + "hungry": "hungert", + "husband": "guidman", + "husbands": "guidmen", + "idea": "conceit", + "ideas": "conceits", + "idiot": "eejit", + "idiots": "eejits", + "ill": "unweel", + "im": "a'm", + "i'm": "a'm", + "import": "inbring", + "incantation": "cantrip", + "incantations": "cantrips", + "industrious": "eydent", + "infinite": "mairchless", + "inject": "jag", + "injected": "jagit", + "injection": "jag", + "injections": "jag", + "insect": "beastie", + "insects": "beasties", + "inside": "inby", + "into": "intae", + "ireland": "airlan", + "island": "islan", + "islands": "islans", + "isn't": "isna", + "isnt": "isna", + "issue": "aishan", + "it's": "hit's", + "it": "hit", + "its": "hits", + "jar": "jaur", + "jars": "jaurs", + "jig's": "jeeg's", + "jig": "jeeg", + "jigs": "jeegs", + "join": "jine", + "jolly": "waulie", + "judge": "juidge", + "judged": "juidgit", + "judges": "juidges", + "jump": "loup", + "jumped": "lowpen", + "jumping": "loupin", + "jumpsuit's": "carsakie's", + "jumpsuit": "carsackie", + "jumpsuits": "carsakies", + "just": "jist", + "kept": "keepit", + "killed": "kilt", + "kind": "kin", + "kindly": "kin'ly", + "kitchen": "keetchin", + "know": "ken", + "known": "kent", + "knows": "ken", + "laid": "leen", + "lake": "loch", + "lakes": "lochs", + "land": "lan", + "large": "muckle", + "last": "lest", + "lasted": "lestit", + "lasts": "lests", + "lawyer": "lawer", + "lawyers": "lawers", + "lay": "lee", + "lazy": "thowless", + "leap": "loup", + "leaping": "loupin", + "leapt": "lowpen", + "learn": "lairn", + "learned": "lairnt", + "learns": "lairns", + "leave": "lea'", + "lend": "len", + "length": "lenth", + "lengths": "lenths", + "let": "lat", + "letter": "screive", + "liar": "leear", + "liars": "leears", + "lie": "lee", + "lifted": "liftit", + "light": "licht", + "lightning": "fire-flaucht", + "like": "lik", + "liked": "likit", + "limp": "hirple", + "liquor": "spunkie", + "list": "leet", + "little": "wee", + "live": "bide", + "lived": "bade", + "lively": "birkie", + "lives": "bides", + "load": "lade", + "loaded": "laden", + "loading": "laden'", + "loads": "lades", + "lobster": "lapster", + "lobsters": "lapsters", + "long": "lang", + "look": "leuk", + "looked": "leukit", + "looks": "leuks", + "lore": "lear", + "lose": "tyne", + "loses": "tynes", + "lost": "tint", + "lot": "wheen", + "loud": "lood", + "louse": "cootie", + "love": "loo", + "loved": "loo'd", + "loves": "loos", + "loving": "looin", + "low": "wee", + "lowest": "blomaist", + "lump": "dod", + "made": "makkit", + "magic": "glammerie", + "make": "mak", + "man": "jimmy", + "manure": "aidle", + "many": "mony", + "married": "merrit", + "may": "can", + "maybe": "mibbie", + "meat": "flesh", + "merchant's": "packman's", + "merchant": "packman", + "merchants'": "packmens'", + "merchants": "packmen", + "mess": "fankle", + "mice": "myce", + "might": "micht", + "mightn't": "michtna", + "mightnt": "michtna", + "milk": "mulk", + "min": "min'", + "mine": "mines", + "mire": "glaur", + "mischeivous": "ill-trickit", + "miss": "tyne", + "misses": "tynes", + "missing": "amissin", + "mistake": "mistak", + "mistaken": "mistaen", + "mixture": "mixtur", + "mole": "mowdiewarp", + "moles": "mowdiewarps", + "money": "clink", + "monkey": "puggie", + "monkeys": "puggies", + "monkies": "puggies", + "moor": "muir", + "more": "mair", + "moron": "baw juggler", + "morons": "dunderheids", + "most": "maist", + "moth": "blinnd-bat", + "mother": "maw", + "moths": "blinnd-bats", + "mountain": "ben", + "mountains": "bens", + "mouse": "moose", + "moustache": "mouser", + "moustaches": "mousers", + "mouth": "gob", + "move": "flit", + "moved": "flittit", + "moves": "flits", + "much": "muckle", + "muddled": "doited", + "music": "muisic", + "must": "maun", + "mustache": "mouser", + "mustaches": "mousers", + "mustn't": "maunna", + "mustnt": "maunna", + "my": "ma", + "myself": "masel", + "naked": "nakit", + "nanotrasen": "nanotraisen", + "natural": "naitral", + "nature": "naitur", + "near": "naur", + "nearer": "naurer", + "nearest": "naurmaist", + "needed": "needit", + "needn't": "needna", + "neednt": "needna", + "neither": "nane", + "nestle": "coorie", + "never": "ne'er", + "news": "bizz", + "next": "neist", + "nice": "crakin", + "night": "nicht", + "nights": "nichts", + "nit": "cootie", + "no": "nae", + "none": "nane", + "nonsense": [ + "haivers", + "havers", + "pish" + ], + "north": "nor", + "northern": "norlins", + "northernmost": "normaist", + "northmost": "normasit", + "not": "no", + "nothing": "hee haw", + "now": "nou", + "number": "hantle", + "numbers": "hantles", + "oak": "aik", + "oat": "aits", + "oats": "aits", + "obliged": "behauden", + "of": "o'", + "off": "aff", + "officer": "boaby", + "officers": "boabies", + "often": "aften", + "oh": "och", + "oil": "ile", + "old": "auld", + "once": "yinst", + "one": "ane", + "onion": "ingan", + "onions": "ingans", + "opened": "opent", + "opposite": "forgain", + "oppressed": "dounhauden", + "other": "ither", + "our": "oor", + "ourselves": "oorsels", + "out": "oot", + "outside": "ootside", + "oven": "uin", + "ovens": "uins", + "over": "oot ower", + "owe": "awe", + "owes": "awes", + "owl": "howlet", + "owls": "howlets", + "own": "ain", + "owned": "awned", + "owns": "awns", + "painting": "pentin", + "pale": "peely-wally", + "pants": "trews", + "parcel": "paircel", + "parched": "drouchtit", + "park": "pairk", + "part": "pairt", + "parted": "pairted", + "partial": "pairtial", + "parts": "pairts", + "path": "pad", + "pebble": [ + "chuckie", + "chuckie-stane" + ], + "pebbles": "chuckie-stanes", + "pee": "strone", + "peed": "stroned", + "pees": "strones", + "people": "fowk", + "person": "chiel", + "pet": "daut", + "pets": "dauts", + "petted": "dautit", + "petting": "dautin'", + "phantom": "bogle", + "phone": "phane", + "phones": "phanes", + "picture": "pictur", + "pictures": "picturs", + "pierce": "thirl", + "pigeon": "doo", + "piss": "pish", + "pissed": "pished", + "pisses": "pishes", + "place": "stell", + "placed": "stellt", + "places": "airts", + "play": "daff", + "played": "dafft", + "plays": "daffs", + "pocket": "pooch", + "pockets": "pooches", + "point": "pynt", + "pointed": "pynted", + "points": "pynt", + "poison": "pushion", + "poisoned": "pushionit", + "poisoning": "pushionin'", + "poisons": "pushions", + "poke": "powk", + "poked": "powkit", + "pokes": "powks", + "poking": "powkin'", + "police": "polis", + "poo": "keech", + "pool": "puil", + "poor": "pair", + "position": "poseetion", + "potato": "tattie", + "potatoes": "tatties", + "powder": "pouther", + "power": "pouer", + "present": "praisent", + "pretty": "bonny", + "prick": "jag", + "pricked": "jagit", + "pricks": "jags", + "probably": "likelie", + "proof": "prief", + "properly": "swash", + "proud": "prood", + "prove": "pruve", + "proved": "pruved", + "proves": "pruves", + "pub": "inns", + "puddle": "dub", + "pull": "pu'", + "pulled": "pu'd", + "pulls": "pu's", + "punch": "batter", + "punches": "batters", + "push": "pouss", + "pushed": "poussit", + "pushes": "pouss'", + "pushing": "poussin'", + "put": "pat", + "puts": "pits", + "quiet": "weesht", + "quit": "quitten", + "quite": "fair", + "rain": "smirr", + "ran": "run", + "raspberry": "rasp", + "rat": "rottan", + "rather": "raither", + "raven": "raen", + "real": "rael", + "reaper": "shearer", + "reason": "raison", + "reasons": "raisons", + "red": "rid", + "remember": "mind", + "replied": "reponed", + "reply": "repone", + "resident": "indwaller", + "residents": "indwallers", + "resign": "demit", + "retch": "boak", + "retches": "boaks", + "ridge": "rig", + "ridges": "rigs", + "right": "richt", + "roar": "rair", + "roared": "rair't", + "roars": "rairs", + "rob": "rab", + "room": "chaummer", + "root": "ruit", + "rope": "raip", + "rubber": "cahoutchie", + "ruffle": "tousle", + "run": "rin", + "rural": "landwart", + "rush": "breeshle", + "rust": "roust", + "sad": "dowie", + "said": "sayed", + "scare": "scaur", + "scariest": "skeeriest", + "scary": "scaury", + "school": "schuil", + "scientific": "scienteefic", + "scissors": "sheers", + "scold": "scaud", + "scone": "bannock", + "scorch": "birsle", + "scowl": "scoul", + "scowls": "scouls", + "scratch": "scart", + "scream": "skriegh", + "screaming": "skrieghin'", + "screams": "skreighs", + "seal": "cowan", + "seals": "cowans", + "sec": "polis", + "second": "saicont", + "security": "polis", + "seem": "kythe", + "seemed": "kythed", + "seems": "kythes", + "separate": "twyne", + "servant": "skivvy", + "seven": "sieven", + "shake": "shak", + "shaken": "shakit", + "shakes": "shaks", + "shall": "sall", + "shell": "sheel", + "shelter": "bield", + "sherrif": "shirra", + "shivering": "ourie", + "shoes": "shoon", + "shook": [ + "shakit", + "sheuk" + ], + "shop": "shap", + "shopping": "messages", + "shops": "shaps", + "should": "shoud", + "shouldn't": "shoudna", + "shouldnt": "shoudna", + "shovel": "shool", + "shovels": "shools", + "shrunken": "cruppen", + "shy": "blate", + "sicken": "scunner", + "sickening": "scunnersome", + "sigh": "sech", + "sighs": "soughs", + "silver": "sillar", + "singed": "singet", + "skip": "fimmer", + "skips": "fimmers", + "slap": "clout", + "slaps": "clouts", + "slept": "sleepit", + "slid": "slidden", + "slip": "slup", + "slippery": "slidie", + "slips": "slups", + "slope": "brae", + "sly": "slee", + "smack": "skelp", + "smacks": "skelps", + "small": "wee", + "smart": "snap", + "smile": "smirk", + "smiles": "smous", + "smoke": "reek", + "smoked": "reekit", + "smokes": "reeks", + "smoking": "reekin'", + "sneeze": "sneesh", + "snow": "snaw", + "snowflake": "pyle", + "so": "sae", + "soap": "saip", + "sold": "selt", + "some": "som", + "someone": "a bodie", + "sometimes": "whyles", + "somewhat": "fair", + "song": "sang", + "songs": "sangs", + "soothe": "dill", + "sore": "sair", + "sound": "soond", + "sounded": "soonded", + "sounds": "soonds", + "soup": "broo", + "south": "sooth", + "southern": "soothron", + "southernmost": "soothmaist", + "southmost": "soothmaist", + "spacemas": "Yule", + "sparkle": "glint", + "sparkled": "glintit", + "sparkles": "glints", + "sparkling": "begesserant", + "spat": "sputten", + "speak": "spaek", + "speaks": "spaeks", + "spelled": "spellt", + "spider": "speeder", + "spin": "birl", + "spine": "rig", + "spines": "rigs", + "spinning": "birlin'", + "spins": "birls", + "spit": "speet", + "spoil": "blaud", + "spoils": "blauds", + "spoke": "spak", + "spoon": "spuin", + "squeal": "squyle", + "squint": "skelly", + "stagger": "stoiter", + "staggered": "stoiter'd", + "staggers": "stoiters", + "stand": "staun", + "star": "starn", + "stare": "gove", + "stared": "glourt", + "stares": "goves", + "stars": "starns", + "start": "stert", + "started": "stertit", + "starts": "sterts", + "stay": "bide", + "stays": "bides", + "stead": "steid", + "stench": "bowf", + "stiff": "stechie", + "still": "yet", + "stink": "bowf", + "stinks": "bowfs", + "stir": "steer", + "stirs": "steers", + "stole": "stealt", + "stolen": "stown", + "stomach": "wame", + "stone": "stane", + "stones": "stanes", + "stopped": "stoppit", + "stout": "stoot", + "stream": "burn", + "stretch": "streek", + "stretched": "streekit", + "stretches": "streeks", + "striped": "strippit", + "stroll": "daunder", + "struck": "strak", + "stuck": "stickit", + "stuff": "stech", + "stumble": "doiter", + "stumbled": "stoited", + "stumbles": "doiters", + "stunned": "donnert", + "stupid": "glaikit", + "such": "sic", + "sunset": "sindoun", + "suppose": "daursay", + "sure": "shuir", + "surely": "shuirlie", + "swallow": "swallae", + "swallowed": "swallae'd", + "swallows": "swallaes", + "swarm": "byke", + "swear": "sweir", + "sweared": "sweired", + "swearing": "sweiring", + "swears": "sweirs", + "swell": "swall", + "swelled": "swall'd", + "table": "boord", + "tables": "boords", + "tadpole": "poweheid", + "take": "tak", + "taken": "taen", + "takes": "taks", + "talk": "tauk", + "tangled": "tousled", + "taste": "pree", + "tasted": "pree'd", + "tasteless": "warsh", + "tastes": "prees", + "tavern": "inns", + "terrible": "tairible", + "than": "nor", + "thank": "thenk", + "that": "thon", + "the": "th'", + "their": "thair", + "theirs": "thairs", + "them": "thaim", + "themselves": "thairsels", + "then": "than", + "there's": "thonder's", + "there": "thonder", + "they": "thay", + "thirst": "drouth", + "thirsts": "drouths", + "thirsty": "drouthy", + "those": "they", + "thought": "thocht", + "thousand": "thoosan", + "thousands": "thoosans", + "thousandth": "thoosant", + "thrashed": "thruishen", + "thrilled": "thirl'd", + "throat": "thrapple", + "through": "throu'", + "thundering": "dunderin", + "tidy": "doss", + "tingle": "fissle", + "tiny": [ + "tottie", + "toty" + ], + "to": "tae", + "tobacco": "baccie", + "today": "th'day", + "together": "thegither", + "toilet": "cludgie", + "toilets": "cludgies", + "token": "taiken", + "told": "tellt", + "tomorrow": "th' morra", + "tonight": "thenicht", + "too": "tae", + "took": "teuk", + "top": "tap", + "tore": "tuir", + "tortoise": "tortie", + "tough": "teugh", + "town": "toon", + "trader's": "dealer's", + "trader": "dealer", + "traders'": "dealers'", + "traders": "dealers", + "translated": "owerset", + "treason": "traison", + "trick": "brogue", + "tried": "ettelt", + "tries": "ettles", + "trigger": "tricker", + "triggered": "tricker'd", + "triggering": "trickerin'", + "triggers": "trickers", + "trouble": "trauchle", + "trousers": "breeks", + "trurth": "trowth", + "try": "huv a go", + "tumble": "cowp", + "turf": "divot", + "turfs": "divots", + "turn": "birl", + "turned": "birlt", + "turning": "birlin'", + "turnip": "neep", + "turnips": "neeps", + "turns": "birls", + "twist": "swirl", + "twisted": "swirlie", + "twists": "skewls", + "two": "twa", + "unbolt": "unsnib", + "uncertain": "unsicker", + "under": "unner", + "understand": "unnerstaund", + "understands": "unnerstaunds", + "unhurt": "unskaithed", + "uninvited": "unbidden", + "unknown": "unkent", + "unlucky": "wanchancie", + "until": "till", + "us": "hus", + "usage": "uisage", + "use": "uise", + "used": "uised", + "useless": "uissless", + "uses": "uises", + "valley": "glen", + "valleys": "glens", + "value": "feck", + "vegetables": "greens", + "venture": "anter", + "very": "verra", + "vessel": "veshel", + "vessels": "veshel", + "vision": "veesion", + "visions": "veesion", + "visit": "veesit", + "visitor": "caa'er", + "visitors": "caa'ers", + "vomit": "boak", + "vomits": "boaks", + "wages": "wauges", + "walk": "traivel", + "walked": "traivelt", + "walks": "traivels", + "wall": "dike", + "walls": "dikes", + "wand": "wannd", + "wander": "daunder", + "wandered": "daundert", + "wanders": "daunders", + "want": "waant", + "wanted": "wantit", + "warm": "beek", + "was": "wis", + "washed": "washt", + "wasn't": "wisna", + "wasnt": "wisna", + "watched": "watcht", + "water": "watter", + "way": "gate", + "ways": "gates", + "weak": "fushionless", + "website": "wasteid", + "weep": "greet", + "welcome": "walcome", + "well": "weel", + "went": "gaed", + "were": "war", + "weren't": "warna", + "werent": "warna", + "west": "wast", + "westernmost": "wastmaist", + "westmost": "wastmaist", + "westward": "wastart", + "wet": "drookit", + "what": "whit", + "whatever": "whitsomiver", + "whatsoever": "whitsaeiver", + "where's": "whaur's", + "where": "whaur", + "whiskey": "usquebaugh", + "whistle": "wheiple", + "whistles": "wheiples", + "who": "wha", + "whole": "hail", + "whom": "wham", + "whose": "whase", + "wife": "guidwife", + "will": "wull", + "win": "wun", + "wind": "wynd", + "window": "winnock", + "windows": "winnocks", + "wing": "weeng", + "wings": "weengs", + "wipe": "dight", + "wipes": "dights", + "wire-cutters": "weir-sheers", + "wire": "weir", + "wirecutters": "weirsheers", + "wisdom": "gumption", + "wish": "wiss", + "wished": "wisst", + "wishes": "wisses", + "witch's": "carlin's", + "witch": "carlin", + "witches": "carlins", + "with": "wi", + "within": "aithin", + "without": "athoot", + "witless": "doitert", + "wives": "guidwifes", + "wizard's": "warlock's", + "wizard": "warlock", + "wizards": "warlocks", + "woman": "hen", + "women": "kimmers", + "won't": "winna", + "won": "wun", + "wonder": "wonner", + "wont": "winna", + "wood": "wid", + "wool": "woo'", + "word": "wird", + "words": "wirds", + "work": "wark", + "worked": "wrocht", + "world": "warld", + "worried": "wirried", + "worries": "wirries", + "worry": "wirrie", + "worst": "wast", + "worth": "wirth", + "would": "wad", + "wouldn't": "wadna", + "wouldnt": "wadna", + "wrench": "wranch", + "wrenches": "wranches", + "writ": "wrate", + "write": "screive", + "writes": "scrieves", + "wrong": "wrang", + "wrote": "wrat", + "yes": "aye", + "you": "ye", + "your": "yer", + "yeah": "aye", + "yourself": "yersel", + "yourselves": "yersels", + "youth": "weans", + "zero": "hee-haw" + } +} \ No newline at end of file diff --git a/strings/names/dwarf_first.txt b/strings/names/dwarf_first.txt new file mode 100644 index 0000000000..a5de072053 --- /dev/null +++ b/strings/names/dwarf_first.txt @@ -0,0 +1,42 @@ +Thizuil +Dondock +Nemdout +Ararhir +Kadeag +Elminister +Nursan +Grimm +Matgroir +Thosotir +Jatdrouc +Kaschei +Khelben +Kreol +Dalofrubelyn +Reirgrebyrn +Hosdrum +Mordenkainen +Sarbarra +Mystryl +Nihilus +Palando +Prospero +Radagast +Burroutalyn +Vargibela +Saruman +Tenser +Terefi +Tzeentch +Gotdrilyn +Vaarsuvius +Erisseadrid +Arazzanelyn +Zagyg +Dargroungrid +Urist +Durimarlum +Matgrous +Kissaet +Magni +Muradin \ No newline at end of file diff --git a/strings/names/dwarf_last.txt b/strings/names/dwarf_last.txt new file mode 100644 index 0000000000..17fdb7f4d2 --- /dev/null +++ b/strings/names/dwarf_last.txt @@ -0,0 +1,45 @@ +Brightjaw +Steelbrew +Grimtank +Mudback +Brickbane +Smeltmaster +Lavabrow +Woldtoe +Deephelm +Earthpike +Berylshield +Asharmour +Caskspine +Rubygrip +Noblemaster +Flintgrip +Thunderchest +Ignotchest +Cragborg +Jadearm +Hornbelt +Fierygranite +Twilightbane +Leadforge +Kragthane +Oakenaxe +Beastback +Coinbender +Bronzejaw +Mithrilrock +Barrelhood +Grumblesphere +Graybane +Flattoe +Steelmaker +Bronzebeard +Kragcloak +Magmaborn +Gravelbasher +Whitbrew +McUristurister +Mountaincoat +Chaosbane +Darksunder +Bronzebeard \ No newline at end of file diff --git a/tgstation.dme b/tgstation.dme index afe619593e..a18113d9c9 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -16,6 +16,7 @@ #include "_maps\_basemap.dm" #include "code\_compile_options.dm" #include "code\world.dm" +#include "code\__DEFINES\__513_compatibility.dm" #include "code\__DEFINES\_globals.dm" #include "code\__DEFINES\_protect.dm" #include "code\__DEFINES\_tick.dm" @@ -47,7 +48,6 @@ #include "code\__DEFINES\flags.dm" #include "code\__DEFINES\food.dm" #include "code\__DEFINES\footsteps.dm" -#include "code\__DEFINES\forensics.dm" #include "code\__DEFINES\hud.dm" #include "code\__DEFINES\integrated_electronics.dm" #include "code\__DEFINES\interaction_flags.dm" @@ -231,6 +231,7 @@ #include "code\controllers\subsystem\atoms.dm" #include "code\controllers\subsystem\augury.dm" #include "code\controllers\subsystem\blackbox.dm" +#include "code\controllers\subsystem\chat.dm" #include "code\controllers\subsystem\communications.dm" #include "code\controllers\subsystem\dbcore.dm" #include "code\controllers\subsystem\dcs.dm" @@ -356,7 +357,6 @@ #include "code\datums\components\empprotection.dm" #include "code\datums\components\footstep.dm" #include "code\datums\components\forced_gravity.dm" -#include "code\datums\components\forensics.dm" #include "code\datums\components\infective.dm" #include "code\datums\components\jousting.dm" #include "code\datums\components\knockoff.dm" @@ -369,12 +369,12 @@ #include "code\datums\components\ntnet_interface.dm" #include "code\datums\components\orbiter.dm" #include "code\datums\components\paintable.dm" +#include "code\datums\components\phantomthief.dm" #include "code\datums\components\rad_insulation.dm" #include "code\datums\components\radioactive.dm" #include "code\datums\components\remote_materials.dm" #include "code\datums\components\riding.dm" #include "code\datums\components\rotation.dm" -#include "code\datums\components\signal_redirect.dm" #include "code\datums\components\slippery.dm" #include "code\datums\components\spooky.dm" #include "code\datums\components\squeak.dm" @@ -382,9 +382,9 @@ #include "code\datums\components\swarming.dm" #include "code\datums\components\thermite.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\decals\blood.dm" #include "code\datums\components\storage\storage.dm" #include "code\datums\components\storage\concrete\_concrete.dm" #include "code\datums\components\storage\concrete\bag_of_holding.dm" @@ -577,10 +577,12 @@ #include "code\game\machinery\autolathe.dm" #include "code\game\machinery\bank_machine.dm" #include "code\game\machinery\Beacon.dm" +#include "code\game\machinery\bloodbankgen.dm" #include "code\game\machinery\buttons.dm" #include "code\game\machinery\cell_charger.dm" #include "code\game\machinery\cloning.dm" #include "code\game\machinery\constructable_frame.dm" +#include "code\game\machinery\cryopod.dm" #include "code\game\machinery\dance_machine.dm" #include "code\game\machinery\defibrillator_mount.dm" #include "code\game\machinery\deployable.dm" @@ -620,6 +622,7 @@ #include "code\game\machinery\syndicatebomb.dm" #include "code\game\machinery\teleporter.dm" #include "code\game\machinery\transformer.dm" +#include "code\game\machinery\turnstile.dm" #include "code\game\machinery\washing_machine.dm" #include "code\game\machinery\wishgranter.dm" #include "code\game\machinery\camera\camera.dm" @@ -647,7 +650,6 @@ #include "code\game\machinery\computer\medical.dm" #include "code\game\machinery\computer\Operating.dm" #include "code\game\machinery\computer\pod.dm" -#include "code\game\machinery\computer\prisoner.dm" #include "code\game\machinery\computer\robot.dm" #include "code\game\machinery\computer\security.dm" #include "code\game\machinery\computer\station_alert.dm" @@ -712,6 +714,7 @@ #include "code\game\mecha\combat\gygax.dm" #include "code\game\mecha\combat\honker.dm" #include "code\game\mecha\combat\marauder.dm" +#include "code\game\mecha\combat\neovgre.dm" #include "code\game\mecha\combat\phazon.dm" #include "code\game\mecha\combat\reticence.dm" #include "code\game\mecha\equipment\mecha_equipment.dm" @@ -754,6 +757,7 @@ #include "code\game\objects\effects\decals\misc.dm" #include "code\game\objects\effects\decals\remains.dm" #include "code\game\objects\effects\decals\cleanable\aliens.dm" +#include "code\game\objects\effects\decals\cleanable\gibs.dm" #include "code\game\objects\effects\decals\cleanable\humans.dm" #include "code\game\objects\effects\decals\cleanable\misc.dm" #include "code\game\objects\effects\decals\cleanable\robots.dm" @@ -914,15 +918,16 @@ #include "code\game\objects\items\implants\implant_krav_maga.dm" #include "code\game\objects\items\implants\implant_mindshield.dm" #include "code\game\objects\items\implants\implant_misc.dm" +#include "code\game\objects\items\implants\implant_radio.dm" #include "code\game\objects\items\implants\implant_spell.dm" #include "code\game\objects\items\implants\implant_stealth.dm" #include "code\game\objects\items\implants\implant_storage.dm" #include "code\game\objects\items\implants\implant_track.dm" +#include "code\game\objects\items\implants\implant_uplink.dm" #include "code\game\objects\items\implants\implantcase.dm" #include "code\game\objects\items\implants\implantchair.dm" #include "code\game\objects\items\implants\implanter.dm" #include "code\game\objects\items\implants\implantpad.dm" -#include "code\game\objects\items\implants\implantuplink.dm" #include "code\game\objects\items\melee\energy.dm" #include "code\game\objects\items\melee\misc.dm" #include "code\game\objects\items\melee\transforming.dm" @@ -1035,6 +1040,7 @@ #include "code\game\objects\structures\crates_lockers\closets\bodybag.dm" #include "code\game\objects\structures\crates_lockers\closets\cardboardbox.dm" #include "code\game\objects\structures\crates_lockers\closets\fitness.dm" +#include "code\game\objects\structures\crates_lockers\closets\genpop.dm" #include "code\game\objects\structures\crates_lockers\closets\gimmick.dm" #include "code\game\objects\structures\crates_lockers\closets\job_closets.dm" #include "code\game\objects\structures\crates_lockers\closets\l3closet.dm" @@ -1462,11 +1468,25 @@ #include "code\modules\cargo\exports\large_objects.dm" #include "code\modules\cargo\exports\manifest.dm" #include "code\modules\cargo\exports\materials.dm" +#include "code\modules\cargo\exports\orgains_robotics.dm" #include "code\modules\cargo\exports\parts.dm" #include "code\modules\cargo\exports\seeds.dm" #include "code\modules\cargo\exports\sheets.dm" #include "code\modules\cargo\exports\tools.dm" #include "code\modules\cargo\exports\weapons.dm" +#include "code\modules\cargo\packs\armory.dm" +#include "code\modules\cargo\packs\costumes_toys.dm" +#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\livestock.dm" +#include "code\modules\cargo\packs\materials.dm" +#include "code\modules\cargo\packs\medical.dm" +#include "code\modules\cargo\packs\misc.dm" +#include "code\modules\cargo\packs\organic.dm" +#include "code\modules\cargo\packs\science.dm" +#include "code\modules\cargo\packs\security.dm" +#include "code\modules\cargo\packs\service.dm" #include "code\modules\chatter\chatter.dm" #include "code\modules\client\asset_cache.dm" #include "code\modules\client\client_colour.dm" @@ -1519,6 +1539,7 @@ #include "code\modules\clothing\neck\_neck.dm" #include "code\modules\clothing\outfits\ert.dm" #include "code\modules\clothing\outfits\event.dm" +#include "code\modules\clothing\outfits\plasmaman.dm" #include "code\modules\clothing\outfits\standard.dm" #include "code\modules\clothing\outfits\vr.dm" #include "code\modules\clothing\outfits\vv_outfit.dm" @@ -1561,9 +1582,18 @@ #include "code\modules\clothing\under\jobs\engineering.dm" #include "code\modules\clothing\under\jobs\medsci.dm" #include "code\modules\clothing\under\jobs\security.dm" +#include "code\modules\clothing\under\jobs\Plasmaman\civilian_service.dm" +#include "code\modules\clothing\under\jobs\Plasmaman\engineering.dm" +#include "code\modules\clothing\under\jobs\Plasmaman\medsci.dm" +#include "code\modules\clothing\under\jobs\Plasmaman\security.dm" #include "code\modules\crafting\craft.dm" #include "code\modules\crafting\guncrafting.dm" #include "code\modules\crafting\recipes.dm" +#include "code\modules\crafting\recipes\recipes_clothing.dm" +#include "code\modules\crafting\recipes\recipes_misc.dm" +#include "code\modules\crafting\recipes\recipes_primal.dm" +#include "code\modules\crafting\recipes\recipes_robot.dm" +#include "code\modules\crafting\recipes\recipes_weapon_and_ammo.dm" #include "code\modules\detectivework\detective_work.dm" #include "code\modules\detectivework\evidence.dm" #include "code\modules\detectivework\scanner.dm" @@ -1699,6 +1729,9 @@ #include "code\modules\goonchat\jsErrorHandler.dm" #include "code\modules\holiday\easter.dm" #include "code\modules\holiday\holidays.dm" +#include "code\modules\holiday\halloween\bartholomew.dm" +#include "code\modules\holiday\halloween\halloween.dm" +#include "code\modules\holiday\halloween\jacqueen.dm" #include "code\modules\holodeck\area_copy.dm" #include "code\modules\holodeck\computer.dm" #include "code\modules\holodeck\holo_effect.dm" @@ -2060,6 +2093,7 @@ #include "code\modules\mob\living\carbon\human\species_types\bugmen.dm" #include "code\modules\mob\living\carbon\human\species_types\corporate.dm" #include "code\modules\mob\living\carbon\human\species_types\dullahan.dm" +#include "code\modules\mob\living\carbon\human\species_types\dwarves.dm" #include "code\modules\mob\living\carbon\human\species_types\felinid.dm" #include "code\modules\mob\living\carbon\human\species_types\flypeople.dm" #include "code\modules\mob\living\carbon\human\species_types\furrypeople.dm" @@ -2136,6 +2170,7 @@ #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" +#include "code\modules\mob\living\simple_animal\simplemob_vore_values.dm" #include "code\modules\mob\living\simple_animal\spawner.dm" #include "code\modules\mob\living\simple_animal\status_procs.dm" #include "code\modules\mob\living\simple_animal\bot\bot.dm" @@ -2192,6 +2227,7 @@ #include "code\modules\mob\living\simple_animal\hostile\eyeballs.dm" #include "code\modules\mob\living\simple_animal\hostile\faithless.dm" #include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm" +#include "code\modules\mob\living\simple_animal\hostile\goose.dm" #include "code\modules\mob\living\simple_animal\hostile\headcrab.dm" #include "code\modules\mob\living\simple_animal\hostile\hivebot.dm" #include "code\modules\mob\living\simple_animal\hostile\hostile.dm" @@ -2513,6 +2549,7 @@ #include "code\modules\projectiles\projectile\special\temperature.dm" #include "code\modules\projectiles\projectile\special\wormhole.dm" #include "code\modules\reagents\chem_splash.dm" +#include "code\modules\reagents\chem_wiki_render.dm" #include "code\modules\reagents\reagent_containers.dm" #include "code\modules\reagents\reagent_dispenser.dm" #include "code\modules\reagents\chemistry\colors.dm" @@ -2531,6 +2568,7 @@ #include "code\modules\reagents\chemistry\reagents\drink_reagents.dm" #include "code\modules\reagents\chemistry\reagents\drug_reagents.dm" #include "code\modules\reagents\chemistry\reagents\food_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\impure_reagents.dm" #include "code\modules\reagents\chemistry\reagents\medicine_reagents.dm" #include "code\modules\reagents\chemistry\reagents\other_reagents.dm" #include "code\modules\reagents\chemistry\reagents\pyrotechnic_reagents.dm" @@ -2548,6 +2586,7 @@ #include "code\modules\reagents\reagent_containers\dropper.dm" #include "code\modules\reagents\reagent_containers\glass.dm" #include "code\modules\reagents\reagent_containers\hypospray.dm" +#include "code\modules\reagents\reagent_containers\hypovial.dm" #include "code\modules\reagents\reagent_containers\medspray.dm" #include "code\modules\reagents\reagent_containers\patch.dm" #include "code\modules\reagents\reagent_containers\pill.dm" @@ -2673,6 +2712,7 @@ #include "code\modules\ruins\spaceruin_code\crashedship.dm" #include "code\modules\ruins\spaceruin_code\deepstorage.dm" #include "code\modules\ruins\spaceruin_code\DJstation.dm" +#include "code\modules\ruins\spaceruin_code\hilbertshotel.dm" #include "code\modules\ruins\spaceruin_code\listeningstation.dm" #include "code\modules\ruins\spaceruin_code\miracle.dm" #include "code\modules\ruins\spaceruin_code\oldstation.dm" @@ -2747,13 +2787,18 @@ #include "code\modules\surgery\brain_surgery.dm" #include "code\modules\surgery\cavity_implant.dm" #include "code\modules\surgery\core_removal.dm" +#include "code\modules\surgery\coronary_bypass.dm" #include "code\modules\surgery\dental_implant.dm" #include "code\modules\surgery\embalming.dm" +#include "code\modules\surgery\experimental_dissection.dm" #include "code\modules\surgery\eye_surgery.dm" +#include "code\modules\surgery\graft_synthtissue.dm" +#include "code\modules\surgery\healing.dm" #include "code\modules\surgery\helpers.dm" #include "code\modules\surgery\implant_removal.dm" #include "code\modules\surgery\limb_augmentation.dm" #include "code\modules\surgery\lipoplasty.dm" +#include "code\modules\surgery\lobectomy.dm" #include "code\modules\surgery\mechanic_steps.dm" #include "code\modules\surgery\nutcracker.dm" #include "code\modules\surgery\organ_manipulation.dm" @@ -2768,12 +2813,14 @@ #include "code\modules\surgery\advanced\lobotomy.dm" #include "code\modules\surgery\advanced\necrotic_revival.dm" #include "code\modules\surgery\advanced\pacification.dm" -#include "code\modules\surgery\advanced\reconstruction.dm" #include "code\modules\surgery\advanced\revival.dm" #include "code\modules\surgery\advanced\toxichealing.dm" #include "code\modules\surgery\advanced\viral_bonding.dm" #include "code\modules\surgery\advanced\bioware\bioware.dm" #include "code\modules\surgery\advanced\bioware\bioware_surgery.dm" +#include "code\modules\surgery\advanced\bioware\ligament_hook.dm" +#include "code\modules\surgery\advanced\bioware\ligament_reinforcement.dm" +#include "code\modules\surgery\advanced\bioware\muscled_veins.dm" #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" @@ -2869,7 +2916,18 @@ #include "code\modules\vending\toys.dm" #include "code\modules\vending\wardrobes.dm" #include "code\modules\vending\youtool.dm" -#include "code\modules\VR\vr_human.dm" +#include "code\modules\vore\hook-defs.dm" +#include "code\modules\vore\persistence.dm" +#include "code\modules\vore\trycatch.dm" +#include "code\modules\vore\eating\belly_dat_vr.dm" +#include "code\modules\vore\eating\belly_obj.dm" +#include "code\modules\vore\eating\bellymodes.dm" +#include "code\modules\vore\eating\digest_act.dm" +#include "code\modules\vore\eating\living.dm" +#include "code\modules\vore\eating\vore.dm" +#include "code\modules\vore\eating\voreitems.dm" +#include "code\modules\vore\eating\vorepanel.dm" +#include "code\modules\VR\vr_mob.dm" #include "code\modules\VR\vr_sleeper.dm" #include "code\modules\zombie\items.dm" #include "code\modules\zombie\organs.dm" @@ -2891,7 +2949,6 @@ #include "modular_citadel\code\controllers\subsystem\job.dm" #include "modular_citadel\code\controllers\subsystem\shuttle.dm" #include "modular_citadel\code\datums\components\material_container.dm" -#include "modular_citadel\code\datums\components\phantomthief.dm" #include "modular_citadel\code\datums\components\souldeath.dm" #include "modular_citadel\code\datums\mood_events\chem_events.dm" #include "modular_citadel\code\datums\mood_events\generic_negative_events.dm" @@ -2918,7 +2975,6 @@ #include "modular_citadel\code\game\gamemodes\gangs\implant_gang.dm" #include "modular_citadel\code\game\gamemodes\miniantags\bot_swarm\swarmer_event.dm" #include "modular_citadel\code\game\gamemodes\revolution\revolution.dm" -#include "modular_citadel\code\game\machinery\cryopod.dm" #include "modular_citadel\code\game\machinery\displaycases.dm" #include "modular_citadel\code\game\machinery\firealarm.dm" #include "modular_citadel\code\game\machinery\Sleeper.dm" @@ -2929,7 +2985,6 @@ #include "modular_citadel\code\game\machinery\doors\airlock.dm" #include "modular_citadel\code\game\machinery\doors\airlock_types.dm" #include "modular_citadel\code\game\objects\cit_screenshake.dm" -#include "modular_citadel\code\game\objects\ids.dm" #include "modular_citadel\code\game\objects\items.dm" #include "modular_citadel\code\game\objects\tools.dm" #include "modular_citadel\code\game\objects\effects\spawner\spawners.dm" @@ -2948,12 +3003,9 @@ #include "modular_citadel\code\game\objects\items\devices\radio\encryptionkey.dm" #include "modular_citadel\code\game\objects\items\devices\radio\headset.dm" #include "modular_citadel\code\game\objects\items\devices\radio\shockcollar.dm" -#include "modular_citadel\code\game\objects\items\melee\eutactic_blades.dm" -#include "modular_citadel\code\game\objects\items\robot\robot_upgrades.dm" #include "modular_citadel\code\game\objects\items\storage\firstaid.dm" #include "modular_citadel\code\game\objects\structures\tables_racks.dm" #include "modular_citadel\code\game\objects\structures\beds_chairs\chair.dm" -#include "modular_citadel\code\game\objects\structures\beds_chairs\sofa.dm" #include "modular_citadel\code\game\objects\structures\crates_lockers\closets\fitness.dm" #include "modular_citadel\code\game\objects\structures\crates_lockers\closets\wardrobe.dm" #include "modular_citadel\code\game\objects\structures\crates_lockers\closets\secure\citadel_lockers.dm" @@ -2974,7 +3026,6 @@ #include "modular_citadel\code\modules\arousal\organs\vagina.dm" #include "modular_citadel\code\modules\arousal\organs\womb.dm" #include "modular_citadel\code\modules\arousal\toys\dildos.dm" -#include "modular_citadel\code\modules\awaymissions\citadel_ghostrole_spawners.dm" #include "modular_citadel\code\modules\cargo\console.dm" #include "modular_citadel\code\modules\client\client_defines.dm" #include "modular_citadel\code\modules\client\client_procs.dm" @@ -3001,7 +3052,6 @@ #include "modular_citadel\code\modules\clothing\neck.dm" #include "modular_citadel\code\modules\clothing\glasses\phantomthief.dm" #include "modular_citadel\code\modules\clothing\head\head.dm" -#include "modular_citadel\code\modules\clothing\spacesuits\cydonian_armor.dm" #include "modular_citadel\code\modules\clothing\spacesuits\flightsuit.dm" #include "modular_citadel\code\modules\clothing\suits\polychromic_cloaks.dm" #include "modular_citadel\code\modules\clothing\suits\suits.dm" @@ -3012,17 +3062,8 @@ #include "modular_citadel\code\modules\custom_loadout\custom_items.dm" #include "modular_citadel\code\modules\custom_loadout\load_to_mob.dm" #include "modular_citadel\code\modules\custom_loadout\read_from_file.dm" -#include "modular_citadel\code\modules\events\blob.dm" -#include "modular_citadel\code\modules\events\wizard\magicarp.dm" #include "modular_citadel\code\modules\food_and_drinks\snacks\meat.dm" #include "modular_citadel\code\modules\integrated_electronics\subtypes\manipulation.dm" -#include "modular_citadel\code\modules\jobs\dresscode_values.dm" -#include "modular_citadel\code\modules\jobs\job_types\captain.dm" -#include "modular_citadel\code\modules\jobs\job_types\cargo_service.dm" -#include "modular_citadel\code\modules\jobs\job_types\engineering.dm" -#include "modular_citadel\code\modules\jobs\job_types\medical.dm" -#include "modular_citadel\code\modules\jobs\job_types\science.dm" -#include "modular_citadel\code\modules\jobs\job_types\security.dm" #include "modular_citadel\code\modules\keybindings\bindings_carbon.dm" #include "modular_citadel\code\modules\keybindings\bindings_human.dm" #include "modular_citadel\code\modules\keybindings\bindings_robot.dm" @@ -3045,14 +3086,12 @@ #include "modular_citadel\code\modules\mob\living\carbon\human\human.dm" #include "modular_citadel\code\modules\mob\living\carbon\human\human_defense.dm" #include "modular_citadel\code\modules\mob\living\carbon\human\human_movement.dm" -#include "modular_citadel\code\modules\mob\living\silicon\ai\vox_sounds.dm" #include "modular_citadel\code\modules\mob\living\silicon\robot\dogborg_equipment.dm" #include "modular_citadel\code\modules\mob\living\silicon\robot\robot.dm" #include "modular_citadel\code\modules\mob\living\silicon\robot\robot_modules.dm" #include "modular_citadel\code\modules\mob\living\silicon\robot\robot_movement.dm" #include "modular_citadel\code\modules\mob\living\simple_animal\banana_spider.dm" #include "modular_citadel\code\modules\mob\living\simple_animal\kiwi.dm" -#include "modular_citadel\code\modules\mob\living\simple_animal\simplemob_vore_values.dm" #include "modular_citadel\code\modules\power\lighting.dm" #include "modular_citadel\code\modules\projectiles\gun.dm" #include "modular_citadel\code\modules\projectiles\ammunition\caseless.dm" @@ -3071,7 +3110,6 @@ #include "modular_citadel\code\modules\projectiles\guns\ballistic\spinfusor.dm" #include "modular_citadel\code\modules\projectiles\guns\energy\energy_gun.dm" #include "modular_citadel\code\modules\projectiles\guns\energy\laser.dm" -#include "modular_citadel\code\modules\projectiles\projectile\energy.dm" #include "modular_citadel\code\modules\projectiles\projectiles\reusable.dm" #include "modular_citadel\code\modules\reagents\chemistry\reagents\astrogen.dm" #include "modular_citadel\code\modules\reagents\chemistry\reagents\eigentstasium.dm" @@ -3084,29 +3122,9 @@ #include "modular_citadel\code\modules\reagents\chemistry\recipes\fermi.dm" #include "modular_citadel\code\modules\reagents\objects\clothes.dm" #include "modular_citadel\code\modules\reagents\objects\items.dm" -#include "modular_citadel\code\modules\reagents\reagent container\cit_kegs.dm" -#include "modular_citadel\code\modules\reagents\reagent container\hypospraymkii.dm" -#include "modular_citadel\code\modules\reagents\reagent container\hypovial.dm" #include "modular_citadel\code\modules\reagents\reagents\cit_reagents.dm" #include "modular_citadel\code\modules\recycling\disposal\bin.dm" #include "modular_citadel\code\modules\research\designs\autoylathe_designs.dm" -#include "modular_citadel\code\modules\research\designs\machine_designs.dm" -#include "modular_citadel\code\modules\research\designs\weapon_designs.dm" -#include "modular_citadel\code\modules\research\designs\xenobio_designs.dm" -#include "modular_citadel\code\modules\research\designs\weapon_designs\weapon_designs.dm" -#include "modular_citadel\code\modules\research\techweb\_techweb.dm" -#include "modular_citadel\code\modules\research\xenobiology\xenobio_camera.dm" #include "modular_citadel\code\modules\vehicles\secway.dm" -#include "modular_citadel\code\modules\vore\hook-defs_vr.dm" -#include "modular_citadel\code\modules\vore\persistence.dm" -#include "modular_citadel\code\modules\vore\trycatch_vr.dm" -#include "modular_citadel\code\modules\vore\eating\belly_dat_vr.dm" -#include "modular_citadel\code\modules\vore\eating\belly_obj_vr.dm" -#include "modular_citadel\code\modules\vore\eating\bellymodes_vr.dm" -#include "modular_citadel\code\modules\vore\eating\digest_act_vr.dm" -#include "modular_citadel\code\modules\vore\eating\living_vr.dm" -#include "modular_citadel\code\modules\vore\eating\vore_vr.dm" -#include "modular_citadel\code\modules\vore\eating\voreitems.dm" -#include "modular_citadel\code\modules\vore\eating\vorepanel_vr.dm" #include "modular_citadel\interface\skin.dmf" // END_INCLUDE diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js index 9fe41589f9..e80e39528f 100644 --- a/tgui/assets/tgui.js +++ b/tgui/assets/tgui.js @@ -10,12 +10,12 @@ return t.replace(/-([a-zA-Z])/g,function(t,e){return e.toUpperCase()})};Xi?(uf={ i:"curve",r:"curves",p:[63,7,2168]}," ",{t:4,f:[{t:4,f:[{p:[68,11,2375],t:7,e:"circle",a:{transform:["translate(",{t:2,r:".",p:[68,40,2404]},")"],r:[{t:2,x:{r:["selected","count"],s:"_0==_1?10:4"},p:[68,51,2415]}],fill:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[68,89,2453]}]},v:{mouseenter:"enter",mouseleave:"exit"}}],n:52,i:"count",x:{r:["line.path"],s:"_0.points()"},p:[67,9,2329]}],n:52,i:"curve",r:"curves",p:[66,7,2297]}," ",{t:4,f:[{t:4,f:[{t:4,f:[{p:[74,13,2678],t:7,e:"text",a:{transform:["translate(",{t:2,r:".",p:[74,40,2705]},") ",{t:2,x:{r:["count","size"],s:'_0<=_1/2?"translate(15, 4)":"translate(-15, 4)"'},p:[74,47,2712]}],"text-anchor":[{t:2,x:{r:["count","size"],s:'_0<=_1/2?"start":"end"'},p:[74,126,2791]}],fill:"white"},f:[{t:2,x:{r:["count","item","yfactor"],s:"_1[_0].y*_2"},p:[75,15,2861]}," ",{t:2,r:"yunit",p:[75,43,2889]}," @ ",{t:2,x:{r:["size","count","item","xfactor"],s:"(_0-_2[_1].x)*_3"},p:[75,55,2901]}," ",{t:2,r:"xunit",p:[75,92,2938]}]}],n:50,x:{r:["selected","count"],s:"_0==_1"},p:[73,11,2638]}],n:52,i:"count",x:{r:["line.path"],s:"_0.points()"},p:[72,9,2592]}],n:52,i:"curve",r:"curves",p:[71,7,2560]}," ",{t:4,f:[{p:[81,9,3063],t:7,e:"g",a:{transform:["translate(",{t:2,x:{r:["width","curves.length","@index"],s:"(_0/(_1+1))*(_2+1)"},p:[81,33,3087]},", 10)"]},f:[{p:[82,11,3154],t:7,e:"circle",a:{r:"4",fill:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[82,31,3174]}]}}," ",{p:[83,11,3206],t:7,e:"text",a:{x:"8",y:"4",fill:"white"},f:[{t:2,rx:{r:"legend",m:[{t:30,n:"curve"}]},p:[83,42,3237]}]}]}],n:52,i:"curve",r:"curves",p:[80,7,3031]}],x:{r:["graph","points","xaccessor","yaccessor","width","height"],s:"_0({data:_1,xaccessor:_2,yaccessor:_3,width:_4,height:_5})"},p:[49,5,1371]}]}]}]},e.exports=a.extend(r.exports)},{338:338,341:341}],347:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"notice"},f:[{t:16,p:[2,3,24]}]}]},e.exports=a.extend(r.exports)},{341:341}],348:[function(t,e,n){var a=t(341),r={exports:{}};!function(e){"use strict";var n=t(481),a=t(483);e.exports={oninit:function(){var t=this,e=a.resize.bind(this),r=function(){return t.set({resize:!1,x:null,y:null})};this.observe("config.fancy",function(a,i,o){(0,n.winset)(t.get("config.window"),"can-resize",!a),a?(document.addEventListener("mousemove",e),document.addEventListener("mouseup",r)):(document.removeEventListener("mousemove",e),document.removeEventListener("mouseup",r))}),this.on("resize",function(){return t.toggle("resize")})}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[28,3,766],t:7,e:"div",a:{"class":"resize"},v:{mousedown:"resize"}}],n:50,r:"config.fancy",p:[27,1,742]}]},e.exports=a.extend(r.exports)},{341:341,481:481,483:483}],349:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"section",a:{"class":[{t:4,f:["candystripe"],r:"candystripe",p:[1,17,16]}]},f:[{t:4,f:[{p:[3,5,84],t:7,e:"span",a:{"class":"label",style:[{t:4,f:["color:",{t:2,r:"labelcolor",p:[3,53,132]}],r:"labelcolor",p:[3,32,111]}]},f:[{t:2,r:"label",p:[3,84,163]},":"]}],n:50,r:"label",p:[2,3,65]}," ",{t:4,f:[{t:16,p:[6,5,215]}],n:50,r:"nowrap",p:[5,3,195]},{t:4,n:51,f:[{p:[8,5,242],t:7,e:"div",a:{"class":"content",style:[{t:4,f:["float:right;"],r:"right",p:[8,33,270]}]},f:[{t:16,p:[9,7,312]}]}],r:"nowrap"}]}]},e.exports=a.extend(r.exports)},{341:341}],350:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"subdisplay"},f:[{t:4,f:[{p:[3,5,47],t:7,e:"header",f:[{p:[4,7,63],t:7,e:"h4",f:[{t:2,r:"title",p:[4,11,67]}]}," ",{t:4,f:[{t:16,n:"button",p:[5,21,103]}],n:50,r:"button",p:[5,7,89]}]}],n:50,r:"title",p:[2,3,28]}," ",{p:[8,3,156],t:7,e:"article",f:[{t:16,p:[9,5,171]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],351:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={oninit:function(){var t=this;this.set("active",this.findComponent("tab").get("name")),this.on("switch",function(e){t.set("active",e.node.textContent.trim())}),this.observe("active",function(e,n,a){for(var r=t.findAllComponents("tab"),i=Array.isArray(r),o=0,r=i?r:r[Symbol.iterator]();;){var s;if(i){if(o>=r.length)break;s=r[o++]}else{if(o=r.next(),o.done)break;s=o.value}var p=s;p.set("shown",p.get("name")===e)}})}}}(r),r.exports.template={v:3,t:[" "," ",{p:[20,1,524],t:7,e:"header",f:[{t:4,f:[{p:[22,5,556],t:7,e:"ui-button",a:{pane:[{t:2,r:".",p:[22,22,573]}]},v:{press:"switch"},f:[{t:2,r:".",p:[22,47,598]}]}],n:52,r:"tabs",p:[21,3,536]}]}," ",{p:[25,1,641],t:7,e:"ui-display",f:[{t:8,r:"content",p:[26,3,657]}]}]},r.exports.components=r.exports.components||{};var i={tab:t(352)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,352:352}],352:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:16,p:[2,3,17]}],n:50,r:"shown",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],353:[function(t,e,n){var a=t(341),r={exports:{}};!function(e){"use strict";var n=t(482),a=t(481),r=t(483);e.exports={computed:{visualStatus:function(){switch(this.get("config.status")){case n.UI_INTERACTIVE:return"good";case n.UI_UPDATE:return"average";case n.UI_DISABLED:return"bad";default:return"bad"}}},oninit:function(){var t=this,e=r.drag.bind(this),n=function(e){return t.set({drag:!1,x:null,y:null})};this.observe("config.fancy",function(r,i,o){(0,a.winset)(t.get("config.window"),"titlebar",!r&&t.get("config.titlebar")),r?(document.addEventListener("mousemove",e),document.addEventListener("mouseup",n)):(document.removeEventListener("mousemove",e),document.removeEventListener("mouseup",n))}),this.on({drag:function(){this.toggle("drag")},close:function(){(0,a.winset)(this.get("config.window"),"is-visible",!1),window.location.href=(0,a.href)({command:"uiclose "+this.get("config.ref")},"winset")},minimize:function(){(0,a.winset)(this.get("config.window"),"is-minimized",!0)}})}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[50,3,1440],t:7,e:"header",a:{"class":"titlebar"},v:{mousedown:"drag"},f:[{p:[51,5,1491],t:7,e:"i",a:{"class":["statusicon fa fa-eye fa-2x ",{t:2,r:"visualStatus",p:[51,42,1528]}]}}," ",{p:[52,5,1556],t:7,e:"span",a:{"class":"title"},f:[{t:16,p:[52,25,1576]}]}," ",{t:4,f:[{p:[54,7,1626],t:7,e:"i",a:{"class":"minimize fa fa-minus fa-2x"},v:{click:"minimize"}}," ",{p:[55,7,1696],t:7,e:"i",a:{"class":"close fa fa-close fa-2x"},v:{click:"close"}}],n:50,r:"config.fancy",p:[53,5,1598]}]}],n:50,r:"config.titlebar",p:[49,1,1413]}]},e.exports=a.extend(r.exports)},{341:341,481:481,482:482,483:483}],354:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";var e=[11,10,9,8];t.exports={data:{userAgent:navigator.userAgent},computed:{ie:function(){if(document.documentMode)return document.documentMode;for(var t in e){var n=document.createElement("div");if(n.innerHTML="",n.getElementsByTagName("span").length)return t}}},oninit:function(){var t=this;this.on("debug",function(){return t.toggle("debug")})}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[27,3,662],t:7,e:"ui-notice",f:[{p:[28,5,679],t:7,e:"span",f:["You have an old (IE",{t:2,r:"ie",p:[28,30,704]},"), end-of-life (click 'EOL Info' for more information) version of Internet Explorer installed."]},{p:[28,137,811],t:7,e:"br"}," ",{p:[29,5,822],t:7,e:"span",f:["To upgrade, click 'Upgrade IE' to download IE11 from Microsoft."]},{p:[29,81,898],t:7,e:"br"}," ",{p:[30,5,909],t:7,e:"span",f:["If you are unable to upgrade directly, click 'IE VMs' to download a VM with IE11 or Edge from Microsoft."]},{p:[30,122,1026],t:7,e:"br"}," ",{p:[31,5,1037],t:7,e:"span",f:["Otherwise, click 'No Frills' below to disable potentially incompatible features (and this message)."]}," ",{p:[32,5,1155],t:7,e:"hr"}," ",{p:[33,5,1166],t:7,e:"ui-button",a:{icon:"close",action:"tgui:nofrills"},f:["No Frills"]}," ",{p:[34,5,1240],t:7,e:"ui-button",a:{icon:"internet-explorer",action:"tgui:link",params:'{"url": "http://windows.microsoft.com/en-us/internet-explorer/download-ie"}'},f:["Upgrade IE"]}," ",{p:[36,5,1416],t:7,e:"ui-button",a:{icon:"edge",action:"tgui:link",params:'{"url": "https://dev.windows.com/en-us/microsoft-edge/tools/vms"}'},f:["IE VMs"]}," ",{p:[38,5,1565],t:7,e:"ui-button",a:{icon:"info",action:"tgui:link",params:'{"url": "https://support.microsoft.com/en-us/lifecycle#gp/Microsoft-Internet-Explorer"}'},f:["EOL Info"]}," ",{p:[40,5,1738],t:7,e:"ui-button",a:{icon:"bug"},v:{press:"debug"},f:["Debug Info"]}," ",{t:4,f:[{p:[42,7,1826],t:7,e:"hr"}," ",{p:[43,7,1839],t:7,e:"span",f:["Detected: IE",{t:2,r:"ie",p:[43,25,1857]}]},{p:[43,38,1870],t:7,e:"br"}," ",{p:[44,7,1883],t:7,e:"span",f:["User Agent: ",{t:2,r:"userAgent",p:[44,25,1901]}]}],n:50,r:"debug",p:[41,5,1805]}]}],n:50,x:{r:["config.fancy","ie"],s:"_0&&_1&&_1<11"},p:[26,1,621]}]},e.exports=a.extend(r.exports)},{341:341}],355:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{powerState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},shockState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[22,1,348],t:7,e:"ui-display",a:{title:"Power Status"},f:[{p:[23,2,384],t:7,e:"ui-section",a:{label:"Main"},f:[{p:[24,3,413],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.power.main"],s:"_0(_1)"},p:[24,16,426]}]},f:[{t:2,x:{r:["data.power.main"],s:'_0?"Online":"Offline"'},p:[24,49,459]}]}," ",{t:4,f:["[ ",{p:[26,6,567],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.main_1","data.wires.main_2"],s:"!_0||!_1"},p:[25,3,512]},{t:4,n:51,f:[{t:4,f:["[ ",{t:2,r:"data.power.main_timeleft",p:[29,7,674]}," seconds left ]"],n:50,x:{r:["data.power.main_timeleft"],s:"_0>0"},p:[28,4,630]}],x:{r:["data.wires.main_1","data.wires.main_2"],s:"!_0||!_1"}}," ",{p:[32,3,744],t:7,e:"div",a:{style:"float:right"},f:[{p:[33,4,774],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"disrupt-main",state:[{t:2,x:{r:["data.power.main"],s:'_0?null:"disabled"'},p:[33,63,833]}]},f:["Disrupt"]}]}]}," ",{p:[36,2,922],t:7,e:"ui-section",a:{label:"Backup"},f:[{p:[37,3,953],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.power.backup"],s:"_0(_1)"},p:[37,16,966]}]},f:[{t:2,x:{r:["data.power.backup"],s:'_0?"Online":"Offline"'},p:[37,51,1001]}]}," ",{t:4,f:["[ ",{p:[39,6,1115],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.backup_1","data.wires.backup_2"],s:"!_0||!_1"},p:[38,3,1056]},{t:4,n:51,f:[{t:4,f:["[ ",{t:2,r:"data.power.backup_timeleft",p:[42,7,1224]}," seconds left ]"],n:50,x:{r:["data.power.backup_timeleft"],s:"_0>0"},p:[41,4,1178]}],x:{r:["data.wires.backup_1","data.wires.backup_2"],s:"!_0||!_1"}}," ",{p:[45,3,1296],t:7,e:"div",a:{style:"float:right"},f:[{p:[46,4,1326],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"disrupt-backup",state:[{t:2,x:{r:["data.power.backup"],s:'_0?null:"disabled"'},p:[46,65,1387]}]},f:["Disrupt"]}]}]}," ",{p:[49,2,1478],t:7,e:"ui-section",a:{label:"Electrify"},f:[{p:[50,3,1512],t:7,e:"span",a:{"class":[{t:2,x:{r:["shockState","data.shock"],s:"_0(_1)"},p:[50,16,1525]}]},f:[{t:2,x:{r:["data.shock"],s:'_0==2?"Safe":"Electrified"'},p:[50,44,1553]}]}," ",{t:4,f:["[ ",{p:[52,6,1640],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.shock"],s:"!_0"},p:[51,3,1608]},{t:4,n:51,f:[{t:4,f:["[ ",{p:[55,7,1742],t:7,e:"span",a:{"class":"bad"},f:[{t:2,r:"data.shock_timeleft",p:[55,25,1760]}," seconds left"]}," ]"],n:50,x:{r:["data.shock_timeleft"],s:"_0>0"},p:[54,4,1703]}," ",{t:4,f:["[ ",{p:[58,7,1863],t:7,e:"span",a:{"class":"bad"},f:["Permanent"]}," ]"],n:50,x:{r:["data.shock_timeleft"],s:"_0==-1"},p:[57,4,1822]}],x:{r:["data.wires.shock"],s:"!_0"}}," ",{p:[61,3,1926],t:7,e:"div",a:{style:"float:right"},f:[{p:[62,4,1956],t:7,e:"ui-button",a:{icon:"wrench",action:"shock-restore",state:[{t:2,x:{r:["data.wires.shock","data.shock"],s:'_0&&_1==0?null:"disabled"'},p:[62,59,2011]}]},f:["Restore"]}," ",{p:[63,4,2094],t:7,e:"ui-button",a:{icon:"bolt",action:"shock-temp",state:[{t:2,x:{r:["data.wires.shock"],s:"!_0"},p:[63,54,2144]}]},f:["Set (Temporary)"]}," ",{p:[64,4,2199],t:7,e:"ui-button",a:{icon:"bolt",action:"shock-perm",state:[{t:2,x:{r:["data.wires.shock"],s:"!_0"},p:[64,53,2248]}]},f:["Set (Permanent)"]}]}]}]}," ",{p:[68,1,2341],t:7,e:"ui-display",a:{title:"Access & Door Control"},f:[{p:[69,2,2386],t:7,e:"ui-section",a:{label:"ID Scan"},f:[{t:4,f:["[ ",{p:[71,6,2455],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.id_scanner"],s:"!_0"},p:[70,3,2418]}," ",{p:[73,3,2516],t:7,e:"div",a:{style:"float:right"},f:[{p:[74,4,2546],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.id_scanner"],s:"!_0"},p:[74,22,2564]}],icon:"power-off",action:"idscan-on",style:[{t:2,x:{r:["data.id_scanner"],s:'_0?"selected":""'},p:[74,93,2635]}]},f:["Enabled"]}," ",{p:[75,4,2698],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.id_scanner"],s:"!_0"},p:[75,22,2716]}],icon:"close",action:"idscan-off",style:[{t:2,x:{r:["data.id_scanner"],s:'_0?"":"selected"'},p:[75,90,2784]}]},f:["Disabled"]}]}]}," ",{p:[78,2,2872],t:7,e:"ui-section",a:{label:"Emergency Access"},f:[{p:[79,3,2913],t:7,e:"div",a:{style:"float:right"},f:[{p:[80,4,2943],t:7,e:"ui-button",a:{icon:"power-off",action:"emergency-on",style:[{t:2,x:{r:["data.emergency"],s:'_0?"selected":""'},p:[80,61,3e3]}]},f:["Enabled"]}," ",{p:[81,4,3062],t:7,e:"ui-button",a:{icon:"close",action:"emergency-off",style:[{t:2,x:{r:["data.emergency"],s:'_0?"":"selected"'},p:[81,58,3116]}]},f:["Disabled"]}]}]}," ",{p:[84,2,3203],t:7,e:"br"}," ",{p:[85,2,3212],t:7,e:"ui-section",a:{label:"Door bolts"},f:[{t:4,f:["[ ",{p:[87,6,3279],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.bolts"],s:"!_0"},p:[86,3,3247]}," ",{p:[89,3,3340],t:7,e:"div",a:{style:"float:right"},f:[{p:[90,4,3370],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.bolts"],s:"!_0"},p:[90,22,3388]}],icon:"unlock",action:"bolt-raise",style:[{t:2,x:{r:["data.locked"],s:'_0?"":"selected"'},p:[90,85,3451]}]},f:["Raised"]}," ",{p:[91,4,3509],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.bolts"],s:"!_0"},p:[91,22,3527]}],icon:"lock",action:"bolt-drop",style:[{t:2,x:{r:["data.locked"],s:'_0?"selected":""'},p:[91,82,3587]}]},f:["Dropped"]}]}]}," ",{p:[94,2,3670],t:7,e:"ui-section",a:{label:"Door bolt lights"},f:[{t:4,f:["[ ",{p:[96,6,3744],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.lights"],s:"!_0"},p:[95,3,3711]}," ",{p:[98,3,3805],t:7,e:"div",a:{style:"float:right"},f:[{p:[99,4,3835],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.lights"],s:"!_0"},p:[99,22,3853]}],icon:"power-off",action:"light-on",style:[{t:2,x:{r:["data.lights"],s:'_0?"selected":""'},p:[99,88,3919]}]},f:["Enabled"]}," ",{p:[100,4,3978],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.lights"],s:"!_0"},p:[100,22,3996]}],icon:"close",action:"light-off",style:[{t:2,x:{r:["data.lights"],s:'_0?"":"selected"'},p:[100,85,4059]}]},f:["Disabled"]}]}]}," ",{p:[103,2,4143],t:7,e:"ui-section",a:{label:"Door force sensors"},f:[{t:4,f:["[ ",{p:[105,6,4217],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.safe"],s:"!_0"},p:[104,3,4186]}," ",{p:[107,3,4278],t:7,e:"div",a:{style:"float:right"},f:[{p:[108,4,4308],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.safe"],s:"!_0"},p:[108,22,4326]}],icon:"power-off",action:"safe-on",style:[{t:2,x:{r:["data.safe"],s:'_0?"selected":""'},p:[108,85,4389]}]},f:["Enabled"]}," ",{p:[109,4,4446],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.safe"],s:"!_0"},p:[109,22,4464]}],icon:"close",action:"safe-off",style:[{t:2,x:{r:["data.safe"],s:'_0?"":"selected"'},p:[109,82,4524]}]},f:["Disabled"]}]}]}," ",{p:[112,2,4606],t:7,e:"ui-section",a:{label:"Door timing safety"},f:[{t:4,f:["[ ",{p:[114,6,4682],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.timing"],s:"!_0"},p:[113,3,4649]}," ",{p:[116,3,4743],t:7,e:"div",a:{style:"float:right"},f:[{p:[117,4,4773],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.timing"],s:"!_0"},p:[117,22,4791]}],icon:"power-off",action:"speed-on",style:[{t:2,x:{r:["data.speed"],s:'_0?"selected":""'},p:[117,88,4857]}]},f:["Enabled"]}," ",{p:[118,4,4915],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.timing"],s:"!_0"},p:[118,22,4933]}],icon:"close",action:"speed-off",style:[{t:2,x:{r:["data.speed"],s:'_0?"":"selected"'},p:[118,85,4996]}]},f:["Disabled"]}]}]}," ",{p:[121,2,5079],t:7,e:"br"}," ",{p:[122,2,5088],t:7,e:"ui-section",a:{label:"Door control"},f:[{t:4,f:["[ ",{p:[124,6,5166],t:7,e:"span",a:{"class":"bad"},f:["Door is ",{t:2,x:{r:["data.locked","data.welded"],s:'(_0?"bolted":"")+(_0&&_1?" and ":"")+(_1?"welded":"")'},p:[124,32,5192]}]}," ]"],n:50,x:{r:["data.locked","data.welded"],s:"_0||_1"},p:[123,3,5125]}," ",{p:[126,3,5327],t:7,e:"div",a:{style:"float:right"},f:[{p:[127,4,5357],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.locked","data.welded","data.opened"],s:'(_0||_1)||(_2&&"disabled")'},p:[127,22,5375]}],icon:"sign-out",action:"open-close"},f:["Open door"]}," ",{p:[128,4,5502],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.locked","data.welded","data.opened"],s:'(_0||_1)||(!_2&&"disabled")'},p:[128,22,5520]}],icon:"sign-in",action:"open-close"},f:["Close door"]}]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],356:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" "," "," "," "," ",{p:[7,1,267],t:7,e:"ui-notice",f:[{t:4,f:[{p:[9,5,312],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[10,7,355],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[10,24,372]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[10,75,423]}]}]}],n:50,r:"data.siliconUser",p:[8,3,282]},{t:4,n:51,f:[{p:[13,5,514],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[13,31,540]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[16,1,625],t:7,e:"status"}," ",{t:4,f:[{t:4,f:[{p:[19,7,719],t:7,e:"ui-display",a:{title:"Air Controls"},f:[{p:[20,9,762],t:7,e:"ui-section",f:[{p:[21,11,786],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"exclamation-triangle":"exclamation"'},p:[21,28,803]}],style:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"caution":null'},p:[21,98,873]}],action:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"reset":"alarm"'},p:[22,23,937]}]},f:["Area Atmosphere Alarm"]}]}," ",{p:[24,9,1045],t:7,e:"ui-section",f:[{p:[25,11,1069],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0==3?"exclamation-triangle":"exclamation"'},p:[25,28,1086]}],style:[{t:2,x:{r:["data.mode"],s:'_0==3?"danger":null'},p:[25,96,1154]}],action:"mode",params:['{"mode": ',{t:2,x:{r:["data.mode"],s:"_0==3?1:3"},p:[26,44,1236]},"}"]},f:["Panic Siphon"]}]}," ",{p:[28,9,1322],t:7,e:"br"}," ",{p:[29,9,1337],t:7,e:"ui-section",f:[{p:[30,11,1361],t:7,e:"ui-button",a:{icon:"sign-out",action:"tgui:view",params:'{"screen": "vents"}'},f:["Vent Controls"]}]}," ",{p:[32,9,1494],t:7,e:"ui-section",f:[{p:[33,11,1518],t:7,e:"ui-button",a:{icon:"filter",action:"tgui:view",params:'{"screen": "scrubbers"}'},f:["Scrubber Controls"]}]}," ",{p:[35,9,1657],t:7,e:"ui-section",f:[{p:[36,11,1681],t:7,e:"ui-button",a:{icon:"cog",action:"tgui:view",params:'{"screen": "modes"}'},f:["Operating Mode"]}]}," ",{p:[38,9,1810],t:7,e:"ui-section",f:[{p:[39,11,1834],t:7,e:"ui-button",a:{icon:"bar-chart",action:"tgui:view",params:'{"screen": "thresholds"}'},f:["Alarm Thresholds"]}]}]}],n:50,x:{r:["config.screen"],s:'_0=="home"'},p:[18,3,680]},{t:4,n:51,f:[{t:4,n:50,x:{r:["config.screen"],s:'_0=="vents"'},f:[{p:[43,5,2032],t:7,e:"vents"}]},{t:4,n:50,x:{r:["config.screen"],s:'(!(_0=="vents"))&&(_0=="scrubbers")'},f:[" ",{p:[45,5,2089],t:7,e:"scrubbers"}]},{t:4,n:50,x:{r:["config.screen"],s:'(!(_0=="vents"))&&((!(_0=="scrubbers"))&&(_0=="modes"))'},f:[" ",{p:[47,5,2146],t:7,e:"modes"}]},{t:4,n:50,x:{r:["config.screen"],s:'(!(_0=="vents"))&&((!(_0=="scrubbers"))&&((!(_0=="modes"))&&(_0=="thresholds")))'},f:[" ",{p:[49,5,2204],t:7,e:"thresholds"}]}],x:{r:["config.screen"],s:'_0=="home"'}}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[17,1,636]}]},r.exports.components=r.exports.components||{};var i={vents:t(362),modes:t(358),thresholds:t(361),status:t(360),scrubbers:t(359)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,358:358,359:359,360:360,361:361,362:362}],357:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-button",a:{icon:"arrow-left",action:"tgui:view",params:'{"screen": "home"}'},f:["Back"]}]},e.exports=a.extend(r.exports)},{341:341}],358:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,115],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Operating Modes",button:0},f:[" ",{t:4,f:[{p:[8,5,168],t:7,e:"ui-section",f:[{p:[9,7,188],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["selected"],s:'_0?"check-square-o":"square-o"'},p:[9,24,205]}],state:[{t:2,x:{r:["selected","danger"],s:'_0?_1?"danger":"selected":null'},p:[10,16,267]}],action:"mode",params:['{"mode": ',{t:2,r:"mode",p:[11,40,361]},"}"]},f:[{t:2,r:"name",p:[11,51,372]}]}]}],n:52,r:"data.modes",p:[7,3,142]}]}]},r.exports.components=r.exports.components||{};var i={back:t(357)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,357:357}],359:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" "," ",{p:{button:[{p:[6,5,185],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Scrubber Controls",button:0},f:[" ",{t:4,f:[{p:[9,5,242],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"long_name",p:[9,27,264]}]},f:[{p:[10,7,287],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[11,9,323],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["power"],s:'_0?"power-off":"close"'},p:[11,26,340]}],style:[{t:2,x:{r:["power"],s:'_0?"selected":null'},p:[11,68,382]}],action:"power",params:['{"id_tag": "',{t:2,r:"id_tag",p:[12,46,459]},'", "val": ',{t:2,x:{r:["power"],s:"+!_0"},p:[12,66,479]},"}"]},f:[{t:2,x:{r:["power"],s:'_0?"On":"Off"'},p:[12,80,493]}]}]}," ",{p:[14,7,558],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[15,9,593],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["scrubbing"],s:'_0?"filter":"sign-in"'},p:[15,26,610]}],style:[{t:2,x:{r:["scrubbing"],s:'_0?null:"danger"'},p:[15,71,655]}],action:"scrubbing",params:['{"id_tag": "',{t:2,r:"id_tag",p:[16,50,738]},'", "val": ',{t:2,x:{r:["scrubbing"],s:"+!_0"},p:[16,70,758]},"}"]},f:[{t:2,x:{r:["scrubbing"],s:'_0?"Scrubbing":"Siphoning"'},p:[16,88,776]}]}]}," ",{p:[18,7,858],t:7,e:"ui-section",a:{label:"Range"},f:[{p:[19,9,894],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["widenet"],s:'_0?"expand":"compress"'},p:[19,26,911]}],style:[{t:2,x:{r:["widenet"],s:'_0?"selected":null'},p:[19,70,955]}],action:"widenet",params:['{"id_tag": "',{t:2,r:"id_tag",p:[20,48,1036]},'", "val": ',{t:2,x:{r:["widenet"],s:"+!_0"},p:[20,68,1056]},"}"]},f:[{t:2,x:{r:["widenet"],s:'_0?"Expanded":"Normal"'},p:[20,84,1072]}]}]}," ",{p:[22,7,1148],t:7,e:"ui-section",a:{label:"Filters"},f:[{p:[23,9,1186],t:7,e:"filters"}]}]}],n:52,r:"data.scrubbers",p:[8,3,212]},{t:4,n:51,f:[{p:[27,5,1257],t:7,e:"span",a:{"class":"bad"},f:["Error: No scrubbers connected."]}],r:"data.scrubbers"}]}]},r.exports.components=r.exports.components||{};var i={filters:t(457),back:t(357)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,357:357,457:457}],360:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Air Status"},f:[{t:4,f:[{t:4,f:[{p:[4,7,110],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[4,26,129]}]},f:[{p:[5,6,146],t:7,e:"span",a:{"class":[{t:2,x:{r:["danger_level"],s:'_0==2?"bad":_0==1?"average":"good"'},p:[5,19,159]}]},f:[{t:2,x:{r:["value"],s:"Math.fixed(_0,2)"},p:[6,5,237]},{t:2,r:"unit",p:[6,29,261]}]}]}],n:52,r:"adata.environment_data",p:[3,5,70]}," ",{p:[10,5,322],t:7,e:"ui-section",a:{label:"Local Status"},f:[{p:[11,7,363],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.danger_level"],s:'_0==2?"bad bold":_0==1?"average bold":"good"'},p:[11,20,376]}]},f:[{t:2,x:{r:["data.danger_level"],s:'_0==2?"Danger (Internals Required)":_0==1?"Caution":"Optimal"'},p:[12,6,475]}]}]}," ",{p:[15,5,619],t:7,e:"ui-section",a:{label:"Area Status"},f:[{p:[16,7,659],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.atmos_alarm","data.fire_alarm"],s:'_0||_1?"bad bold":"good"'},p:[16,20,672]}]},f:[{t:2,x:{r:["data.atmos_alarm","fire_alarm"],s:'_0?"Atmosphere Alarm":_1?"Fire Alarm":"Nominal"'},p:[17,8,744]}]}]}],n:50,r:"data.environment_data",p:[2,3,35]},{t:4,n:51,f:[{p:[21,5,876],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[22,7,912],t:7,e:"span",a:{"class":"bad bold"},f:["Cannot obtain air sample for analysis."]}]}],r:"data.environment_data"}," ",{t:4,f:[{p:[26,5,1040],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[27,7,1076],t:7,e:"span",a:{"class":"bad bold"},f:["Safety measures offline. Device may exhibit abnormal behavior."]}]}],n:50,r:"data.emagged",p:[25,3,1014]}]}]},e.exports=a.extend(r.exports)},{341:341}],361:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.css=" th, td {\r\n padding-right: 16px;\r\n text-align: left;\r\n }",r.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,116],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Alarm Thresholds",button:0},f:[" ",{p:[7,3,143],t:7,e:"table",f:[{p:[8,5,156],t:7,e:"thead",f:[{p:[8,12,163],t:7,e:"tr",f:[{p:[9,7,175],t:7,e:"th"}," ",{p:[10,7,192],t:7,e:"th",f:[{p:[10,11,196],t:7,e:"span",a:{"class":"bad"},f:["min2"]}]}," ",{p:[11,7,238],t:7,e:"th",f:[{p:[11,11,242],t:7,e:"span",a:{"class":"average"},f:["min1"]}]}," ",{p:[12,7,288],t:7,e:"th",f:[{p:[12,11,292],t:7,e:"span",a:{"class":"average"},f:["max1"]}]}," ",{p:[13,7,338],t:7,e:"th",f:[{p:[13,11,342],t:7,e:"span",a:{"class":"bad"},f:["max2"]}]}]}]}," ",{p:[15,5,401],t:7,e:"tbody",f:[{t:4,f:[{p:[16,32,441],t:7,e:"tr",f:[{p:[17,9,455],t:7,e:"th",f:[{t:3,r:"name",p:[17,13,459]}]}," ",{t:4,f:[{p:[18,27,502],t:7,e:"td",f:[{p:[19,11,518],t:7,e:"ui-button",a:{action:"threshold",params:['{"env": "',{t:2,r:"env",p:[19,58,565]},'", "var": "',{t:2,r:"val",p:[19,76,583]},'"}']},f:[{t:2,x:{r:["selected"],s:"Math.fixed(_0,2)"},p:[19,87,594]}]}]}],n:52,r:"settings",p:[18,9,484]}]}],n:52,r:"data.thresholds",p:[16,7,416]}]}," ",{p:[23,3,697],t:7,e:"table",f:[]}]}]}," "]},r.exports.components=r.exports.components||{};var i={back:t(357)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,357:357}],362:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,113],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Vent Controls",button:0},f:[" ",{t:4,f:[{p:[8,5,166],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"long_name",p:[8,27,188]}]},f:[{p:[9,7,211],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[10,9,247],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["power"],s:'_0?"power-off":"close"'},p:[10,26,264]}],style:[{t:2,x:{r:["power"],s:'_0?"selected":null'},p:[10,68,306]}],action:"power",params:['{"id_tag": "',{t:2,r:"id_tag",p:[11,46,383]},'", "val": ',{t:2,x:{r:["power"],s:"+!_0"},p:[11,66,403]},"}"]},f:[{t:2,x:{r:["power"],s:'_0?"On":"Off"'},p:[11,80,417]}]}]}," ",{p:[13,7,482],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[14,9,517],t:7,e:"span",f:[{t:2,x:{r:["direction"],s:'_0=="release"?"Pressurizing":"Siphoning"'},p:[14,15,523]}]}]}," ",{p:[16,7,616],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[17,9,665],t:7,e:"ui-button",a:{icon:"sign-in",style:[{t:2,x:{r:["incheck"],s:'_0?"selected":null'},p:[17,42,698]}],action:"incheck",params:['{"id_tag": "',{t:2,r:"id_tag",p:[18,48,779]},'", "val": ',{t:2,r:"checks",p:[18,68,799]},"}"]},f:["Internal"]}," ",{p:[19,9,842],t:7,e:"ui-button",a:{icon:"sign-out",style:[{t:2,x:{r:["excheck"],s:'_0?"selected":null'},p:[19,43,876]}],action:"excheck",params:['{"id_tag": "',{t:2,r:"id_tag",p:[20,48,957]},'", "val": ',{t:2,r:"checks",p:[20,68,977]},"}"]},f:["External"]}]}," ",{t:4,f:[{p:[23,9,1064],t:7,e:"ui-section",a:{label:"Internal Target Pressure"},f:[{p:[24,11,1121],t:7,e:"ui-button",a:{icon:"pencil",action:"set_internal_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[25,33,1210]},'"}']},f:[{t:2,x:{r:["internal"],s:"Math.fixed(_0)"},p:[25,47,1224]}]}," ",{p:[26,11,1272],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["intdefault"],s:'_0?"disabled":null'},p:[26,44,1305]}],action:"reset_internal_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[27,33,1407]},'"}']},f:["Reset"]}]}],n:50,r:"incheck",p:[22,7,1039]}," ",{t:4,f:[{p:[31,11,1511],t:7,e:"ui-section",a:{label:"External Target Pressure"},f:[{p:[32,13,1570],t:7,e:"ui-button",a:{icon:"pencil",action:"set_external_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[33,35,1661]},'"}']},f:[{t:2,x:{r:["external"],s:"Math.fixed(_0)"},p:[33,49,1675]}]}," ",{p:[34,13,1725],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["extdefault"],s:'_0?"disabled":null'},p:[34,46,1758]}],action:"reset_external_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[35,35,1862]},'"}']},f:["Reset"]}]}],n:50,r:"excheck",p:[30,7,1484]}]}],n:52,r:"data.vents",p:[7,3,140]},{t:4,n:51,f:[{p:[40,5,1973],t:7,e:"span",a:{"class":"bad"},f:["Error: No vents connected."]}],r:"data.vents"}]}]},r.exports.components=r.exports.components||{};var i={back:t(357)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,357:357}],363:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.css=" table {\r\n width: 100%;\r\n border-spacing: 2px;\r\n }\r\n th {\r\n text-align: left;\r\n }\r\n td {\r\n vertical-align: top;\r\n }\r\n td .button {\r\n margin-top: 4px\r\n }",r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",f:[{p:[3,5,34],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.oneAccess"],s:'_0?"unlock":"lock"'},p:[3,22,51]}],action:"one_access"},f:[{t:2,x:{r:["data.oneAccess"],s:'_0?"One":"All"'},p:[3,82,111]}," Required"]}," ",{p:[4,5,172],t:7,e:"ui-button",a:{icon:"refresh",action:"clear"},f:["Clear"]}]}," ",{p:[6,3,251],t:7,e:"hr"}," ",{p:[7,3,260],t:7,e:"table",f:[{p:[8,3,271],t:7,e:"thead",f:[{p:[9,4,283],t:7,e:"tr",f:[{t:4,f:[{p:[10,5,315],t:7,e:"th",f:[{p:[10,9,319],t:7,e:"span",a:{"class":"highlight bold"},f:[{t:2,r:"name",p:[10,38,348]}]}]}],n:52,r:"data.regions",p:[9,8,287]}]}]}," ",{p:[13,3,403],t:7,e:"tbody",f:[{p:[14,4,415],t:7,e:"tr",f:[{t:4,f:[{p:[15,5,447],t:7,e:"td",f:[{t:4,f:[{p:[16,11,481],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["req"],s:'_0?"check-square-o":"square-o"'},p:[16,28,498]}],style:[{t:2,x:{r:["req"],s:'_0?"selected":null'},p:[16,76,546]}],action:"set",params:['{"access": "',{t:2,r:"id",p:[17,46,621]},'"}']},f:[{t:2,r:"name",p:[17,56,631]}]}," ",{p:[18,9,661],t:7,e:"br"}],n:52,r:"accesses",p:[15,9,451]}]}],n:52,r:"data.regions",p:[14,8,419]}]}]}]}," ",{p:[23,2,731],t:7,e:"hr"}," ",{p:[24,2,739],t:7,e:"span",a:{"class":"highlight bold"},f:["Unrestricted Access:"]}," ",{p:[25,2,798],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.unres_direction"],s:'_0&1?"check-square-o":"square-o"'},p:[25,19,815]}],style:[{t:2,x:{r:["data.unres_direction"],s:'_0&1?"selected":null'},p:[25,88,884]}],action:"direc_set",params:'{"unres_direction": "1"}'},f:["North"]}," ",{p:[26,2,1007],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.unres_direction"],s:'_0&4?"check-square-o":"square-o"'},p:[26,19,1024]}],style:[{t:2,x:{r:["data.unres_direction"],s:'_0&4?"selected":null'},p:[26,88,1093]}],action:"direc_set",params:'{"unres_direction": "4"}'},f:["East"]}," ",{p:[27,2,1215],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.unres_direction"],s:'_0&2?"check-square-o":"square-o"'},p:[27,19,1232]}],style:[{t:2,x:{r:["data.unres_direction"], s:'_0&2?"selected":null'},p:[27,88,1301]}],action:"direc_set",params:'{"unres_direction": "2"}'},f:["South"]}," ",{p:[28,2,1424],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.unres_direction"],s:'_0&8?"check-square-o":"square-o"'},p:[28,19,1441]}],style:[{t:2,x:{r:["data.unres_direction"],s:'_0&8?"selected":null'},p:[28,88,1510]}],action:"direc_set",params:'{"unres_direction": "8"}'},f:["West"]}]}," "]},e.exports=a.extend(r.exports)},{341:341}],364:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{powerState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}}},computed:{malfAction:function(){switch(this.get("data.malfStatus")){case 1:return"hack";case 2:return"occupy";case 3:return"deoccupy"}},malfButton:function(){switch(this.get("data.malfStatus")){case 1:return"Override Programming";case 2:case 4:return"Shunt Core Process";case 3:return"Return to Main Core"}},malfIcon:function(){switch(this.get("data.malfStatus")){case 1:return"terminal";case 2:case 4:return"caret-square-o-down";case 3:return"caret-square-o-left"}},powerCellStatusState:function(){var t=this.get("data.powerCellStatus");return t>50?"good":t>25?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[46,2,1206],t:7,e:"ui-notice",f:[{p:[47,3,1221],t:7,e:"b",f:[{p:[47,6,1224],t:7,e:"h3",f:["SYSTEM FAILURE"]}]}," ",{p:[48,3,1255],t:7,e:"i",f:["I/O regulators malfunction detected! Waiting for system reboot..."]},{p:[48,75,1327],t:7,e:"br"}," Automatic reboot in ",{t:2,r:"data.failTime",p:[49,23,1355]}," seconds... ",{p:[50,3,1387],t:7,e:"ui-button",a:{icon:"refresh",action:"reboot"},f:["Reboot Now"]},{p:[50,67,1451],t:7,e:"br"},{p:[50,71,1455],t:7,e:"br"},{p:[50,75,1459],t:7,e:"br"}]}],n:50,r:"data.failTime",p:[45,1,1182]},{t:4,n:51,f:[{p:[53,2,1491],t:7,e:"ui-notice",f:[{t:4,f:[{p:[55,3,1535],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[56,5,1576],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[56,22,1593]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[56,73,1644]}]}]}],n:50,r:"data.siliconUser",p:[54,4,1507]},{t:4,n:51,f:[{p:[59,3,1732],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[59,29,1758]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[62,2,1846],t:7,e:"ui-display",a:{title:"Power Status"},f:[{p:[63,4,1884],t:7,e:"ui-section",a:{label:"Main Breaker"},f:[{t:4,f:[{p:[65,5,1967],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.isOperating"],s:'_0?"good":"bad"'},p:[65,18,1980]}]},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[65,57,2019]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[64,3,1921]},{t:4,n:51,f:[{p:[67,5,2079],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[67,22,2096]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[67,75,2149]}],action:"breaker"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[68,21,2212]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}," ",{p:[71,4,2293],t:7,e:"ui-section",a:{label:"External Power"},f:[{p:[72,3,2332],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.externalPower"],s:"_0(_1)"},p:[72,16,2345]}]},f:[{t:2,x:{r:["data.externalPower"],s:'_0==2?"Good":_0==1?"Low":"None"'},p:[72,52,2381]}]}]}," ",{p:[74,4,2490],t:7,e:"ui-section",a:{label:"Power Cell"},f:[{t:4,f:[{p:[76,5,2567],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.powerCellStatus",p:[76,38,2600]}],state:[{t:2,r:"powerCellStatusState",p:[76,71,2633]}]},f:[{t:2,x:{r:["adata.powerCellStatus"],s:"Math.fixed(_0)"},p:[76,97,2659]},"%"]}],n:50,x:{r:["data.powerCellStatus"],s:"_0!=null"},p:[75,3,2525]},{t:4,n:51,f:[{p:[78,5,2724],t:7,e:"span",a:{"class":"bad"},f:["Removed"]}],x:{r:["data.powerCellStatus"],s:"_0!=null"}}]}," ",{t:4,f:[{p:[82,3,2830],t:7,e:"ui-section",a:{label:"Charge Mode"},f:[{t:4,f:[{p:[84,4,2913],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.chargeMode"],s:'_0?"good":"bad"'},p:[84,17,2926]}]},f:[{t:2,x:{r:["data.chargeMode"],s:'_0?"Auto":"Off"'},p:[84,55,2964]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[83,5,2868]},{t:4,n:51,f:[{p:[86,4,3026],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.chargeMode"],s:'_0?"refresh":"close"'},p:[86,21,3043]}],style:[{t:2,x:{r:["data.chargeMode"],s:'_0?"selected":null'},p:[86,71,3093]}],action:"charge"},f:[{t:2,x:{r:["data.chargeMode"],s:'_0?"Auto":"Off"'},p:[87,22,3156]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}," [",{p:[90,6,3236],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.chargingStatus"],s:"_0(_1)"},p:[90,19,3249]}]},f:[{t:2,x:{r:["data.chargingStatus"],s:'_0==2?"Fully Charged":_0==1?"Charging":"Not Charging"'},p:[90,56,3286]}]},"]"]}],n:50,x:{r:["data.powerCellStatus"],s:"_0!=null"},p:[81,4,2790]}]}," ",{p:[94,2,3445],t:7,e:"ui-display",a:{title:"Power Channels"},f:[{t:4,f:[{p:[96,3,3517],t:7,e:"ui-section",a:{label:[{t:2,r:"title",p:[96,22,3536]}],nowrap:0},f:[{p:[97,5,3560],t:7,e:"div",a:{"class":"content"},f:[{t:2,rx:{r:"adata.powerChannels",m:[{t:30,n:"@index"},"powerLoad"]},p:[97,26,3581]}]}," ",{p:[98,5,3634],t:7,e:"div",a:{"class":"content"},f:[{p:[98,26,3655],t:7,e:"span",a:{"class":[{t:2,x:{r:["status"],s:'_0>=2?"good":"bad"'},p:[98,39,3668]}]},f:[{t:2,x:{r:["status"],s:'_0>=2?"On":"Off"'},p:[98,73,3702]}]}]}," ",{p:[99,5,3751],t:7,e:"div",a:{"class":"content"},f:["[",{p:[99,27,3773],t:7,e:"span",f:[{t:2,x:{r:["status"],s:'_0==1||_0==3?"Auto":"Manual"'},p:[99,33,3779]}]},"]"]}," ",{p:[100,5,3849],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{t:4,f:[{p:[102,6,3942],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["status"],s:'_0==1||_0==3?"selected":null'},p:[102,39,3975]}],action:"channel",params:[{t:2,r:"topicParams.auto",p:[103,30,4057]}]},f:["Auto"]}," ",{p:[104,6,4102],t:7,e:"ui-button",a:{icon:"power-off",state:[{t:2,x:{r:["status"],s:'_0==2?"selected":null'},p:[104,41,4137]}],action:"channel",params:[{t:2,r:"topicParams.on",p:[105,13,4204]}]},f:["On"]}," ",{p:[106,6,4245],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["status"],s:'_0==0?"selected":null'},p:[106,37,4276]}],action:"channel",params:[{t:2,r:"topicParams.off",p:[107,13,4343]}]},f:["Off"]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[101,4,3895]}]}]}],n:52,r:"data.powerChannels",p:[95,4,3485]}," ",{p:[112,4,4439],t:7,e:"ui-section",a:{label:"Total Load"},f:[{p:[113,3,4474],t:7,e:"span",a:{"class":"bold"},f:[{t:2,r:"adata.totalLoad",p:[113,22,4493]}]}]}]}," ",{t:4,f:[{p:[117,4,4585],t:7,e:"ui-display",a:{title:"System Overrides"},f:[{p:[118,3,4626],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"overload"},f:["Overload"]}," ",{t:4,f:[{p:[120,5,4727],t:7,e:"ui-button",a:{icon:[{t:2,r:"malfIcon",p:[120,22,4744]}],state:[{t:2,x:{r:["data.malfStatus"],s:'_0==4?"disabled":null'},p:[120,43,4765]}],action:[{t:2,r:"malfAction",p:[120,97,4819]}]},f:[{t:2,r:"malfButton",p:[120,113,4835]}]}],n:50,r:"data.malfStatus",p:[119,3,4698]}]}],n:50,r:"data.siliconUser",p:[116,2,4556]}," ",{p:[124,2,4903],t:7,e:"ui-notice",f:[{p:[125,4,4919],t:7,e:"ui-section",a:{label:"Emergency Light Fallback"},f:[{t:4,f:[{p:[127,8,5020],t:7,e:"span",f:[{t:2,x:{r:["data.emergencyLights"],s:'_0?"Enabled":"Disabled"'},p:[127,14,5026]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[126,6,4971]},{t:4,n:51,f:[{p:[129,8,5106],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"emergency_lighting"},f:[{t:2,x:{r:["data.emergencyLights"],s:'_0?"Enabled":"Disabled"'},p:[129,66,5164]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}]}," ",{p:[133,2,5275],t:7,e:"ui-notice",f:[{p:[134,4,5291],t:7,e:"ui-section",a:{label:"Night Shift Lighting"},f:[{t:4,f:[{p:[136,8,5388],t:7,e:"span",f:[{t:2,x:{r:["data.nightshiftLights"],s:'_0?"Enabled":"Disabled"'},p:[136,14,5394]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[135,6,5339]},{t:4,n:51,f:[{p:[138,8,5475],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"toggle_nightshift"},f:[{t:2,x:{r:["data.nightshiftLights"],s:'_0?"Enabled":"Disabled"'},p:[138,65,5532]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}]}," ",{p:[142,2,5644],t:7,e:"ui-notice",f:[{p:[143,4,5660],t:7,e:"ui-section",a:{label:"Cover Lock"},f:[{t:4,f:[{p:[145,5,5741],t:7,e:"span",f:[{t:2,x:{r:["data.coverLocked"],s:'_0?"Engaged":"Disengaged"'},p:[145,11,5747]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[144,3,5695]},{t:4,n:51,f:[{p:[147,5,5819],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.coverLocked"],s:'_0?"lock":"unlock"'},p:[147,22,5836]}],action:"cover"},f:[{t:2,x:{r:["data.coverLocked"],s:'_0?"Engaged":"Disengaged"'},p:[147,79,5893]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}]}],r:"data.failTime"}]},e.exports=a.extend(r.exports)},{341:341}],365:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Alarms"},f:[{p:[2,3,31],t:7,e:"ul",f:[{t:4,f:[{p:[4,7,72],t:7,e:"li",f:[{p:[4,11,76],t:7,e:"ui-button",a:{icon:"close",style:"danger",action:"clear",params:['{"zone": "',{t:2,r:".",p:[4,83,148]},'"}']},f:[{t:2,r:".",p:[4,92,157]}]}]}],n:52,r:"data.priority",p:[3,5,41]},{t:4,n:51,f:[{p:[6,7,201],t:7,e:"li",f:[{p:[6,11,205],t:7,e:"span",a:{"class":"good"},f:["No Priority Alerts"]}]}],r:"data.priority"}," ",{t:4,f:[{p:[9,7,303],t:7,e:"li",f:[{p:[9,11,307],t:7,e:"ui-button",a:{icon:"close",style:"caution",action:"clear",params:['{"zone": "',{t:2,r:".",p:[9,84,380]},'"}']},f:[{t:2,r:".",p:[9,93,389]}]}]}],n:52,r:"data.minor",p:[8,5,275]},{t:4,n:51,f:[{p:[11,7,433],t:7,e:"li",f:[{p:[11,11,437],t:7,e:"span",a:{"class":"good"},f:["No Minor Alerts"]}]}],r:"data.minor"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],366:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:[{t:2,x:{r:["data.tank","data.sensors.0.long_name"],s:"_0?_1:null"},p:[1,20,19]}]},f:[{t:4,f:[{p:[3,5,102],t:7,e:"ui-subdisplay",a:{title:[{t:2,x:{r:["data.tank","long_name"],s:"!_0?_1:null"},p:[3,27,124]}]},f:[{p:[4,7,167],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[5,3,200],t:7,e:"span",f:[{t:2,x:{r:["pressure"],s:"Math.fixed(_0,2)"},p:[5,9,206]}," kPa"]}]}," ",{t:4,f:[{p:[8,9,302],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[9,11,346],t:7,e:"span",f:[{t:2,x:{r:["temperature"],s:"Math.fixed(_0,2)"},p:[9,17,352]}," K"]}]}],n:50,r:"temperature",p:[7,7,273]}," ",{t:4,f:[{p:[13,9,462],t:7,e:"ui-section",a:{label:[{t:2,r:"id",p:[13,28,481]}]},f:[{p:[14,5,495],t:7,e:"span",f:[{t:2,x:{r:["."],s:"Math.fixed(_0,2)"},p:[14,11,501]},"%"]}]}],n:52,i:"id",r:"gases",p:[12,4,434]}]}],n:52,r:"adata.sensors",p:[2,3,73]}]}," ",{t:4,f:[{p:{button:[{p:[23,5,704],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}]},t:7,e:"ui-display",a:{title:"Controls",button:0},f:[" ",{p:[25,5,792],t:7,e:"ui-section",a:{label:"Input Injector"},f:[{p:[26,7,835],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.inputting"],s:'_0?"power-off":"close"'},p:[26,24,852]}],style:[{t:2,x:{r:["data.inputting"],s:'_0?"selected":null'},p:[26,75,903]}],action:"input"},f:[{t:2,x:{r:["data.inputting"],s:'_0?"Injecting":"Off"'},p:[27,9,968]}]}]}," ",{p:[29,5,1044],t:7,e:"ui-section",a:{label:"Input Rate"},f:[{p:[30,7,1083],t:7,e:"span",f:[{t:2,x:{r:["adata.inputRate"],s:"Math.fixed(_0)"},p:[30,13,1089]}," L/s"]}]}," ",{p:[32,5,1156],t:7,e:"ui-section",a:{label:"Output Regulator"},f:[{p:[33,7,1201],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.outputting"],s:'_0?"power-off":"close"'},p:[33,24,1218]}],style:[{t:2,x:{r:["data.outputting"],s:'_0?"selected":null'},p:[33,76,1270]}],action:"output"},f:[{t:2,x:{r:["data.outputting"],s:'_0?"Open":"Closed"'},p:[34,9,1337]}]}]}," ",{p:[36,5,1412],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[37,7,1456],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure"},f:[{t:2,x:{r:["adata.outputPressure"],s:"Math.round(_0)"},p:[37,50,1499]}," kPa"]}]}]}],n:50,r:"data.tank",p:[20,1,618]}]},e.exports=a.extend(r.exports)},{341:341}],367:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{p:[6,3,223],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[7,5,265],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[8,5,360],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[8,35,390]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[9,5,518],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[9,11,524]}," kPa"]}]}," ",{p:[11,3,586],t:7,e:"ui-section",a:{label:"Filter"},f:[{t:4,f:[{p:[13,7,654],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[13,25,672]}],action:"filter",params:['{"mode": ',{t:2,r:"id",p:[14,42,748]},"}"]},f:[{t:2,r:"name",p:[14,51,757]}]}],n:52,r:"data.filter_types",p:[12,5,619]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],368:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{p:[6,3,223],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[7,5,265],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[8,5,360],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.set_pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[8,35,390]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[9,5,522],t:7,e:"span",f:[{t:2,x:{r:["adata.set_pressure"],s:"Math.round(_0)"},p:[9,11,528]}," kPa"]}]}," ",{p:[11,3,594],t:7,e:"ui-section",a:{label:"Node 1"},f:[{p:[12,5,627],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==0?"disabled":null'},p:[12,44,666]}],action:"node1",params:'{"concentration": -0.1}'}}," ",{p:[14,5,783],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==0?"disabled":null'},p:[14,39,817]}],action:"node1",params:'{"concentration": -0.01}'}}," ",{p:[16,5,935],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==100?"disabled":null'},p:[16,38,968]}],action:"node1",params:'{"concentration": 0.01}'}}," ",{p:[18,5,1087],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==100?"disabled":null'},p:[18,43,1125]}],action:"node1",params:'{"concentration": 0.1}'}}," ",{p:[20,5,1243],t:7,e:"span",f:[{t:2,x:{r:["adata.node1_concentration"],s:"Math.round(_0)"},p:[20,11,1249]},"%"]}]}," ",{p:[22,3,1319],t:7,e:"ui-section",a:{label:"Node 2"},f:[{p:[23,5,1352],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==0?"disabled":null'},p:[23,44,1391]}],action:"node2",params:'{"concentration": -0.1}'}}," ",{p:[25,5,1508],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==0?"disabled":null'},p:[25,39,1542]}],action:"node2",params:'{"concentration": -0.01}'}}," ",{p:[27,5,1660],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==100?"disabled":null'},p:[27,38,1693]}],action:"node2",params:'{"concentration": 0.01}'}}," ",{p:[29,5,1812],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==100?"disabled":null'},p:[29,43,1850]}],action:"node2",params:'{"concentration": 0.1}'}}," ",{p:[31,5,1968],t:7,e:"span",f:[{t:2,x:{r:["adata.node2_concentration"],s:"Math.round(_0)"},p:[31,11,1974]},"%"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],369:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{t:4,f:[{p:[7,5,250],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{p:[8,7,292],t:7,e:"ui-button",a:{icon:"pencil",action:"rate",params:'{"rate": "input"}'},f:["Set"]}," ",{p:[9,7,381],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.rate","data.max_rate"],s:'_0==_1?"disabled":null'},p:[9,37,411]}],action:"rate",params:'{"rate": "max"}'},f:["Max"]}," ",{p:[10,7,525],t:7,e:"span",f:[{t:2,x:{r:["adata.rate"],s:"Math.round(_0)"},p:[10,13,531]}," L/s"]}]}],n:50,r:"data.max_rate",p:[6,3,223]},{t:4,n:51,f:[{p:[13,5,605],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[14,7,649],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[15,7,746],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[15,37,776]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[16,7,906],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[16,13,912]}," kPa"]}]}],r:"data.max_rate"}]}]},e.exports=a.extend(r.exports)},{341:341}],370:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{p:[3,3,72],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:["Rename"]}]},t:7,e:"ui-display",a:{title:[{t:2,r:"data.borg.name",p:[1,20,19]}],button:0},f:[" ",{p:[5,2,149],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[6,4,181],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.borg.emagged"],s:'_0?"check-square-o":"square-o"'},p:[6,21,198]}],style:[{t:2,x:{r:["data.borg.emagged"],s:'_0?"selected":null'},p:[6,83,260]}],action:"toggle_emagged"},f:["Emagged"]}," ",{p:[7,4,351],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.borg.lockdown"],s:'_0?"check-square-o":"square-o"'},p:[7,21,368]}],style:[{t:2,x:{r:["data.borg.lockdown"],s:'_0?"selected":null'},p:[7,84,431]}],action:"toggle_lockdown"},f:["Locked down"]}," ",{p:[8,4,528],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.borg.scrambledcodes"],s:'_0?"check-square-o":"square-o"'},p:[8,21,545]}],style:[{t:2,x:{r:["data.borg.scrambledcodes"],s:'_0?"selected":null'},p:[8,90,614]}],action:"toggle_scrambledcodes"},f:["Scrambled codes"]}]}," ",{p:[10,2,741],t:7,e:"ui-section",a:{label:"Charge"},f:[{t:4,f:[{p:[12,4,803],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.cell.maxcharge",p:[12,25,824]}],value:[{t:2,r:"data.cell.charge",p:[12,57,856]}]},f:[{t:2,x:{r:["data.cell.charge"],s:"Math.round(_0)"},p:[12,79,878]}," / ",{t:2,x:{r:["data.cell.maxcharge"],s:"Math.round(_0)"},p:[12,114,913]}]}],n:50,x:{r:["data.cell.missing"],s:"!_0"},p:[11,3,772]},{t:4,n:51,f:[{p:[14,4,974],t:7,e:"span",a:{"class":"warning"},f:["Cell missing"]},{p:[14,45,1015],t:7,e:"br"}],x:{r:["data.cell.missing"],s:"!_0"}}," ",{p:[16,3,1035],t:7,e:"ui-button",a:{icon:"pencil",action:"set_charge"},f:["Set"]},{p:[16,63,1095],t:7,e:"ui-button",a:{icon:"eject",action:"change_cell"},f:["Change"]},{p:[16,126,1158],t:7,e:"ui-button",a:{icon:"trash","class":"bad",action:"remove_cell"},f:["Remove"]}]}," ",{p:[18,2,1252],t:7,e:"ui-section",a:{label:"Radio channels"},f:[{t:4,f:[{p:[20,4,1319],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["installed"],s:'_0?"check-square-o":"square-o"'},p:[20,21,1336]}],style:[{t:2,x:{r:["installed"],s:'_0?"selected":null'},p:[20,75,1390]}],action:"toggle_radio",params:['{"channel": "',{t:2,r:"name",p:[20,154,1469]},'"}']},f:[{t:2,r:"name",p:[20,166,1481]}]}],n:52,r:"data.channels",p:[19,3,1291]}]}," ",{p:[23,2,1533],t:7,e:"ui-section",a:{label:"Module"},f:[{t:4,f:[{p:[25,4,1591],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.borg.active_module","type"],s:'_0==_1?"check-square-o":"square-o"'},p:[25,21,1608]}],style:[{t:2,x:{r:["data.borg.active_module","type"],s:'_0==_1?"selected":null'},p:[25,97,1684]}],action:"setmodule",params:['{"module": "',{t:2,r:"type",p:[25,193,1780]},'"}']},f:[{t:2,r:"name",p:[25,205,1792]}]}],n:52,r:"data.modules",p:[24,3,1564]}]}," ",{p:[28,2,1844],t:7,e:"ui-section",a:{label:"Upgrades"},f:[{t:4,f:[{p:[30,4,1905],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["installed"],s:'_0?"check-square-o":"square-o"'},p:[30,21,1922]}],style:[{t:2,x:{r:["installed"],s:'_0?"selected":null'},p:[30,75,1976]}],action:"toggle_upgrade",params:['{"upgrade": "',{t:2,r:"type",p:[30,155,2056]},'"}']},f:[{t:2,r:"name",p:[30,167,2068]}]}],n:52,r:"data.upgrades",p:[29,3,1877]}]}," ",{p:[33,2,2120],t:7,e:"ui-section",a:{label:"Master AI"},f:[{t:4,f:[{p:[35,4,2177],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["connected"],s:'_0?"check-square-o":"square-o"'},p:[35,21,2194]}],style:[{t:2,x:{r:["connected"],s:'_0?"selected":null'},p:[35,75,2248]}],action:"slavetoai",params:['{"slavetoai": "',{t:2,r:"ref",p:[35,152,2325]},'"}']},f:[{t:2,r:"name",p:[35,163,2336]}]}],n:52,r:"data.ais",p:[34,3,2154]}]}]}," ",{p:{button:[{p:[41,3,2460],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.borg.lawupdate"],s:'_0?"check-square-o":"square-o"'},p:[41,20,2477]}],style:[{t:2,x:{r:["data.borg.lawupdate"],s:'_0?"selected":null'},p:[41,84,2541]}],action:"toggle_lawupdate"},f:["Lawsync"]}]},t:7,e:"ui-display",a:{title:"Laws",button:0},f:[" ",{t:4,f:[{p:[44,3,2672],t:7,e:"p",f:[{t:2,r:".",p:[44,6,2675]}]}],n:52,r:"data.laws",p:[43,2,2649]}]}]},e.exports=a.extend(r.exports)},{341:341}],371:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{p:[3,5,67],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"selected":null'},p:[3,38,100]}],action:[{t:2,x:{r:["data.timing"],s:'_0?"stop":"start"'},p:[3,83,145]}]},f:[{t:2,x:{r:["data.timing"],s:'_0?"Stop":"Start"'},p:[3,119,181]}]}," ",{p:[4,5,233],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"flash",style:[{t:2,x:{r:["data.flash_charging"],s:'_0?"disabled":null'},p:[4,57,285]}]},f:[{t:2,x:{r:["data.flash_charging"],s:'_0?"Recharging":"Flash"'},p:[4,102,330]}]}]},t:7,e:"ui-display",a:{title:"Cell Timer",button:0},f:[" ",{p:[6,3,410],t:7,e:"ui-section",f:[{p:[7,5,428],t:7,e:"ui-button",a:{icon:"fast-backward",action:"time",params:'{"adjust": -600}'}}," ",{p:[8,5,518],t:7,e:"ui-button",a:{icon:"backward",action:"time",params:'{"adjust": -100}'}}," ",{p:[9,5,603],t:7,e:"span",f:[{t:2,x:{r:["text","data.minutes"],s:"_0.zeroPad(_1,2)"},p:[9,11,609]},":",{t:2,x:{r:["text","data.seconds"],s:"_0.zeroPad(_1,2)"},p:[9,45,643]}]}," ",{p:[10,5,689],t:7,e:"ui-button",a:{icon:"forward",action:"time",params:'{"adjust": 100}'}}," ",{p:[11,5,772],t:7,e:"ui-button",a:{icon:"fast-forward",action:"time",params:'{"adjust": 600}'}}]}," ",{p:[13,3,875],t:7,e:"ui-section",f:[{p:[14,7,895],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "short"}'},f:["Short"]}," ",{p:[15,7,999],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "medium"}'},f:["Medium"]}," ",{p:[16,7,1105],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "long"}'},f:["Long"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],372:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,23],t:7,e:"ui-notice",f:[{t:2,r:"data.notice",p:[3,5,40]}]}],n:50,r:"data.notice",p:[1,1,0]},{p:[6,1,82],t:7,e:"ui-display",a:{title:"Bluespace Artillery Control",button:0},f:[{t:4,f:[{p:[8,3,167],t:7,e:"ui-section",a:{label:"Target"},f:[{p:[9,5,200],t:7,e:"ui-button",a:{icon:"crosshairs",action:"recalibrate"},f:[{t:2,r:"data.target",p:[9,55,250]}]}]}," ",{p:[11,3,298],t:7,e:"ui-section",a:{label:"Controls"},f:[{t:4,f:[{p:[13,3,356],t:7,e:"ui-notice",f:[{p:[14,4,372],t:7,e:"span",f:["Bluespace Artillery firing protocols must be globally unlocked from two keycard authentication devices first!"]}]}],n:50,x:{r:["data.unlocked"],s:"!_0"},p:[12,2,330]},{t:4,n:51,f:[{p:[17,3,525],t:7,e:"ui-button",a:{icon:"warning",state:[{t:2,x:{r:["data.ready"],s:'_0?null:"disabled"'},p:[17,36,558]}],action:"fire"},f:["FIRE!"]}],x:{r:["data.unlocked"],s:"!_0"}}]}],n:50,r:"data.connected",p:[7,3,141]}," ",{t:4,f:[{p:[22,3,694],t:7,e:"ui-section",a:{label:"Maintenance"},f:[{p:[23,7,734],t:7,e:"ui-button",a:{icon:"wrench",action:"build"},f:["Complete Deployment."]}]}],n:50,x:{r:["data.connected"],s:"!_0"},p:[21,3,667]}]}]},e.exports=a.extend(r.exports)},{341:341}],373:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.hasHoldingTank"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:{button:[{p:[6,5,185],t:7,e:"ui-button",a:{icon:"pencil",action:"relabel"},f:["Relabel"]}]},t:7,e:"ui-display",a:{title:"Canister",button:0},f:[" ",{p:[8,3,266],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[9,5,301],t:7,e:"span",f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[9,11,307]}," kPa"]}]}," ",{p:[11,3,373],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[12,5,404],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.portConnected"],s:'_0?"good":"average"'},p:[12,18,417]}]},f:[{t:2,x:{r:["data.portConnected"],s:'_0?"Connected":"Not Connected"'},p:[12,63,462]}]}]}," ",{t:4,f:[{p:[15,3,573],t:7,e:"ui-section",a:{label:"Access"},f:[{p:[16,7,608],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.restricted"],s:'_0?"lock":"unlock"'},p:[16,24,625]}],style:[{t:2,x:{r:[],s:'"caution"'},p:[17,14,680]}],action:"restricted"},f:[{t:2,x:{r:["data.restricted"],s:'_0?"Restricted to Engineering":"Public"'},p:[18,27,722]}]}]}],n:50,r:"data.isPrototype",p:[14,3,544]}]}," ",{p:[22,1,839],t:7,e:"ui-display",a:{title:"Valve"},f:[{p:[23,3,869],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[24,5,912],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[24,18,925]}],max:[{t:2,r:"data.maxReleasePressure",p:[24,52,959]}],value:[{t:2,r:"data.releasePressure",p:[25,14,1002]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[25,40,1028]}," kPa"]}]}," ",{p:[27,3,1099],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[28,5,1144],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[28,38,1177]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[30,5,1333],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'},p:[30,36,1364]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[32,5,1511],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[33,5,1606],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[33,35,1636]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}," ",{p:[36,3,1798],t:7,e:"ui-section",a:{label:"Valve"},f:[{p:[37,5,1830],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.valveOpen"],s:'_0?"unlock":"lock"'},p:[37,22,1847]}],style:[{t:2,x:{r:["data.valveOpen","data.hasHoldingTank"],s:'_0?_1?"caution":"danger":null'},p:[38,14,1901]}],action:"valve"},f:[{t:2,x:{r:["data.valveOpen"],s:'_0?"Open":"Closed"'},p:[39,22,1995]}]}]}]}," ",{t:4,f:[{p:[42,1,2090],t:7,e:"ui-display",a:{title:"Valve Toggle Timer"},f:[{t:4,f:[{p:[44,5,2155],t:7,e:"ui-section",a:{label:"Adjust Timer"},f:[{p:[45,7,2196],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.timer_is_not_default"],s:'_0?null:"disabled"'},p:[45,40,2229]}],action:"timer",params:'{"change": "reset"}'},f:["Reset"]}," ",{p:[47,7,2358],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.timer_is_not_min"],s:'_0?null:"disabled"'},p:[47,38,2389]}],action:"timer",params:'{"change": "decrease"}'},f:["Decrease"]}," ",{p:[49,7,2520],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:[],s:'"disabled"'},p:[49,39,2552]}],action:"timer",params:'{"change": "input"}'},f:["Set"]}," ",{p:[51,7,2637],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.timer_is_not_max"],s:'_0?null:"disabled"'},p:[51,37,2667]}],action:"timer",params:'{"change": "increase"}'},f:["Increase"]}]}],n:51,r:"data.timing",p:[43,3,2133]}," ",{p:[55,3,2833],t:7,e:"ui-section",a:{label:"Timer"},f:[{p:[56,6,2866],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"danger":"caution"'},p:[56,39,2899]}],action:"toggle_timer"},f:[{t:2,x:{r:["data.timing"],s:'_0?"On":"Off"'},p:[57,30,2969]}]}," ",{p:[59,2,3017],t:7,e:"ui-section",a:{label:"Time until Valve Toggle"},f:[{p:[60,2,3064],t:7,e:"span",f:[{t:2,x:{r:["data.timing","data.time_left","data.timer_set"],s:"_0?_1:_2"},p:[60,8,3070]}]}]}]}]}],n:50,r:"data.isPrototype",p:[41,1,2062]},{p:{button:[{t:4,f:[{p:[69,7,3277],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.valveOpen"],s:'_0?"danger":null'},p:[69,38,3308]}],action:"eject"},f:["Eject"]}],n:50,r:"data.hasHoldingTank",p:[68,5,3242]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[73,3,3442],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holdingTank.name",p:[74,4,3473]}]}," ",{p:[76,3,3519],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holdingTank.tankPressure"],s:"Math.round(_0)"},p:[77,4,3553]}," kPa"]}],n:50,r:"data.hasHoldingTank",p:[72,3,3411]},{t:4,n:51,f:[{p:[80,3,3635],t:7,e:"ui-section",f:[{p:[81,4,3652],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.hasHoldingTank"}]}]},e.exports=a.extend(r.exports)},{341:341}],374:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{tabs:function(){return Object.keys(this.get("data.supplies"))}}}}(r),r.exports.template={v:3,t:[" ",{p:[11,1,158],t:7,e:"ui-display",a:{title:"Cargo"},f:[{p:[12,3,188],t:7,e:"ui-section",a:{label:"Shuttle"},f:[{t:4,f:[{p:[14,7,270],t:7,e:"ui-button",a:{action:"send"},f:[{t:2,r:"data.location",p:[14,32,295]}]}],n:50,x:{r:["data.docked","data.requestonly"],s:"_0&&!_1"},p:[13,5,222]},{t:4,n:51,f:[{p:[16,7,346],t:7,e:"span",f:[{t:2,r:"data.location",p:[16,13,352]}]}],x:{r:["data.docked","data.requestonly"],s:"_0&&!_1"}}]}," ",{p:[19,3,410],t:7,e:"ui-section",a:{label:"Credits"},f:[{p:[20,5,444],t:7,e:"span",f:[{t:2,x:{r:["adata.points"],s:"Math.floor(_0)"},p:[20,11,450]}]}]}," ",{p:[22,3,506],t:7,e:"ui-section",a:{label:"CentCom Message"},f:[{p:[23,7,550],t:7,e:"span",f:[{t:2,r:"data.message",p:[23,13,556]}]}]}," ",{t:4,f:[{p:[26,5,644],t:7,e:"ui-section",a:{label:"Loan"},f:[{t:4,f:[{p:[28,9,716],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.away","data.docked"],s:'_0&&_1?null:"disabled"'},p:[29,17,744]}],action:"loan"},f:["Loan Shuttle"]}],n:50,x:{r:["data.loan_dispatched"],s:"!_0"},p:[27,7,677]},{t:4,n:51,f:[{p:[32,9,868],t:7,e:"span",a:{"class":"bad"},f:["Loaned to CentCom"]}],x:{r:["data.loan_dispatched"],s:"!_0"}}]}],n:50,x:{r:["data.loan","data.requestonly"],s:"_0&&!_1"},p:[25,3,600]}]}," ",{t:4,f:[{p:{button:[{p:[40,7,1066],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.cart.length"],s:'_0?null:"disabled"'},p:[40,38,1097]}],action:"clear"},f:["Clear"]}]},t:7,e:"ui-display",a:{title:"Cart",button:0},f:[" ",{t:4,f:[{p:[43,7,1222],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[44,9,1263],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[44,31,1285]}]}," ",{p:[45,9,1307],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[45,30,1328]}]}," ",{p:[46,9,1354],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[46,30,1375]}," Credits"]}," ",{p:[47,9,1407],t:7,e:"div",a:{"class":"content"},f:[{p:[48,11,1440],t:7,e:"ui-button",a:{icon:"minus",action:"remove", params:['{"id": "',{t:2,r:"id",p:[48,67,1496]},'"}']}}]}]}],n:52,r:"data.cart",p:[42,5,1195]},{t:4,n:51,f:[{p:[52,7,1566],t:7,e:"span",f:["Nothing in Cart"]}],r:"data.cart"}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[37,1,972]},{p:{button:[{t:4,f:[{p:[59,7,1735],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.requests.length"],s:'_0?null:"disabled"'},p:[59,38,1766]}],action:"denyall"},f:["Clear"]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[58,5,1702]}]},t:7,e:"ui-display",a:{title:"Requests",button:0},f:[" ",{t:4,f:[{p:[63,5,1908],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[64,7,1947],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[64,29,1969]}]}," ",{p:[65,7,1989],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[65,28,2010]}]}," ",{p:[66,7,2034],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[66,28,2055]}," Credits"]}," ",{p:[67,7,2085],t:7,e:"div",a:{"class":"content"},f:["By ",{t:2,r:"orderer",p:[67,31,2109]}]}," ",{p:[68,7,2134],t:7,e:"div",a:{"class":"content"},f:["Comment: ",{t:2,r:"reason",p:[68,37,2164]}]}," ",{t:4,f:[{p:[70,9,2223],t:7,e:"div",a:{"class":"content"},f:[{p:[71,11,2256],t:7,e:"ui-button",a:{icon:"check",action:"approve",params:['{"id": "',{t:2,r:"id",p:[71,68,2313]},'"}']}}," ",{p:[72,11,2336],t:7,e:"ui-button",a:{icon:"close",action:"deny",params:['{"id": "',{t:2,r:"id",p:[72,65,2390]},'"}']}}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[69,7,2188]}]}],n:52,r:"data.requests",p:[62,3,1879]},{t:4,n:51,f:[{p:[77,7,2473],t:7,e:"span",f:["No Requests"]}],r:"data.requests"}]}," ",{p:[80,1,2529],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"tabs",p:[80,16,2544]}]},f:[{t:4,f:[{p:[82,5,2587],t:7,e:"tab",a:{name:[{t:2,r:"name",p:[82,16,2598]}]},f:[{t:4,f:[{p:[84,9,2641],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[84,28,2660]}],candystripe:0,right:0},f:[{p:[85,11,2700],t:7,e:"ui-button",a:{tooltip:[{t:2,r:"desc",p:[85,31,2720]}],"tooltip-side":"left",action:"add",params:['{"id": "',{t:2,r:"id",p:[85,90,2779]},'"}']},f:[{t:2,r:"cost",p:[85,100,2789]}," Credits"]}]}],n:52,r:"packs",p:[83,7,2616]}]}],n:52,r:"data.supplies",p:[81,3,2558]}]}]},e.exports=a.extend(r.exports)},{341:341}],375:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{tabs:function(){return Object.keys(this.get("data.supplies"))}}}}(r),r.exports.template={v:3,t:[" ",{p:[12,1,174],t:7,e:"ui-notice",f:[{t:4,f:[{p:[14,5,220],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[15,7,263],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[15,24,280]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[15,75,331]}]}]}],n:50,r:"data.siliconUser",p:[13,3,189]},{t:4,n:51,f:[{p:[18,5,422],t:7,e:"span",f:["Swipe a QM-Level ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[18,39,456]}," this interface."]}],r:"data.siliconUser"}]}," ",{t:4,f:[{p:[23,3,568],t:7,e:"ui-display",a:{title:"Express Cargo Console"},f:[{p:[25,5,618],t:7,e:"ui-section",a:{label:"Landing Location"},f:[{p:[26,7,663],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.usingBeacon"],s:'_0?null:"selected"'},p:[26,25,681]}],action:"LZCargo"},f:["Cargo Bay"]}," ",{p:[27,7,770],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.hasBeacon","data.usingBeacon"],s:'_0?_1?"selected":null:"disabled"'},p:[27,25,788]}],action:"LZBeacon"},f:[{t:2,r:"data.beaconzone",p:[27,116,879]}," (",{t:2,r:"data.beaconName",p:[27,137,900]},")"]}," ",{p:[28,7,940],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.canBuyBeacon"],s:'_0?null:"disabled"'},p:[28,25,958]}],action:"printBeacon"},f:[{t:2,r:"data.printMsg",p:[28,90,1023]}]}]}," ",{p:[31,5,1079],t:7,e:"ui-section",a:{label:"Credits"},f:[{p:[32,7,1115],t:7,e:"span",f:[{t:2,x:{r:["adata.points"],s:"Math.floor(_0)"},p:[32,13,1121]}]}]}," ",{p:[35,5,1183],t:7,e:"ui-section",a:{label:"Notice"},f:[{p:[36,7,1218],t:7,e:"span",f:[{t:2,r:"data.message",p:[36,13,1224]}]}]}]}," ",{p:[39,3,1287],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"tabs",p:[39,18,1302]}]},f:[{t:4,f:[{p:[41,7,1349],t:7,e:"tab",a:{name:[{t:2,r:"name",p:[41,18,1360]}]},f:[{t:4,f:[{p:[43,11,1407],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[43,30,1426]}],candystripe:0,right:0},f:[{p:[44,13,1468],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.canBeacon"],s:'_0?null:"disabled"'},p:[44,31,1486]}],tooltip:[{t:2,r:"desc",p:[44,80,1535]}],"tooltip-side":"left",action:"add",params:['{"id": "',{t:2,r:"id",p:[44,139,1594]},'"}']},f:[{t:2,r:"cost",p:[44,149,1604]}," Credits ",{t:2,r:"data.beaconError",p:[44,166,1621]}]}]}],n:52,r:"packs",p:[42,9,1380]}]}],n:52,r:"data.supplies",p:[40,5,1318]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[22,1,543]}]},e.exports=a.extend(r.exports)},{341:341}],376:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Cellular Emporium",button:0},f:[{p:[2,3,49],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.can_readapt"],s:'_0?null:"disabled"'},p:[2,36,82]}],action:"readapt"},f:["Readapt"]}," ",{p:[4,3,169],t:7,e:"ui-section",a:{label:"Genetic Points Remaining",right:0},f:[{t:2,r:"data.genetic_points_remaining",p:[5,5,226]}]}]}," ",{p:[8,1,293],t:7,e:"ui-display",f:[{t:4,f:[{p:[10,3,335],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[10,22,354]}],candystripe:0,right:0},f:[{p:[11,5,388],t:7,e:"span",f:[{t:2,r:"desc",p:[11,11,394]}]}," ",{p:[12,5,415],t:7,e:"span",f:[{t:2,r:"helptext",p:[12,11,421]}]}," ",{p:[13,5,446],t:7,e:"span",f:["Cost: ",{t:2,r:"dna_cost",p:[13,17,458]}]}," ",{p:[14,5,483],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["owned","can_purchase"],s:'_0?"selected":_1?null:"disabled"'},p:[15,14,508]}],action:"evolve",params:['{"name": "',{t:2,r:"name",p:[17,25,615]},'"}']},f:[{t:2,x:{r:["owned"],s:'_0?"Evolved":"Evolve"'},p:[18,7,635]}]}]}],n:52,r:"data.abilities",p:[9,1,307]},{t:4,f:[{p:[23,3,738],t:7,e:"span",a:{"class":"warning"},f:["No abilities available."]}],n:51,r:"data.abilities",p:[22,1,715]}]}]},e.exports=a.extend(r.exports)},{341:341}],377:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,5,17],t:7,e:"span",f:["To use this, simply spawn the atoms you want in one of the four Centcom Supplypod Bays. Items in the bay will then be launched inside your supplypod, one turf-full at a time! You can optionally use the following buttons to configure how the supplypod acts."]}]}," ",{p:[5,1,304],t:7,e:"ui-display",a:{title:"Centcom Pod Customization (to be used against helen weinstein)"},f:[{p:[6,4,392],t:7,e:"ui-section",a:{label:"Which supplypod bay will you use?"},f:[{p:[7,9,458],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.bay"],s:'_0==1?"selected":null'},p:[7,27,476]}],action:"bay1"},f:["Bay #1"]}," ",{p:[8,9,557],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.bay"],s:'_0==2?"selected":null'},p:[8,27,575]}],action:"bay2"},f:["Bay #2"]}," ",{p:[9,9,656],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.bay"],s:'_0==3?"selected":null'},p:[9,27,674]}],action:"bay3"},f:["Bay #3"]}," ",{p:[10,9,755],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.bay"],s:'_0==4?"selected":null'},p:[10,27,773]}],action:"bay4"},f:["Bay #4"]}]}," ",{p:[13,5,871],t:7,e:"ui-section",a:{label:"Useful teleport tools!"},f:[{p:[14,9,926],t:7,e:"ui-button",a:{action:"teleportCentcom"},f:["Teleport to Centcom's Supplypod Loading Bay"]}," ",{p:[15,9,1027],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.oldArea"],s:'_0?null:"disabled"'},p:[15,27,1045]}],action:"teleportBack"},f:["Teleport Back to ",{t:2,x:{r:["data.oldArea"],s:'_0?_0:"where you were"'},p:[15,103,1121]}]}]}," ",{p:[18,5,1210],t:7,e:"ui-section",a:{label:"Keep stuff after launching?"},f:[{p:[19,9,1268],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.launchClone"],s:'_0?"selected":null'},p:[19,27,1286]}],action:"launchClone","tooltip-side":"left",tooltip:"Choosing this will create a duplicate of the item to be launched in Centcom, allowing you to send one type of item multiple times. Either way, the atoms are forceMoved into the supplypod after it lands (but before it opens)."},f:["Clone and Launch"]}]}," ",{p:[23,5,1668],t:7,e:"ui-section",a:{label:"Launch all at once?"},f:[{p:[24,9,1718],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.launchChoice"],s:'_0==1?"selected":null'},p:[24,27,1736]}],action:"launchOrdered","tooltip-side":"left",tooltip:'Instead of launching everything in the bay at once, this will "scan" things (one turf-full at a time) in order, left to right and top to bottom. Refreshing will reset the "scanner" to the top-leftmost position.'},f:["Ordered"]}," ",{p:[26,9,2086],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.launchChoice"],s:'_0==2?"selected":null'},p:[26,27,2104]}],action:"launchRandom","tooltip-side":"left",tooltip:"Instead of launching everything in the bay at once, this will launch one random turf of items at a time."},f:["Random"]}]}," ",{p:[30,5,2362],t:7,e:"ui-section",a:{label:"Add an explosion?"},f:[{p:[31,9,2410],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.explosionChoice"],s:'_0==1?"selected":null'},p:[31,27,2428]}],action:"explosionCustom","tooltip-side":"left",tooltip:"This will cause an explosion of whatever size you like (including flame range) to occur as soon as the supplypod lands. Dont worry, supply-pods are explosion-proof!"},f:["Custom Size"]}," ",{p:[33,9,2740],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.explosionChoice"],s:'_0==2?"selected":null'},p:[33,27,2758]}],action:"explosionBus","tooltip-side":"left",tooltip:"This will cause a maxcap explosion (dependent on server config) to occur as soon as the supplypod lands. Dont worry, supply-pods are explosion-proof!"},f:["Adminbus"]}]}," ",{p:[37,5,3066],t:7,e:"ui-section",a:{label:"Extra damage?","(default":"None)"},f:[{p:[38,9,3127],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.damageChoice"],s:'_0==1?"selected":null'},p:[38,27,3145]}],action:"damageCustom","tooltip-side":"left",tooltip:"Anyone caught under the pod when it lands will be dealt this amount of brute damage. Sucks to be them!"},f:["Custom Damage"]}," ",{p:[40,9,3392],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.damageChoice"],s:'_0==2?"selected":null'},p:[40,27,3410]}],action:"damageGib","tooltip-side":"left",tooltip:"This will attempt to gib any mob caught under the pod when it lands, as well as dealing a nice 5000 brute damage. Ya know, just to be sure!"},f:["Gib"]}]}," ",{p:[44,5,3698],t:7,e:"ui-section",a:{label:"Extra effects?"},f:[{p:[45,9,3743],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectStun"],s:'_0?"selected":null'},p:[45,27,3761]}],action:"effectStun","tooltip-side":"left",tooltip:"Anyone who is on the turf when the supplypod is launched will be stunned until the supplypod lands. They cant get away that easy!"},f:["Stun"]}," ",{p:[47,9,4017],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectLimb"],s:'_0?"selected":null'},p:[47,27,4035]}],action:"effectLimb","tooltip-side":"left",tooltip:"This will cause anyone caught under the pod to lose a limb, excluding their head."},f:["Delimb"]}," ",{p:[49,9,4245],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectBluespace"],s:'_0?"selected":null'},p:[49,27,4263]}],action:"effectBluespace","tooltip-side":"left",tooltip:"Gives the supplypod an advanced Bluespace Recyling Device. After opening, the supplypod will be warped directly to the surface of a nearby NT-designated trash planet (/r/ss13)."},f:["Bluespace"]}," ",{p:[51,9,4581],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectStealth"],s:'_0?"selected":null'},p:[51,27,4599]}],action:"effectStealth","tooltip-side":"left",tooltip:'This hides the red target icon from appearing when you launch the supplypod. Combos well with the "Invisible" style. Sneak attack, go!'},f:["Stealth"]}," ",{p:[53,9,4869],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectQuiet"],s:'_0?"selected":null'},p:[53,27,4887]}],action:"effectQuiet","tooltip-side":"left",tooltip:"This will keep the supplypod from making any sounds, except for those specifically set by admins in the Sound section."},f:["Quiet Landing"]}," ",{p:[55,9,5143],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectReverse"],s:'_0?"selected":null'},p:[55,27,5161]}],action:"effectReverse","tooltip-side":"left",tooltip:"This pod will not send any items. Instead, after landing, the supplypod will close (similar to a normal closet closing), and then launch back to the right centcom bay to drop off any new contents."},f:["Reverse Mode"]}," ",{p:[57,9,5498],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectMissile"],s:'_0?"selected":null'},p:[57,27,5516]}],action:"effectMissile","tooltip-side":"left",tooltip:"This pod will not send any items. Instead, it will immediatley delete after landing (Similar visually to setting openDelay & departDelay to 0, but this looks nicer). Useful if you just wanna fuck some shit up. Combos well with the Missile style."},f:["Missile Mode"]}," ",{p:[59,9,5902],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectCircle"],s:'_0?"selected":null'},p:[59,27,5920]}],action:"effectCircle","tooltip-side":"left",tooltip:"This will make the supplypod come in from any angle. Im not sure why this feature exists, but here it is."},f:["Any Descent Angle"]}," ",{p:[61,9,6169],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectBurst"],s:'_0?"selected":null'},p:[61,27,6187]}],action:"effectBurst","tooltip-side":"left",tooltip:"This will make each click launch 5 supplypods inaccuratly around the target turf (a 3x3 area). Combos well with the Missle Mode if you dont want shit lying everywhere after."},f:["Machine Gun Mode"]}," ",{p:[63,9,6501],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectTarget"],s:'_0?"selected":null'},p:[63,27,6519]}],action:"effectTarget","tooltip-side":"left",tooltip:"This will make the supplypod target a specific atom, instead of the mouses position. Smiting does this automatically!"},f:["Specific Target"]}," ",{p:[65,9,6778],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectName"],s:'_0?"selected":null'},p:[65,27,6796]}],action:"effectName","tooltip-side":"left",tooltip:"Allows you to add a custom name and description."},f:["Custom Name/Desc"]}]}," ",{p:[69,5,7e3],t:7,e:"ui-section",a:{label:"Sound?"},f:[{p:[70,9,7037],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.landingSound"],s:'_0?"selected":null'},p:[70,27,7055]}],action:"landingSound","tooltip-side":"left",tooltip:"Choose a sound to play when the pod lands."},f:["Custom Landing Sound"]}," ",{p:[72,10,7245],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.openingSound"],s:'_0?"selected":null'},p:[72,28,7263]}],action:"openingSound","tooltip-side":"left",tooltip:"Choose a sound to play when the pod opens."},f:["Custom Opening Sound"]}," ",{p:[74,9,7452],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.leavingSound"],s:'_0?"selected":null'},p:[74,27,7470]}],action:"leavingSound","tooltip-side":"left",tooltip:"Choose a sound to play when the pod departs (whether that be delection in the case of a bluespace pod, or leaving for centcom for a reversing pod)."},f:["Custom Leaving Sound"]}," ",{p:[76,9,7764],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.soundVolume"],s:'_0?"selected":null'},p:[76,27,7782]}],action:"soundVolume","tooltip-side":"left",tooltip:"Choose the volume for the sound to play at. Default values are between 1 and 100, but hey, do whatever. Im a tooltip, not a cop."},f:["Admin Sound Volume"]}]}," ",{p:[80,5,8070],t:7,e:"ui-section",a:{label:"Delay timers?"},f:[{p:[81,9,8114],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.landingDelay"],s:'_0!=5?"selected":null'},p:[81,27,8132]}],action:"landingDelay","tooltip-side":"left",tooltip:"Choose the amount of time it takes for the supplypod to hit the station. By default this value is 0.5 seconds."},f:["Custom Landing Time"]}," ",{p:[83,10,8394],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.openingDelay"],s:'_0!=30?"selected":null'},p:[83,28,8412]}],action:"openingDelay","tooltip-side":"left",tooltip:"Choose the amount of time it takes for the supplypod to open after landing. Useful for giving whatevers inside the pod a nice dramatic entrance! By default this value is 3 seconds."},f:["Custom Opening Time"]}," ",{p:[85,9,8744],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.departureDelay"],s:'_0!=30?"selected":null'},p:[85,27,8762]}],action:"departureDelay","tooltip-side":"left",tooltip:"Choose the amount of time it takes for the supplypod to leave after landing. By default this value is 3 seconds."},f:["Custom Leaving Time"]}]}," ",{p:[89,5,9047],t:7,e:"ui-section",a:{label:"Style?"},f:[{p:[90,9,9084],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==1?"selected":null'},p:[90,27,9102]}],action:"styleStandard","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom color scheme to your standard Nanotrasen black and orange. Same color scheme as the normal station-used supplypods."},f:["Standard"]}," ",{p:[92,9,9405],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==2?"selected":null'},p:[92,27,9423]}],action:"styleBluespace","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom color scheme to the same as the stations upgraded blue-and-white Bluespace Supplypods."},f:["Advanced"]}," ",{p:[94,9,9698],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==4?"selected":null'},p:[94,27,9716]}],action:"styleSyndie","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom color scheme to a menacing black and blood-red. Great for sending meme-ops in style!"},f:["Syndicate"]}," ",{p:[96,9,9987],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==5?"selected":null'},p:[96,27,10005]}],action:"styleBlue","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom color scheme to a menacing black and dark blue. Great for sending deathsquads in style!"},f:["Deathsquad"]}," ",{p:[98,10,10279],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==6?"selected":null'},p:[98,28,10297]}],action:"styleCult","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom style to a blood and rune covered cult pod!"},f:["Cult Pod"]}," ",{p:[100,9,10524],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==7?"selected":null'},p:[100,27,10542]}],action:"styleMissile","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom style to a large missile. Combos well with a missile mode, so the missile doesnt stick around after landing."},f:["Missile"]}," ",{p:[102,9,10836],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==8?"selected":null'},p:[102,27,10854]}],action:"styleSMissile","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom style to a large blood-red missile. Combos well with missile mode, so the missile doesnt stick around after landing."},f:["Syndicate Missile"]}," ",{p:[104,9,11167],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==9?"selected":null'},p:[104,27,11185]}],action:"styleBox","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom style to a large, dark-green military supply crate."},f:["Supply Crate"]}," ",{p:[106,9,11423],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==10?"selected":null'},p:[106,27,11441]}],action:"styleHONK","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom color scheme to a colorful, clown inspired look."},f:["HONK"]}," ",{p:[108,9,11670],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==11?"selected":null'},p:[108,27,11688]}],action:"styleFruit","tooltip-side":"left",tooltip:"for when an orange is angry"},f:["Fruit~"]}," ",{p:[110,9,11851],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==12?"selected":null'},p:[110,27,11869]}],action:"styleInvisible","tooltip-side":"left",tooltip:'Makes the supplypod invisible! Useful for when you want to use this feature with a gateway or something. Combos well with the "Stealth" and "Quiet Landing" effects.'},f:["Invisible"]}," ",{p:[112,9,12175],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==13?"selected":null'},p:[112,27,12193]}],action:"styleGondola","tooltip-side":"left",tooltip:"this gondola can control when he wants to deliver his supplies if he has a smart enough mind, so offer up his body to ghosts for maximum enjoyment. (Make sure to turn off bluespace and set a arbitrarily high open-time if you do!)"},f:["Gondola (alive)"]}]}]}," ",{p:[117,1,12597],t:7,e:"ui-display",f:[{p:[118,5,12615],t:7,e:"ui-section",a:{label:[{t:2,r:"data.numObjects",p:[118,26,12636]}," turfs with launchable atoms found in Bay #",{t:2,r:"data.bay",p:[118,88,12698]}]},f:[{p:[119,9,12722],t:7,e:"ui-button",a:{action:"refresh","tooltip-side":"right",tooltip:"Manually refreshes the possible things to launch in the pod bay."},f:["Refresh Pod Bay"]}]}," ",{p:[123,5,12909],t:7,e:"ui-section",f:[{p:[124,9,12931],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.giveLauncher"],s:'_0?"selected":null'},p:[124,27,12949]}],action:"giveLauncher","tooltip-side":"right",tooltip:"THE CODEX ASTARTES CALLS THIS MANEUVER: STEEL RAIN!!"},f:["Enter Launch Mode"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],378:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Energy"},f:[{p:[3,5,64],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.maxEnergy",p:[3,26,85]}],value:[{t:2,r:"data.energy",p:[3,53,112]}]},f:[{t:2,x:{r:["adata.energy"],s:"Math.fixed(_0)"},p:[3,70,129]}," Units"]}]}]}," ",{p:[6,1,206],t:7,e:"ui-display",a:{title:"Saved Recipes",button:0},f:[{p:[7,3,251],t:7,e:"ui-section",f:[{p:[8,5,269],t:7,e:"ui-button",a:{icon:"plus",action:"add_recipe"},f:["Add Recipe"]}," ",{p:[9,2,337],t:7,e:"ui-button",a:{icon:"minus",action:"clear_recipes"},f:["Clear Recipes"]}," ",{t:4,f:[{p:[11,7,445],t:7,e:"ui-button",a:{grid:0,icon:"tint",action:"dispense_recipe",params:['{"recipe": "',{t:2,r:"contents",p:[11,80,518]},'"}']},f:[{t:2,r:"recipe_name",p:[11,96,534]}]}],n:52,r:"data.recipes",p:[10,5,415]}]}]}," ",{p:{button:[{t:4,f:[{p:[18,7,719],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.amount","."],s:'_0==_1?"selected":null'},p:[18,37,749]}],action:"amount",params:['{"target": ',{t:2,r:".",p:[18,114,826]},"}"]},f:[{t:2,r:".",p:[18,122,834]}]}],n:52,r:"data.beakerTransferAmounts",p:[17,5,675]}]},t:7,e:"ui-display",a:{title:"Dispense",button:0},f:[" ",{p:[21,3,886],t:7,e:"ui-section",f:[{t:4,f:[{p:[23,7,936],t:7,e:"ui-button",a:{grid:0,icon:"tint",action:"dispense",params:['{"reagent": "',{t:2,r:"id",p:[23,74,1003]},'"}']},f:[{t:2,r:"title",p:[23,84,1013]}]}],n:52,r:"data.chemicals",p:[22,5,904]}]}]}," ",{p:{button:[{t:4,f:[{p:[30,7,1190],t:7,e:"ui-button",a:{icon:"minus",action:"remove",params:['{"amount": ',{t:2,r:".",p:[30,66,1249]},"}"]},f:[{t:2,r:".",p:[30,74,1257]}]}],n:52,r:"data.beakerTransferAmounts",p:[29,5,1146]}," ",{p:[32,5,1295],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[32,36,1326]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[34,3,1423],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[36,7,1493],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[36,13,1499]},"/",{t:2,r:"data.beakerMaxVolume",p:[36,55,1541]}," Units"]}," ",{p:[37,4,1583],t:7,e:"span",f:["pH: ",{t:2,x:{r:["adata.beakerCurrentpH","adata.partRating"],s:"Math.round(_0*_1)/_1"},p:[37,14,1593]}]}," ",{p:[38,7,1679],t:7,e:"br"}," ",{t:4,f:[{p:[40,9,1732],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[40,52,1775]}," units of ",{t:2,r:"name",p:[40,87,1810]}]},{p:[40,102,1825],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[39,7,1692]},{t:4,n:51,f:[{p:[42,9,1856],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[35,5,1458]},{t:4,n:51,f:[{p:[45,7,1932],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],379:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[2,3,35],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,67],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isActive"],s:'_0?"power-off":"close"'},p:[3,22,84]}],style:[{t:2,x:{r:["data.isActive"],s:'_0?"selected":null'},p:[4,10,137]}],state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,10,186]}],action:"power"},f:[{t:2,x:{r:["data.isActive"],s:'_0?"On":"Off"'},p:[6,18,249]}]}]}," ",{p:[8,3,314],t:7,e:"ui-section",a:{label:"Target"},f:[{p:[9,4,346],t:7,e:"ui-button",a:{icon:"pencil",action:"temperature",params:'{"target": "input"}'},f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[9,79,421]}," K"]}]}]}," ",{p:{button:[{p:[14,5,564],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[14,36,595]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[16,3,692],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[18,7,762],t:7,e:"span",f:["Temperature: ",{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[18,26,781]}," K"]}," ",{p:[19,4,828],t:7,e:"br"}," ",{p:[20,7,842],t:7,e:"span",f:["pH: ",{t:2,x:{r:["adata.currentpH","adata.partRating"],s:"Math.round(_0*_1)/_1"},p:[20,17,852]}]}," ",{p:[21,7,932],t:7,e:"br"}," ",{t:4,f:[{p:[23,3,980],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[23,46,1023]}," units of ",{t:2,r:"name",p:[23,81,1058]}]},{p:[23,96,1073],t:7,e:"br"}," ",{t:4,f:[{p:[25,4,1111],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:["Purity: ",{t:2,x:{r:["purity"],s:"Math.fixed(_0,2)"},p:[25,55,1162]}]},{p:[25,87,1194],t:7,e:"br"}],n:50,r:"data.showPurity",p:[24,3,1083]}],n:52,r:"adata.beakerContents",p:[22,7,946]},{t:4,n:51,f:[{p:[28,9,1237],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[17,5,727]},{t:4,n:51,f:[{p:[31,7,1313],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],380:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:["\ufeff",{t:4,f:[" ",{p:[2,2,33],t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[{p:[3,3,71],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"Eject":"close"'},p:[3,20,88]}],style:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"selected":null'},p:[4,11,144]}],state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,11,200]}],action:"eject"},f:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"Eject":"No beaker"'},p:[7,5,269]}]}," ",{p:[10,3,341],t:7,e:"ui-section",f:[{t:4,f:[{t:4,f:[{p:[13,6,427],t:7,e:"ui-section",a:{label:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[13,25,446]}," units of ",{t:2,r:"name",p:[13,60,481]}],nowrap:0},f:[{p:[14,7,506],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{p:[15,8,556],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[15,61,609]},'", "amount": 1}']},f:["1"]}," ",{p:[16,8,654],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[16,61,707]},'", "amount": 5}']},f:["5"]}," ",{p:[17,8,752],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[17,61,805]},'", "amount": 10}']},f:["10"]}," ",{p:[18,8,852],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[18,61,905]},'", "amount": 1000}']},f:["All"]}," ",{p:[19,8,955],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[19,61,1008]},'", "amount": -1}']},f:["Custom"]}," ",{p:[20,8,1059],t:7,e:"ui-button",a:{action:"analyzeBeak",params:['{"id": "',{t:2,r:"id",p:[20,56,1107]},'"}']},f:["Analyze"]}]}]}],n:52,r:"data.beakerContents",p:[12,5,391]},{t:4,n:51,f:[{p:[24,5,1189],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"data.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[11,4,358]},{t:4,n:51,f:[{p:[27,5,1260],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}," ",{p:[32,2,1348],t:7,e:"ui-display",a:{title:"Buffer"},f:[{p:[33,3,1379],t:7,e:"ui-button",a:{action:"toggleMode",state:[{t:2,x:{r:["data.mode"],s:'_0?null:"selected"'},p:[33,41,1417]}]},f:["Destroy"]}," ",{p:[34,3,1475],t:7,e:"ui-button",a:{action:"toggleMode",state:[{t:2,x:{r:["data.mode"],s:'_0?"selected":null'},p:[34,41,1513]}]},f:["Transfer to Beaker"]}," ",{p:[35,3,1582],t:7,e:"ui-section",f:[{t:4,f:[{p:[37,5,1634],t:7,e:"ui-section",a:{label:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[37,24,1653]}," units of ",{t:2,r:"name",p:[37,59,1688]}],nowrap:0},f:[{p:[38,6,1712],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{p:[39,7,1761],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[39,62,1816]},'", "amount": 1}']},f:["1"]}," ",{p:[40,7,1860],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[40,62,1915]},'", "amount": 5}']},f:["5"]}," ",{p:[41,7,1959],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[41,62,2014]},'", "amount": 10}']},f:["10"]}," ",{p:[42,7,2060],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[42,62,2115]},'", "amount": 1000}']},f:["All"]}," ",{p:[43,7,2164],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[43,62,2219]},'", "amount": -1}']},f:["Custom"]}," ",{p:[44,7,2269],t:7,e:"ui-button",a:{action:"analyzeBuff",params:['{"id": "',{t:2,r:"id",p:[44,55,2317]},'"}']},f:["Analyze"]}]}]}],n:52,r:"data.bufferContents",p:[36,4,1599]}]}]}," ",{t:4,f:[{p:[52,3,2453],t:7,e:"ui-display",a:{title:"Pills, Bottles and Patches"},f:[{t:4,f:[{p:[54,5,2537],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["id","data.chosenPillStyle"],s:'_0==_1?"selected":null'},p:[54,23,2555]}],action:"pillStyle",params:['{"id": "',{t:2,r:"id",p:[54,108,2640]},'"}']},f:[{t:3,r:"htmltag",p:[54,118,2650]}]}],n:52,r:"data.pillStyles",p:[53,4,2506]}," ",{p:[56,4,2694],t:7,e:"br"}," ",{t:4,f:[{p:[58,5,2740],t:7,e:"ui-button",a:{action:"ejectp",state:[{t:2,x:{r:["data.isPillBottleLoaded"],s:'_0?null:"disabled"'},p:[58,39,2774]}]},f:[{t:2,x:{r:["data.isPillBottleLoaded"],s:'_0?"Eject":"No Pill bottle loaded"'},p:[58,88,2823]}]}," ",{p:[59,5,2904],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.pillBotContent",p:[59,27,2926]},"/",{t:2,r:"data.pillBotMaxContent",p:[59,51,2950]}]}],n:50,r:"data.isPillBottleLoaded",p:[57,4,2703]},{t:4,n:51,f:[{p:[61,5,3002],t:7,e:"span",a:{"class":"average"},f:["No Pillbottle"]}],r:"data.isPillBottleLoaded"}," ",{p:[64,4,3063],t:7,e:"br"}," ",{p:[65,4,3073],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[65,63,3132]}]},f:["Create Pill (max 50µ)"]}," ",{p:[66,4,3216],t:7,e:"br"}," ",{p:[67,4,3226],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[67,63,3285]}]},f:["Create Multiple Pills"]}," ",{p:[68,4,3369],t:7,e:"br"}," ",{p:[69,4,3379],t:7,e:"br"}," ",{p:[70,4,3389],t:7,e:"ui-button",a:{action:"createPatch",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[70,64,3449]}]},f:["Create Patch (max 40µ)"]}," ",{p:[71,4,3534],t:7,e:"br"}," ",{p:[72,4,3544],t:7,e:"ui-button",a:{action:"createPatch",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[72,64,3604]}]},f:["Create Multiple Patches"]}," ",{p:[73,4,3690],t:7,e:"br"}," ",{p:[74,4,3700],t:7,e:"br"}," ",{p:[75,4,3710],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[75,65,3771]}]},f:["Create Bottle (max 30µ)"]}," ",{p:[76,4,3857],t:7,e:"br"}," ",{p:[77,4,3867],t:7,e:"ui-button",a:{ -action:"createBottle",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[77,65,3928]}]},f:["Dispense Buffer to Bottles"]}," ",{p:[78,4,4017],t:7,e:"br"}," ",{p:[79,4,4027],t:7,e:"br"}," ",{p:[80,4,4037],t:7,e:"ui-button",a:{action:"createVial",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[80,63,4096]}]},f:["Create Hypo Vial (max 60µ)"]}," ",{p:[81,4,4185],t:7,e:"br"}," ",{p:[82,4,4195],t:7,e:"ui-button",a:{action:"createVial",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[82,63,4254]}]},f:["Dispense Buffer to Hypo vials"]}," ",{p:[83,4,4347],t:7,e:"br"}]}],n:50,x:{r:["data.condi"],s:"!_0"},p:[51,2,2430]},{t:4,n:51,f:[{p:[88,3,4390],t:7,e:"ui-display",a:{title:"Condiments bottles and packs"},f:[{p:[89,4,4445],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[89,63,4504]}]},f:["Create Pack (max 10µ)"]}," ",{p:[90,4,4588],t:7,e:"br"}," ",{p:[91,4,4598],t:7,e:"br"}," ",{p:[92,4,4608],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[92,65,4669]}]},f:["Create Bottle (max 50µ)"]}]}],x:{r:["data.condi"],s:"!_0"}}],n:50,x:{r:["data.screen"],s:'_0=="home"'},p:[1,2,1]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.screen"],s:'_0=="analyze"'},f:[{p:[96,2,4817],t:7,e:"ui-display",a:{title:[{t:2,r:"data.analyzeVars.name",p:[96,20,4835]}]},f:[{p:[97,3,4866],t:7,e:"span",a:{"class":"highlight"},f:["Description:"]}," ",{p:[98,3,4914],t:7,e:"span",a:{"class":"content",style:"float:center"},f:[{t:2,r:"data.analyzeVars.description",p:[98,46,4957]}]}," ",{p:[99,3,5e3],t:7,e:"br"}," ",{p:[100,3,5009],t:7,e:"span",a:{"class":"highlight"},f:["Color:"]}," ",{p:[101,3,5051],t:7,e:"span",a:{style:["color: ",{t:2,r:"data.analyzeVars.color",p:[101,23,5071]},"; background-color: ",{t:2,r:"data.analyzeVars.color",p:[101,69,5117]}]},f:[{t:2,r:"data.analyzeVars.color",p:[101,97,5145]}]}," ",{p:[102,3,5182],t:7,e:"br"}," ",{p:[103,3,5191],t:7,e:"span",a:{"class":"highlight"},f:["State:"]}," ",{p:[104,3,5233],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.state",p:[104,25,5255]}]}," ",{p:[105,3,5292],t:7,e:"br"}," ",{p:[106,3,5301],t:7,e:"span",a:{"class":"highlight"},f:["Metabolization Rate:"]}," ",{p:[107,3,5357],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.metaRate",p:[107,25,5379]},"µ/minute"]}," ",{p:[108,3,5427],t:7,e:"br"}," ",{p:[109,3,5436],t:7,e:"span",a:{"class":"highlight"},f:["Overdose Threshold:"]}," ",{p:[110,3,5491],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.overD",p:[110,25,5513]}]}," ",{p:[111,3,5550],t:7,e:"br"}," ",{p:[112,3,5559],t:7,e:"span",a:{"class":"highlight"},f:["Addiction Threshold:"]}," ",{p:[113,3,5615],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.addicD",p:[113,25,5637]}]}," ",{p:[114,3,5675],t:7,e:"br"}," ",{t:4,f:[{p:[116,4,5714],t:7,e:"span",a:{"class":"highlight"},f:["Minumum Reaction Temperature:"]}," ",{p:[117,4,5780],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.minTemp",p:[117,26,5802]},"K"]}," ",{p:[118,4,5843],t:7,e:"br"}," ",{p:[119,4,5853],t:7,e:"span",a:{"class":"highlight"},f:["Optimal Reaction Temperature:"]}," ",{p:[120,4,5919],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.maxTemp",p:[120,26,5941]},"K"]}," ",{p:[121,4,5982],t:7,e:"br"}," ",{p:[122,4,5992],t:7,e:"span",a:{"class":"highlight"},f:["Explosion Reaction Temperature:"]}," ",{p:[123,4,6060],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.eTemp",p:[123,26,6082]},"K"]}," ",{p:[124,4,6121],t:7,e:"br"}," ",{p:[125,4,6131],t:7,e:"span",a:{"class":"highlight"},f:["Optimal reaction pH:"]}," ",{p:[126,4,6188],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.pHpeak",p:[126,26,6210]}]}," ",{p:[127,4,6249],t:7,e:"br"}," ",{p:[128,4,6259],t:7,e:"span",a:{"class":"highlight"},f:["Current Purity:"]}," ",{p:[129,4,6311],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.purityF",p:[129,26,6333]}]}," ",{p:[130,4,6373],t:7,e:"br"}," ",{p:[131,4,6383],t:7,e:"span",a:{"class":"highlight"},f:["Inverse Purity Threshold:"]}," ",{p:[132,4,6445],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.inverseRatioF",p:[132,26,6467]}]}," ",{p:[133,4,6513],t:7,e:"br"}," ",{p:[134,4,6523],t:7,e:"span",a:{"class":"highlight"},f:["Explosion Purity Threshold:"]}," ",{p:[135,4,6587],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.purityE",p:[135,26,6609]}]}," ",{p:[136,4,6649],t:7,e:"br"}],n:50,r:"data.fermianalyze",p:[115,3,5684]}," ",{p:[138,3,6669],t:7,e:"br"}," ",{p:[139,3,6678],t:7,e:"ui-button",a:{action:"goScreen",params:'{"screen": "home"}'},f:["Back"]}]}]}],x:{r:["data.screen"],s:'_0=="home"'}}]},e.exports=a.extend(r.exports)},{341:341}],381:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Recipient Contents"},f:[{p:[2,2,42],t:7,e:"ui-section",f:[{p:[3,3,58],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[3,34,89]}],action:"ejectBeaker"},f:["Eject"]}," ",{p:[4,3,176],t:7,e:"ui-button",a:{icon:"circle",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[4,35,208]}],action:"input"},f:["Input"]}," ",{p:[5,3,289],t:7,e:"ui-button",a:{icon:"circle",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,35,321]}],action:"amount"},f:[{t:2,r:"data.amount",p:[5,96,382]},"U"]}," ",{p:[6,3,414],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"disabled":null'},p:[6,33,444]}],action:"makecup"},f:["Create Beaker"]}]}]}," ",{p:[9,1,564],t:7,e:"ui-display",a:{title:"Recipient"},f:[{p:[10,2,597],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[12,4,662],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[12,10,668]},"/",{t:2,r:"data.beakerMaxVolume",p:[12,52,710]}," Units"]}," ",{t:4,f:[{p:[14,5,788],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[14,48,831]}," units of ",{t:2,r:"name",p:[14,83,866]}]},{p:[14,98,881],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[13,4,752]},{t:4,n:51,f:[{p:[16,5,905],t:7,e:"span",a:{"class":"bad"},f:["Recipient Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[11,3,630]},{t:4,n:51,f:[{p:[19,4,976],t:7,e:"span",a:{"class":"average"},f:["No Recipient"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],382:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-button",a:{action:"toggle"},f:[{t:2,x:{r:["data.recollection"],s:'_0?"Recital":"Recollection"'},p:[2,30,43]}]}]}," ",{t:4,f:[{p:[5,3,149],t:7,e:"ui-display",f:[{t:3,r:"data.rec_text",p:[6,3,165]}," ",{t:4,f:[{p:[8,4,231],t:7,e:"br"},{p:[8,8,235],t:7,e:"ui-button",a:{action:"rec_category",params:['{"category": "',{t:2,r:"name",p:[8,63,290]},'"}']},f:[{t:3,r:"name",p:[8,75,302]}," - ",{t:3,r:"desc",p:[8,88,315]}]}],n:52,r:"data.recollection_categories",p:[7,3,188]}," ",{t:3,r:"data.rec_section",p:[10,3,354]}," ",{t:3,r:"data.rec_binds",p:[11,3,380]}]}],n:50,r:"data.recollection",p:[4,1,120]},{t:4,n:51,f:[{p:[14,2,431],t:7,e:"ui-display",a:{title:"Power",button:0},f:[{p:[15,4,469],t:7,e:"ui-section",f:[{t:3,r:"data.power",p:[16,6,488]}]}]}," ",{p:[19,2,541],t:7,e:"ui-display",f:[{p:[20,3,557],t:7,e:"ui-section",f:[{p:[21,4,574],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Driver"?"selected":null'},p:[21,22,592]}],action:"select",params:'{"category": "Driver"}'},f:["Driver"]}," ",{p:[22,4,715],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Script"?"selected":null'},p:[22,22,733]}],action:"select",params:'{"category": "Script"}'},f:["Scripts"]}," ",{p:[23,4,857],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Application"?"selected":null'},p:[23,22,875]}],action:"select",params:'{"category": "Application"}'},f:["Applications"]}," ",{p:[24,4,1014],t:7,e:"br"},{t:3,r:"data.tier_info",p:[24,8,1018]}]}," ",{p:[26,3,1059],t:7,e:"ui-section",f:[{t:3,r:"data.scripturecolors",p:[27,4,1076]}]},{p:[28,16,1119],t:7,e:"hr"}," ",{p:[29,3,1127],t:7,e:"ui-section",f:[{t:4,f:[{p:[31,4,1172],t:7,e:"div",f:[{p:[31,9,1177],t:7,e:"ui-button",a:{tooltip:[{t:3,r:"tip",p:[31,29,1197]}],"tooltip-side":"right",action:"recite",params:['{"category": "',{t:2,r:"type",p:[31,99,1267]},'"}']},f:["Recite ",{t:3,r:"required",p:[31,118,1286]}]}," ",{t:4,f:[{t:4,f:[{p:[34,6,1362],t:7,e:"ui-button",a:{action:"bind",params:['{"category": "',{t:2,r:"type",p:[34,53,1409]},'"}']},f:["Unbind ",{t:3,r:"bound",p:[34,72,1428]}]}],n:50,r:"bound",p:[33,5,1342]},{t:4,n:51,f:[{p:[36,6,1472],t:7,e:"ui-button",a:{action:"bind",params:['{"category": "',{t:2,r:"type",p:[36,53,1519]},'"}']},f:["Quickbind"]}],r:"bound"}],n:50,r:"quickbind",p:[32,6,1319]}," ",{t:3,r:"name",p:[39,6,1586]}," ",{t:3,r:"descname",p:[39,17,1597]}," ",{t:3,r:"invokers",p:[39,32,1612]}]}],n:52,r:"data.scripture",p:[30,3,1143]}]}]}],r:"data.recollection"}]},e.exports=a.extend(r.exports)},{341:341}],383:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Codex Gigas"},f:[{p:[2,2,35],t:7,e:"ui-section",f:[{t:2,r:"data.name",p:[3,3,51]}]}," ",{p:[5,5,86],t:7,e:"ui-section",a:{label:"Prefix"},f:[{p:[6,3,117],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[6,22,136]}],action:"Dark "},f:["Dark"]}," ",{p:[7,3,221],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[7,22,240]}],action:"Hellish "},f:["Hellish"]}," ",{p:[8,3,331],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[8,22,350]}],action:"Fallen "},f:["Fallen"]}," ",{p:[9,3,439],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[9,22,458]}],action:"Fiery "},f:["Fiery"]}," ",{p:[10,3,545],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[10,22,564]}],action:"Sinful "},f:["Sinful"]}," ",{p:[11,3,653],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[11,22,672]}],action:"Blood "},f:["Blood"]}," ",{p:[12,3,759],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[12,22,778]}],action:"Fluffy "},f:["Fluffy"]}]}," ",{p:[14,5,888],t:7,e:"ui-section",a:{label:"Title"},f:[{p:[15,3,918],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[15,22,937]}],action:"Lord "},f:["Lord"]}," ",{p:[16,3,1022],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[16,22,1041]}],action:"Prelate "},f:["Prelate"]}," ",{p:[17,3,1132],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[17,22,1151]}],action:"Count "},f:["Count"]}," ",{p:[18,3,1238],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[18,22,1257]}],action:"Viscount "},f:["Viscount"]}," ",{p:[19,3,1350],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[19,22,1369]}],action:"Vizier "},f:["Vizier"]}," ",{p:[20,3,1458],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[20,22,1477]}],action:"Elder "},f:["Elder"]}," ",{p:[21,3,1564],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[21,22,1583]}],action:"Adept "},f:["Adept"]}]}," ",{p:[23,5,1691],t:7,e:"ui-section",a:{label:"Name"},f:[{p:[24,3,1720],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[24,22,1739]}],action:"hal"},f:["hal"]}," ",{p:[25,3,1821],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[25,22,1840]}],action:"ve"},f:["ve"]}," ",{p:[26,3,1920],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[26,22,1939]}],action:"odr"},f:["odr"]}," ",{p:[27,3,2021],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[27,22,2040]}],action:"neit"},f:["neit"]}," ",{p:[28,3,2124],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[28,22,2143]}],action:"ci"},f:["ci"]}," ",{p:[29,3,2223],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[29,22,2242]}],action:"quon"},f:["quon"]}," ",{p:[30,3,2326],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[30,22,2345]}],action:"mya"},f:["mya"]}," ",{p:[31,3,2427],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[31,22,2446]}],action:"folth"},f:["folth"]}," ",{p:[32,3,2532],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[32,22,2551]}],action:"wren"},f:["wren"]}," ",{p:[33,3,2635],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[33,22,2654]}],action:"geyr"},f:["geyr"]}," ",{p:[34,3,2738],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[34,22,2757]}],action:"hil"},f:["hil"]}," ",{p:[35,3,2839],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[35,22,2858]}],action:"niet"},f:["niet"]}," ",{p:[36,3,2942],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[36,22,2961]}],action:"twou"},f:["twou"]}," ",{p:[37,3,3045],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[37,22,3064]}],action:"phi"},f:["phi"]}," ",{p:[38,3,3146],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[38,22,3165]}],action:"coa"},f:["coa"]}]}," ",{p:[40,5,3268],t:7,e:"ui-section",a:{label:"suffix"},f:[{p:[41,3,3299],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[41,22,3318]}],action:" the Red"},f:["the Red"]}," ",{p:[42,3,3409],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[42,22,3428]}],action:" the Soulless"},f:["the Soulless"]}," ",{p:[43,3,3529],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[43,22,3548]}],action:" the Master"},f:["the Master"]}," ",{p:[44,3,3645],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[44,22,3664]}],action:", the Lord of all things"},f:["the Lord of all things"]}," ",{p:[45,3,3786],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[45,22,3805]}],action:", Jr."},f:["jr"]}]}," ",{p:[47,5,3909],t:7,e:"ui-section",a:{label:"submit"},f:[{p:[48,3,3941],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0>=4?null:"disabled"'},p:[48,21,3959]}],action:"search"},f:["search"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],384:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[2,1,2],t:7,e:"ui-button",a:{icon:"circle",action:"clean_order"},f:["Clear Order"]},{p:[2,70,71],t:7,e:"br"},{p:[2,74,75],t:7,e:"br"}," ",{p:[3,1,81],t:7,e:"i",f:["Your new computer device you always dreamed of is just four steps away..."]},{p:[3,81,161],t:7,e:"hr"}," ",{t:4,f:[" ",{p:[5,1,223],t:7,e:"div",a:{"class":"item"},f:[{p:[6,2,244],t:7,e:"h2",f:["Step 1: Select your device type"]}," ",{p:[7,2,287],t:7,e:"ui-button",a:{icon:"calc",action:"pick_device",params:'{"pick" : "1"}'},f:["Laptop"]}," ",{p:[8,2,377],t:7,e:"ui-button",a:{icon:"calc",action:"pick_device",params:'{"pick" : "2"}'},f:["LTablet"]}]}],n:50,x:{r:["data.state"],s:"_0==0"},p:[4,1,167]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.state"],s:"_0==1"},f:[{p:[11,1,502],t:7,e:"div",a:{"class":"item"},f:[{p:[12,2,523],t:7,e:"h2",f:["Step 2: Personalise your device"]}," ",{p:[13,2,566],t:7,e:"table",f:[{p:[14,3,577],t:7,e:"tr",f:[{p:[15,4,586],t:7,e:"td",f:[{p:[15,8,590],t:7,e:"b",f:["Current Price:"]}]},{p:[16,4,616],t:7,e:"td",f:[{t:2,r:"data.totalprice",p:[16,8,620]},"C"]}]}," ",{p:[18,3,653],t:7,e:"tr",f:[{p:[19,4,663],t:7,e:"td",f:[{p:[19,8,667],t:7,e:"b",f:["Battery:"]}]},{p:[20,4,687],t:7,e:"td",f:[{p:[20,8,691],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "1"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==1?"selected":null'},p:[20,73,756]}]},f:["Standard"]}]},{p:[21,4,827],t:7,e:"td",f:[{p:[21,8,831],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "2"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==2?"selected":null'},p:[21,73,896]}]},f:["Upgraded"]}]},{p:[22,4,967],t:7,e:"td",f:[{p:[22,8,971],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "3"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==3?"selected":null'},p:[22,73,1036]}]},f:["Advanced"]}]}]}," ",{p:[24,3,1115],t:7,e:"tr",f:[{p:[25,4,1124],t:7,e:"td",f:[{p:[25,8,1128],t:7,e:"b",f:["Hard Drive:"]}]},{p:[26,4,1151],t:7,e:"td",f:[{p:[26,8,1155],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "1"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==1?"selected":null'},p:[26,67,1214]}]},f:["Standard"]}]},{p:[27,4,1282],t:7,e:"td",f:[{p:[27,8,1286],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "2"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==2?"selected":null'},p:[27,67,1345]}]},f:["Upgraded"]}]},{p:[28,4,1413],t:7,e:"td",f:[{p:[28,8,1417],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "3"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==3?"selected":null'},p:[28,67,1476]}]},f:["Advanced"]}]}]}," ",{p:[30,3,1552],t:7,e:"tr",f:[{p:[31,4,1561],t:7,e:"td",f:[{p:[31,8,1565],t:7,e:"b",f:["Network Card:"]}]},{p:[32,4,1590],t:7,e:"td",f:[{p:[32,8,1594],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "0"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==0?"selected":null'},p:[32,73,1659]}]},f:["None"]}]},{p:[33,4,1726],t:7,e:"td",f:[{p:[33,8,1730],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "1"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==1?"selected":null'},p:[33,73,1795]}]},f:["Standard"]}]},{p:[34,4,1866],t:7,e:"td",f:[{p:[34,8,1870],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "2"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==2?"selected":null'},p:[34,73,1935]}]},f:["Advanced"]}]}]}," ",{p:[36,3,2014],t:7,e:"tr",f:[{p:[37,4,2023],t:7,e:"td",f:[{p:[37,8,2027],t:7,e:"b",f:["Nano Printer:"]}]},{p:[38,4,2052],t:7,e:"td",f:[{p:[38,8,2056],t:7,e:"ui-button",a:{action:"hw_nanoprint",params:'{"print" : "0"}',state:[{t:2,x:{r:["data.hw_nanoprint"],s:'_0==0?"selected":null'},p:[38,73,2121]}]},f:["None"]}]},{p:[39,4,2190],t:7,e:"td",f:[{p:[39,8,2194],t:7,e:"ui-button",a:{action:"hw_nanoprint",params:'{"print" : "1"}',state:[{t:2,x:{r:["data.hw_nanoprint"],s:'_0==1?"selected":null'},p:[39,73,2259]}]},f:["Standard"]}]}]}," ",{p:[41,3,2340],t:7,e:"tr",f:[{p:[42,4,2349],t:7,e:"td",f:[{p:[42,8,2353],t:7,e:"b",f:["Card Reader:"]}]},{p:[43,4,2377],t:7,e:"td",f:[{p:[43,8,2381],t:7,e:"ui-button",a:{action:"hw_card",params:'{"card" : "0"}',state:[{t:2,x:{r:["data.hw_card"],s:'_0==0?"selected":null'},p:[43,67,2440]}]},f:["None"]}]},{p:[44,4,2504],t:7,e:"td",f:[{p:[44,8,2508],t:7,e:"ui-button",a:{action:"hw_card",params:'{"card" : "1"}',state:[{t:2,x:{r:["data.hw_card"],s:'_0==1?"selected":null'},p:[44,67,2567]}]},f:["Standard"]}]}]}]}," ",{t:4,f:[" ",{p:[49,4,2706],t:7,e:"table",f:[{p:[50,5,2719],t:7,e:"tr",f:[{p:[51,6,2730],t:7,e:"td",f:[{p:[51,10,2734],t:7,e:"b",f:["Processor Unit:"]}]},{p:[52,6,2763],t:7,e:"td",f:[{p:[52,10,2767],t:7,e:"ui-button",a:{action:"hw_cpu",params:'{"cpu" : "1"}',state:[{t:2,x:{r:["data.hw_cpu"],s:'_0==1?"selected":null'},p:[52,67,2824]}]},f:["Standard"]}]},{p:[53,6,2893],t:7,e:"td",f:[{p:[53,10,2897],t:7,e:"ui-button",a:{action:"hw_cpu",params:'{"cpu" : "2"}',state:[{t:2,x:{r:["data.hw_cpu"],s:'_0==2?"selected":null'},p:[53,67,2954]}]},f:["Advanced"]}]}]}," ",{p:[55,5,3033],t:7,e:"tr",f:[{p:[56,6,3044],t:7,e:"td",f:[{p:[56,10,3048],t:7,e:"b",f:["Tesla Relay:"]}]},{p:[57,6,3074],t:7,e:"td",f:[{p:[57,10,3078],t:7,e:"ui-button",a:{action:"hw_tesla",params:'{"tesla" : "0"}',state:[{t:2,x:{r:["data.hw_tesla"],s:'_0==0?"selected":null'},p:[57,71,3139]}]},f:["None"]}]},{p:[58,6,3206],t:7,e:"td",f:[{p:[58,10,3210],t:7,e:"ui-button",a:{action:"hw_tesla",params:'{"tesla" : "1"}',state:[{t:2,x:{r:["data.hw_tesla"],s:'_0==1?"selected":null'},p:[58,71,3271]}]},f:["Standard"]}]}]}]}],n:50,x:{r:["data.devtype"],s:"_0!=2"},p:[48,3,2659]}," ",{p:[62,3,3374],t:7,e:"table",f:[{p:[63,4,3386],t:7,e:"tr",f:[{p:[64,5,3396],t:7,e:"td",f:[{p:[64,9,3400],t:7,e:"b",f:["Confirm Order:"]}]},{p:[65,5,3427],t:7,e:"td",f:[{p:[65,9,3431],t:7,e:"ui-button",a:{action:"confirm_order"},f:["CONFIRM"]}]}]}]}," ",{p:[69,2,3512],t:7,e:"hr"}," ",{p:[70,2,3519],t:7,e:"b",f:["Battery"]}," allows your device to operate without external utility power source. Advanced batteries increase battery life.",{p:[70,127,3644],t:7,e:"br"}," ",{p:[71,2,3651],t:7,e:"b",f:["Hard Drive"]}," stores file on your device. Advanced drives can store more files, but use more power, shortening battery life.",{p:[71,130,3779],t:7,e:"br"}," ",{p:[72,2,3786],t:7,e:"b",f:["Network Card"]}," allows your device to wirelessly connect to stationwide NTNet network. Basic cards are limited to on-station use, while advanced cards can operate anywhere near the station, which includes the asteroid outposts.",{p:[72,233,4017],t:7,e:"br"}," ",{p:[73,2,4024],t:7,e:"b",f:["Processor Unit"]}," is critical for your device's functionality. It allows you to run programs from your hard drive. Advanced CPUs use more power, but allow you to run more programs on background at once.",{p:[73,208,4230],t:7,e:"br"}," ",{p:[74,2,4237],t:7,e:"b",f:["Tesla Relay"]}," is an advanced wireless power relay that allows your device to connect to nearby area power controller to provide alternative power source. This component is currently unavailable on tablet computers due to size restrictions.",{p:[74,246,4481],t:7,e:"br"}," ",{p:[75,2,4488],t:7,e:"b",f:["Nano Printer"]}," is device that allows for various paperwork manipulations, such as, scanning of documents or printing new ones. This device was certified EcoFriendlyPlus and is capable of recycling existing paper for printing purposes.",{p:[75,241,4727],t:7,e:"br"}," ",{p:[76,2,4734],t:7,e:"b",f:["Card Reader"]}," adds a slot that allows you to manipulate RFID cards. Please note that this is not necessary to allow the device to read your identification, it is just necessary to manipulate other cards."]}]},{t:4,n:50,x:{r:["data.state"],s:"(!(_0==1))&&(_0==2)"},f:[" ",{p:[79,2,4981],t:7,e:"h2",f:["Step 3: Payment"]}," ",{p:[80,2,5008],t:7,e:"b",f:["Your device is now ready for fabrication.."]},{p:[80,51,5057],t:7,e:"br"}," ",{p:[81,2,5064],t:7,e:"i",f:["Please ensure the required amount of credits are in the machine, then press purchase."]},{p:[81,94,5156],t:7,e:"br"}," ",{p:[82,2,5163],t:7,e:"i",f:["Current credits: ",{p:[82,22,5183],t:7,e:"b",f:[{t:2,r:"data.credits",p:[82,25,5186]},"C"]}]},{p:[82,50,5211],t:7,e:"br"}," ",{p:[83,2,5218],t:7,e:"i",f:["Total price: ",{p:[83,18,5234],t:7,e:"b",f:[{t:2,r:"data.totalprice",p:[83,21,5237]},"C"]}]},{p:[83,49,5265],t:7,e:"br"},{p:[83,53,5269],t:7,e:"br"}," ",{p:[84,2,5276],t:7,e:"ui-button",a:{action:"purchase",state:[{t:2,x:{r:["data.credits","data.totalprice"],s:'_0>=_1?null:"disabled"'},p:[84,38,5312]}]},f:["PURCHASE"]}]},{t:4,n:50,x:{r:["data.state"],s:"(!(_0==1))&&((!(_0==2))&&(_0==3))"},f:[" ",{p:[87,2,5423],t:7,e:"h2",f:["Step 4: Thank you for your purchase"]},{p:[87,46,5467],t:7,e:"br"}," ",{p:[88,2,5474],t:7,e:"b",f:["Should you experience any issues with your new device, contact your local network admin for assistance."]}]}],x:{r:["data.state"],s:"_0==0"}}]},e.exports=a.extend(r.exports)},{341:341}],385:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,1,22],t:7,e:"ui-display",f:[{p:[3,2,37],t:7,e:"ui-section",a:{label:"Cap"},f:[{p:[4,3,65],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.is_capped"],s:'_0?"power-off":"close"'},p:[4,20,82]}],style:[{t:2,x:{r:["data.is_capped"],s:'_0?null:"selected"'},p:[4,71,133]}],action:"toggle_cap"},f:[{t:2,x:{r:["data.is_capped"],s:'_0?"On":"Off"'},p:[6,4,202]}]}]}]}],n:50,r:"data.has_cap",p:[1,1,0]},{p:[10,1,288],t:7,e:"ui-display",f:[{t:4,f:[{p:[14,2,419],t:7,e:"ui-section",f:[{p:[15,3,435],t:7,e:"ui-button",a:{action:"select_colour"},f:["Select New Colour"]}]}],n:50,r:"data.can_change_colour",p:[13,1,386]}]}," ",{p:[19,1,540],t:7,e:"ui-display",a:{title:"Stencil"},f:[{t:4,f:[{p:[21,2,599],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[21,21,618]}]},f:[{t:4,f:[{p:[23,7,655],t:7,e:"ui-button",a:{action:"select_stencil",params:['{"item":"',{t:2,r:"item",p:[23,59,707]},'"}'],style:[{t:2,x:{r:["item","data.selected_stencil"],s:'_0==_1?"selected":null'},p:[24,12,731]}]},f:[{t:2,r:"item",p:[25,4,791]}]}],n:52,r:"items",p:[22,3,632]}]}],n:52,r:"data.drawables",p:[20,3,572]}]}," ",{p:[31,1,874],t:7,e:"ui-display",a:{title:"Text Mode"},f:[{p:[32,2,907],t:7,e:"ui-section",a:{label:"Current Buffer"},f:[{t:2,r:"text_buffer",p:[32,37,942]}]}," ",{p:[34,2,976],t:7,e:"ui-section",f:[{p:[34,14,988],t:7,e:"ui-button",a:{action:"enter_text"},f:["New Text"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],386:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{isHead:function(t){return t%10==0},dept_class:function(t){return 0==t?"dept-cap":t>=10&&20>t?"dept-sec":t>=20&&30>t?"dept-med":t>=30&&40>t?"dept-sci":t>=40&&50>t?"dept-eng":t>=50&&60>t?"dept-cargo":t>=200&&230>t?"dept-cent":"dept-other"},health_state:function(t,e,n,a){var r=t+e+n+a;return 0>=r?"health-5":25>=r?"health-4":50>=r?"health-3":75>=r?"health-2":"health-0"}}}}(r),r.exports.css=" .health {\r\n width: 16px;\r\n height: 16px;\r\n background-color: #FFF;\r\n border: 1px solid #434343;\r\n position: relative;\r\n top: 2px;\r\n display: inline-block;\r\n }\r\n .health-5 { background-color: #17d568; }\r\n .health-4 { background-color: #2ecc71; }\r\n .health-3 { background-color: #e67e22; }\r\n .health-2 { background-color: #ed5100; }\r\n .health-1 { background-color: #e74c3c; }\r\n .health-0 { background-color: #ed2814; }\r\n\r\n .dept-cap {color : #C06616;}\r\n .dept-sec {color : #E74C3C;}\r\n .dept-med {color : #3498DB;}\r\n .dept-sci {color : #9B59B6;}\r\n .dept-eng {color : #F1C40F;}\r\n .dept-cargo {color : #F39C12;}\r\n .dept-cent {color : #00C100;}\r\n .dept-other {color: #C38312;}\r\n\r\n .oxy { color : #3498db; }\r\n .toxin { color : #2ecc71; }\r\n .burn { color : #e67e22; }\r\n .brute { color : #e74c3c; }\r\n\r\n table.crew{\r\n border-collapse: collapse;\r\n }\r\n\r\n table.crew td {\r\n padding : 0px 10px;\r\n }",r.exports.template={v:3,t:[" ",{p:[27,1,1030],t:7,e:"ui-display",f:[{p:[28,2,1045],t:7,e:"ui-section",f:[{p:[29,3,1061],t:7,e:"table",a:{"class":"crew"},f:[{p:[30,3,1085],t:7,e:"thead",f:[{p:[31,3,1096],t:7,e:"tr",f:[{p:[32,4,1105],t:7,e:"th",f:["Name"]}," ",{p:[33,4,1123],t:7,e:"th",f:["Status"]}," ",{p:[34,4,1143],t:7,e:"th",f:["Vitals"]}," ",{p:[35,4,1163],t:7,e:"th",f:["Position"]}," ",{t:4,f:[{p:[37,5,1216],t:7,e:"th",f:["Tracking"]}],n:50,r:"data.link_allowed",p:[36,4,1185]}]}]}," ",{p:[41,3,1270],t:7,e:"tbody",f:[{t:4,f:[{p:[43,4,1308],t:7,e:"tr",f:[{p:[44,5,1318],t:7,e:"td",f:[{p:[45,6,1329],t:7,e:"span",a:{"class":[{t:2,x:{r:["isHead","ijob"],s:'_0(_1)?"bold ":""'},p:[45,19,1342]},{t:2,x:{r:["dept_class","ijob"],s:"_0(_1)"},p:[45,49,1372]}]},f:[{t:2,r:"name",p:[46,7,1402]}," (",{t:2,r:"assignment",p:[46,17,1412]},") ",{p:[47,6,1434],t:7,e:"span",f:[]}]}]}," ",{p:[49,5,1457],t:7,e:"td",f:[{t:4,f:[{p:[51,7,1498],t:7,e:"span",a:{"class":["health ",{t:2,x:{r:["health_state","oxydam","toxdam","burndam","brutedam"],s:"_0(_1,_2,_3,_4)"},p:[51,27,1518]}]}}],n:50,x:{r:["oxydam"],s:"_0!=null"},p:[50,6,1468]},{t:4,n:51,f:[{t:4,f:[{p:[54,8,1626],t:7,e:"span",a:{"class":"health health-5"}}],n:50,r:"life_status",p:[53,7,1598]},{t:4,n:51,f:[{p:[56,8,1688],t:7,e:"span",a:{"class":"health health-0"}}],r:"life_status"}],x:{r:["oxydam"],s:"_0!=null"}}]}," ",{p:[60,5,1771],t:7,e:"td",f:[{t:4,f:[{p:[62,7,1812],t:7,e:"span",f:["( ",{p:[64,8,1836],t:7,e:"span",a:{"class":"oxy"},f:[{t:2,r:"oxydam",p:[64,26,1854]}]}," / ",{p:[66,8,1890],t:7,e:"span",a:{"class":"toxin"},f:[{t:2,r:"toxdam",p:[66,28,1910]}]}," / ",{p:[68,8,1946],t:7,e:"span",a:{"class":"burn"},f:[{t:2,r:"burndam",p:[68,27,1965]}]}," / ",{p:[70,8,2002],t:7,e:"span",a:{"class":"brute"},f:[{t:2,r:"brutedam",p:[70,28,2022]}]}," )"]}],n:50,x:{r:["oxydam"],s:"_0!=null"},p:[61,6,1782]},{t:4,n:51,f:[{t:4,f:[{p:[75,8,2116],t:7,e:"span",f:["Alive"]}],n:50,r:"life_status",p:[74,7,2088]},{t:4,n:51,f:[{p:[77,8,2159],t:7,e:"span",f:["Dead"]}],r:"life_status"}],x:{r:["oxydam"],s:"_0!=null"}}]}," ",{p:[81,5,2222],t:7,e:"td",f:[{t:4,f:[{p:[83,6,2260],t:7,e:"span",f:[{t:2,r:"area",p:[83,12,2266]}]}],n:50,x:{r:["pos_x"],s:"_0!=null"},p:[82,5,2232]},{t:4,n:51,f:[{p:[85,6,2302],t:7,e:"span",f:["N/A"]}],x:{r:["pos_x"],s:"_0!=null"}}]}," ",{t:4,f:[{p:[89,6,2381],t:7,e:"td",f:[{p:[90,7,2393],t:7,e:"ui-button",a:{action:"select_person",state:[{t:2,x:{r:["can_track"],s:'_0?null:"disabled"'},p:[90,48,2434]}],params:['{"name":"',{t:2,r:"name",p:[90,100,2486]},'"}']},f:["Track"]}]}],n:50,r:"data.link_allowed",p:[88,5,2348]}]}],n:52,r:"data.sensors",p:[42,3,1281]}]}]}]}]}," "]},e.exports=a.extend(r.exports)},{341:341}],387:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,189],t:7,e:"ui-section",a:{label:"State"},f:[{p:[7,7,223],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[7,20,236]}]},f:[{t:2,r:"data.occupant.stat",p:[7,49,265]}]}]}," ",{p:[9,4,317],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[10,6,356],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.temperaturestatus",p:[10,19,369]}]},f:[{t:2,r:"data.occupant.bodyTemperature",p:[10,56,406]}," K"]}]}," ",{p:[12,5,472],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[13,7,507],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[13,20,520]}],max:[{t:2,r:"data.occupant.maxHealth",p:[13,54,554]}],value:[{t:2,r:"data.occupant.health",p:[13,90,590]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[14,16,632]}]},f:[{t:2,r:"data.occupant.health",p:[14,68,684]}]}]}," ",{t:4,f:[{p:[17,7,908],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[17,26,927]}]},f:[{p:[18,9,948],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[18,30,969]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[18,66,1005]}],state:"bad"},f:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[18,103,1042]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[16,5,742]}],n:50,r:"data.hasOccupant",p:[5,3,159]}]}," ",{p:[23,1,1138],t:7,e:"ui-display",a:{title:"Cell"},f:[{p:[24,3,1167],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[25,5,1199],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[25,22,1216]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[26,14,1276]}],state:[{t:2,x:{r:["data.isOpen"],s:'_0?"disabled":null'},p:[27,14,1332]}],action:"power"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[28,22,1391]}]}]}," ",{p:[30,3,1459],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[31,3,1495],t:7,e:"span",a:{"class":[{t:2,r:"data.temperaturestatus",p:[31,16,1508]}]},f:[{t:2,r:"data.cellTemperature", -p:[31,44,1536]}," K"]}]}," ",{p:[33,2,1588],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[34,5,1619],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOpen"],s:'_0?"unlock":"lock"'},p:[34,22,1636]}],action:"door"},f:[{t:2,x:{r:["data.isOpen"],s:'_0?"Open":"Closed"'},p:[34,73,1687]}]}," ",{p:[35,5,1740],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoEject"],s:'_0?"sign-out":"sign-in"'},p:[35,22,1757]}],action:"autoeject"},f:[{t:2,x:{r:["data.autoEject"],s:'_0?"Auto":"Manual"'},p:[35,86,1821]}]}]}]}," ",{p:{button:[{p:[40,5,1967],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[40,36,1998]}],action:"ejectbeaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[42,3,2101],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{t:4,f:[{p:[45,9,2211],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,r:"volume",p:[45,52,2254]}," units of ",{t:2,r:"name",p:[45,72,2274]}]},{p:[45,87,2289],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[44,7,2171]},{t:4,n:51,f:[{p:[47,9,2320],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[43,5,2136]},{t:4,n:51,f:[{p:[50,7,2396],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],388:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"ui-section",a:{label:"State"},f:[{t:4,f:[{p:[4,4,76],t:7,e:"span",a:{"class":"good"},f:["Ready"]}],n:50,r:"data.full_pressure",p:[3,3,45]},{t:4,n:51,f:[{t:4,f:[{p:[7,5,153],t:7,e:"span",a:{"class":"bad"},f:["Power Disabled"]}],n:50,r:"data.panel_open",p:[6,4,124]},{t:4,n:51,f:[{t:4,f:[{p:[10,6,248],t:7,e:"span",a:{"class":"average"},f:["Pressurizing"]}],n:50,r:"data.pressure_charging",p:[9,5,211]},{t:4,n:51,f:[{p:[12,6,310],t:7,e:"span",a:{"class":"bad"},f:["Off"]}],r:"data.pressure_charging"}],r:"data.panel_open"}],r:"data.full_pressure"}]}," ",{p:[17,2,393],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[18,3,426],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.per",p:[18,36,459]}],state:"good"},f:[{t:2,r:"data.per",p:[18,63,486]},"%"]}]}," ",{p:[20,5,530],t:7,e:"ui-section",a:{label:"Handle"},f:[{p:[21,9,567],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.flush"],s:'_0?"toggle-on":"toggle-off"'},p:[22,10,589]}],state:[{t:2,x:{r:["data.isai","data.panel_open"],s:'_0||_1?"disabled":null'},p:[23,11,647]}],action:[{t:2,x:{r:["data.flush"],s:'_0?"handle-0":"handle-1"'},p:[24,12,714]}]},f:[{t:2,x:{r:["data.flush"],s:'_0?"Disengage":"Engage"'},p:[25,5,763]}]}]}," ",{p:[27,2,837],t:7,e:"ui-section",a:{label:"Eject"},f:[{p:[28,3,867],t:7,e:"ui-button",a:{icon:"sign-out",state:[{t:2,x:{r:["data.isai"],s:'_0?"disabled":null'},p:[28,37,901]}],action:"eject"},f:["Eject Contents"]},{p:[28,114,978],t:7,e:"br"}]}," ",{p:[30,2,1002],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,3,1032],t:7,e:"ui-button",a:{icon:"power-off",state:[{t:2,x:{r:["data.panel_open"],s:'_0?"disabled":null'},p:[31,38,1067]}],action:[{t:2,x:{r:["data.pressure_charging"],s:'_0?"pump-0":"pump-1"'},p:[31,87,1116]}],style:[{t:2,x:{r:["data.pressure_charging"],s:'_0?"selected":null'},p:[31,145,1174]}]}},{p:[31,206,1235],t:7,e:"br"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],389:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"DNA Vault Database"},f:[{p:[2,3,43],t:7,e:"ui-section",a:{label:"Human DNA"},f:[{p:[3,7,81],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.dna_max",p:[3,28,102]}],value:[{t:2,r:"data.dna",p:[3,53,127]}]},f:[{t:2,r:"data.dna",p:[3,67,141]},"/",{t:2,r:"data.dna_max",p:[3,80,154]}," Samples"]}]}," ",{p:[5,3,208],t:7,e:"ui-section",a:{label:"Plant Data"},f:[{p:[6,5,245],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.plants_max",p:[6,26,266]}],value:[{t:2,r:"data.plants",p:[6,54,294]}]},f:[{t:2,r:"data.plants",p:[6,71,311]},"/",{t:2,r:"data.plants_max",p:[6,87,327]}," Samples"]}]}," ",{p:[8,3,384],t:7,e:"ui-section",a:{label:"Animal Data"},f:[{p:[9,5,422],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.animals_max",p:[9,26,443]}],value:[{t:2,r:"data.animals",p:[9,55,472]}]},f:[{t:2,r:"data.animals",p:[9,73,490]},"/",{t:2,r:"data.animals_max",p:[9,90,507]}," Samples"]}]}]}," ",{t:4,f:[{p:[13,1,616],t:7,e:"ui-display",a:{title:"Personal Gene Therapy"},f:[{p:[14,3,663],t:7,e:"ui-section",f:[{p:[15,2,678],t:7,e:"span",f:["Applicable gene therapy treatments:"]}]}," ",{p:[17,3,747],t:7,e:"ui-section",f:[{p:[18,2,762],t:7,e:"ui-button",a:{action:"gene",params:['{"choice": "',{t:2,r:"data.choiceA",p:[18,47,807]},'"}']},f:[{t:2,r:"data.choiceA",p:[18,67,827]}]}," ",{p:[19,2,858],t:7,e:"ui-button",a:{action:"gene",params:['{"choice": "',{t:2,r:"data.choiceB",p:[19,47,903]},'"}']},f:[{t:2,r:"data.choiceB",p:[19,67,923]}]}]}]}],n:50,x:{r:["data.completed","data.used"],s:"_0&&!_1"},p:[12,1,578]}]},e.exports=a.extend(r.exports)},{341:341}],390:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,183],t:7,e:"ui-section",a:{label:"Items in storage"},f:[{p:[7,4,225],t:7,e:"span",f:[{t:2,r:"data.items",p:[7,10,231]}]}]}],n:50,r:"data.items",p:[5,3,159]}," ",{t:4,f:[{p:[11,5,310],t:7,e:"ui-section",a:{label:"State"},f:[{p:[12,7,344],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[12,20,357]}]},f:[{t:2,r:"data.occupant.stat",p:[12,49,386]}]}]}," ",{p:[14,5,439],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[15,7,474],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[15,20,487]}],max:[{t:2,r:"data.occupant.maxHealth",p:[15,54,521]}],value:[{t:2,r:"data.occupant.health",p:[15,90,557]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[16,16,599]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[16,68,651]}]}]}," ",{t:4,f:[{p:[19,7,888],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[19,26,907]}]},f:[{p:[20,9,928],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[20,30,949]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[20,66,985]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[20,103,1022]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[18,5,722]}," ",{p:[23,5,1109],t:7,e:"ui-section",a:{label:"Cells"},f:[{p:[24,9,1145],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"bad":"good"'},p:[24,22,1158]}]},f:[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"Damaged":"Healthy"'},p:[24,68,1204]}]}]}," ",{p:[26,5,1287],t:7,e:"ui-section",a:{label:"Brain"},f:[{p:[27,9,1323],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"bad":"good"'},p:[27,22,1336]}]},f:[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"Abnormal":"Healthy"'},p:[27,68,1382]}]}]}," ",{p:[29,5,1466],t:7,e:"ui-section",a:{label:"Bloodstream"},f:[{t:4,f:[{p:[31,11,1553],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,1)"},p:[31,54,1596]}," units of ",{t:2,r:"name",p:[31,89,1631]}]},{p:[31,104,1646],t:7,e:"br"}],n:52,r:"adata.occupant.reagents",p:[30,9,1508]},{t:4,n:51,f:[{p:[33,11,1681],t:7,e:"span",a:{"class":"good"},f:["Pure"]}],r:"adata.occupant.reagents"}]}],n:50,r:"data.occupied",p:[10,3,283]}]}," ",{p:[38,1,1777],t:7,e:"ui-display",a:{title:"Operations"},f:[{p:[39,3,1812],t:7,e:"ui-section",a:{label:"Inject"},f:[{t:4,f:[{p:[41,7,1872],t:7,e:"ui-button",a:{icon:"flask",state:[{t:2,x:{r:["data.occupied"],s:'_0?null:"disabled"'},p:[41,38,1903]}],action:"inject",params:['{"chem": "',{t:2,r:"id",p:[41,111,1976]},'"}']},f:[{t:2,r:"name",p:[41,121,1986]}]},{p:[41,141,2006],t:7,e:"br"}],n:52,r:"data.chem",p:[40,5,1845]}]}," ",{p:[44,2,2046],t:7,e:"ui-section",a:{label:"Eject"},f:[{p:[45,6,2079],t:7,e:"ui-button",a:{icon:"sign-out",action:"eject"},f:["Eject Contents"]}]}," ",{p:[47,2,2166],t:7,e:"ui-section",a:{label:"Self Cleaning"},f:[{p:[48,3,2204],t:7,e:"ui-button",a:{icon:"recycle",action:"cleaning"},f:["Self-Clean Cycle"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],391:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,24],t:7,e:"ui-display",a:{title:[{t:2,r:"data.question",p:[2,21,42]}]},f:[{p:[3,5,66],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,9,118],t:7,e:"ui-button",a:{action:"vote",params:['{"answer": "',{t:2,r:"answer",p:[6,45,174]},'"}'],style:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[7,18,206]}]},f:[{t:2,r:"answer",p:[7,53,241]}," (",{t:2,r:"amount",p:[7,65,253]},")"]}],n:52,r:"data.answers",p:[4,7,86]}]}]}],n:50,r:"data.shaking",p:[1,1,0]},{t:4,n:51,f:[{p:[13,3,353],t:7,e:"ui-notice",f:["The eightball is not currently being shaken."]}],r:"data.shaking"}]},e.exports=a.extend(r.exports)},{341:341}],392:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,5,17],t:7,e:"span",f:["Time Until Launch: ",{t:2,r:"data.timer_str",p:[2,30,42]}]}]}," ",{p:[4,1,83],t:7,e:"ui-notice",f:[{p:[5,3,98],t:7,e:"span",f:["Engines: ",{t:2,x:{r:["data.engines_started"],s:'_0?"Online":"Idle"'},p:[5,18,113]}]}]}," ",{p:[7,1,180],t:7,e:"ui-display",a:{title:"Early Launch"},f:[{p:[8,2,216],t:7,e:"span",f:["Authorizations Remaining: ",{t:2,x:{r:["data.emagged","data.authorizations_remaining"],s:'_0?"ERROR":_1'},p:[9,2,250]}]}," ",{p:[10,2,318],t:7,e:"ui-button",a:{icon:"exclamation-triangle",action:"authorize",style:"danger",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[12,10,404]}]},f:["AUTHORIZE"]}," ",{p:[15,2,473],t:7,e:"ui-button",a:{icon:"minus",action:"repeal",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[16,10,523]}]},f:["Repeal"]}," ",{p:[19,2,589],t:7,e:"ui-button",a:{icon:"close",action:"abort",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[20,10,638]}]},f:["Repeal All"]}]}," ",{p:[24,1,722],t:7,e:"ui-display",a:{title:"Authorizations"},f:[{t:4,f:[{p:[26,3,793],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{t:2,r:"name",p:[26,34,824]}," (",{t:2,r:"job",p:[26,44,834]},")"]}],n:52,r:"data.authorizations",p:[25,2,760]},{t:4,n:51,f:[{p:[28,3,870],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:["No authorizations."]}],r:"data.authorizations"}]}]},e.exports=a.extend(r.exports)},{341:341}],393:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Message"},f:[{t:2,r:"data.hidden_message",p:[3,5,50]}]}," ",{p:[5,3,94],t:7,e:"ui-section",a:{label:"Created On"},f:[{t:2,r:"data.realdate",p:[6,5,131]}]}," ",{p:[8,3,169],t:7,e:"ui-section",a:{label:"Approval"},f:[{p:[9,5,204],t:7,e:"ui-button",a:{icon:"arrow-up",state:[{t:2,x:{r:["data.is_creator","data.has_liked"],s:'_0?"disabled":_1?"selected":null'},p:[11,14,252]}],action:"like"},f:[{t:2,r:"data.num_likes",p:[12,21,344]}]}," ",{p:[13,5,380],t:7,e:"ui-button",a:{icon:"circle",state:[{t:2,x:{r:["data.is_creator","data.has_liked","data.has_disliked"],s:'_0?"disabled":!_1&&!_2?"selected":null'},p:[15,14,426]}],action:"neutral"}}," ",{p:[17,5,562],t:7,e:"ui-button",a:{icon:"arrow-down",state:[{t:2,x:{r:["data.is_creator","data.has_disliked"],s:'_0?"disabled":_1?"selected":null'},p:[19,14,612]}],action:"dislike"},f:[{t:2,r:"data.num_dislikes",p:[20,24,710]}]}]}]}," ",{t:4,f:[{p:[24,3,805],t:7,e:"ui-display",a:{title:"Admin Panel"},f:[{p:[25,5,843],t:7,e:"ui-section",a:{label:"Creator Ckey"},f:[{t:2,r:"data.creator_key",p:[25,38,876]}]}," ",{p:[26,5,915],t:7,e:"ui-section",a:{label:"Creator Character Name"},f:[{t:2,r:"data.creator_name",p:[26,48,958]}]}," ",{p:[27,5,998],t:7,e:"ui-button",a:{icon:"remove",action:"delete",style:"danger"},f:["Delete"]}]}],n:50,r:"data.admin_mode",p:[23,1,778]}]},e.exports=a.extend(r.exports)},{341:341}],394:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The requested interface (",{t:2,r:"config.interface",p:[2,34,46]},") was not found. Does it exist?"]}]}]},e.exports=a.extend(r.exports)},{341:341}],395:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,20],t:7,e:"ui-notice",f:["Currently syncing with the database"]}],n:50,r:"data.sync",p:[1,1,0]},{t:4,n:51,f:[{p:{button:[{p:[8,4,163],t:7,e:"ui-button",a:{icon:"eject",action:"eject_all"},f:["Eject all"]}," ",{p:[9,4,232],t:7,e:"ui-button",a:{icon:["toggle-",{t:2,x:{r:["data.show_materials"],s:'_0?"off":"on"'},p:[9,28,256]}],action:"toggle_materials_visibility"},f:[{t:2,x:{r:["data.show_materials"],s:'_0?"Hide":"Show"'},p:[10,5,339]}]}]},t:7,e:"ui-display",a:{title:"Materials",button:0},f:[" ",{t:4,f:[{p:[14,4,449],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[15,5,484],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[16,6,520],t:7,e:"section",a:{"class":"cell"}}," ",{p:[17,6,559],t:7,e:"section",a:{"class":"cell"},f:["Mineral"]}," ",{p:[20,6,620],t:7,e:"section",a:{"class":"cell"},f:["Amount"]}," ",{p:[23,6,680],t:7,e:"section",a:{"class":"cell"}}," ",{p:[24,6,719],t:7,e:"section",a:{"class":"cell"}}]}," ",{t:4,f:[{p:[27,6,808],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[28,7,845],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[29,8,876]}]}," ",{p:[31,7,910],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"amount",p:[32,8,941]}]}," ",{p:[34,7,977],t:7,e:"section",a:{"class":"cell"},f:[{p:[35,8,1008],t:7,e:"ui-button",a:{icon:"eject"},f:["Release amount"]}]}," ",{p:[37,7,1084],t:7,e:"section",a:{"class":"cell",style:"width: 40px;"},f:[{p:[38,8,1136],t:7,e:"ui-button",a:{icon:"eject"},f:["Release all"]}]}]}],n:52,r:"data.all_materials",p:[26,5,773]}]}],n:50,r:"data.show_materials",p:[13,3,417]}]}," ",{p:[45,2,1274],t:7,e:"ui-display",a:{title:"Categories"},f:[{t:4,f:[{p:[47,4,1334],t:7,e:"ui-button",f:[{t:2,r:".",p:[47,15,1345]}]}],r:"data.categories",p:[46,3,1309]}]}],r:"data.sync"}]},e.exports=a.extend(r.exports)},{341:341}],396:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[3,5,49],t:7,e:"ui-button",a:{action:"toggle_power",style:[{t:2,x:{r:["data.toggle"],s:'_0?"selected":null'},p:[5,18,111]}]},f:["Turn ",{t:2,x:{r:["data.toggle"],s:'_0?"off":"on"'},p:[6,16,166]}]}]}," ",{p:[9,3,235],t:7,e:"ui-display",a:{title:"Logging"},f:[{t:4,f:[{p:[11,3,292],t:7,e:"ui-section",a:{label:">"},f:[{t:2,r:".",p:[11,25,314]},{p:[11,30,319],t:7,e:"ui-section",f:[]}]}],n:52,r:"data.logs",p:[10,5,269]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],397:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{seclevelState:function(){switch(this.get("data.seclevel")){case"blue":return"average";case"red":return"bad";case"delta":return"bad bold";default:return"good"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[16,1,323],t:7,e:"ui-display",f:[{p:[17,5,341],t:7,e:"ui-section",a:{label:"Alert Level"},f:[{p:[18,9,383],t:7,e:"span",a:{"class":[{t:2,r:"seclevelState",p:[18,22,396]}]},f:[{t:2,x:{r:["text","data.seclevel"],s:"_0.titleCase(_1)"},p:[18,41,415]}]}]}," ",{p:[20,5,480],t:7,e:"ui-section",a:{label:"Controls"},f:[{p:[21,9,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.alarm"],s:'_0?"close":"bell-o"'},p:[21,26,536]}],action:[{t:2,x:{r:["data.alarm"],s:'_0?"reset":"alarm"'},p:[21,71,581]}]},f:[{t:2,x:{r:["data.alarm"],s:'_0?"Reset":"Activate"'},p:[22,13,631]}]}]}," ",{t:4,f:[{p:[25,7,733],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[26,9,771],t:7,e:"span",a:{"class":"bad bold"},f:["Safety measures offline. Device may exhibit abnormal behavior."]}]}],n:50,r:"data.emagged",p:[24,5,705]}]}]},e.exports=a.extend(r.exports)},{341:341}],398:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[2,1,31],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,2,60],t:7,e:"ui-button",a:{icon:"power-off",style:[{t:2,x:{r:["data.power"],s:'_0?"selected":"danger"'},p:[3,37,95]}],action:"power"},f:[{t:2,x:{r:["data.power"],s:'_0?"Enabled":"Disabled"'},p:[3,92,150]}]}]}," ",{p:[5,1,218],t:7,e:"ui-section",a:{label:"Tag"},f:[{p:[6,2,245],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:[{t:2,r:"data.tag",p:[6,43,286]}]}]}," ",{p:[8,1,327],t:7,e:"ui-section",a:{label:"Scanning mode"},f:[{p:[9,2,364],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.updating"],s:'_0?"unlock":"lock"'},p:[9,18,380]}],style:[{t:2,x:{r:["data.updating"],s:'_0?null:"danger"'},p:[9,63,425]}],action:"updating",tooltip:"Toggle between automatic scanning or scan only when a button is pressed.","tooltip-side":"right"},f:[{t:2,x:{r:["data.updating"],s:'_0?"AUTO":"MANUAL"'},p:[9,221,583]}]}]}," ",{p:[11,1,649],t:7,e:"ui-section",a:{label:"Detection range"},f:[{p:[12,2,688],t:7,e:"ui-button",a:{icon:"refresh",style:[{t:2,x:{r:["data.globalmode"],s:'_0?null:"selected"'},p:[12,35,721]}],action:"globalmode",tooltip:"Local sector or whole region scanning.","tooltip-side":"right"},f:[{t:2,x:{r:["data.globalmode"],s:'_0?"MAXIMUM":"LOCAL"'},p:[12,165,851]}]}]}]}," ",{t:4,f:[{p:[16,2,957],t:7,e:"ui-display",a:{title:"Current Location"},f:[{p:[17,3,998],t:7,e:"span",f:[{t:2,r:"data.current",p:[17,9,1004]}]}]}," ",{p:[20,2,1048],t:7,e:"ui-display",a:{title:"Detected Signals"},f:[{t:4,f:[{p:[22,3,1114],t:7,e:"ui-section",a:{label:[{t:2,r:"entrytag",p:[22,21,1132]}]},f:[{p:[23,3,1149],t:7,e:"span",f:[{t:2,r:"area",p:[23,9,1155]}," (",{t:2,r:"coord",p:[23,19,1165]},")"]}," ",{t:4,f:[{p:[25,4,1209],t:7,e:"span",f:["Dist: ",{t:2,r:"dist",p:[25,16,1221]},"m Dir: ",{t:2,r:"degrees",p:[25,31,1236]},"° (",{t:2,r:"direction",p:[25,45,1250]},")"]}],n:50,r:"direction",p:[24,3,1187]}]}],n:52,r:"data.signals",p:[21,2,1088]}]}],n:50,r:"data.power",p:[15,1,936]}]},e.exports=a.extend(r.exports)},{341:341}],399:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Labor Camp Teleporter"},f:[{p:[2,2,45],t:7,e:"ui-section",a:{label:"Teleporter Status"},f:[{p:[3,3,87],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.teleporter"],s:'_0?"good":"bad"'},p:[3,16,100]}]},f:[{t:2,x:{r:["data.teleporter"],s:'_0?"Connected":"Not connected"'},p:[3,54,138]}]}]}," ",{t:4,f:[{p:[6,4,244],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[7,5,279],t:7,e:"span",f:[{t:2,r:"data.teleporter_location",p:[7,11,285]}]}]}," ",{p:[9,4,343],t:7,e:"ui-section",a:{label:"Locked status"},f:[{p:[10,5,383],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"lock":"unlock"'},p:[10,22,400]}],action:"teleporter_lock"},f:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"Locked":"Unlocked"'},p:[10,93,471]}]}," ",{p:[11,5,537],t:7,e:"ui-button",a:{action:"toggle_open"},f:[{t:2,x:{r:["data.teleporter_state_open"],s:'_0?"Open":"Closed"'},p:[11,37,569]}]}]}],n:50,r:"data.teleporter",p:[5,3,216]},{t:4,n:51,f:[{p:[14,4,666],t:7,e:"span",f:[{p:[14,10,672],t:7,e:"ui-button",a:{action:"scan_teleporter"},f:["Scan Teleporter"]}]}],r:"data.teleporter"}]}," ",{p:[17,1,770],t:7,e:"ui-display",a:{title:"Labor Camp Beacon"},f:[{p:[18,2,811],t:7,e:"ui-section",a:{label:"Beacon Status"},f:[{p:[19,3,849],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.beacon"],s:'_0?"good":"bad"'},p:[19,16,862]}]},f:[{t:2,x:{r:["data.beacon"],s:'_0?"Connected":"Not connected"'},p:[19,50,896]}]}]}," ",{t:4,f:[{p:[22,3,992],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[23,4,1026],t:7,e:"span",f:[{t:2,r:"data.beacon_location",p:[23,10,1032]}]}]}],n:50,r:"data.beacon",p:[21,2,969]},{t:4,n:51,f:[{p:[26,4,1097],t:7,e:"span",f:[{p:[26,10,1103],t:7,e:"ui-button",a:{action:"scan_beacon"},f:["Scan Beacon"]}]}],r:"data.beacon"}]}," ",{p:[29,1,1193],t:7,e:"ui-display",a:{title:"Prisoner details"},f:[{p:[30,2,1233],t:7,e:"ui-section",a:{label:"Prisoner ID"},f:[{p:[31,3,1269],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[31,33,1299]}]}]}," ",{t:4,f:[{p:[34,2,1392],t:7,e:"ui-section",a:{label:"Set ID goal"},f:[{p:[35,4,1429],t:7,e:"ui-button",a:{action:"set_goal"},f:[{t:2,r:"data.goal",p:[35,33,1458]}]}]}],n:50,r:"data.id",p:[33,2,1374]}," ",{p:[38,2,1512],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[39,3,1545],t:7,e:"span",f:[{t:2,x:{r:["data.prisoner.name"],s:'_0?_0:"No Occupant"'},p:[39,9,1551]}]}]}," ",{t:4,f:[{p:[42,3,1661],t:7,e:"ui-section",a:{label:"Criminal Status"},f:[{p:[43,4,1702],t:7,e:"span",f:[{t:2,r:"data.prisoner.crimstat",p:[43,10,1708]}]}]}],n:50,r:"data.prisoner",p:[41,2,1636]}]}," ",{p:[47,1,1785],t:7,e:"ui-display",f:[{p:[48,2,1800],t:7,e:"center",f:[{p:[48,10,1808],t:7,e:"ui-button",a:{action:"teleport",state:[{t:2,x:{r:["data.can_teleport"],s:'_0?null:"disabled"'},p:[48,45,1843]}]},f:["Process Prisoner"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],400:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"center",f:[{p:[2,10,23],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[2,40,53]}]}]}]}," ",{p:[4,1,135],t:7,e:"ui-display",a:{title:"Stored Items"},f:[{t:4,f:[{p:[6,3,194],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[6,22,213]}]},f:[{p:[7,4,228],t:7,e:"ui-button",a:{action:"release_items",params:['{"mobref":',{t:2,r:"mob",p:[7,56,280]},"}"],state:[{t:2,x:{r:["data.can_reclaim"],s:'_0?null:"disabled"'},p:[7,72,296]}]},f:["Drop Items"]}]}],n:52,r:"data.mobs",p:[5,2,171]}]}]},e.exports=a.extend(r.exports)},{341:341}],401:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{p:[3,3,70],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.emagged"],s:'_0?"un":null'},p:[3,20,87]},"lock"],state:[{t:2,x:{r:["data.can_toggle_safety"],s:'_0?null:"disabled"'},p:[3,63,130]}],action:"safety"},f:["Safeties: ",{p:[4,14,209],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.emagged"],s:'_0?"bad":"good"'},p:[4,27,222]}]},f:[{t:2,x:{r:["data.emagged"],s:'_0?"OFF":"ON"'},p:[4,62,257]}]}]}]},t:7,e:"ui-display",a:{title:"Default Programs",button:0},f:[" ",{t:4,f:[{p:[8,2,363],t:7,e:"ui-button",a:{action:"load_program",params:['{"type": ',{t:2,r:"type",p:[8,52,413]},"}"],style:[{t:2,x:{r:["data.program","type"],s:'_0==_1?"selected":null'},p:[8,70,431]}]},f:[{t:2,r:"name",p:[9,5,483]}," "]},{p:[10,14,506],t:7,e:"br"}],n:52,r:"data.default_programs",p:[7,2,329]}]}," ",{t:4,f:[{p:[14,2,562],t:7,e:"ui-display",a:{title:"Dangerous Programs"},f:[{t:4,f:[{p:[16,4,638],t:7,e:"ui-button",a:{icon:"warning",action:"load_program",params:['{"type": ',{t:2,r:"type",p:[16,69,703]},"}"],style:[{t:2,x:{r:["data.program","type"],s:'_0==_1?"selected":null'},p:[16,87,721]}]},f:[{t:2,r:"name",p:[17,5,773]}," "]},{p:[18,16,798],t:7,e:"br"}],n:52,r:"data.emag_programs",p:[15,3,605]}]}],n:50,r:"data.emagged",p:[13,1,539]}]},e.exports=a.extend(r.exports)},{341:341}],402:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{occupantStatState:function(){switch(this.get("data.occupant.stat")){case 0:return"good";case 1:return"average";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[15,1,280],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[16,3,313],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[17,3,346],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[17,9,352]}]}]}," ",{t:4,f:[{p:[20,5,466],t:7,e:"ui-section",a:{label:"State"},f:[{p:[21,7,500],t:7,e:"span",a:{"class":[{t:2,r:"occupantStatState",p:[21,20,513]}]},f:[{t:2,x:{r:["data.occupant.stat"],s:'_0==0?"Conscious":_0==1?"Unconcious":"Dead"'},p:[21,43,536]}]}]}],n:50,r:"data.occupied",p:[19,3,439]}]}," ",{p:[25,1,680],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[26,2,712],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[27,5,743],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[27,22,760]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[27,71,809]}]}]}," ",{p:[29,3,874],t:7,e:"ui-section",a:{label:"Uses"},f:[{t:2,r:"data.ready_implants",p:[30,5,905]}," ",{t:4,f:[{p:[32,7,969],t:7,e:"span",a:{"class":"fa fa-cog fa-spin"}}],n:50,r:"data.replenishing",p:[31,5,936]}]}," ",{p:[35,3,1036],t:7,e:"ui-section",a:{label:"Activate"},f:[{p:[36,7,1073],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.occupied","data.ready_implants","data.ready"],s:'_0&&_1>0&&_2?null:"disabled"'},p:[36,25,1091]}],action:"implant"},f:[{t:2,x:{r:["data.ready","data.special_name"],s:'_0?(_1?_1:"Implant"):"Recharging"'},p:[37,9,1198]}," "]},{p:[38,19,1302],t:7,e:"br"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],403:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[15,3,296],t:7,e:"ui-notice",f:[{p:[16,5,313],t:7,e:"span",f:["Wipe in progress!"]}]}],n:50,r:"data.wiping",p:[14,1,273]},{p:{button:[{t:4,f:[{p:[22,7,479],t:7,e:"ui-button",a:{icon:"trash",state:[{t:2,x:{r:["data.isDead"],s:'_0?"disabled":null'},p:[22,38,510]}],action:"wipe"},f:[{t:2,x:{r:["data.wiping"],s:'_0?"Stop Wiping":"Wipe"'},p:[22,89,561]}," AI"]}],n:50,r:"data.name",p:[21,5,454]}]},t:7,e:"ui-display",a:{title:[{t:2,x:{r:["data.name"],s:'_0||"Empty Card"'},p:[19,19,388]}],button:0},f:[" ",{t:4,f:[{p:[26,5,672],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[27,9,709],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"bad":"good"'},p:[27,22,722]}]},f:[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"Offline":"Operational"'},p:[27,76,776]}]}]}," ",{p:[29,5,871],t:7,e:"ui-section",a:{label:"Software Integrity"},f:[{p:[30,7,918],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[30,40,951]}],state:[{t:2,r:"healthState",p:[30,64,975]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[30,81,992]},"%"]}]}," ",{p:[32,5,1055],t:7,e:"ui-section",a:{label:"Laws"},f:[{t:4,f:[{p:[34,9,1117],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[34,33,1141]}]},{p:[34,45,1153],t:7,e:"br"}],n:52,r:"data.laws",p:[33,7,1088]}]}," ",{p:[37,5,1200],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[38,7,1237],t:7,e:"ui-button",a:{icon:"signal",style:[{t:2,x:{r:["data.wireless"],s:'_0?"selected":null'},p:[38,39,1269]}],action:"wireless"},f:["Wireless Activity"]}," ",{p:[39,7,1363],t:7,e:"ui-button",a:{icon:"microphone",style:[{t:2,x:{r:["data.radio"],s:'_0?"selected":null'},p:[39,43,1399]}],action:"radio"},f:["Subspace Radio"]}]}],n:50,r:"data.name",p:[25,3,649]}]}]},e.exports=a.extend(r.exports)},{341:341}],404:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,23],t:7,e:"ui-notice",f:[{p:[3,3,38],t:7,e:"span",f:["Waiting for another device to confirm your request..."]}]}],n:50,r:"data.waiting",p:[1,1,0]},{t:4,n:51,f:[{p:[6,2,132],t:7,e:"ui-display",f:[{p:[7,3,148],t:7,e:"ui-section",f:[{t:4,f:[{p:[9,5,197],t:7,e:"ui-button",a:{icon:"check",action:"auth_swipe"},f:["Authorize ",{t:2,r:"data.auth_required",p:[9,59,251]}]}],n:50,r:"data.auth_required",p:[8,4,165]},{t:4,n:51,f:[{p:[11,5,304],t:7,e:"ui-button",a:{icon:"warning",state:[{t:2,x:{r:["data.red_alert"],s:'_0?"disabled":null'},p:[11,38,337]}],action:"red_alert"},f:["Red Alert"]}," ",{p:[12,5,423],t:7,e:"ui-button",a:{icon:"wrench",state:[{t:2,x:{r:["data.emergency_maint"],s:'_0?"disabled":null'},p:[12,37,455]}],action:"emergency_maint"},f:["Emergency Maintenance Access"]}," ",{p:[13,5,572],t:7,e:"ui-button",a:{icon:"warning",state:"null",action:"bsa_unlock"},f:["Bluespace Artillery Unlock"]}],r:"data.auth_required"}]}]}],r:"data.waiting"}]},e.exports=a.extend(r.exports)},{341:341}],405:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Ore values"},f:[{t:4,f:[{p:[3,3,57],t:7,e:"ui-section",a:{label:[{t:2,r:"ore",p:[3,22,76]}]},f:[{p:[4,4,90],t:7,e:"span",f:[{t:2,r:"value",p:[4,10,96]}]}]}],n:52,r:"data.ores",p:[2,2,34]}]}," ",{p:[8,1,158],t:7,e:"ui-display",a:{title:"Points"},f:[{p:[9,2,188],t:7,e:"ui-section",a:{label:"ID"},f:[{p:[10,3,215],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[10,33,245]}]}]}," ",{t:4,f:[{p:[13,3,339],t:7,e:"ui-section",a:{label:"Points collected"},f:[{p:[14,4,381],t:7,e:"span",f:[{t:2,r:"data.points",p:[14,10,387]}]}]}," ",{p:[16,3,430],t:7,e:"ui-section",a:{label:"Goal"},f:[{p:[17,4,460],t:7,e:"span",f:[{t:2,r:"data.goal",p:[17,10,466]}]}]}," ",{p:[19,3,507],t:7,e:"ui-section",a:{label:"Unclaimed points"},f:[{p:[20,4,549],t:7,e:"span",f:[{t:2,r:"data.unclaimed_points",p:[20,10,555]}]}," ",{p:[21,4,592],t:7,e:"ui-button",a:{action:"claim_points",state:[{t:2,x:{r:["data.unclaimed_points"],s:'_0?null:"disabled"'},p:[21,43,631]}]},f:["Claim points"]}]}],n:50,r:"data.id",p:[12,2,320]}]}," ",{p:[25,1,745],t:7,e:"ui-display",f:[{p:[26,2,760],t:7,e:"center",f:[{p:[27,3,772],t:7,e:"ui-button",a:{action:"move_shuttle",state:[{t:2,x:{r:["data.can_go_home"],s:'_0?null:"disabled"'},p:[27,42,811]}]},f:["Move shuttle"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],406:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Known Languages"},f:[{t:4,f:[{p:[3,5,70],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[3,23,88]}]},f:[{p:[4,7,105],t:7,e:"span",f:[{t:2,r:"desc",p:[4,13,111]}]}," ",{p:[5,7,134],t:7,e:"span",f:["Key: ,",{t:2,r:"key",p:[5,19,146]}]}," ",{t:4,f:[{p:[7,9,192],t:7,e:"span",f:["(gained from mob)"]}],n:50,r:"shadow",p:[6,7,168]}," ",{p:[9,7,245],t:7,e:"span",f:[{t:2,x:{r:["can_speak"],s:'_0?"Can Speak":"Cannot Speak"'},p:[9,13,251]}]}," ",{t:4,f:[{p:[11,9,342],t:7,e:"ui-button",a:{action:"select_default",params:['{"language_name":"',{t:2,r:"name",p:[13,37,425]},'"}'],style:[{t:2,x:{r:["is_default","can_speak"],s:'_0?"selected":_1?null:"disabled"'},p:[14,18,455]}]},f:[{t:2,x:{r:["is_default"],s:'_0?"Default Language":"Select as Default"'},p:[15,10,526]}]}],n:50,r:"data.is_living",p:[10,7,310]}," ",{t:4,f:[{t:4,f:[{p:[20,11,685],t:7,e:"ui-button",a:{action:"grant_language",params:['{"language_name":"',{t:2,r:"name",p:[20,72,746]},'"}']},f:["Grant"]}],n:50,r:"shadow",p:[19,9,659]},{t:4,n:51,f:[{p:[22,11,805],t:7,e:"ui-button",a:{action:"remove_language",params:['{"language_name":"',{t:2,r:"name",p:[22,73,867]},'"}']},f:["Remove"]}],r:"shadow"}],n:50,r:"data.admin_mode",p:[18,7,626]}]}],n:52,r:"data.languages",p:[2,3,40]}]}," ",{t:4,f:[{t:4,f:[{p:[30,5,1033],t:7,e:"ui-button",a:{action:"toggle_omnitongue",style:[{t:2,x:{r:["data.omnitongue"],s:'_0?"selected":null'},p:[32,14,1092]}]},f:["Omnitongue ",{t:2,x:{r:["data.omnitongue"],s:'_0?"Enabled":"Disabled"'},p:[33,19,1152]}]}],n:50,r:"data.is_living",p:[29,3,1005]}," ",{p:[36,3,1231],t:7,e:"ui-display",a:{title:"Unknown Languages"},f:[{t:4,f:[{p:[38,7,1315],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[38,25,1333]}]},f:[{p:[39,9,1352],t:7,e:"span",f:[{t:2,r:"desc",p:[39,15,1358]}]}," ",{p:[40,9,1383],t:7,e:"span",f:["Key: ,",{t:2,r:"key",p:[40,21,1395]}]}," ",{p:[41,9,1419],t:7,e:"ui-button",a:{action:"grant_language",params:['{"language_name":"',{t:2,r:"name",p:[43,37,1502]},'"}']},f:["Grant"]}]}],n:52,r:"data.unknown_languages",p:[37,5,1275]}]}],n:50,r:"data.admin_mode",p:[28,1,978]}]},e.exports=a.extend(r.exports)},{341:341}],407:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Controls"},f:[{t:4,f:[{t:4,f:[{p:[4,4,84],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[5,5,118],t:7,e:"span",f:["Launchpad closed."]}]}],n:50,r:"data.pad_closed",p:[3,3,56]},{t:4,n:51,f:[{p:[8,4,183],t:7,e:"ui-section",a:{label:"Launchpad"},f:[{p:[9,4,218],t:7,e:"span",f:[{p:[9,10,224], -t:7,e:"b",f:[{t:2,r:"data.pad_name",p:[9,13,227]}]}]},{p:[9,41,255],t:7,e:"br"}," ",{p:[10,4,264],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:["Rename"]}," ",{p:[11,4,328],t:7,e:"ui-button",a:{icon:"remove",style:"danger",action:"remove"},f:["Remove"]}]}," ",{p:[14,4,427],t:7,e:"ui-section",a:{label:"Set Target"},f:[{p:[15,4,463],t:7,e:"table",f:[{p:[16,4,475],t:7,e:"tr",f:[{p:[17,5,485],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[17,38,518],t:7,e:"ui-button",a:{action:"up-left"},f:["↖"]}]}," ",{p:[18,5,570],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[18,57,622],t:7,e:"ui-button",a:{action:"up"},f:["↑"]}]}," ",{p:[19,5,669],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[19,56,720],t:7,e:"ui-button",a:{action:"up-right"},f:["↗"]}]}]}," ",{p:[21,4,782],t:7,e:"tr",f:[{p:[22,5,792],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[22,38,825],t:7,e:"ui-button",a:{action:"left",style:"width:35px!important"},f:["←"]}]}," ",{p:[23,5,903],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[23,57,955],t:7,e:"ui-button",a:{action:"reset"},f:["R"]}]}," ",{p:[24,5,1005],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[24,56,1056],t:7,e:"ui-button",a:{action:"right"},f:["→"]}]}]}," ",{p:[26,4,1115],t:7,e:"tr",f:[{p:[27,5,1125],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[27,38,1158],t:7,e:"ui-button",a:{action:"down-left"},f:["↙"]}]}," ",{p:[28,5,1212],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[28,57,1264],t:7,e:"ui-button",a:{action:"down"},f:["↓"]}]}," ",{p:[29,5,1313],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[29,56,1364],t:7,e:"ui-button",a:{action:"down-right"},f:["↘"]}]}]}]}]}," ",{p:[33,4,1459],t:7,e:"ui-section",a:{label:"Current Target"},f:[{p:[34,5,1500],t:7,e:"span",f:[{t:2,r:"data.abs_y",p:[34,11,1506]}," ",{t:2,r:"data.north_south",p:[34,26,1521]}]},{p:[34,53,1548],t:7,e:"br"}," ",{p:[35,5,1558],t:7,e:"span",f:[{t:2,r:"data.abs_x",p:[35,11,1564]}," ",{t:2,r:"data.east_west",p:[35,26,1579]}]}]}," ",{p:[37,4,1627],t:7,e:"ui-section",a:{label:"Activate"},f:[{p:[38,5,1662],t:7,e:"ui-button",a:{action:"launch",tooltip:"Teleport everything on the pad to the target.","tooltip-side":"down"},f:["Launch"]}," ",{p:[39,5,1789],t:7,e:"ui-button",a:{action:"pull",tooltip:"Teleport everything from the target to the pad.","tooltip-side":"down"},f:["Pull"]}]}],r:"data.pad_closed"}],n:50,r:"data.has_pad",p:[2,2,32]},{t:4,n:51,f:[{p:[45,3,1956],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[46,4,1989],t:7,e:"span",f:["No launchpad found. Link the remote to a launchpad."]}]}],r:"data.has_pad"}]}]},e.exports=a.extend(r.exports)},{341:341}],408:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{mechChargeState:function(t){var e=this.get("data.recharge_port.mech.cell.maxcharge");return t>=e/1.5?"good":t>=e/3?"average":"bad"},mechHealthState:function(t){var e=this.get("data.recharge_port.mech.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[20,1,545],t:7,e:"ui-display",a:{title:"Mech Status"},f:[{t:4,f:[{t:4,f:[{p:[23,4,646],t:7,e:"ui-section",a:{label:"Integrity"},f:[{p:[24,6,683],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,27,704]}],value:[{t:2,r:"adata.recharge_port.mech.health",p:[24,74,751]}],state:[{t:2,x:{r:["mechHealthState","adata.recharge_port.mech.health"],s:"_0(_1)"},p:[24,117,794]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.health"],s:"Math.round(_0)"},p:[24,171,848]},"/",{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,219,896]}]}]}," ",{t:4,f:[{t:4,f:[{p:[28,5,1061],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[28,31,1087],t:7,e:"span",a:{"class":"bad"},f:["Cell Critical Failure"]}]}],n:50,r:"data.recharge_port.mech.cell.critfail",p:[27,3,1010]},{t:4,n:51,f:[{p:[30,11,1170],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,13,1210],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.cell.maxcharge",p:[31,34,1231]}],value:[{t:2,r:"adata.recharge_port.mech.cell.charge",p:[31,86,1283]}],state:[{t:2,x:{r:["mechChargeState","adata.recharge_port.mech.cell.charge"],s:"_0(_1)"},p:[31,134,1331]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.cell.charge"],s:"Math.round(_0)"},p:[31,193,1390]},"/",{t:2,x:{r:["adata.recharge_port.mech.cell.maxcharge"],s:"Math.round(_0)"},p:[31,246,1443]}]}]}],r:"data.recharge_port.mech.cell.critfail"}],n:50,r:"data.recharge_port.mech.cell",p:[26,4,970]},{t:4,n:51,f:[{p:[35,3,1558],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[35,29,1584],t:7,e:"span",a:{"class":"bad"},f:["Cell Missing"]}]}],r:"data.recharge_port.mech.cell"}],n:50,r:"data.recharge_port.mech",p:[22,2,610]},{t:4,n:51,f:[{p:[38,4,1662],t:7,e:"ui-section",f:["Mech Not Found"]}],r:"data.recharge_port.mech"}],n:50,r:"data.recharge_port",p:[21,3,581]},{t:4,n:51,f:[{p:[41,5,1729],t:7,e:"ui-section",f:["Recharging Port Not Found"]}," ",{p:[42,2,1782],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}],r:"data.recharge_port"}]}]},e.exports=a.extend(r.exports)},{341:341}],409:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{t:4,f:[{p:[3,5,45],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[4,7,88],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[4,24,105]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[4,75,156]}]}]}],n:50,r:"data.siliconUser",p:[2,3,15]},{t:4,n:51,f:[{p:[7,5,247],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[7,31,273]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[10,1,358],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[11,3,389],t:7,e:"ui-section",a:{label:"Power"},f:[{t:4,f:[{p:[13,7,470],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[13,24,487]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[13,68,531]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[13,116,579]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[12,5,421]},{t:4,n:51,f:[{p:[15,7,639],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.on"],s:'_0?"good":"bad"'},p:[15,20,652]}],state:[{t:2,x:{r:["data.cell"],s:'_0?null:"disabled"'},p:[15,57,689]}]},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[15,92,724]}]}],x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"}}]}," ",{p:[18,3,791],t:7,e:"ui-section",a:{label:"Cell"},f:[{p:[19,5,822],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.cell"],s:'_0?null:"bad"'},p:[19,18,835]}]},f:[{t:2,x:{r:["data.cell","data.cellPercent"],s:'_0?_1+"%":"No Cell"'},p:[19,48,865]}]}]}," ",{p:[21,3,943],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[22,5,974],t:7,e:"span",a:{"class":[{t:2,r:"data.modeStatus",p:[22,18,987]}]},f:[{t:2,r:"data.mode",p:[22,39,1008]}]}]}," ",{p:[24,3,1049],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[25,5,1080],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.load"],s:'_0?"good":"average"'},p:[25,18,1093]}]},f:[{t:2,x:{r:["data.load"],s:'_0?_0:"None"'},p:[25,54,1129]}]}]}," ",{p:[27,3,1191],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[28,5,1229],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.destination"],s:'_0?"good":"average"'},p:[28,18,1242]}]},f:[{t:2,x:{r:["data.destination"],s:'_0?_0:"None"'},p:[28,60,1284]}]}]}]}," ",{t:4,f:[{p:{button:[{t:4,f:[{p:[35,9,1513],t:7,e:"ui-button",a:{icon:"eject",action:"unload"},f:["Unload"]}],n:50,r:"data.load",p:[34,7,1486]}," ",{t:4,f:[{p:[38,9,1623],t:7,e:"ui-button",a:{icon:"eject",action:"ejectpai"},f:["Eject PAI"]}],n:50,r:"data.haspai",p:[37,7,1594]}," ",{p:[40,7,1709],t:7,e:"ui-button",a:{icon:"pencil",action:"setid"},f:["Set ID"]}]},t:7,e:"ui-display",a:{title:"Controls",button:0},f:[" ",{p:[42,5,1791],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[43,7,1831],t:7,e:"ui-button",a:{icon:"pencil",action:"destination"},f:["Set Destination"]}," ",{p:[44,7,1912],t:7,e:"ui-button",a:{icon:"stop",action:"stop"},f:["Stop"]}," ",{p:[45,7,1973],t:7,e:"ui-button",a:{icon:"play",action:"go"},f:["Go"]}]}," ",{p:[47,5,2047],t:7,e:"ui-section",a:{label:"Home"},f:[{p:[48,7,2080],t:7,e:"ui-button",a:{icon:"home",action:"home"},f:["Go Home"]}," ",{p:[49,7,2144],t:7,e:"ui-button",a:{icon:"pencil",action:"sethome"},f:["Set Home"]}]}," ",{p:[51,5,2231],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[52,7,2268],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoReturn"],s:'_0?"check-square-o":"square-o"'},p:[52,24,2285]}],style:[{t:2,x:{r:["data.autoReturn"],s:'_0?"selected":null'},p:[52,84,2345]}],action:"autoret"},f:["Auto-Return Home"]}," ",{p:[54,7,2449],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoPickup"],s:'_0?"check-square-o":"square-o"'},p:[54,24,2466]}],style:[{t:2,x:{r:["data.autoPickup"],s:'_0?"selected":null'},p:[54,84,2526]}],action:"autopick"},f:["Auto-Pickup Crate"]}," ",{p:[56,7,2632],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"check-square-o":"square-o"'},p:[56,24,2649]}],style:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"selected":null'},p:[56,88,2713]}],action:"report"},f:["Report Deliveries"]}]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[31,1,1373]}]},e.exports=a.extend(r.exports)},{341:341}],410:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Chamber Console"},f:[{p:[2,1,45],t:7,e:"ui-display",a:{title:"Program Disk"},f:[{t:4,f:[{p:[4,2,104],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]},{p:[4,63,165],t:7,e:"br"}," ",{t:4,f:[{p:[6,3,200],t:7,e:"ui-section",a:{label:"Program Name"},f:[{t:2,r:"data.disk.name",p:[6,36,233]}]}," ",{p:[7,3,268],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.disk.desc",p:[7,35,300]}]}," ",{p:[8,3,335],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["data.disk.activated"],s:'_0?"Active":"Inactive"'},p:[8,41,373]}]}," ",{t:4,f:[{p:[10,4,477],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"data.disk.activation_delay",p:[10,41,514]}]}],n:50,r:"data.disk.activation_delay",p:[9,3,438]}," ",{t:4,f:[{p:[13,4,600],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"data.disk.timer",p:[13,30,626]}]}," ",{p:[14,4,663],t:7,e:"ui-section",a:{label:"Timer Type "},f:[{t:2,r:"data.disk.timer_type",p:[14,36,695]}]}],n:50,r:"data.disk.timer",p:[12,3,572]}," ",{t:4,f:[{p:[17,4,785],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"data.disk.activation_code",p:[17,40,821]}]}],n:50,r:"data.disk.activation_code",p:[16,3,747]}," ",{t:4,f:[{p:[20,4,918],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"data.disk.deactivation_code",p:[20,42,956]}]}],n:50,r:"data.disk.deactivation_code",p:[19,3,878]}," ",{t:4,f:[{p:[23,4,1047],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"data.disk.kill_code",p:[23,34,1077]}]}],n:50,r:"data.disk.kill_code",p:[22,3,1015]}," ",{t:4,f:[{p:[26,4,1163],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"data.disk.trigger_code",p:[26,37,1196]}]}],n:50,r:"data.disk.trigger_code",p:[25,3,1128]}," ",{t:4,f:[{t:4,f:[{p:[30,6,1332],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[30,25,1351]}]},f:[{t:2,r:"value",p:[30,35,1361]}]}],n:52,r:"data.disk.extra_settings",p:[29,4,1291]}],n:50,r:"data.disk.has_extra_settings",p:[28,3,1250]}],n:50,r:"data.has_program",p:[5,2,172]},{t:4,n:51,f:[{p:[34,3,1423],t:7,e:"ui-notice",f:["No program detected."]}],r:"data.has_program"}],n:50,r:"data.has_disk",p:[3,1,80]},{t:4,n:51,f:[{p:[37,2,1489],t:7,e:"ui-notice",f:["Insert disk."]}],r:"data.has_disk"}]}," ",{p:[40,1,1550],t:7,e:"br"}," ",{t:4,f:[{p:[42,2,1582],t:7,e:"ui-notice",f:[{t:2,r:"data.status_msg",p:[42,13,1593]}]}],n:50,r:"data.status_msg",p:[41,1,1556]},{t:4,n:51,f:[{p:[44,2,1637],t:7,e:"ui-display",a:{title:"Chamber"},f:[{p:[45,2,1668],t:7,e:"ui-section",f:[{p:[45,14,1680],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock-open":"lock"'},p:[45,30,1696]}],action:"toggle_lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Unlock":"Lock"'},p:[45,90,1756]}," Chamber"]},{p:[45,146,1812],t:7,e:"br"}]}," ",{p:[46,2,1832],t:7,e:"ui-section",f:[{p:[46,14,1844],t:7,e:"b",f:["Occupant:"]}," ",{t:2,r:"data.occupant_name",p:[46,31,1861]}]}," ",{t:4,f:[{p:[48,4,1929],t:7,e:"ui-section",f:[{p:[48,16,1941],t:7,e:"ui-notice",f:["No nanites detected."]}]}," ",{p:[49,4,2002],t:7,e:"ui-section",f:[{p:[49,16,2014],t:7,e:"ui-button",a:{icon:"syringe",action:"nanite_injection"},f:["Implant Nanites"]}]}],n:50,x:{r:["data.has_nanites"],s:"!_0"},p:[47,2,1899]},{t:4,n:51,f:[{p:[51,3,2121],t:7,e:"ui-display",a:{title:"Nanites"},f:[{t:4,f:[{p:[53,5,2181],t:7,e:"ui-button",a:{icon:"download",action:"add_program"},f:["Install Program From Disk"]},{p:[53,90,2266],t:7,e:"br"}," ",{p:[54,5,2276],t:7,e:"br"}],n:50,r:"data.has_disk",p:[52,4,2154]}," ",{p:[56,4,2297],t:7,e:"ui-section",f:[{p:[57,5,2315],t:7,e:"ui-section",a:{label:"Nanite Volume"},f:[{t:2,r:"data.nanite_volume",p:[57,39,2349]}]}," ",{p:[58,5,2390],t:7,e:"ui-section",a:{label:"Growth Rate"},f:[{t:2,r:"data.regen_rate",p:[58,37,2422]}]}," ",{p:[59,5,2460],t:7,e:"ui-section",a:{label:"Safety Threshold"},f:[{t:2,r:"data.safety_threshold",p:[59,42,2497]}," ",{p:[59,68,2523],t:7,e:"ui-button",a:{icon:"pencil",action:"set_safety"},f:["Set"]}]}," ",{p:[60,5,2603],t:7,e:"ui-section",a:{label:"Cloud ID"},f:[{t:2,x:{r:["data.cloud_id"],s:'_0?_0:"No Cloud"'},p:[60,34,2632]}," ",{p:[60,82,2680],t:7,e:"ui-button",a:{icon:"pencil",action:"set_cloud"},f:["Set"]}]}]}," ",{p:[62,4,2776],t:7,e:"ui-display",a:{title:"Programs"},f:[{t:4,f:[{p:[64,6,2845],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[64,25,2864]}],button:0},f:[{p:[65,6,2888],t:7,e:"ui-button",a:{icon:"minus",action:"remove_program",params:['{"program_id": "',{t:2,r:"id",p:[65,78,2960]},'"}']},f:["Uninstall"]}," ",{p:[66,6,2998],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"desc",p:[66,38,3030]}]}," ",{t:4,f:[{p:[68,7,3094],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["activated"],s:'_0?"Active":"Inactive"'},p:[68,45,3132]}]}," ",{p:[69,7,3191],t:7,e:"ui-section",a:{label:"Nanites Consumed"},f:[{t:2,r:"use_rate",p:[69,44,3228]},"/s"]}," ",{t:4,f:[{p:[71,8,3291],t:7,e:"ui-section",a:{label:"Trigger Cost"},f:[{t:2,r:"trigger_cost",p:[71,41,3324]}]}," ",{p:[72,8,3362],t:7,e:"ui-section",a:{label:"Trigger Cooldown"},f:[{t:2,r:"trigger_cooldown",p:[72,45,3399]}," seconds"]}],n:50,r:"can_trigger",p:[70,7,3263]}," ",{t:4,f:[{t:4,f:[{p:[76,9,3534],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"activation_delay",p:[76,46,3571]}]}],n:50,r:"activation_delay",p:[75,8,3500]}," ",{t:4,f:[{p:[79,9,3652],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"timer",p:[79,35,3678]}]}," ",{p:[80,9,3710],t:7,e:"ui-section",a:{label:"Timer Type"},f:[{t:2,r:"timer_type",p:[80,40,3741]}]}],n:50,r:"timer",p:[78,8,3629]}," ",{t:4,f:[{t:4,f:[{p:[84,11,3865],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[84,30,3884]}]},f:[{t:2,r:"value",p:[84,40,3894]}]}],n:52,r:"extra_settings",p:[83,9,3829]}],n:50,r:"has_extra_settings",p:[82,8,3793]}," ",{t:4,f:[{t:4,f:[{p:[89,10,4032],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"activation_code",p:[89,46,4068]}]}],n:50,r:"activation_code",p:[88,9,3998]}," ",{t:4,f:[{p:[92,10,4163],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"deactivation_code",p:[92,48,4201]}]}],n:50,r:"deactivation_code",p:[91,9,4127]}," ",{t:4,f:[{p:[95,10,4290],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"kill_code",p:[95,40,4320]}]}],n:50,r:"kill_code",p:[94,9,4262]}," ",{t:4,f:[{p:[98,10,4404],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"trigger_code",p:[98,43,4437]}]}],n:50,r:"trigger_code",p:[97,9,4373]}],n:50,x:{r:["data.scan_level"],s:"_0>=4"},p:[87,8,3960]}],n:50,x:{r:["data.scan_level"],s:"_0>=3"},p:[74,7,3463]}],n:50,x:{r:["data.scan_level"],s:"_0>=2"},p:[67,6,3058]}]}],n:52,r:"data.mob_programs",p:[63,5,2811]}]}]}],x:{r:["data.has_nanites"],s:"!_0"}}]}],r:"data.status_msg"}]}]},e.exports=a.extend(r.exports)},{341:341}],411:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Cloud Console"},f:[{p:[2,1,43],t:7,e:"ui-display",a:{title:"Program Disk"},f:[{t:4,f:[{p:[4,3,104],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]},{p:[4,64,165],t:7,e:"br"}," ",{t:4,f:[{p:[6,4,202],t:7,e:"ui-section",f:[{p:[7,5,220],t:7,e:"ui-section",a:{label:"Program Name"},f:[{t:2,r:"data.disk.name",p:[7,38,253]}]}," ",{p:[8,5,290],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.disk.desc",p:[8,37,322]}]}," ",{p:[9,5,359],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["data.disk.activated"],s:'_0?"Active":"Inactive"'},p:[9,43,397]}]}," ",{t:4,f:[{p:[11,6,505],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"data.disk.activation_delay",p:[11,43,542]}]}],n:50,r:"data.disk.activation_delay",p:[10,5,464]}," ",{t:4,f:[{p:[14,6,634],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"data.disk.timer",p:[14,32,660]}]}," ",{p:[15,6,699],t:7,e:"ui-section",a:{label:"Timer Type "},f:[{t:2,r:"data.disk.timer_type",p:[15,38,731]}]}],n:50,r:"data.disk.timer",p:[13,5,604]}," ",{t:4,f:[{p:[18,6,827],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"data.disk.activation_code",p:[18,42,863]}]}],n:50,r:"data.disk.activation_code",p:[17,5,787]}," ",{t:4,f:[{p:[21,6,966],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"data.disk.deactivation_code",p:[21,44,1004]}]}],n:50,r:"data.disk.deactivation_code",p:[20,5,924]}," ",{t:4,f:[{p:[24,6,1101],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"data.disk.kill_code",p:[24,36,1131]}]}],n:50,r:"data.disk.kill_code",p:[23,5,1067]}," ",{t:4,f:[{p:[27,6,1223],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"data.disk.trigger_code",p:[27,39,1256]}]}],n:50,r:"data.disk.trigger_code",p:[26,5,1186]}," ",{t:4,f:[{t:4,f:[{p:[31,8,1400],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[31,27,1419]}]},f:[{t:2,r:"value",p:[31,37,1429]}]}],n:52,r:"data.disk.extra_settings",p:[30,6,1357]}],n:50,r:"data.disk.has_extra_settings",p:[29,5,1314]}]}],n:50,r:"data.has_program",p:[5,3,173]},{t:4,n:51,f:[{p:[36,4,1515],t:7,e:"ui-notice",f:["No program detected."]}],r:"data.has_program"}],n:50,r:"data.has_disk",p:[3,2,79]},{t:4,n:51,f:[{p:[39,3,1584],t:7,e:"ui-notice",f:["Insert disk."]}],r:"data.has_disk"}]}," ",{p:[42,1,1646],t:7,e:"ui-display",a:{title:"Cloud Storage"},f:[{t:4,f:[{p:[44,3,1713],t:7,e:"ui-button",a:{icon:"plus-circle",action:"create_backup"},f:["Create New Backup"]}," ",{p:[45,3,1799],t:7,e:"ui-display",a:{title:"Active Backups"},f:[{t:4,f:[{p:[47,5,1873],t:7,e:"ui-button",a:{action:"set_view",params:['{"view": "',{t:2,r:"cloud_id",p:[47,52,1920]},'"}']},f:["Backup #",{t:2,r:"cloud_id",p:[47,76,1944]}]}],n:52,r:"data.cloud_backups",p:[46,4,1839]}]}],n:50,x:{r:["data.current_view"],s:"!_0"},p:[43,2,1683]},{t:4,n:51,f:[{p:[51,3,2014],t:7,e:"ui-button",a:{icon:"undo",action:"set_view",params:'{"view": "0"}'},f:["Return"]}," ",{t:4,f:[{p:[53,4,2131],t:7,e:"ui-notice",f:["ERROR: Backup not found."]}],n:50,x:{r:["data.cloud_backup"],s:"!_0"},p:[52,3,2100]},{t:4,n:51,f:[{p:[55,4,2195],t:7,e:"ui-display",a:{title:["Backup #",{t:2,r:"data.current_view",p:[55,31,2222]}]},f:[{t:4,f:[{p:[57,6,2282],t:7,e:"ui-button",a:{icon:"upload",action:"upload_program",style:"selected"},f:["Upload Program From Disk"]},{p:[57,108,2384],t:7,e:"br"}],n:50,r:"data.has_program",p:[56,5,2251]}," ",{t:4,f:[{p:[60,6,2443],t:7,e:"hr"}," ",{p:[61,6,2454],t:7,e:"ui-section",f:[{p:[62,7,2474],t:7,e:"h3",f:[{t:2,r:"name",p:[62,11,2478]}]}," ",{p:[63,7,2499],t:7,e:"div",a:{style:"float:right"},f:[{p:[64,8,2533],t:7,e:"ui-button",a:{icon:"minus-circle",action:"remove_program",style:"danger",params:['{"program_id": "',{t:2,r:"id",p:[64,102,2627]},'"}']},f:["Uninstall"]}]}]}," ",{p:[67,6,2699],t:7,e:"ui-section",f:[{p:[68,7,2719],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"desc",p:[68,39,2751]}]}," ",{p:[69,7,2780],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["activated"],s:'_0?"Active":"Inactive"'},p:[69,45,2818]}]}," ",{p:[70,7,2877],t:7,e:"ui-section",a:{label:"Nanites Consumed"},f:[{t:2,r:"use_rate",p:[70,44,2914]},"/s"]}," ",{t:4,f:[{p:[72,8,2977],t:7,e:"ui-section",a:{label:"Trigger Cost"},f:[{t:2,r:"trigger_cost",p:[72,41,3010]},"/s"]}," ",{p:[73,8,3050],t:7,e:"ui-section",a:{label:"Trigger Cooldown"},f:[{t:2,r:"trigger_cooldown",p:[73,45,3087]},"/s"]}],n:50,r:"can_trigger",p:[71,7,2949]}," ",{t:4,f:[{p:[76,8,3178],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"activation_delay",p:[76,45,3215]}]}],n:50,r:"activation_delay",p:[75,7,3145]}," ",{t:4,f:[{p:[79,8,3293],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"timer",p:[79,34,3319]}]}," ",{p:[80,8,3350],t:7,e:"ui-section",a:{label:"Timer Type "},f:[{t:2,r:"timer_type",p:[80,40,3382]}]}],n:50,r:"timer",p:[78,7,3271]}," ",{t:4,f:[{p:[83,8,3464],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"activation_code",p:[83,44,3500]}]}],n:50,r:"activation_code",p:[82,7,3432]}," ",{t:4,f:[{p:[86,8,3589],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"deactivation_code",p:[86,46,3627]}]}],n:50,r:"deactivation_code",p:[85,7,3555]}," ",{t:4,f:[{p:[89,8,3710],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"kill_code",p:[89,38,3740]}]}],n:50,r:"kill_code",p:[88,7,3684]}," ",{t:4,f:[{p:[92,8,3818],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"trigger_code",p:[92,41,3851]}]}],n:50,r:"trigger_code",p:[91,7,3789]}," ",{t:4,f:[{t:4,f:[{p:[96,10,3973],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[96,29,3992]}]},f:[{t:2,r:"value",p:[96,39,4002]}]}],n:52,r:"extra_settings",p:[95,8,3938]}],n:50,r:"has_extra_settings",p:[94,7,3903]}]}],n:52,r:"data.cloud_programs",p:[59,5,2407]}]}],x:{r:["data.cloud_backup"],s:"!_0"}}],x:{r:["data.current_view"],s:"!_0"}}]}]}]},e.exports=a.extend(r.exports)},{341:341}],412:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Program Hub"},f:[{t:4,f:[{p:[3,2,65],t:7,e:"ui-display",a:{title:"Program Disk"},f:[{p:[4,3,102],t:7,e:"ui-section",f:[{p:[5,4,119],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]}," ",{p:[6,4,185],t:7,e:"ui-button",a:{icon:"minus-circle",action:"clear"},f:["Delete Program"]}]}," ",{t:4,f:[{p:[9,4,307],t:7,e:"ui-section",a:{label:"Program Name"},f:[{t:2,r:"data.disk.name",p:[9,37,340]}]}," ",{p:[10,4,376],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.disk.desc",p:[10,36,408]}]}],n:50,r:"data.has_program",p:[8,3,278]},{t:4,n:51,f:[{p:[12,4,456],t:7,e:"ui-notice",f:["No program installed."]}],r:"data.has_program"}]}],n:50,r:"data.has_disk",p:[2,1,41]},{t:4,n:51,f:[{p:[16,2,540],t:7,e:"ui-notice",f:["Insert disk."]}],r:"data.has_disk"},{p:[18,1,586],t:7,e:"br"}," ",{p:[19,1,592],t:7,e:"ui-display",a:{title:"Programs"},f:[{p:[20,2,624],t:7,e:"ui-section",f:[{p:[21,3,640],t:7,e:"ui-button",a:{icon:"undo",action:"set_category",params:'{"category": "Main"}'},f:["Return"]}," ",{p:[22,3,737],t:7,e:"ui-button",a:{icon:"align-justify ",action:"toggle_details"},f:[{t:2,x:{r:["data.detail_view"],s:'_0?"Compact View":"Detailed View"'},p:[22,60,794]}]}]}," ",{t:4,f:[{p:[25,3,916],t:7,e:"ui-display",f:[{t:4,f:[{p:[27,5,964],t:7,e:"ui-section",f:[{p:[27,17,976],t:7,e:"ui-button",a:{action:"set_category",params:['{"category": "',{t:2,r:"name",p:[27,72,1031]},'"}']},f:[{t:2,r:"name",p:[27,84,1043]}]}]}],n:52,r:"data.categories",p:[26,4,933]}]}],n:50,x:{r:["data.category"],s:'_0=="Main"'},p:[24,2,881]},{t:4,n:51,f:[{p:[31,3,1122],t:7,e:"ui-display",a:{title:[{t:2,r:"data.category",p:[31,22,1141]}]},f:[{t:4,f:[{t:4,f:[{p:[34,6,1229],t:7,e:"ui-display",f:[{p:[35,7,1249],t:7,e:"ui-section",f:[{p:[35,19,1261],t:7,e:"b",f:[{t:2,r:"name",p:[35,22,1264]}]}]}," ",{p:[36,7,1297],t:7,e:"ui-section",f:[{t:2,r:"desc",p:[36,19,1309]}]}," ",{p:[37,7,1338],t:7,e:"ui-section",f:[{p:[38,8,1359],t:7,e:"ui-button",a:{icon:"download",action:"download",params:['{"program_id": "',{t:2,r:"id",p:[38,77,1428]},'"}'],state:[{t:2,x:{r:["data.has_disk"],s:'_0?null:"disabled"'},p:[38,94,1445]}]},f:["Download"]}]}]}],n:50,r:"data.detail_view",p:[33,5,1198]},{t:4,n:51,f:[{p:[44,6,1585],t:7,e:"ui-section",f:[{p:[44,18,1597],t:7,e:"ui-button",a:{action:"download",params:['{"program_id": "',{t:2,r:"id",p:[44,71,1650]},'"}']},f:[{t:2,r:"name",p:[44,81,1660]}]}]}],r:"data.detail_view"}],n:52,r:"data.program_list",p:[32,4,1165]}]}],x:{r:["data.category"],s:'_0=="Main"'}}]}]}]},e.exports=a.extend(r.exports)},{341:341}],413:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Programming"},f:[{t:4,f:[{p:[3,3,67],t:7,e:"ui-notice",f:["Insert a nanite program disk."]}],n:50,x:{r:["data.has_disk"],s:"!_0"},p:[2,1,41]},{t:4,n:51,f:[{p:[5,3,133],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]}," ",{t:4,f:[{p:[7,5,229],t:7,e:"ui-notice",f:["No program detected."]}],n:50,x:{r:["data.has_program"],s:"!_0"},p:[6,3,198]},{t:4,n:51,f:[{p:[9,5,290],t:7,e:"ui-section",f:[{p:[10,7,310],t:7,e:"ui-display",a:{title:[{t:2,r:"data.name",p:[10,26,329]}]},f:[{t:2,r:"data.desc",p:[11,9,354]}]}]}," ",{p:[14,5,413],t:7,e:"ui-section",f:[{p:[15,7,433],t:7,e:"ui-section",a:{label:"Program Info"},f:["Nanites Consumed: ",{t:2,r:"data.use_rate",p:[16,26,493]},{p:[16,43,510],t:7,e:"br"}," ",{t:4,f:["Trigger Cost: ",{t:2,r:"data.trigger_cost",p:[18,25,574]},"u",{p:[18,47,596],t:7,e:"br"}],n:50,r:"data.can_trigger",p:[17,9,524]}]}," ",{p:[22,7,648],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[23,9,685],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.activated"],s:'_0?"toggle-on":"toggle-off"'},p:[24,17,713]}],action:"toggle_active"},f:[{t:2,x:{r:["data.activated"],s:'_0?"Active":"Inactive"'},p:[26,11,809]}]}]}," ",{p:[30,7,905],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[31,9,944],t:7,e:"ui-button",a:{icon:"pencil",action:"set_activation_delay"}}," Activation Delay: ",{t:2,r:"data.activation_delay",p:[31,95,1030]}," ",{p:[31,121,1056],t:7,e:"br"}," ",{p:[32,9,1070],t:7,e:"ui-button",a:{icon:"pencil",action:"set_timer"}}," Timer: ",{t:2,r:"data.timer",p:[32,73,1134]}," ",{p:[32,88,1149],t:7,e:"br"}," ",{p:[33,9,1163],t:7,e:"ui-button",a:{icon:"pencil",action:"set_timer_type"}}," Timer Type: ",{t:2,r:"data.timer_type",p:[33,83,1237]}," ",{p:[33,103,1257],t:7,e:"br"}]}," ",{p:[36,7,1292],t:7,e:"ui-section",a:{label:"Codes"},f:[{p:[37,9,1328],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "activation"}'}}," Activation Code: ",{t:2,r:"data.activation_code",p:[37,121,1440]}," ",{p:[37,146,1465],t:7,e:"br"}," ",{p:[38,9,1479],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "deactivation"}'}}," Deactivation Code: ",{t:2,r:"data.deactivation_code",p:[38,125,1595]}," ",{p:[38,152,1622],t:7,e:"br"}," ",{p:[39,9,1636],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "kill"}'}}," Kill Code: ",{t:2,r:"data.kill_code",p:[39,109,1736]}," ",{p:[39,128,1755],t:7,e:"br"}," ",{t:4,f:[{p:[41,11,1805],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "trigger"}'}}," Trigger Code: ",{t:2,r:"data.trigger_code",p:[41,117,1911]}," ",{p:[41,139,1933],t:7,e:"br"}],n:50,r:"data.can_trigger",p:[40,9,1769]}]}," ",{t:4,f:[{p:[46,9,2026],t:7,e:"ui-section",a:{label:"Special"},f:[{t:4,f:[{p:[48,13,2109],t:7,e:"ui-button",a:{icon:"pencil",action:"set_extra_setting",params:['{"target_setting": "',{t:2,r:"name",p:[48,93,2189]},'"}']}}," ",{t:2,r:"name",p:[48,118,2214]},": ",{t:2,r:"value",p:[48,128,2224]}," ",{p:[48,138,2234],t:7,e:"br"}],n:52,r:"data.extra_settings",p:[47,11,2066]}]}],n:50,r:"data.has_extra_settings",p:[45,7,1985]}]}],x:{r:["data.has_program"],s:"!_0"}}],x:{r:["data.has_disk"],s:"!_0"}}]}]},e.exports=a.extend(r.exports)},{341:341}],414:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Control"},f:[{t:4,f:[{p:[3,3,60],t:7,e:"ui-notice",f:["The interface is locked."]}],n:50,r:"data.locked",p:[2,1,37]},{t:4,n:51,f:[{p:[5,3,121],t:7,e:"ui-button",a:{icon:"lock",action:"lock"},f:["Lock Interface"]}," ",{p:[6,3,188],t:7,e:"ui-button",a:{icon:"save",action:"save"},f:["Save Current Setting"]}," ",{p:[7,3,261],t:7,e:"ui-section",a:{label:"Signal Code"},f:[{p:[8,5,299],t:7,e:"span",f:[{t:2,r:"data.code",p:[8,11,305]}]}," ",{p:[9,4,330],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code"},f:["Set"]}]}," ",{t:4,f:[{p:[12,5,443],t:7,e:"ui-section",a:{label:"Relay Code"},f:[{p:[13,7,482],t:7,e:"span",f:[{t:2,r:"data.relay_code",p:[13,13,488]}]}," ",{p:[14,5,520],t:7,e:"ui-button",a:{icon:"pencil",action:"set_relay_code"},f:["Set"]}]}],n:50,x:{r:["data.mode"],s:'_0=="Relay"'},p:[11,3,409]}," ",{p:[17,3,618],t:7,e:"ui-section",a:{label:"Signal Mode"},f:[{p:[18,5,656],t:7,e:"span",f:[{t:2,r:"data.mode",p:[18,11,662]}]}," ",{p:[19,5,688],t:7,e:"br"}," ",{p:[20,4,697],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Off"}'},f:["Off"]}," ",{p:[21,5,775],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Local"}'},f:["Local"]}," ",{p:[22,5,857],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Targeted"}'},f:["Targeted"]}," ",{p:[23,5,945],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Area"}'},f:["Area"]}," ",{p:[24,5,1025],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Relay"}'},f:["Relay"]}]}],r:"data.locked"}]}," ",{p:[28,1,1144],t:7,e:"ui-display",a:{title:"Saved Settings"},f:[{t:4,f:[{p:[30,3,1215],t:7,e:"ui-button",a:{icon:"load",action:"load",params:['{"save_id": "',{t:2,r:"id",p:[30,61,1273]},'"}']},f:[{t:2,r:"name",p:[30,71,1283]}]}," ",{t:4,f:[{p:[32,4,1332],t:7,e:"ui-button",a:{icon:"remove",action:"remove_save",params:['{"save_id": "',{t:2,r:"id",p:[32,71,1399]},'"}']},f:["Remove"]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[31,3,1307]}," ",{p:[34,3,1442],t:7,e:"br"}],n:52,r:"data.saved_settings",p:[29,2,1182]}]}]},e.exports=a.extend(r.exports)},{341:341}],415:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Ghost roles"},f:[{p:[2,2,35],t:7,e:"ui-section",a:{label:"Ignored roles"},f:[{t:4,f:[{p:[4,4,99],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["enabled"],s:'_0?"check-square-o":"square-o"'},p:[4,21,116]}],style:[{t:2,x:{r:["enabled"],s:'_0?"danger":null'},p:[4,73,168]}],action:"toggle_ignore",params:['{"key": "',{t:2,r:"key",p:[4,144,239]},'"}']},f:[{t:2,r:"desc",p:[4,155,250]}]}],n:52,r:"data.ignore",p:[3,3,73]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],416:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Relay"},f:[{t:4,f:[{p:[3,3,57],t:7,e:"h2",f:["NETWORK BUFFERS OVERLOADED"]}," ",{p:[4,3,96],t:7,e:"h3",f:["Overload Recovery Mode"]}," ",{p:[5,3,131],t:7,e:"i",f:["This system is suffering temporary outage due to overflow of traffic buffers. Until buffered traffic is processed, all further requests will be dropped. Frequent occurences of this error may indicate insufficient hardware capacity of your network. Please contact your network planning department for instructions on how to resolve this issue."]}," ",{p:[6,3,484],t:7,e:"h3",f:["ADMINISTRATIVE OVERRIDE"]}," ",{p:[7,3,520],t:7,e:"b",f:["CAUTION - Data loss may occur"]}," ",{p:[8,3,562],t:7,e:"ui-button",a:{icon:"signal",action:"restart"},f:["Purge buffered traffic"]}],n:50,r:"data.dos_crashed",p:[2,2,29]},{t:4,n:51,f:[{p:[12,3,663],t:7,e:"ui-section",a:{label:"Relay status"},f:[{p:[13,4,701],t:7,e:"ui-button",a:{icon:"power-off",action:"toggle"},f:[{t:2,x:{r:["data.enabled"],s:'_0?"ENABLED":"DISABLED"'},p:[14,6,752]}]}]}," ",{p:[18,3,836],t:7,e:"ui-section",a:{label:"Network buffer status"},f:[{t:2,r:"data.dos_overload",p:[19,4,883]}," / ",{t:2,r:"data.dos_capacity",p:[19,28,907]}," GQ"]}],r:"data.dos_crashed"}]}]},e.exports=a.extend(r.exports); -},{341:341}],417:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[15,1,320],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[18,3,363],t:7,e:"ui-notice",f:[{p:[19,5,380],t:7,e:"span",f:["Reconstruction in progress!"]}]}],n:50,r:"data.restoring",p:[17,1,337]},{p:[24,1,451],t:7,e:"ui-display",f:[{p:[26,1,467],t:7,e:"div",a:{"class":"item"},f:[{p:[27,3,489],t:7,e:"div",a:{"class":"itemLabel"},f:["Inserted AI:"]}," ",{p:[30,3,541],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[31,2,569],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",state:[{t:2,x:{r:["data.nocard"],s:'_0?"disabled":null'},p:[31,52,619]}]},f:[{t:2,x:{r:["data.name"],s:'_0?_0:"---"'},p:[31,89,656]}]}]}]}," ",{t:4,f:[{p:[36,2,744],t:7,e:"b",f:["ERROR: ",{t:2,r:"data.error",p:[36,12,754]}]}],n:50,r:"data.error",p:[35,1,723]},{t:4,n:51,f:[{p:[38,2,785],t:7,e:"h2",f:["System Status"]}," ",{p:[39,2,810],t:7,e:"div",a:{"class":"item"},f:[{p:[40,3,832],t:7,e:"div",a:{"class":"itemLabel"},f:["Current AI:"]}," ",{p:[43,3,885],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.name",p:[44,4,915]}]}," ",{p:[46,3,942],t:7,e:"div",a:{"class":"itemLabel"},f:["Status:"]}," ",{p:[49,3,991],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["Nonfunctional"],n:50,r:"data.isDead",p:[50,4,1021]},{t:4,n:51,f:["Functional"],r:"data.isDead"}]}," ",{p:[56,3,1114],t:7,e:"div",a:{"class":"itemLabel"},f:["System Integrity:"]}," ",{p:[59,3,1173],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[60,4,1203],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[60,37,1236]}],state:[{t:2,r:"healthState",p:[61,11,1264]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[61,28,1281]},"%"]}]}," ",{p:[63,3,1336],t:7,e:"div",a:{"class":"itemLabel"},f:["Active Laws:"]}," ",{p:[66,3,1390],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[67,4,1420],t:7,e:"table",f:[{t:4,f:[{p:[69,6,1462],t:7,e:"tr",f:[{p:[69,10,1466],t:7,e:"td",f:[{p:[69,14,1470],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[69,38,1494]}]}]}]}],n:52,r:"data.ai_laws",p:[68,5,1433]}]}]}," ",{p:[73,2,1547],t:7,e:"ui-section",a:{label:"Operations"},f:[{p:[74,3,1582],t:7,e:"ui-button",a:{icon:"plus",style:[{t:2,x:{r:["data.restoring"],s:'_0?"disabled":null'},p:[74,33,1612]}],action:"PRG_beginReconstruction"},f:["Begin Reconstruction"]}]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],418:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[5,1,91],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"home",params:'{"target" : "mod"}',state:[{t:2,x:{r:["data.mmode"],s:'_0==1?"disabled":null'},p:[5,80,170]}]},f:["Access Modification"]}],n:50,r:"data.have_id_slot",p:[4,1,64]},{p:[7,1,253],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"folder-open",params:'{"target" : "manage"}',state:[{t:2,x:{r:["data.mmode"],s:'_0==2?"disabled":null'},p:[7,90,342]}]},f:["Job Management"]}," ",{p:[8,1,411],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"folder-open",params:'{"target" : "manifest"}',state:[{t:2,x:{r:["data.mmode"],s:'!_0?"disabled":null'},p:[8,92,502]}]},f:["Crew Manifest"]}," ",{t:4,f:[{p:[10,1,593],t:7,e:"ui-button",a:{action:"PRG_print",icon:"print",state:[{t:2,x:{r:["data.has_id","data.mmode"],s:'!_1||_0&&_1==1?null:"disabled"'},p:[10,51,643]}]},f:["Print"]}],n:50,r:"data.have_printer",p:[9,1,566]},{t:4,f:[{p:[14,1,766],t:7,e:"div",a:{"class":"item"},f:[{p:[15,3,788],t:7,e:"h2",f:["Crew Manifest"]}," ",{p:[16,3,814],t:7,e:"br"},"Please use security record computer to modify entries.",{p:[16,61,872],t:7,e:"br"},{p:[16,65,876],t:7,e:"br"}]}," ",{t:4,f:[{p:[19,2,916],t:7,e:"div",a:{"class":"item"},f:[{t:2,r:"name",p:[20,2,937]}," - ",{t:2,r:"rank",p:[20,13,948]}]}],n:52,r:"data.manifest",p:[18,1,890]}],n:50,x:{r:["data.mmode"],s:"!_0"},p:[13,1,745]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.mmode"],s:"_0==2"},f:[{p:[25,1,1008],t:7,e:"div",a:{"class":"item"},f:[{p:[26,3,1030],t:7,e:"h2",f:["Job Management"]}]}," ",{p:[28,1,1063],t:7,e:"table",f:[{p:[29,1,1072],t:7,e:"tr",f:[{p:[29,5,1076],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,27,1098],t:7,e:"b",f:["Job"]}]},{p:[29,42,1113],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,64,1135],t:7,e:"b",f:["Slots"]}]},{p:[29,81,1152],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,103,1174],t:7,e:"b",f:["Open job"]}]},{p:[29,123,1194],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,145,1216],t:7,e:"b",f:["Close job"]}]}]}," ",{t:4,f:[{p:[32,2,1269],t:7,e:"tr",f:[{p:[32,6,1273],t:7,e:"td",f:[{t:2,r:"title",p:[32,10,1277]}]},{p:[32,24,1291],t:7,e:"td",f:[{t:2,r:"current",p:[32,28,1295]},"/",{t:2,r:"total",p:[32,40,1307]}]},{p:[32,54,1321],t:7,e:"td",f:[{p:[32,58,1325],t:7,e:"ui-button",a:{action:"PRG_open_job",params:['{"target" : "',{t:2,r:"title",p:[32,112,1379]},'"}'],state:[{t:2,x:{r:["status_open"],s:'_0?null:"disabled"'},p:[32,132,1399]}]},f:[{t:2,r:"desc_open",p:[32,169,1436]}]},{p:[32,194,1461],t:7,e:"br"}]},{p:[32,203,1470],t:7,e:"td",f:[{p:[32,207,1474],t:7,e:"ui-button",a:{action:"PRG_close_job",params:['{"target" : "',{t:2,r:"title",p:[32,262,1529]},'"}'],state:[{t:2,x:{r:["status_close"],s:'_0?null:"disabled"'},p:[32,282,1549]}]},f:[{t:2,r:"desc_close",p:[32,320,1587]}]}]}]}],n:52,r:"data.slots",p:[30,1,1244]}]}]},{t:4,n:50,x:{r:["data.mmode"],s:"!(_0==2)"},f:[" ",{p:[40,1,1665],t:7,e:"div",a:{"class":"item"},f:[{p:[41,3,1687],t:7,e:"h2",f:["Access Modification"]}]}," ",{t:4,f:[{p:[45,3,1751],t:7,e:"span",a:{"class":"alert"},f:[{p:[45,23,1771],t:7,e:"i",f:["Please insert the ID into the terminal to proceed."]}]},{p:[45,87,1835],t:7,e:"br"}],n:50,x:{r:["data.has_id"],s:"!_0"},p:[44,1,1727]},{p:[48,1,1852],t:7,e:"div",a:{"class":"item"},f:[{p:[49,3,1874],t:7,e:"div",a:{"class":"itemLabel"},f:["Target Identity:"]}," ",{p:[52,3,1930],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[53,2,1958],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",params:'{"target" : "id"}'},f:[{t:2,r:"data.id_name",p:[53,72,2028]}]}]}]}," ",{p:[56,1,2076],t:7,e:"div",a:{"class":"item"},f:[{p:[57,3,2098],t:7,e:"div",a:{"class":"itemLabel"},f:["Auth Identity:"]}," ",{p:[60,3,2152],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[61,2,2180],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",params:'{"target" : "auth"}'},f:[{t:2,r:"data.auth_name",p:[61,74,2252]}]}]}]}," ",{p:[64,1,2302],t:7,e:"hr"}," ",{t:4,f:[{t:4,f:[{p:[68,2,2362],t:7,e:"div",a:{"class":"item"},f:[{p:[69,4,2385],t:7,e:"h2",f:["Details"]}]}," ",{t:4,f:[{p:[73,2,2436],t:7,e:"div",a:{"class":"item"},f:[{p:[74,4,2459],t:7,e:"div",a:{"class":"itemLabel"},f:["Registered Name:"]}," ",{p:[77,4,2518],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.id_owner",p:[78,3,2547]}]}]}," ",{p:[81,2,2587],t:7,e:"div",a:{"class":"item"},f:[{p:[82,4,2610],t:7,e:"div",a:{"class":"itemLabel"},f:["Rank:"]}," ",{p:[85,4,2658],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.id_rank",p:[86,3,2687]}]}]}," ",{p:[89,2,2726],t:7,e:"div",a:{"class":"item"},f:[{p:[90,4,2749],t:7,e:"div",a:{"class":"itemLabel"},f:["Demote:"]}," ",{p:[93,4,2799],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[94,3,2828],t:7,e:"ui-button",a:{action:"PRG_terminate",icon:"gear",state:[{t:2,x:{r:["data.id_rank"],s:'_0=="Unassigned"?"disabled":null'},p:[94,56,2881]}]},f:["Demote ",{t:2,r:"data.id_owner",p:[94,117,2942]}]}]}]}],n:50,r:"data.minor",p:[72,2,2415]},{t:4,n:51,f:[{p:[99,2,3007],t:7,e:"div",a:{"class":"item"},f:[{p:[100,4,3030],t:7,e:"div",a:{"class":"itemLabel"},f:["Registered Name:"]}," ",{p:[103,4,3089],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[104,3,3118],t:7,e:"ui-button",a:{action:"PRG_edit",icon:"pencil",params:'{"name" : "1"}'},f:[{t:2,r:"data.id_owner",p:[104,70,3185]}]}]}]}," ",{p:[108,2,3239],t:7,e:"div",a:{"class":"item"},f:[{p:[109,4,3262],t:7,e:"h2",f:["Assignment"]}]}," ",{p:[111,3,3294],t:7,e:"ui-button",a:{action:"PRG_togglea",icon:"gear"},f:[{t:2,x:{r:["data.assignments"],s:'_0?"Hide assignments":"Show assignments"'},p:[111,47,3338]}]}," ",{p:[112,2,3415],t:7,e:"div",a:{"class":"item"},f:[{p:[113,4,3438],t:7,e:"span",a:{id:"allvalue.jobsslot"},f:[]}]}," ",{p:[117,2,3495],t:7,e:"div",a:{"class":"item"},f:[{t:4,f:[{p:[119,4,3547],t:7,e:"div",a:{id:"all-value.jobs"},f:[{p:[120,3,3576],t:7,e:"table",f:[{p:[121,5,3589],t:7,e:"tr",f:[{p:[122,4,3598],t:7,e:"th",f:["Command"]}," ",{p:[123,4,3619],t:7,e:"td",f:[{p:[124,6,3630],t:7,e:"ui-button",a:{action:"PRG_assign",params:'{"assign_target" : "Captain"}',state:[{t:2,x:{r:["data.id_rank"],s:'_0=="Captain"?"selected":null'},p:[124,83,3707]}]},f:["Captain"]}]}]}," ",{p:[127,5,3804],t:7,e:"tr",f:[{p:[128,4,3813],t:7,e:"th",f:["Special"]}," ",{p:[129,4,3834],t:7,e:"td",f:[{p:[130,6,3845],t:7,e:"ui-button",a:{action:"PRG_assign",params:'{"assign_target" : "Custom"}'},f:["Custom"]}]}]}," ",{p:[133,5,3959],t:7,e:"tr",f:[{p:[134,4,3968],t:7,e:"th",a:{style:"color: '#FFA500';"},f:["Engineering"]}," ",{p:[135,4,4019],t:7,e:"td",f:[{t:4,f:[{p:[137,5,4067],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[137,64,4126]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[137,82,4144]}]},f:[{t:2,r:"display_name",p:[137,127,4189]}]}],n:52,r:"data.engineering_jobs",p:[136,6,4030]}]}]}," ",{p:[141,5,4260],t:7,e:"tr",f:[{p:[142,4,4269],t:7,e:"th",a:{style:"color: '#008000';"},f:["Medical"]}," ",{p:[143,4,4316],t:7,e:"td",f:[{t:4,f:[{p:[145,5,4360],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[145,64,4419]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[145,82,4437]}]},f:[{t:2,r:"display_name",p:[145,127,4482]}]}],n:52,r:"data.medical_jobs",p:[144,6,4327]}]}]}," ",{p:[149,5,4553],t:7,e:"tr",f:[{p:[150,4,4562],t:7,e:"th",a:{style:"color: '#800080';"},f:["Science"]}," ",{p:[151,4,4609],t:7,e:"td",f:[{t:4,f:[{p:[153,5,4653],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[153,64,4712]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[153,82,4730]}]},f:[{t:2,r:"display_name",p:[153,127,4775]}]}],n:52,r:"data.science_jobs",p:[152,6,4620]}]}]}," ",{p:[157,5,4846],t:7,e:"tr",f:[{p:[158,4,4855],t:7,e:"th",a:{style:"color: '#DD0000';"},f:["Security"]}," ",{p:[159,4,4903],t:7,e:"td",f:[{t:4,f:[{p:[161,5,4948],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[161,64,5007]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[161,82,5025]}]},f:[{t:2,r:"display_name",p:[161,127,5070]}]}],n:52,r:"data.security_jobs",p:[160,6,4914]}]}]}," ",{p:[165,5,5141],t:7,e:"tr",f:[{p:[166,4,5150],t:7,e:"th",a:{style:"color: '#cc6600';"},f:["Cargo"]}," ",{p:[167,4,5195],t:7,e:"td",f:[{t:4,f:[{p:[169,5,5237],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[169,64,5296]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[169,82,5314]}]},f:[{t:2,r:"display_name",p:[169,127,5359]}]}],n:52,r:"data.cargo_jobs",p:[168,6,5206]}]}]}," ",{p:[173,5,5430],t:7,e:"tr",f:[{p:[174,4,5439],t:7,e:"th",a:{style:"color: '#808080';"},f:["Civilian"]}," ",{p:[175,4,5487],t:7,e:"td",f:[{t:4,f:[{p:[177,5,5532],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[177,64,5591]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[177,82,5609]}]},f:[{t:2,r:"display_name",p:[177,127,5654]}]}],n:52,r:"data.civilian_jobs",p:[176,6,5498]}]}]}," ",{t:4,f:[{p:[182,4,5757],t:7,e:"tr",f:[{p:[183,6,5768],t:7,e:"th",a:{style:"color: '#A52A2A';"},f:["CentCom"]}," ",{p:[184,6,5817],t:7,e:"td",f:[{t:4,f:[{p:[186,7,5862],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[186,66,5921]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[186,84,5939]}]},f:[{t:2,r:"display_name",p:[186,129,5984]}]}],n:52,r:"data.centcom_jobs",p:[185,5,5827]}]}]}],n:50,r:"data.centcom_access",p:[181,5,5725]}]}]}],n:50,r:"data.assignments",p:[118,4,3518]}]}],r:"data.minor"}," ",{t:4,f:[{p:[198,4,6153],t:7,e:"div",a:{"class":"item"},f:[{p:[199,3,6175],t:7,e:"h2",f:["Central Command"]}]}," ",{p:[201,4,6215],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[203,5,6296],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[204,5,6331],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[204,64,6390]},'", "allowed" : "',{t:2,r:"allowed",p:[204,87,6413]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[204,109,6435]}]},f:[{t:2,r:"desc",p:[204,140,6466]}]}]}],n:52,r:"data.all_centcom_access",p:[202,3,6257]}]}],n:50,r:"data.centcom_access",p:[197,2,6121]},{t:4,n:51,f:[{p:[209,4,6538],t:7,e:"div",a:{"class":"item"},f:[{p:[210,3,6560],t:7,e:"h2",f:[{t:2,r:"data.station_name",p:[210,7,6564]}]}]}," ",{p:[212,4,6606],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[214,5,6676],t:7,e:"div",a:{style:"float: left; width: 175px; min-height: 250px"},f:[{p:[215,4,6739],t:7,e:"div",a:{"class":"average"},f:[{p:[215,25,6760],t:7,e:"ui-button",a:{action:"PRG_regsel",state:[{t:2,x:{r:["selected"],s:'_0?"toggle":null'},p:[215,63,6798]}],params:['{"region" : "',{t:2,r:"regid",p:[215,116,6851]},'"}']},f:[{p:[215,129,6864],t:7,e:"b",f:[{t:2,r:"name",p:[215,132,6867]}]}]}]}," ",{p:[216,4,6902],t:7,e:"br"}," ",{t:4,f:[{p:[218,6,6938],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[219,5,6973],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[219,64,7032]},'", "allowed" : "',{t:2,r:"allowed",p:[219,87,7055]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[219,109,7077]}]},f:[{t:2,r:"desc",p:[219,140,7108]}]}]}],n:52,r:"accesses",p:[217,6,6913]}]}],n:52,r:"data.regions",p:[213,3,6648]}]}],r:"data.centcom_access"}],n:50,r:"data.has_id",p:[67,3,2340]}],n:50,r:"data.authenticated",p:[66,1,2310]}]}],x:{r:["data.mmode"],s:"!_0"}}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],419:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{chargeState:function(t){var e=this.get("data.battery.max");return t>e/2?"good":t>e/4?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[15,1,311],t:7,e:"ntosheader"}," ",{p:[17,1,328],t:7,e:"ui-display",f:[{p:[18,2,343],t:7,e:"i",f:["Welcome to computer configuration utility. Please consult your system administrator if you have any questions about your device."]},{p:[18,137,478],t:7,e:"hr"}," ",{p:[19,2,485],t:7,e:"ui-display",a:{title:"Power Supply"},f:[{p:[20,3,522],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"data.power_usage",p:[21,4,559]},"W"]}," ",{t:4,f:[{p:[25,4,630],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Active"]}," ",{p:[28,4,701],t:7,e:"ui-section",a:{label:"Battery Rating"},f:[{t:2,r:"data.battery.max",p:[29,5,742]}]}," ",{p:[31,4,785],t:7,e:"ui-section",a:{label:"Battery Charge"},f:[{p:[32,5,826],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.battery.max",p:[32,26,847]}],value:[{t:2,r:"adata.battery.charge",p:[32,56,877]}],state:[{t:2,x:{r:["chargeState","adata.battery.charge"],s:"_0(_1)"},p:[32,89,910]}]},f:[{t:2,x:{r:["adata.battery.charge"],s:"Math.round(_0)"},p:[32,128,949]},"/",{t:2,r:"adata.battery.max",p:[32,165,986]}]}]}],n:50,r:"data.battery",p:[24,3,605]},{t:4,n:51,f:[{p:[35,4,1051],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Not Available"]}],r:"data.battery"}]}," ",{p:[41,2,1156],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,3,1192],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,4,1231],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,25,1252]}],value:[{t:2,r:"adata.disk_used",p:[43,53,1280]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,87,1314]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,123,1350]},"GQ"]}]}]}," ",{p:[47,2,1419],t:7,e:"ui-display",a:{title:"Computer Components"},f:[{t:4,f:[{p:[49,4,1491],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"name",p:[49,26,1513]}]},f:[{p:[50,5,1529],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"desc",p:[50,59,1583]}]}," ",{p:[52,5,1605],t:7,e:"ui-section",a:{label:"State"},f:[{p:[53,6,1638],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["critical"],s:'_0?"disabled":null'},p:[53,24,1656]}],action:"PC_toggle_component",params:['{"name": "',{t:2,r:"name",p:[53,105,1737]},'"}']},f:[{t:2,x:{r:["enabled"],s:'_0?"Enabled":"Disabled"'},p:[54,7,1757]}]}]}," ",{t:4,f:[{p:[59,6,1868],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"powerusage",p:[60,7,1908]},"W"]}],n:50,r:"powerusage",p:[58,5,1843]}]}," ",{p:[64,4,1985],t:7,e:"br"}],n:52,r:"data.hardware",p:[48,3,1463]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],420:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,3,103],t:7,e:"h2",f:["An error has occurred and this program can not continue."]}," Additional information: ",{t:2,r:"data.error",p:[8,27,196]},{p:[8,41,210],t:7,e:"br"}," ",{p:[9,3,218],t:7,e:"i",f:["Please try again. If the problem persists contact your system administrator for assistance."]}," ",{p:[10,3,320],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["Restart program"]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,f:[{p:[13,4,422],t:7,e:"h2",f:["Viewing file ",{t:2,r:"data.filename",p:[13,21,439]}]}," ",{p:[14,4,466],t:7,e:"div",a:{"class":"item"},f:[{p:[15,4,489],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["CLOSE"]}," ",{p:[16,4,545],t:7,e:"ui-button",a:{action:"PRG_edit"},f:["EDIT"]}," ",{p:[17,4,595],t:7,e:"ui-button",a:{action:"PRG_printfile"},f:["PRINT"]}," "]},{p:[18,10,657],t:7,e:"hr"}," ",{t:3,r:"data.filedata",p:[19,4,666]}],n:50,r:"data.filename",p:[12,3,396]},{t:4,n:51,f:[{p:[21,4,702],t:7,e:"h2",f:["Available files (local):"]}," ",{p:[22,4,740],t:7,e:"table",f:[{p:[23,5,753],t:7,e:"tr",f:[{p:[24,6,764],t:7,e:"th",f:["File name"]}," ",{p:[25,6,789],t:7,e:"th",f:["File type"]}," ",{p:[26,6,814],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[27,6,844],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[30,6,907],t:7,e:"tr",f:[{p:[31,7,919],t:7,e:"td",f:[{t:2,r:"name",p:[31,11,923]}]}," ",{p:[32,7,944],t:7,e:"td",f:[".",{t:2,r:"type",p:[32,12,949]}]}," ",{p:[33,7,970],t:7,e:"td",f:[{t:2,r:"size",p:[33,11,974]},"GQ"]}," ",{p:[34,7,997],t:7,e:"td",f:[{p:[35,8,1010],t:7,e:"ui-button",a:{action:"PRG_openfile",params:['{"name": "',{t:2,r:"name",p:[35,59,1061]},'"}']},f:["VIEW"]}," ",{p:[36,8,1098],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[36,26,1116]}],action:"PRG_deletefile",params:['{"name": "',{t:2,r:"name",p:[36,105,1195]},'"}']},f:["DELETE"]}," ",{p:[37,8,1234],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[37,26,1252]}],action:"PRG_rename",params:['{"name": "',{t:2,r:"name",p:[37,101,1327]},'"}']},f:["RENAME"]}," ",{p:[38,8,1366],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[38,26,1384]}],action:"PRG_clone",params:['{"name": "',{t:2,r:"name",p:[38,100,1458]},'"}']},f:["CLONE"]}," ",{t:4,f:[{p:[40,9,1531],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[40,27,1549]}],action:"PRG_copytousb",params:['{"name": "',{t:2,r:"name",p:[40,105,1627]},'"}']},f:["EXPORT"]}],n:50,r:"data.usbconnected",p:[39,8,1496]}]}]}],n:52,r:"data.files",p:[29,5,880]}]}," ",{t:4,f:[{p:[47,4,1761],t:7,e:"h2",f:["Available files (portable device):"]}," ",{p:[48,4,1809],t:7,e:"table",f:[{p:[49,5,1822],t:7,e:"tr",f:[{p:[50,6,1833],t:7,e:"th",f:["File name"]}," ",{p:[51,6,1858],t:7,e:"th",f:["File type"]}," ",{p:[52,6,1883],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[53,6,1913],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[56,6,1979],t:7,e:"tr",f:[{p:[57,7,1991],t:7,e:"td",f:[{t:2,r:"name",p:[57,11,1995]}]}," ",{p:[58,7,2016],t:7,e:"td",f:[".",{t:2,r:"type",p:[58,12,2021]}]}," ",{p:[59,7,2042],t:7,e:"td",f:[{t:2,r:"size",p:[59,11,2046]},"GQ"]}," ",{p:[60,7,2069],t:7,e:"td",f:[{p:[61,8,2082],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[61,26,2100]}],action:"PRG_usbdeletefile",params:['{"name": "',{t:2,r:"name",p:[61,108,2182]},'"}']},f:["DELETE"]}," ",{t:4,f:[{p:[63,9,2256],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[63,27,2274]}],action:"PRG_copyfromusb",params:['{"name": "',{t:2,r:"name",p:[63,107,2354]},'"}']},f:["IMPORT"]}],n:50,r:"data.usbconnected",p:[62,8,2221]}]}]}],n:52,r:"data.usbfiles",p:[55,5,1949]}]}],n:50,r:"data.usbconnected",p:[46,4,1731]}," ",{p:[70,4,2470],t:7,e:"ui-button",a:{action:"PRG_newtextfile"},f:["NEW DATA FILE"]}],r:"data.filename"}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],421:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["No program loaded. Please select program from list below."]}," ",{p:[6,2,146],t:7,e:"table",f:[{t:4,f:[{p:[8,4,185],t:7,e:"tr",f:[{p:[8,8,189],t:7,e:"td",f:[{p:[8,12,193],t:7,e:"ui-button",a:{action:"PC_runprogram",params:['{"name": "',{t:2,r:"name",p:[8,64,245]},'"}']},f:[{t:2,r:"desc",p:[9,5,263]}]}]},{p:[11,4,293],t:7,e:"td",f:[{p:[11,8,297],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["running"],s:'_0?null:"disabled"'},p:[11,26,315]}],icon:"close",action:"PC_killprogram",params:['{"name": "',{t:2,r:"name",p:[11,114,403]},'"}']}}]}]}],n:52,r:"data.programs",p:[7,3,157]}]}," ",{p:[14,2,454],t:7,e:"br"},{p:[14,6,458],t:7,e:"br"}," ",{t:4,f:[{p:[16,3,491],t:7,e:"ui-button",a:{action:"PC_toggle_light",style:[{t:2,x:{r:["data.light_on"],s:'_0?"selected":null'},p:[16,46,534]}]},f:["Toggle Flashlight"]},{p:[16,114,602],t:7,e:"br"}," ",{p:[17,3,610],t:7,e:"ui-button",a:{action:"PC_light_color"},f:["Change Flashlight Color ",{p:[17,62,669],t:7,e:"span",a:{style:["border:1px solid #161616; background-color: ",{t:2,r:"data.comp_light_color",p:[17,119,726]},";"]},f:["   "]}]}],n:50,r:"data.has_light",p:[15,2,465]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],422:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[6,3,105],t:7,e:"h1",f:["ADMINISTRATIVE MODE"]}],n:50,r:"data.adminmode",p:[5,2,79]}," ",{t:4,f:[{p:[10,3,170],t:7,e:"div",a:{"class":"itemLabel"},f:["Current channel:"]}," ",{p:[13,3,229],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.title",p:[14,4,259]}]}," ",{p:[16,3,287],t:7,e:"div",a:{"class":"itemLabel"},f:["Operator access:"]}," ",{p:[19,3,346],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:[{p:[21,5,406],t:7,e:"b",f:["Enabled"]}],n:50,r:"data.is_operator",p:[20,4,376]},{t:4,n:51,f:[{p:[23,5,439],t:7,e:"b",f:["Disabled"]}],r:"data.is_operator"}]}," ",{p:[26,3,480],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[29,3,532],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[30,4,562],t:7,e:"table",f:[{p:[31,5,575],t:7,e:"tr",f:[{p:[31,9,579],t:7,e:"td",f:[{p:[31,13,583],t:7,e:"ui-button",a:{action:"PRG_speak"},f:["Send message"]}]}]},{p:[32,5,643],t:7,e:"tr",f:[{p:[32,9,647],t:7,e:"td",f:[{p:[32,13,651],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[33,5,719],t:7,e:"tr",f:[{p:[33,9,723],t:7,e:"td",f:[{p:[33,13,727],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]},{p:[34,5,807],t:7,e:"tr",f:[{p:[34,9,811],t:7,e:"td",f:[{p:[34,13,815],t:7,e:"ui-button",a:{action:"PRG_leavechannel"},f:["Leave channel"]}]}]},{p:[35,5,883],t:7,e:"tr",f:[{p:[35,9,887],t:7,e:"td",f:[{p:[35,13,891],t:7,e:"ui-button",a:{action:"PRG_savelog"},f:["Save log to local drive"]}," ",{t:4,f:[{p:[37,6,995],t:7,e:"tr",f:[{p:[37,10,999],t:7,e:"td",f:[{p:[37,14,1003],t:7,e:"ui-button",a:{action:"PRG_renamechannel"},f:["Rename channel"]}]}]},{p:[38,6,1074],t:7,e:"tr",f:[{p:[38,10,1078],t:7,e:"td",f:[{p:[38,14,1082],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}]}]},{p:[39,6,1149],t:7,e:"tr",f:[{p:[39,10,1153],t:7,e:"td",f:[{p:[39,14,1157],t:7,e:"ui-button",a:{action:"PRG_deletechannel"},f:["Delete channel"]}]}]}],n:50,r:"data.is_operator",p:[36,5,964]}]}]}]}]}," ",{p:[43,3,1263],t:7,e:"b",f:["Chat Window"]}," ",{p:[44,4,1286],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[45,4,1342],t:7,e:"div",a:{"class":"item"},f:[{p:[46,5,1366],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"msg",p:[48,7,1450]},{p:[48,14,1457],t:7,e:"br"}],n:52,r:"data.messages",p:[47,6,1419]}]}]}]}," ",{p:[53,3,1516],t:7,e:"b",f:["Connected Users"]},{p:[53,25,1538],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"name",p:[55,4,1573]},{p:[55,12,1581],t:7,e:"br"}],n:52,r:"data.clients",p:[54,3,1546]}],n:50,r:"data.title",p:[9,2,148]},{t:4,n:51,f:[{p:[58,3,1613],t:7,e:"b",f:["Controls:"]}," ",{p:[59,3,1633],t:7,e:"table",f:[{p:[60,4,1645],t:7,e:"tr",f:[{p:[60,8,1649],t:7,e:"td",f:[{p:[60,12,1653],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[61,4,1720],t:7,e:"tr",f:[{p:[61,8,1724],t:7,e:"td",f:[{p:[61,12,1728],t:7,e:"ui-button",a:{action:"PRG_newchannel"},f:["New Channel"]}]}]},{p:[62,4,1791],t:7,e:"tr",f:[{p:[62,8,1795],t:7,e:"td",f:[{p:[62,12,1799],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]}]}," ",{p:[64,3,1889],t:7,e:"b",f:["Available channels:"]}," ",{p:[65,3,1919],t:7,e:"table",f:[{t:4,f:[{p:[67,4,1964],t:7,e:"tr",f:[{p:[67,8,1968],t:7,e:"td",f:[{p:[67,12,1972],t:7,e:"ui-button",a:{action:"PRG_joinchannel",params:['{"id": "',{t:2,r:"id",p:[67,64,2024]},'"}']},f:[{t:2,r:"chan",p:[67,74,2034]}]},{p:[67,94,2054],t:7,e:"br"}]}]}],n:52,r:"data.all_channels",p:[66,3,1930]}]}],r:"data.title"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],423:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:["##SYSTEM ERROR: ",{t:2,r:"data.error",p:[6,19,117]},{p:[6,33,131],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["RESET"]}],n:50,r:"data.error",p:[5,2,79]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.target"],s:"_0"},f:["##DoS traffic generator active. Tx: ",{t:2,r:"data.speed",p:[8,39,243]},"GQ/s",{p:[8,57,261],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"nums",p:[10,4,300]},{p:[10,12,308],t:7,e:"br"}],n:52,r:"data.dos_strings",p:[9,3,269]}," ",{p:[12,3,329],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["ABORT"]}]},{t:4,n:50,x:{r:["data.target"],s:"!(_0)"},f:[" ##DoS traffic generator ready. Select target device.",{p:[14,55,443],t:7,e:"br"}," ",{t:4,f:["Targeted device ID: ",{t:2,r:"data.focus",p:[16,24,494]}],n:50,r:"data.focus",p:[15,3,451]},{t:4,n:51,f:["Targeted device ID: None"],r:"data.focus"}," ",{p:[20,3,564],t:7,e:"ui-button",a:{action:"PRG_execute"},f:["EXECUTE"]},{p:[20,54,615],t:7,e:"div",a:{style:"clear:both"}}," Detected devices on network:",{p:[21,31,677],t:7,e:"br"}," ",{t:4,f:[{p:[23,4,711],t:7,e:"ui-button",a:{action:"PRG_target_relay",params:['{"targid": "',{t:2,r:"id",p:[23,61,768]},'"}']},f:[{t:2,r:"id",p:[23,71,778]}]}],n:52,r:"data.relays",p:[22,3,685]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],424:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["Welcome to software download utility. Please select which software you wish to download."]},{p:[5,97,174],t:7,e:"hr"}," ",{t:4,f:[{p:[7,3,203],t:7,e:"ui-display",a:{title:"Download Error"},f:[{p:[8,4,243],t:7,e:"ui-section",a:{label:"Information"},f:[{t:2,r:"data.error",p:[9,5,281]}]}," ",{p:[11,4,318],t:7,e:"ui-section",a:{label:"Reset Program"},f:[{p:[12,5,358],t:7,e:"ui-button",a:{icon:"times",action:"PRG_reseterror"},f:["RESET"]}]}]}],n:50,r:"data.error",p:[6,2,181]},{t:4,n:51,f:[{t:4,f:[{p:[19,4,516],t:7,e:"ui-display",a:{title:"Download Running"},f:[{p:[20,5,559],t:7,e:"i",f:["Please wait..."]}," ",{p:[21,5,586],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"data.downloadname",p:[22,6,623]}]}," ",{p:[24,5,669],t:7,e:"ui-section",a:{label:"File description"},f:[{t:2,r:"data.downloaddesc",p:[25,6,713]}]}," ",{p:[27,5,759],t:7,e:"ui-section",a:{label:"File size"},f:[{t:2,r:"data.downloadsize",p:[28,6,796]},"GQ"]}," ",{p:[30,5,844],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{t:2,r:"data.downloadspeed",p:[31,6,885]}," GQ/s"]}," ",{p:[33,5,937],t:7,e:"ui-section",a:{label:"Download progress"},f:[{p:[34,6,982],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.downloadsize",p:[34,27,1003]}],value:[{t:2,r:"adata.downloadcompletion",p:[34,58,1034]}],state:"good"},f:[{t:2,x:{r:["adata.downloadcompletion"],s:"Math.round(_0)"},p:[34,101,1077]},"GQ / ",{t:2,r:"adata.downloadsize",p:[34,146,1122]},"GQ"]}]}]}],n:50,r:"data.downloadname",p:[18,3,486]}],r:"data.error"}," ",{t:4,f:[{t:4,f:[{p:[41,4,1270],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,5,1308],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,6,1349],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,27,1370]}],value:[{t:2,r:"adata.disk_used",p:[43,55,1398]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,89,1432]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,125,1468]},"GQ"]}]}]}," ",{p:[47,4,1545],t:7,e:"ui-display",a:{title:"Primary Software Repository"},f:[{t:4,f:[{p:[49,6,1642],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[49,28,1664]}]},f:[{p:[50,7,1686],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[50,61,1740]}]}," ",{p:[52,7,1774],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[53,8,1813]}," (",{t:2,r:"size",p:[53,22,1827]}," GQ)"]}," ",{p:[55,7,1868],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[56,8,1911]}]}," ",{p:[58,7,1957],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[58,80,2030]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[62,6,2113],t:7,e:"br"}],n:52,r:"data.downloadable_programs",p:[48,5,1599]}]}," ",{t:4,f:[{p:[67,5,2194],t:7,e:"ui-display",a:{title:"UNKNOWN Software Repository"},f:[{p:[68,6,2249],t:7,e:"i",f:["Please note that Nanotrasen does not recommend download of software from non-official servers."]}," ",{t:4,f:[{p:[70,7,2395],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[70,29,2417]}]},f:[{p:[71,8,2440],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[71,62,2494]}]}," ",{p:[73,8,2530],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[74,9,2570]}," (",{t:2,r:"size",p:[74,23,2584]}," GQ)"]}," ",{p:[76,8,2627],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[77,9,2671]}]}," ",{p:[79,8,2719],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename", -p:[79,81,2792]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[83,7,2879],t:7,e:"br"}],n:52,r:"data.hacked_programs",p:[69,6,2357]}]}],n:50,r:"data.hackedavailable",p:[66,4,2160]}],n:50,x:{r:["data.error"],s:"!_0"},p:[40,3,1246]}],n:50,x:{r:["data.downloadname"],s:"!_0"},p:[39,2,1216]}," ",{p:[89,2,2954],t:7,e:"br"},{p:[89,6,2958],t:7,e:"br"},{p:[89,10,2962],t:7,e:"hr"},{p:[89,14,2966],t:7,e:"i",f:["NTOS v2.0.4b Copyright Nanotrasen 2557 - 2559"]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],425:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[6,2,81],t:7,e:"ui-display",a:{title:"WIRELESS CONNECTIVITY"},f:[{p:[8,3,129],t:7,e:"ui-section",a:{label:"Active NTNetRelays"},f:[{p:[9,4,173],t:7,e:"b",f:[{t:2,r:"data.ntnetrelays",p:[9,7,176]}]}]}," ",{t:4,f:[{p:[12,4,250],t:7,e:"ui-section",a:{label:"System status"},f:[{p:[13,6,291],t:7,e:"b",f:[{t:2,x:{r:["data.ntnetstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[13,9,294]}]}]}," ",{p:[15,4,366],t:7,e:"ui-section",a:{label:"Control"},f:[{p:[17,4,401],t:7,e:"ui-button",a:{icon:"plus",action:"toggleWireless"},f:["TOGGLE"]}]}," ",{p:[21,4,500],t:7,e:"br"},{p:[21,8,504],t:7,e:"br"}," ",{p:[22,4,513],t:7,e:"i",f:["Caution - Disabling wireless transmitters when using wireless device may prevent you from re-enabling them again!"]}],n:50,r:"data.ntnetrelays",p:[11,3,221]},{t:4,n:51,f:[{p:[24,4,650],t:7,e:"br"},{p:[24,8,654],t:7,e:"p",f:["Wireless coverage unavailable, no relays are connected."]}],r:"data.ntnetrelays"}]}," ",{p:[29,2,750],t:7,e:"ui-display",a:{title:"FIREWALL CONFIGURATION"},f:[{p:[31,2,798],t:7,e:"table",f:[{p:[32,3,809],t:7,e:"tr",f:[{p:[33,4,818],t:7,e:"th",f:["PROTOCOL"]},{p:[34,4,835],t:7,e:"th",f:["STATUS"]},{p:[35,4,850],t:7,e:"th",f:["CONTROL"]}]},{p:[36,3,865],t:7,e:"tr",f:[" ",{p:[37,4,874],t:7,e:"td",f:["Software Downloads"]},{p:[38,4,901],t:7,e:"td",f:[{t:2,x:{r:["data.config_softwaredownload"],s:'_0?"ENABLED":"DISABLED"'},p:[38,8,905]}]},{p:[39,4,967],t:7,e:"td",f:[" ",{p:[39,9,972],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "1"}'},f:["TOGGLE"]}]}]},{p:[40,3,1051],t:7,e:"tr",f:[" ",{p:[41,4,1060],t:7,e:"td",f:["Peer to Peer Traffic"]},{p:[42,4,1089],t:7,e:"td",f:[{t:2,x:{r:["data.config_peertopeer"],s:'_0?"ENABLED":"DISABLED"'},p:[42,8,1093]}]},{p:[43,4,1149],t:7,e:"td",f:[{p:[43,8,1153],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "2"}'},f:["TOGGLE"]}]}]},{p:[44,3,1232],t:7,e:"tr",f:[" ",{p:[45,4,1241],t:7,e:"td",f:["Communication Systems"]},{p:[46,4,1271],t:7,e:"td",f:[{t:2,x:{r:["data.config_communication"],s:'_0?"ENABLED":"DISABLED"'},p:[46,8,1275]}]},{p:[47,4,1334],t:7,e:"td",f:[{p:[47,8,1338],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "3"}'},f:["TOGGLE"]}]}]},{p:[48,3,1417],t:7,e:"tr",f:[" ",{p:[49,4,1426],t:7,e:"td",f:["Remote System Control"]},{p:[50,4,1456],t:7,e:"td",f:[{t:2,x:{r:["data.config_systemcontrol"],s:'_0?"ENABLED":"DISABLED"'},p:[50,8,1460]}]},{p:[51,4,1519],t:7,e:"td",f:[{p:[51,8,1523],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "4"}'},f:["TOGGLE"]}]}]}]}]}," ",{p:[55,2,1630],t:7,e:"ui-display",a:{title:"SECURITY SYSTEMS"},f:[{t:4,f:[{p:[58,4,1699],t:7,e:"ui-notice",f:[{p:[59,5,1716],t:7,e:"h1",f:["NETWORK INCURSION DETECTED"]}]}," ",{p:[61,5,1774],t:7,e:"i",f:["An abnormal activity has been detected in the network. Please verify system logs for more information"]}],n:50,r:"data.idsalarm",p:[57,3,1673]}," ",{p:[64,3,1902],t:7,e:"ui-section",a:{label:"Intrusion Detection System"},f:[{p:[65,4,1954],t:7,e:"b",f:[{t:2,x:{r:["data.idsstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[65,7,1957]}]}]}," ",{p:[68,3,2029],t:7,e:"ui-section",a:{label:"Maximal Log Count"},f:[{p:[69,4,2072],t:7,e:"b",f:[{t:2,r:"data.ntnetmaxlogs",p:[69,7,2075]}]}]}," ",{p:[72,3,2125],t:7,e:"ui-section",a:{label:"Controls"},f:[]}," ",{p:[74,4,2176],t:7,e:"table",f:[{p:[75,4,2188],t:7,e:"tr",f:[{p:[75,8,2192],t:7,e:"td",f:[{p:[75,12,2196],t:7,e:"ui-button",a:{action:"resetIDS"},f:["RESET IDS"]}]}]},{p:[76,4,2251],t:7,e:"tr",f:[{p:[76,8,2255],t:7,e:"td",f:[{p:[76,12,2259],t:7,e:"ui-button",a:{action:"toggleIDS"},f:["TOGGLE IDS"]}]}]},{p:[77,4,2316],t:7,e:"tr",f:[{p:[77,8,2320],t:7,e:"td",f:[{p:[77,12,2324],t:7,e:"ui-button",a:{action:"updatemaxlogs"},f:["SET LOG LIMIT"]}]}]},{p:[78,4,2388],t:7,e:"tr",f:[{p:[78,8,2392],t:7,e:"td",f:[{p:[78,12,2396],t:7,e:"ui-button",a:{action:"purgelogs"},f:["PURGE LOGS"]}]}]}]}," ",{p:[81,3,2467],t:7,e:"ui-subdisplay",a:{title:"System Logs"},f:[{p:[82,3,2506],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[83,3,2561],t:7,e:"div",a:{"class":"item"},f:[{p:[84,4,2584],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"entry",p:[86,6,2667]},{p:[86,15,2676],t:7,e:"br"}],n:52,r:"data.ntnetlogs",p:[85,5,2636]}]}]}]}]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],426:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,2,102],t:7,e:"div",a:{"class":"item"},f:[{p:[8,3,124],t:7,e:"h2",f:["An error has occurred during operation..."]}," ",{p:[9,3,178],t:7,e:"b",f:["Additional information:"]},{t:2,r:"data.error",p:[9,34,209]},{p:[9,48,223],t:7,e:"br"}," ",{p:[10,3,231],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Clear"]}]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.downloading"],s:"_0"},f:[{p:[13,3,321],t:7,e:"h2",f:["Download in progress..."]}," ",{p:[14,3,357],t:7,e:"div",a:{"class":"itemLabel"},f:["Downloaded file:"]}," ",{p:[17,3,416],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_name",p:[18,4,446]}]}," ",{p:[20,3,483],t:7,e:"div",a:{"class":"itemLabel"},f:["Download progress:"]}," ",{p:[23,3,544],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_progress",p:[24,4,574]}," / ",{t:2,r:"data.download_size",p:[24,33,603]}," GQ"]}," ",{p:[26,3,642],t:7,e:"div",a:{"class":"itemLabel"},f:["Transfer speed:"]}," ",{p:[29,3,700],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_netspeed",p:[30,4,730]},"GQ/s"]}," ",{p:[32,3,774],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[35,3,826],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[36,4,856],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Abort download"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading"],s:"(!(_0))&&(_1)"},f:[" ",{p:[39,3,954],t:7,e:"h2",f:["Server enabled"]}," ",{p:[40,3,981],t:7,e:"div",a:{"class":"itemLabel"},f:["Connected clients:"]}," ",{p:[43,3,1042],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_clients",p:[44,4,1072]}]}," ",{p:[46,3,1109],t:7,e:"div",a:{"class":"itemLabel"},f:["Provided file:"]}," ",{p:[49,3,1166],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_filename",p:[50,4,1196]}]}," ",{p:[52,3,1234],t:7,e:"div",a:{"class":"itemLabel"},f:["Server password:"]}," ",{p:[55,3,1293],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ENABLED"],n:50,r:"data.upload_haspassword",p:[56,4,1323]},{t:4,n:51,f:["DISABLED"],r:"data.upload_haspassword"}]}," ",{p:[62,3,1420],t:7,e:"div",a:{"class":"itemLabel"},f:["Commands:"]}," ",{p:[65,3,1472],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[66,4,1502],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[67,4,1567],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Exit server"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(_2))"},f:[" ",{p:[70,3,1668],t:7,e:"h2",f:["File transfer server ready. Select file to upload:"]}," ",{p:[71,3,1732],t:7,e:"table",f:[{p:[72,3,1743],t:7,e:"tr",f:[{p:[72,7,1747],t:7,e:"th",f:["File name"]},{p:[72,20,1760],t:7,e:"th",f:["File size"]},{p:[72,33,1773],t:7,e:"th",f:["Controls ",{t:4,f:[{p:[74,4,1824],t:7,e:"tr",f:[{p:[74,8,1828],t:7,e:"td",f:[{t:2,r:"filename",p:[74,12,1832]}]},{p:[75,4,1849],t:7,e:"td",f:[{t:2,r:"size",p:[75,8,1853]},"GQ"]},{p:[76,4,1868],t:7,e:"td",f:[{p:[76,8,1872],t:7,e:"ui-button",a:{action:"PRG_uploadfile",params:['{"id": "',{t:2,r:"uid",p:[76,59,1923]},'"}']},f:["Select"]}]}]}],n:52,r:"data.upload_filelist",p:[73,3,1789]}]}]}]}," ",{p:[79,3,1981],t:7,e:"hr"}," ",{p:[80,3,1989],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[81,3,2053],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Return"]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(!(_2)))"},f:[" ",{p:[83,3,2116],t:7,e:"h2",f:["Available files:"]}," ",{p:[84,3,2145],t:7,e:"table",a:{border:"1",style:"border-collapse: collapse"},f:[{p:[84,55,2197],t:7,e:"tr",f:[{p:[84,59,2201],t:7,e:"th",f:["Server UID"]},{p:[84,73,2215],t:7,e:"th",f:["File Name"]},{p:[84,86,2228],t:7,e:"th",f:["File Size"]},{p:[84,99,2241],t:7,e:"th",f:["Password Protection"]},{p:[84,122,2264],t:7,e:"th",f:["Operations ",{t:4,f:[{p:[86,5,2311],t:7,e:"tr",f:[{p:[86,9,2315],t:7,e:"td",f:[{t:2,r:"uid",p:[86,13,2319]}]},{p:[87,5,2332],t:7,e:"td",f:[{t:2,r:"filename",p:[87,9,2336]}]},{p:[88,5,2354],t:7,e:"td",f:[{t:2,r:"size",p:[88,9,2358]},"GQ ",{t:4,f:[{p:[90,6,2400],t:7,e:"td",f:["Enabled"]}],n:50,r:"haspassword",p:[89,5,2374]}," ",{t:4,f:[{p:[93,6,2457],t:7,e:"td",f:["Disabled"]}],n:50,x:{r:["haspassword"],s:"!_0"},p:[92,5,2430]}]},{p:[96,5,2494],t:7,e:"td",f:[{p:[96,9,2498],t:7,e:"ui-button",a:{action:"PRG_downloadfile",params:['{"id": "',{t:2,r:"uid",p:[96,62,2551]},'"}']},f:["Download"]}]}]}],n:52,r:"data.servers",p:[85,4,2283]}]}]}]}," ",{p:[99,3,2612],t:7,e:"hr"}," ",{p:[100,3,2620],t:7,e:"ui-button",a:{action:"PRG_uploadmenu"},f:["Send file"]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],427:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[43,1,1082],t:7,e:"ntosheader"}," ",{p:[45,1,1099],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[47,5,1157],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",p:[47,27,1179]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[49,38,1331]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[50,15,1387]}],yinc:"9"}}],n:50,r:"config.fancy",p:[46,3,1131]},{t:4,n:51,f:[{p:[52,5,1437],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[53,7,1475],t:7,e:"span",f:[{t:2,r:"data.supply",p:[53,13,1481]}]}]}," ",{p:[55,5,1528],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[56,9,1563],t:7,e:"span",f:[{t:2,r:"data.demand",p:[56,15,1569]}]}]}],r:"config.fancy"}]}," ",{p:[60,1,1638],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[61,3,1668],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[62,5,1693],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[63,5,1730],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[64,5,1769],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[65,5,1806],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[66,5,1845],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[67,5,1887],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[68,5,1928],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[71,5,2013],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[71,24,2032]}],nowrap:0},f:[{p:[72,7,2057],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[72,28,2078]}," %"]}," ",{p:[73,7,2136],t:7,e:"div",a:{"class":"content"},f:[{t:2,rx:{r:"adata.areas",m:[{t:30,n:"@index"},"load"]},p:[73,28,2157]}]}," ",{p:[74,7,2199],t:7,e:"div",a:{"class":"content"},f:[{p:[74,28,2220],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[74,41,2233]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[74,70,2262]}]}]}," ",{p:[75,7,2309],t:7,e:"div",a:{"class":"content"},f:[{p:[75,28,2330],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[75,41,2343]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[75,64,2366]}," [",{p:[75,87,2389],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[75,93,2395]}]},"]"]}]}," ",{p:[76,7,2444],t:7,e:"div",a:{"class":"content"},f:[{p:[76,28,2465],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[76,41,2478]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[76,64,2501]}," [",{p:[76,87,2524],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[76,93,2530]}]},"]"]}]}," ",{p:[77,7,2579],t:7,e:"div",a:{"class":"content"},f:[{p:[77,28,2600],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[77,41,2613]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[77,64,2636]}," [",{p:[77,87,2659],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[77,93,2665]}]},"]"]}]}]}],n:52,r:"data.areas",p:[70,3,1987]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],428:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"div",a:{"class":"item"},f:[{p:[6,3,101],t:7,e:"div",a:{"class":"itemLabel"},f:["Payload status:"]}," ",{p:[9,3,158],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ARMED"],n:50,r:"data.armed",p:[10,4,188]},{t:4,n:51,f:["DISARMED"],r:"data.armed"}]}," ",{p:[16,3,270],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[19,3,321],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[20,4,351],t:7,e:"table",f:[{p:[21,4,363],t:7,e:"tr",f:[{p:[21,8,367],t:7,e:"td",f:[{p:[21,12,371],t:7,e:"ui-button",a:{action:"PRG_obfuscate"},f:["OBFUSCATE PROGRAM NAME"]}]}]},{p:[22,4,444],t:7,e:"tr",f:[{p:[22,8,448],t:7,e:"td",f:[{p:[22,12,452],t:7,e:"ui-button",a:{action:"PRG_arm",state:[{t:2,x:{r:["data.armed"],s:'_0?"danger":null'},p:[22,47,487]}]},f:[{t:2,x:{r:["data.armed"],s:'_0?"DISARM":"ARM"'},p:[22,81,521]}]}," ",{p:[23,4,571],t:7,e:"ui-button",a:{icon:"radiation",state:[{t:2,x:{r:["data.armed"],s:'_0?null:"disabled"'},p:[23,39,606]}],action:"PRG_activate"},f:["ACTIVATE"]}]}]}]}]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],429:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[5,3,95],t:7,e:"ui-display",a:{title:[{t:2,r:"class",p:[5,22,114]}," Alarms"]},f:[{p:[6,5,138],t:7,e:"ul",f:[{t:4,f:[{p:[8,9,171],t:7,e:"li",f:[{t:2,r:".",p:[8,13,175]}]}],n:52,r:".",p:[7,7,150]},{t:4,n:51,f:[{p:[10,9,211],t:7,e:"li",f:["System Nominal"]}],r:"."}]}]}],n:52,i:"class",r:"data.alarms",p:[4,1,64]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],430:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{integState:function(t){var e=100;return t==e?"good":t>e/2?"average":"bad"},bigState:function(t,e,n){return charge>n?"bad":t>e?"average":"good"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[23,1,421],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[27,2,462],t:7,e:"ui-button",a:{action:"PRG_clear"},f:["Back to Menu"]},{p:[27,56,516],t:7,e:"br"}," ",{p:[28,3,524],t:7,e:"ui-display",a:{title:"Supermatter Status:"},f:[{p:[29,3,568],t:7,e:"ui-section",a:{label:"Core Integrity"},f:[{p:[30,5,609],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"adata.SM_integrity",p:[30,38,642]}],state:[{t:2,x:{r:["integState","adata.SM_integrity"],s:"_0(_1)"},p:[30,69,673]}]},f:[{t:2,r:"data.SM_integrity",p:[30,105,709]},"%"]}]}," ",{p:[32,3,761],t:7,e:"ui-section",a:{label:"Relative EER"},f:[{p:[33,5,800],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_power"],s:"_0(_1,150,300)"},p:[33,18,813]}]},f:[{t:2,r:"data.SM_power",p:[33,55,850]}," MeV/cm3"]}]}," ",{p:[35,3,903],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[36,5,941],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_ambienttemp"],s:"_0(_1,4000,5000)"},p:[36,18,954]}]},f:[{t:2,r:"data.SM_ambienttemp",p:[36,63,999]}," K"]}]}," ",{p:[38,3,1052],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[39,5,1087],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_ambientpressure"],s:"_0(_1,5000,10000)"},p:[39,18,1100]}]},f:[{t:2,r:"data.SM_ambientpressure",p:[39,68,1150]}," kPa"]}]}]}," ",{p:[42,3,1227],t:7,e:"hr"},{p:[42,7,1231],t:7,e:"br"}," ",{p:[43,3,1239],t:7,e:"ui-display",a:{title:"Gas Composition:"},f:[{t:4,f:[{p:[45,5,1307],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[45,24,1326]}]},f:[{t:2,r:"amount",p:[46,6,1343]}," %"]}],n:52,r:"data.gases",p:[44,4,1281]}]}],n:50,r:"data.active",p:[26,1,440]},{t:4,n:51,f:[{p:[51,2,1418],t:7,e:"ui-button",a:{action:"PRG_refresh"},f:["Refresh"]},{p:[51,53,1469],t:7,e:"br"}," ",{p:[52,2,1476],t:7,e:"ui-display",a:{title:"Detected Supermatters"},f:[{t:4,f:[{p:[54,3,1552],t:7,e:"ui-section",a:{label:"Area"},f:[{t:2,r:"area_name",p:[55,5,1583]}," - (#",{t:2,r:"uid",p:[55,23,1601]},")"]}," ",{p:[57,3,1630],t:7,e:"ui-section",a:{label:"Integrity"},f:[{t:2,r:"integrity",p:[58,5,1666]}," %"]}," ",{p:[60,3,1702],t:7,e:"ui-section",a:{label:"Options"},f:[{p:[61,5,1736],t:7,e:"ui-button",a:{action:"PRG_set",params:['{"target" : "',{t:2,r:"uid",p:[61,54,1785]},'"}']},f:["View Details"]}]}],n:52,r:"data.supermatters",p:[53,2,1521]}]}],r:"data.active"}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],431:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"item",style:"float: left"},f:[{p:[2,2,41],t:7,e:"table",f:[{p:[2,9,48],t:7,e:"tr",f:[{t:4,f:[{p:[4,3,113],t:7,e:"td",f:[{p:[4,7,117],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[4,17,127]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[3,2,55]}," ",{t:4,f:[{p:[7,3,226],t:7,e:"td",f:[{p:[7,7,230],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[7,10,233]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[6,2,165]}," ",{t:4,f:[{p:[10,3,305],t:7,e:"td",f:[{p:[10,7,309],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[10,17,319]}]}}]}],n:50,r:"data.PC_ntneticon",p:[9,2,276]}," ",{t:4,f:[{p:[13,3,386],t:7,e:"td",f:[{p:[13,7,390],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[13,17,400]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[12,2,355]}," ",{t:4,f:[{p:[16,3,469],t:7,e:"td",f:[{p:[16,7,473],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[16,10,476]}]}]}],n:50,r:"data.PC_stationtime",p:[15,2,438]}," ",{t:4,f:[{p:[19,3,552],t:7,e:"td",f:[{p:[19,7,556],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[19,17,566]}]}}]}],n:52,r:"data.PC_programheaders",p:[18,2,516]}]}]}]}," ",{p:[23,1,609],t:7,e:"div",a:{style:"float: right; margin-top: 5px"},f:[{p:[24,2,655],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[26,3,745],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}," ",{p:[27,3,801],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}],n:50,r:"data.PC_showexitprogram",p:[25,2,710]}]}," ",{p:[30,1,881],t:7,e:"div",a:{style:"clear: both"}}]},e.exports=a.extend(r.exports)},{341:341}],432:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Auth. Disk:"},f:[{t:4,f:[{p:[3,7,69],t:7,e:"ui-button",a:{icon:"eject",style:"selected",action:"eject_disk"},f:["++++++++++"]}],n:50,r:"data.disk_present",p:[2,3,36]},{t:4,n:51,f:[{p:[5,7,172],t:7,e:"ui-button",a:{icon:"plus",action:"insert_disk"},f:["----------"]}],r:"data.disk_present"}]}," ",{p:[8,1,266],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[9,3,297],t:7,e:"span",f:[{t:2,r:"data.status1",p:[9,9,303]},"-",{t:2,r:"data.status2",p:[9,26,320]}]}]}," ",{p:[11,1,360],t:7,e:"ui-display",a:{title:"Timer"},f:[{p:[12,3,390],t:7,e:"ui-section",a:{label:"Time to Detonation"},f:[{p:[13,5,435],t:7,e:"span",f:[{t:2,x:{r:["data.timing","data.time_left","data.timer_set"],s:"_0?_1:_2"},p:[13,11,441]}]}]}," ",{t:4,f:[{p:[16,5,540],t:7,e:"ui-section",a:{label:"Adjust Timer"},f:[{p:[17,7,581],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_default"],s:'_0&&_1&&_2?null:"disabled"'},p:[17,40,614]}],action:"timer",params:'{"change": "reset"}'},f:["Reset"]}," ",{p:[19,7,786],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_min"],s:'_0&&_1&&_2?null:"disabled"'},p:[19,38,817]}],action:"timer",params:'{"change": "decrease"}'},f:["Decrease"]}," ",{p:[21,7,991],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[21,39,1023]}],action:"timer",params:'{"change": "input"}'},f:["Set"]}," ",{p:[22,7,1155],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_max"],s:'_0&&_1&&_2?null:"disabled"'},p:[22,37,1185]}],action:"timer",params:'{"change": "increase"}'},f:["Increase"]}]}],n:51,r:"data.timing",p:[15,3,518]}," ",{p:[26,3,1394],t:7,e:"ui-section",a:{label:"Timer"},f:[{p:[27,5,1426],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"danger":"caution"'},p:[27,38,1459]}],action:"toggle_timer",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.safety"],s:'_0&&_1&&!_2?null:"disabled"'},p:[29,14,1542]}]},f:[{t:2,x:{r:["data.timing"],s:'_0?"On":"Off"'},p:[30,7,1631]}]}]}]}," ",{p:[34,1,1713],t:7,e:"ui-display",a:{title:"Anchoring"},f:[{p:[35,3,1747],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[36,12,1770]}],icon:[{t:2,x:{r:["data.anchored"],s:'_0?"lock":"unlock"'},p:[37,11,1846]}],style:[{t:2,x:{r:["data.anchored"],s:'_0?null:"caution"'},p:[38,12,1897]}],action:"anchor"},f:[{t:2,x:{r:["data.anchored"],s:'_0?"Engaged":"Off"'},p:[39,21,1956]}]}]}," ",{p:[41,1,2022],t:7,e:"ui-display",a:{title:"Safety"},f:[{p:[42,3,2053],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[43,12,2076]}],icon:[{t:2,x:{r:["data.safety"],s:'_0?"lock":"unlock"'},p:[44,11,2152]}],action:"safety",style:[{t:2,x:{r:["data.safety"],s:'_0?"caution":"danger"'},p:[45,12,2217]}]},f:[{p:[46,7,2265],t:7,e:"span",f:[{t:2,x:{r:["data.safety"],s:'_0?"On":"Off"'},p:[46,13,2271]}]}]}]}," ",{p:[49,1,2341],t:7,e:"ui-display",a:{title:"Code"},f:[{p:[50,3,2370],t:7,e:"ui-section",a:{label:"Message"},f:[{t:2,r:"data.message",p:[50,31,2398]}]}," ",{p:[51,3,2431],t:7,e:"ui-section",a:{label:"Keypad"},f:[{p:[52,5,2464],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[52,39,2498]}],params:'{"digit":"1"}'},f:["1"]}," ",{p:[53,5,2583],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[53,39,2617]}],params:'{"digit":"2"}'},f:["2"]}," ",{p:[54,5,2702],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[54,39,2736]}],params:'{"digit":"3"}'},f:["3"]}," ",{p:[55,5,2821],t:7,e:"br"}," ",{p:[56,5,2831],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[56,39,2865]}],params:'{"digit":"4"}'},f:["4"]}," ",{p:[57,5,2950],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[57,39,2984]}],params:'{"digit":"5"}'},f:["5"]}," ",{p:[58,5,3069],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[58,39,3103]}],params:'{"digit":"6"}'},f:["6"]}," ",{p:[59,5,3188],t:7,e:"br"}," ",{p:[60,5,3198],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[60,39,3232]}],params:'{"digit":"7"}'},f:["7"]}," ",{p:[61,5,3317],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[61,39,3351]}],params:'{"digit":"8"}'},f:["8"]}," ",{p:[62,5,3436],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[62,39,3470]}],params:'{"digit":"9"}'},f:["9"]}," ",{p:[63,5,3555],t:7,e:"br"}," ",{p:[64,5,3565],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[64,39,3599]}],params:'{"digit":"R"}'},f:["R"]}," ",{p:[65,5,3684],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[65,39,3718]}],params:'{"digit":"0"}'},f:["0"]}," ",{p:[66,5,3803],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[66,39,3837]}],params:'{"digit":"E"}'},f:["E"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],433:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,25],t:7,e:"ui-button",a:{icon:"undo",action:"change_menu",params:'{"menu": "1"}'},f:["Return"]}," ",{p:[3,2,113],t:7,e:"ui-display",a:{title:"Advanced Surgery Procedures"},f:[{p:[4,3,165],t:7,e:"ui-button",a:{icon:"download",action:"sync"},f:["Sync with research database"]}," ",{t:4,f:[{p:[6,4,278],t:7,e:"ui-display",f:[{p:[7,6,297],t:7,e:"ui-section",f:[{p:[7,18,309],t:7,e:"b",f:[{t:2,r:"name",p:[7,21,312]}]}]}," ",{p:[8,6,344],t:7,e:"ui-section",f:[{t:2,r:"desc",p:[8,18,356]}]}]}],n:52,r:"data.surgeries",p:[5,3,249]}]}],n:50,x:{r:["data.menu"],s:"_0==2"},p:[1,1,0]},{t:4,n:51,f:[{p:[13,2,437],t:7,e:"ui-button",a:{action:"change_menu",params:'{"menu": "2"}'},f:["View Surgery Procedures"]}," ",{t:4,f:[{p:[15,3,556],t:7,e:"ui-notice",f:["No table detected!"]}],n:51,r:"data.table",p:[14,2,530]}," ",{p:[19,2,623],t:7,e:"ui-display",f:[{p:[20,3,639],t:7,e:"ui-display",a:{title:"Patient State"},f:[{t:4,f:[{p:[22,5,704],t:7,e:"ui-section",a:{label:"State"},f:[{p:[23,6,737],t:7,e:"span",a:{"class":[{t:2,r:"data.patient.statstate",p:[23,19,750]}]},f:[{t:2,r:"data.patient.stat",p:[23,47,778]}]}]}," ",{p:[25,5,831],t:7,e:"ui-section",a:{label:"Blood Type"},f:[{p:[26,6,869],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.patient.blood_type",p:[26,28,891]}]}]}," ",{p:[28,5,950],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[29,6,984],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.patient.minHealth",p:[29,19,997]}],max:[{t:2,r:"data.patient.maxHealth",p:[29,52,1030]}],value:[{t:2,r:"data.patient.health",p:[29,87,1065]}],state:[{t:2,x:{r:["data.patient.health"],s:'_0>=0?"good":"average"'},p:[30,13,1103]}]},f:[{t:2,x:{r:["adata.patient.health"],s:"Math.round(_0)"},p:[30,64,1154]}]}]}," ",{t:4,f:[{p:[33,6,1389],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[33,25,1408]}]},f:[{p:[34,7,1427],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.patient.maxHealth",p:[34,28,1448]}],value:[{t:2,rx:{r:"data.patient",m:[{t:30,n:"type"}]},p:[34,63,1483]}],state:"bad"},f:[{t:2,x:{r:["type","adata.patient"],s:"Math.round(_1[_0])"},p:[34,99,1519]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Burn",type:"fireLoss"},{label:"Toxin",type:"toxLoss"},{label:"Respiratory",type:"oxyLoss"}]'},p:[32,5,1224]}],n:50,r:"data.patient",p:[21,4,678]},{t:4,n:51,f:["No patient detected."],r:"data.patient"}]}," ",{p:[41,3,1670],t:7,e:"ui-display",a:{title:"Initiated Procedures"},f:[{t:4,f:[{t:4,f:[{p:[44,6,1777],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"name",p:[44,28,1799]}]},f:[{p:[45,7,1817],t:7,e:"ui-section",a:{label:"Next Step"},f:[{p:[46,8,1856],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"next_step",p:[46,30,1878]}]}," ",{t:4,f:[{p:[48,9,1937],t:7,e:"span",a:{"class":"content"},f:[{p:[48,31,1959],t:7,e:"b",f:["Required chemicals:"]},{p:[48,57,1985],t:7,e:"br"}," ",{t:2,r:"chems_needed",p:[48,62,1990]}]}],n:50,r:"chems_needed",p:[47,8,1907]}]}," ",{t:4,f:[{p:[52,8,2091],t:7,e:"ui-section",a:{label:"Alternative Step"},f:[{p:[53,9,2138],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"alternative_step",p:[53,31,2160]}]}," ",{t:4,f:[{p:[55,10,2232],t:7,e:"span",a:{"class":"content"},f:[{p:[55,32,2254],t:7,e:"b",f:["Required chemicals:"]},{p:[55,58,2280],t:7,e:"br"}," ",{t:2,r:"chems_needed",p:[55,63,2285]}]}],n:50,r:"alt_chems_needed",p:[54,9,2197]}]}],n:50,r:"alternative_step",p:[51,7,2058]}]}],n:52,r:"data.procedures",p:[43,5,1745]}],n:50,r:"data.procedures",p:[42,4,1716]},{t:4,n:51,f:["No active procedures."],r:"data.procedures"}]}]}],x:{r:["data.menu"],s:"_0==2"}}]},e.exports=a.extend(r.exports)},{341:341}],434:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"ui-section",f:["This machine only accepts ore. Gibtonite and Slag are not accepted."]}," ",{p:[5,2,117],t:7,e:"ui-section",f:["Current unclaimed points: ",{t:2,r:"data.unclaimedPoints",p:[6,29,159]}," ",{t:4,f:[{p:[8,4,220],t:7,e:"ui-button",a:{action:"Claim"},f:["Claim Points"]}],n:50,r:"data.unclaimedPoints",p:[7,3,187]}]}," ",{p:[13,2,311],t:7,e:"ui-section",f:[{t:4,f:[{p:[15,4,350],t:7,e:"ui-button",a:{action:"Eject"},f:["Eject ID"]}," You have ",{t:2,r:"data.claimedPoints",p:[18,13,421]}," mining points collected."],n:50,r:"data.hasID",p:[14,3,327]},{t:4,n:51,f:[{p:[20,4,485],t:7,e:"ui-button",a:{action:"Insert"},f:["Insert ID"]}],r:"data.hasID"}]}]}," ",{p:[26,1,588],t:7,e:"ui-display",f:[{t:4,f:[{p:[28,3,627],t:7,e:"ui-section",f:[{p:[29,4,644],t:7,e:"ui-button",a:{action:"diskEject",icon:"eject"},f:["Eject Disk"]}]}," ",{t:4,f:[{p:[34,4,772],t:7,e:"ui-section",a:{"class":"candystripe"},f:[{p:[35,5,808],t:7,e:"ui-button",a:{action:"diskUpload",state:[{t:2,x:{r:["canupload"],s:'(_0)?null:"disabled"'},p:[35,42,845]}],icon:"upload",align:"right",params:['{ "design" : "',{t:2,r:"index",p:[35,129,932]},'" }']},f:["Upload"]}," File ",{t:2,r:"index",p:[38,10,988]},": ",{t:2,r:"name",p:[38,21,999]}]}],n:52,r:"data.diskDesigns",p:[33,3,741]}],n:50,r:"data.hasDisk",p:[27,2,603]},{t:4,n:51,f:[{p:[42,3,1053],t:7,e:"ui-section",f:[{p:[43,4,1070],t:7,e:"ui-button",a:{action:"diskInsert",icon:"floppy-o"},f:["Insert Disk"]}]}],r:"data.hasDisk"}]}," ",{t:4,f:[{p:[50,2,1223],t:7,e:"ui-display",f:[{p:[51,3,1239],t:7,e:"ui-section",f:[{p:[52,4,1256],t:7,e:"b",f:["Warning"]},": ",{t:2,r:"data.disconnected",p:[52,20,1272]},". Please contact the quartermaster."]}]}],n:50,r:"data.disconnected",p:[49,1,1195]},{t:4,f:[{p:[57,2,1412],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[58,3,1445],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[59,5,1480],t:7,e:"section",a:{"class":"cell"},f:["Mineral"]}," ",{p:[62,5,1538],t:7,e:"section",a:{"class":"cell"},f:["Sheets"]}," ",{p:[65,5,1595],t:7,e:"section",a:{"class":"cell"},f:[]}," ",{p:[67,5,1639],t:7,e:"section",a:{"class":"cell"},f:[]}," ",{p:[69,5,1683],t:7,e:"section",a:{"class":"cell"},f:["Ore Value"]}]}," ",{t:4,f:[{p:[74,4,1785],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[75,5,1820],t:7,e:"section", -a:{"class":"cell"},f:[{t:2,r:"name",p:[76,6,1849]}]}," ",{p:[78,5,1879],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[79,6,1922]}]}," ",{p:[81,5,1954],t:7,e:"section",a:{"class":"cell"},f:[{p:[82,6,1983],t:7,e:"input",a:{value:[{t:2,r:"sheets",p:[82,19,1996]}],placeholder:"###","class":"number"}}]}," ",{p:[84,5,2063],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[85,6,2106],t:7,e:"ui-button",a:{"class":"center",grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[85,60,2160]}],params:['{ "id" : ',{t:2,r:"id",p:[85,115,2215]},', "sheets" : ',{t:2,r:"sheets",p:[85,134,2234]}," }"]},f:["Release"]}]}," ",{p:[89,5,2305],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"value",p:[90,6,2348]}]}]}],n:52,r:"data.materials",p:[73,3,1756]}," ",{t:4,f:[{p:[95,4,2431],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[96,5,2466],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[97,6,2495]}]}," ",{p:[99,5,2525],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[100,6,2568]}]}," ",{p:[102,5,2600],t:7,e:"section",a:{"class":"cell"},f:[{p:[103,6,2629],t:7,e:"input",a:{value:[{t:2,r:"sheets",p:[103,19,2642]}],placeholder:"###","class":"number"}}]}," ",{p:[105,5,2709],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[106,6,2752],t:7,e:"ui-button",a:{"class":"center",grid:0,action:"Smelt",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[106,58,2804]}],params:['{ "id" : ',{t:2,r:"id",p:[106,114,2860]},', "sheets" : ',{t:2,r:"sheets",p:[106,133,2879]}," }"]},f:["Smelt"]}]}," ",{p:[110,5,2947],t:7,e:"section",a:{"class":"cell",align:"right"},f:[]}]}],n:52,r:"data.alloys",p:[94,3,2405]}]}],n:50,x:{r:["data.materials","data.alloys"],s:"_0||_1"},p:[56,1,1372]}]},e.exports=a.extend(r.exports)},{341:341}],435:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:{button:[{p:[4,4,87],t:7,e:"ui-button",a:{icon:"remove",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[4,36,119]}],action:"empty_eject_beaker"},f:["Empty and eject"]}," ",{p:[7,4,231],t:7,e:"ui-button",a:{icon:"trash",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[7,35,262]}],action:"empty_beaker"},f:["Empty"]}," ",{p:[10,4,358],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[10,35,389]}],action:"eject_beaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{t:4,f:[{p:[15,4,528],t:7,e:"ui-section",f:[{t:4,f:[{p:[17,6,578],t:7,e:"span",a:{"class":"bad"},f:["The beaker is empty!"]}],n:50,r:"data.beaker_empty",p:[16,5,546]},{t:4,n:51,f:[{p:[19,6,644],t:7,e:"ui-subdisplay",a:{title:"Blood"},f:[{t:4,f:[{p:[21,8,712],t:7,e:"ui-section",a:{label:"Blood DNA"},f:[{t:2,r:"data.blood.dna",p:[21,38,742]}]}," ",{p:[22,8,782],t:7,e:"ui-section",a:{label:"Blood type"},f:[{t:2,r:"data.blood.type",p:[22,39,813]}]}],n:50,r:"data.has_blood",p:[20,7,681]},{t:4,n:51,f:[{p:[24,8,870],t:7,e:"ui-section",f:[{p:[25,9,892],t:7,e:"span",a:{"class":"average"},f:["No blood sample detected."]}]}],r:"data.has_blood"}]}],r:"data.beaker_empty"}]}],n:50,r:"data.has_beaker",p:[14,3,500]},{t:4,n:51,f:[{p:[32,4,1054],t:7,e:"ui-section",f:[{p:[33,5,1072],t:7,e:"span",a:{"class":"bad"},f:["No beaker loaded."]}]}],r:"data.has_beaker"}]}," ",{t:4,f:[{p:[38,3,1188],t:7,e:"ui-display",a:{title:"Diseases"},f:[{t:4,f:[{p:{button:[{t:4,f:[{p:[43,8,1343],t:7,e:"ui-button",a:{icon:"pencil",action:"rename_disease",state:[{t:2,x:{r:["can_rename"],s:'_0?"":"disabled"'},p:[43,64,1399]}],params:['{"index": ',{t:2,r:"index",p:[43,116,1451]},"}"]},f:["Name advanced disease"]}],n:50,r:"is_adv",p:[42,7,1320]}," ",{p:[47,7,1538],t:7,e:"ui-button",a:{icon:"flask",action:"create_culture_bottle",state:[{t:2,x:{r:["data.is_ready"],s:'_0?"":"disabled"'},p:[47,69,1600]}],params:['{"index": ',{t:2,r:"index",p:[47,124,1655]},"}"]},f:["Create virus culture bottle"]}]},t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[40,24,1269]}],button:0},f:[" ",{p:[51,6,1749],t:7,e:"ui-section",a:{label:"Disease agent"},f:[{t:2,r:"agent",p:[51,40,1783]}]}," ",{p:[52,6,1812],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"description",p:[52,38,1844]}]}," ",{p:[53,6,1879],t:7,e:"ui-section",a:{label:"Spread"},f:[{t:2,r:"spread",p:[53,33,1906]}]}," ",{p:[54,6,1936],t:7,e:"ui-section",a:{label:"Possible cure"},f:[{t:2,r:"cure",p:[54,40,1970]}]}," ",{t:4,f:[{p:[56,7,2021],t:7,e:"ui-section",a:{label:"Symptoms"},f:[{t:4,f:[{p:[58,9,2087],t:7,e:"ui-button",a:{action:"symptom_details",state:"",params:['{"picked_symptom": ',{t:2,r:"sym_index",p:[58,81,2159]},', "index": ',{t:2,r:"index",p:[58,105,2183]},"}"]},f:[{t:2,r:"name",p:[59,10,2206]}," "]},{p:[60,21,2236],t:7,e:"br"}],n:52,r:"symptoms",p:[57,8,2059]}]}," ",{p:[63,7,2289],t:7,e:"ui-section",a:{label:"Resistance"},f:[{t:2,r:"resistance",p:[63,38,2320]}]}," ",{p:[64,7,2355],t:7,e:"ui-section",a:{label:"Stealth"},f:[{t:2,r:"stealth",p:[64,35,2383]}]}," ",{p:[65,7,2415],t:7,e:"ui-section",a:{label:"Stage speed"},f:[{t:2,r:"stage_speed",p:[65,39,2447]}]}," ",{p:[66,7,2483],t:7,e:"ui-section",a:{label:"Transmittability"},f:[{t:2,r:"transmission",p:[66,44,2520]}]}],n:50,r:"is_adv",p:[55,6,1999]}]}],n:52,r:"data.viruses",p:[39,4,1222]},{t:4,n:51,f:[{p:[70,5,2601],t:7,e:"ui-section",f:[{p:[71,6,2620],t:7,e:"span",a:{"class":"average"},f:["No detectable virus in the blood sample."]}]}],r:"data.viruses"}]}," ",{p:[75,3,2743],t:7,e:"ui-display",a:{title:"Antibodies"},f:[{t:4,f:[{p:[77,5,2811],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[77,24,2830]}]},f:[{p:[78,7,2848],t:7,e:"ui-button",a:{icon:"eyedropper",state:[{t:2,x:{r:["data.is_ready"],s:'_0?"":"disabled"'},p:[78,43,2884]}],action:"create_vaccine_bottle",params:['{"index": ',{t:2,r:"id",p:[78,129,2970]},"}"]},f:["Create vaccine bottle"]}]}],n:52,r:"data.resistances",p:[76,4,2779]},{t:4,n:51,f:[{p:[83,5,3067],t:7,e:"ui-section",f:[{p:[84,6,3086],t:7,e:"span",a:{"class":"average"},f:["No antibodies detected in the blood sample."]}]}],r:"data.resistances"}]}],n:50,r:"data.has_blood",p:[37,2,1162]}],n:50,x:{r:["data.mode"],s:"_0==1"},p:[1,1,0]},{t:4,n:51,f:[{p:[90,2,3231],t:7,e:"ui-button",a:{icon:"undo",state:"",action:"back"},f:["Back"]}," ",{t:4,f:[{p:[94,4,3330],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[94,23,3349]}]},f:[{p:[95,4,3364],t:7,e:"ui-section",f:[{t:2,r:"desc",p:[96,5,3382]}," ",{t:4,f:[{p:[98,5,3417],t:7,e:"br"}," ",{p:[99,5,3428],t:7,e:"b",f:["This symptom has been neutered, and has no effect. It will still affect the virus' statistics."]}],n:50,r:"neutered",p:[97,4,3395]}]}," ",{p:[102,4,3564],t:7,e:"ui-section",f:[{p:[103,5,3582],t:7,e:"ui-section",a:{label:"Level"},f:[{t:2,r:"level",p:[103,31,3608]}]}," ",{p:[104,5,3636],t:7,e:"ui-section",a:{label:"Resistance"},f:[{t:2,r:"resistance",p:[104,36,3667]}]}," ",{p:[105,5,3700],t:7,e:"ui-section",a:{label:"Stealth"},f:[{t:2,r:"stealth",p:[105,33,3728]}]}," ",{p:[106,5,3758],t:7,e:"ui-section",a:{label:"Stage speed"},f:[{t:2,r:"stage_speed",p:[106,37,3790]}]}," ",{p:[107,5,3824],t:7,e:"ui-section",a:{label:"Transmittability"},f:[{t:2,r:"transmission",p:[107,42,3861]}]}]}," ",{p:[109,4,3913],t:7,e:"ui-subdisplay",a:{title:"Effect Thresholds"},f:[{p:[110,5,3960],t:7,e:"ui-section",f:[{t:3,r:"threshold_desc",p:[110,17,3972]}]}]}]}],n:53,r:"data.symptom",p:[93,2,3303]}],x:{r:["data.mode"],s:"_0==1"}}]},e.exports=a.extend(r.exports)},{341:341}],436:[function(t,e,n){var a=t(341),r={exports:{}};!function(e){"use strict";var n=t(484);e.exports={data:{filter:"",tooltiptext:function(t,e,n){var a="";return t&&(a+="REQUIREMENTS: "+t+" "),e&&(a+="CATALYSTS: "+e+" "),n&&(a+="TOOLS: "+n),a}},oninit:function(){var t=this;this.on({hover:function(t){this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}}),this.observe("filter",function(e,a,r){var i=null;i=t.get("data.display_compact")?t.findAll(".section"):t.findAll(".display:not(:first-child)"),(0,n.filterMulti)(i,t.get("filter").toLowerCase())},{init:!1})}}}(r),r.exports.template={v:3,t:[" ",{p:[48,1,1342],t:7,e:"ui-display",a:{title:[{t:2,r:"data.category",p:[48,20,1361]},{t:4,f:[" : ",{t:2,r:"data.subcategory",p:[48,64,1405]}],n:50,r:"data.subcategory",p:[48,37,1378]}]},f:[{t:4,f:[{p:[50,3,1459],t:7,e:"ui-section",f:["Crafting... ",{p:[51,16,1488],t:7,e:"i",a:{"class":"fa-spin fa fa-spinner"}}]}],n:50,r:"data.busy",p:[49,2,1438]},{t:4,n:51,f:[{p:[54,3,1557],t:7,e:"ui-section",f:[{p:[55,4,1574],t:7,e:"table",a:{style:"width:100%"},f:[{p:[56,5,1606],t:7,e:"tr",f:[{p:[57,6,1617],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[58,7,1659],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardCat"},f:[{t:2,r:"data.prev_cat",p:[59,8,1718]}]}]}," ",{p:[62,6,1774],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[63,7,1816],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardCat"},f:[{t:2,r:"data.next_cat",p:[64,7,1874]}]}]}," ",{p:[67,6,1930],t:7,e:"td",a:{style:"float:right!important"},f:[{t:4,f:[{p:[69,7,2014],t:7,e:"ui-button",a:{icon:"lock",action:"toggle_recipes"},f:["Showing Craftable Recipes"]}],n:50,r:"data.display_craftable_only",p:[68,6,1971]},{t:4,n:51,f:[{p:[73,7,2138],t:7,e:"ui-button",a:{icon:"unlock",action:"toggle_recipes"},f:["Showing All Recipes"]}],r:"data.display_craftable_only"}]}," ",{p:[78,6,2268],t:7,e:"td",a:{style:"float:right!important"},f:[{p:[79,7,2310],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.display_compact"],s:'_0?"check-square-o":"square-o"'},p:[79,24,2327]}],action:"toggle_compact"},f:["Compact"]}]}]}," ",{p:[84,5,2474],t:7,e:"tr",f:[{t:4,f:[{p:[86,6,2515],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[87,7,2557],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardSubCat"},f:[{t:2,r:"data.prev_subcat",p:[88,8,2619]}]}]}," ",{p:[91,6,2678],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[92,7,2720],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardSubCat"},f:[{t:2,r:"data.next_subcat",p:[93,8,2782]}]}]}],n:50,r:"data.subcategory",p:[85,5,2484]}]}]}," ",{t:4,f:[{t:4,f:[" ",{p:[101,6,2992],t:7,e:"ui-input",a:{value:[{t:2,r:"filter",p:[101,23,3009]}],placeholder:"Filter.."}}],n:51,r:"data.display_compact",p:[100,5,2902]}],n:50,r:"config.fancy",p:[99,4,2876]}]}," ",{t:4,f:[{p:[106,5,3144],t:7,e:"ui-display",f:[{t:4,f:[{p:[108,6,3193],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[108,25,3212]}]},f:[{p:[109,7,3230],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[109,27,3250]}],"tooltip-side":"right",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[109,135,3358]},'"}'],icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.can_craft",p:[107,5,3162]}," ",{t:4,f:[{t:4,f:[{p:[116,7,3567],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[116,26,3586]}]},f:[{p:[117,8,3605],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[117,28,3625]}],"tooltip-side":"right",state:"disabled",icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.cant_craft",p:[115,6,3534]}],n:51,r:"data.display_craftable_only",p:[114,5,3495]}]}],n:50,r:"data.display_compact",p:[105,4,3110]},{t:4,n:51,f:[{t:4,f:[{p:[126,6,3947],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[126,25,3966]}]},f:[{t:4,f:[{p:[128,8,4009],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[129,9,4052]}]}],n:50,r:"req_text",p:[127,7,3984]}," ",{t:4,f:[{p:[133,8,4139],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[134,9,4179]}]}],n:50,r:"catalyst_text",p:[132,7,4109]}," ",{t:4,f:[{p:[138,8,4267],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[139,9,4303]}]}],n:50,r:"tool_text",p:[137,7,4241]}," ",{p:[142,7,4361],t:7,e:"ui-section",f:[{p:[143,8,4382],t:7,e:"ui-button",a:{icon:"gears",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[143,66,4440]},'"}']},f:["Craft"]}]}]}],n:52,r:"data.can_craft",p:[125,5,3916]}," ",{t:4,f:[{t:4,f:[{p:[151,7,4621],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[151,26,4640]}]},f:[{t:4,f:[{p:[153,9,4685],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[154,10,4729]}]}],n:50,r:"req_text",p:[152,8,4659]}," ",{t:4,f:[{p:[158,9,4820],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[159,10,4861]}]}],n:50,r:"catalyst_text",p:[157,8,4789]}," ",{t:4,f:[{p:[163,9,4953],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[164,10,4990]}]}],n:50,r:"tool_text",p:[162,8,4926]}]}],n:52,r:"data.cant_craft",p:[150,6,4588]}],n:51,r:"data.display_craftable_only",p:[149,5,4549]}],r:"data.display_compact"}],r:"data.busy"}]}]},e.exports=a.extend(r.exports)},{341:341,484:484}],437:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:[4,1,113],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[5,3,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,5,186],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[6,11,192]}," kPa"]}]}," ",{p:[8,3,254],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[9,5,285],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[9,18,298]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[9,59,339]}]}]}]}," ",{p:[12,1,430],t:7,e:"ui-display",a:{title:"Pump"},f:[{p:[13,3,459],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,5,491],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[14,22,508]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[15,14,559]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[16,22,616]}]}]}," ",{p:[18,3,675],t:7,e:"ui-section",a:{label:"Direction"},f:[{p:[19,5,711],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"sign-out":"sign-in"'},p:[19,22,728]}],action:"direction"},f:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"Out":"In"'},p:[20,26,808]}]}]}," ",{p:[22,3,883],t:7,e:"ui-section",a:{label:"Target Pressure"},f:[{p:[23,5,925],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.min_pressure",p:[23,18,938]}],max:[{t:2,r:"data.max_pressure",p:[23,46,966]}],value:[{t:2,r:"data.target_pressure",p:[24,14,1003]}]},f:[{t:2,x:{r:["adata.target_pressure"],s:"Math.round(_0)"},p:[24,40,1029]}," kPa"]}]}," ",{p:[26,3,1100],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,1145],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.target_pressure","data.default_pressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,1178]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1328],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.target_pressure","data.min_pressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1359]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1500],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1595],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.target_pressure","data.max_pressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1625]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}," ",{p:{button:[{t:4,f:[{p:[39,7,1891],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[39,38,1922]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[38,5,1863]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[43,3,2042],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[44,4,2073]}]}," ",{p:[46,3,2115],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[47,4,2149]}," kPa"]}],n:50,r:"data.holding",p:[42,3,2018]},{t:4,n:51,f:[{p:[50,3,2223],t:7,e:"ui-section",f:[{p:[51,4,2240],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}]},e.exports=a.extend(r.exports)},{341:341}],438:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[3,1,69],t:7,e:"ui-notice",f:[{p:[4,3,84],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[4,23,104]}," connected to a tank."]}]}," ",{p:[6,1,182],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[7,3,220],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[8,5,255],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[8,11,261]}," kPa"]}]}," ",{p:[10,3,323],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[11,5,354],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[11,18,367]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[11,59,408]}]}]}]}," ",{p:[14,1,499],t:7,e:"ui-display",a:{title:"Filter"},f:[{p:[15,3,530],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[16,5,562],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[16,22,579]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[17,14,630]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[18,22,687]}]}]}]}," ",{p:{button:[{t:4,f:[{p:[24,7,856],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[24,38,887]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[23,5,828]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[28,3,1007],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[29,4,1038]}]}," ",{p:[31,3,1080],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[32,4,1114]}," kPa"]}],n:50,r:"data.holding",p:[27,3,983]},{t:4,n:51,f:[{p:[35,3,1188],t:7,e:"ui-section",f:[{p:[36,4,1205],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}," ",{p:[40,1,1293],t:7,e:"ui-display",a:{title:"Filters"},f:[{t:4,f:[{p:[42,5,1345],t:7,e:"filters"}],n:53,r:"data",p:[41,3,1325]}]}]},r.exports.components=r.exports.components||{};var i={filters:t(457)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,457:457}],439:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(r),r.exports.template={v:3,t:[" ",{p:[42,1,1035],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[44,5,1093],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",p:[44,27,1115]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[46,38,1267]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[47,15,1323]}],yinc:"9"}}],n:50,r:"config.fancy",p:[43,3,1067]},{t:4,n:51,f:[{p:[49,5,1373],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[50,7,1411],t:7,e:"span",f:[{t:2,r:"data.supply",p:[50,13,1417]}]}]}," ",{p:[52,5,1464],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[53,9,1499],t:7,e:"span",f:[{t:2,r:"data.demand",p:[53,15,1505]}]}]}],r:"config.fancy"}]}," ",{p:[57,1,1574],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[58,3,1604],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[59,5,1629],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[60,5,1666],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[61,5,1705],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[62,5,1742],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[63,5,1781],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[64,5,1823],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[65,5,1864],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[68,5,1949],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[68,24,1968]}],nowrap:0},f:[{p:[69,7,1993],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[69,28,2014]}," %"]}," ",{p:[70,7,2072],t:7,e:"div",a:{"class":"content"},f:[{t:2,rx:{r:"adata.areas",m:[{t:30,n:"@index"},"load"]},p:[70,28,2093]}]}," ",{p:[71,7,2135],t:7,e:"div",a:{"class":"content"},f:[{p:[71,28,2156],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[71,41,2169]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[71,70,2198]}]}]}," ",{p:[72,7,2245],t:7,e:"div",a:{"class":"content"},f:[{p:[72,28,2266],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[72,41,2279]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[72,64,2302]}," [",{p:[72,87,2325],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[72,93,2331]}]},"]"]}]}," ",{p:[73,7,2380],t:7,e:"div",a:{"class":"content"},f:[{p:[73,28,2401],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[73,41,2414]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[73,64,2437]}," [",{p:[73,87,2460],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[73,93,2466]}]},"]"]}]}," ",{p:[74,7,2515],t:7,e:"div",a:{"class":"content"},f:[{p:[74,28,2536],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[74,41,2549]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[74,64,2572]}," [",{p:[74,87,2595],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[74,93,2601]}]},"]"]}]}]}],n:52,r:"data.areas",p:[67,3,1923]}]}]},e.exports=a.extend(r.exports)},{341:341}],440:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{readableFrequency:function(){return Math.round(this.get("adata.frequency"))/10}}}}(r),r.exports.template={v:3,t:[" ",{p:[11,1,177],t:7,e:"ui-display",a:{title:"Settings"},f:[{t:4,f:[{p:[13,5,236],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,7,270],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[14,24,287]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[14,75,338]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"On":"Off"'},p:[16,9,413]}]}]}],n:50,r:"data.headset",p:[12,3,210]},{t:4,n:51,f:[{p:[19,5,494],t:7,e:"ui-section",a:{label:"Microphone"},f:[{p:[20,7,533],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.broadcasting"],s:'_0?"power-off":"close"'},p:[20,24,550]}],style:[{t:2,x:{r:["data.broadcasting"],s:'_0?"selected":null'},p:[20,78,604]}],action:"broadcast"},f:[{t:2,x:{r:["data.broadcasting"],s:'_0?"Engaged":"Disengaged"'},p:[22,9,685]}]}]}," ",{p:[24,5,769],t:7,e:"ui-section",a:{label:"Speaker"},f:[{p:[25,7,805],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[25,24,822]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[25,75,873]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"Engaged":"Disengaged"'},p:[27,9,948]}]}]}],r:"data.headset"}," ",{t:4,f:[{p:[31,5,1064],t:7,e:"ui-section",a:{label:"High Volume"},f:[{p:[32,7,1104],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.useCommand"],s:'_0?"power-off":"close"'},p:[32,24,1121]}],style:[{t:2,x:{r:["data.useCommand"],s:'_0?"selected":null'},p:[32,76,1173]}],action:"command"},f:[{t:2,x:{r:["data.useCommand"],s:'_0?"On":"Off"'},p:[34,9,1250]}]}]}],n:50,r:"data.command",p:[30,3,1038]}]}," ",{p:[38,1,1342],t:7,e:"ui-display",a:{title:"Channel"},f:[{p:[39,3,1374],t:7,e:"ui-section",a:{label:"Frequency"},f:[{t:4,f:[{p:[41,7,1439],t:7,e:"span",f:[{t:2,r:"readableFrequency",p:[41,13,1445]}]}],n:50,r:"data.freqlock",p:[40,5,1410]},{t:4,n:51,f:[{p:[43,7,1495],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[43,46,1534]}],action:"frequency",params:'{"adjust": -1}'}}," ",{p:[44,7,1646],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[44,41,1680]}],action:"frequency",params:'{"adjust": -.2}'}}," ",{p:[45,7,1793],t:7,e:"ui-button",a:{icon:"pencil",action:"frequency",params:'{"tune": "input"}'},f:[{t:2,r:"readableFrequency",p:[45,78,1864]}]}," ",{p:[46,7,1905],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[46,40,1938]}],action:"frequency",params:'{"adjust": .2}'}}," ",{p:[47,7,2050],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[47,45,2088]}],action:"frequency",params:'{"adjust": 1}'}}],r:"data.freqlock"}]}," ",{t:4,f:[{p:[51,5,2262],t:7,e:"ui-section",a:{label:"Subspace Transmission"},f:[{p:[52,7,2312],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.subspace"],s:'_0?"power-off":"close"'},p:[52,24,2329]}],style:[{t:2,x:{r:["data.subspace"],s:'_0?"selected":null'},p:[52,74,2379]}],action:"subspace"},f:[{t:2,x:{r:["data.subspace"],s:'_0?"Active":"Inactive"'},p:[53,29,2447]}]}]}],n:50,r:"data.subspaceSwitchable",p:[50,3,2225]}," ",{t:4,f:[{p:[57,5,2578],t:7,e:"ui-section",a:{label:"Channels"},f:[{t:4,f:[{p:[59,9,2656],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["."],s:'_0?"check-square-o":"square-o"'},p:[59,26,2673]}],style:[{t:2,x:{r:["."],s:'_0?"selected":null'},p:[60,18,2730]}],action:"channel",params:['{"channel": "',{t:2,r:"channel",p:[61,49,2806]},'"}']},f:[{t:2,r:"channel",p:[62,11,2833]}]},{p:[62,34,2856],t:7,e:"br"}],n:52,i:"channel",r:"data.channels",p:[58,7,2615]}]}],n:50,x:{r:["data.subspace","data.channels"],s:"_0&&_1"},p:[56,3,2534]}]}]},e.exports=a.extend(r.exports)},{341:341}],441:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" "," "," "," "," "," "," "," "," "," ",{p:[11,1,560],t:7,e:"rdheader"}," ",{t:4,f:[{p:[13,2,595],t:7,e:"ui-display",a:{title:"CONSOLE LOCKED"},f:[{p:[14,3,634],t:7,e:"ui-button",a:{action:"Unlock"},f:["Unlock"]}]}],n:50,r:"data.locked",p:[12,1,573]},{t:4,f:[{p:[18,2,729],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.tabs",p:[18,17,744]}]},f:[{p:[19,3,763],t:7,e:"tab",a:{name:"Technology"},f:[{p:[20,4,791],t:7,e:"techweb"}]}," ",{p:[22,3,815],t:7,e:"tab",a:{name:"View Node"},f:[{p:[23,4,842],t:7,e:"nodeview"}]}," ",{p:[25,3,867],t:7,e:"tab",a:{name:"View Design"},f:[{p:[26,4,896],t:7,e:"designview"}]}," ",{p:[28,3,923],t:7,e:"tab",a:{name:"Disk Operations - Design"},f:[{p:[29,4,965],t:7,e:"diskopsdesign"}]}," ",{p:[31,3,995],t:7,e:"tab",a:{name:"Disk Operations - Technology"},f:[{p:[32,4,1041],t:7,e:"diskopstech"}]}," ",{p:[34,3,1069],t:7,e:"tab",a:{name:"Deconstructive Analyzer"},f:[{p:[35,4,1110],t:7,e:"destruct"}]}," ",{p:[37,3,1135],t:7,e:"tab",a:{name:"Protolathe"},f:[{p:[38,4,1163],t:7,e:"protolathe"}]}," ",{p:[40,3,1190],t:7,e:"tab",a:{name:"Circuit Imprinter"},f:[{p:[41,4,1225],t:7,e:"circuit"}]}," ",{p:[43,3,1249],t:7,e:"tab",a:{name:"Settings"},f:[{p:[44,4,1275],t:7,e:"settings"}]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[17,1,706]}]},r.exports.components=r.exports.components||{};var i={settings:t(450),circuit:t(442),protolathe:t(448),destruct:t(444),diskopsdesign:t(445),diskopstech:t(446),designview:t(443),nodeview:t(447),techweb:t(451),rdheader:t(449)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,442:442,443:443,444:444,445:445,446:446,447:447,448:448,449:449,450:450,451:451}],442:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[3,3,58],t:7,e:"ui-display",a:{title:"Circuit Imprinter Busy!"}}],n:50,r:"data.circuitbusy",p:[2,2,30]},{t:4,n:51,f:[{p:[5,3,130],t:7,e:"ui-display",f:[{p:[6,4,147],t:7,e:"ui-section",f:["Search Available Designs: ",{p:[7,4,189],t:7,e:"input",a:{value:[{t:2,r:"textsearch",p:[7,17,202]}],placeholder:"Type Here","class":"text"}}," ",{p:[8,5,261],t:7,e:"ui-button",a:{action:"textSearch",params:['{"latheType" : "circuit", "inputText" : ',{t:2,r:"textsearch",p:[8,84,340]},"}"]},f:["Search"]}]}," ",{p:[10,4,398],t:7,e:"ui-section",f:["Materials: ",{t:2,r:"data.circuitmats",p:[10,27,421]}," / ",{t:2,r:"data.circuitmaxmats",p:[10,50,444]}]}," ",{p:[11,4,485],t:7,e:"ui-section",f:["Reagents: ",{t:2,r:"data.circuitchems",p:[11,26,507]}," / ",{t:2,r:"data.circuitmaxchems",p:[11,50,531]}]}," ",{p:[12,3,572],t:7,e:"ui-display",f:[{p:[14,3,590],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.lathe_tabs",p:[14,18,605]}]},f:[{p:[15,4,631],t:7,e:"tab",a:{name:"Category List"},f:[{t:4,f:[{p:[17,6,696],t:7,e:"ui-button",a:{action:"switchcat",state:[{t:2,x:{r:["data.circuitcat"],s:'_0=="{{name}}"?"selected":null'},p:[17,43,733]}],params:['{"type" : "circuit", "cat" : "',{t:2,r:"name",p:[17,135,825]},'"}']},f:[{t:2,r:"name",p:[17,147,837]}]}],n:52,r:"data.circuitcats",p:[16,5,663]}]}," ",{p:[20,4,888],t:7,e:"tab",a:{name:"Selected Category"},f:[{t:4,f:[{p:[22,6,956],t:7,e:"ui-section",f:[{t:2,r:"name",p:[22,18,968]},{t:2,r:"matstring",p:[22,26,976]}," ",{p:[23,7,997],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[23,40,1030]}],params:['{"latheType" : "circuit", "id" : "',{t:2,r:"id",p:[23,119,1109]},'"}']},f:["Print"]}]}],n:52,r:"data.circuitdes",p:[21,5,924]}]}," ",{p:[27,4,1187],t:7,e:"tab",a:{name:"Search Results"},f:[{t:4,f:[{p:[29,6,1254],t:7,e:"ui-section",f:[{t:2,r:"name",p:[29,18,1266]},{t:2,r:"matstring",p:[29,26,1274]}," ",{p:[30,7,1295],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[30,40,1328]}],params:['{"latheType" : "circuit", "id" : "',{t:2,r:"id",p:[30,119,1407]},'"}']},f:["Print"]}]}],n:52,r:"data.circuitmatch",p:[28,5,1220]}]}," ",{p:[34,4,1485],t:7,e:"tab",a:{name:"Materials"},f:[{t:4,f:[{p:[36,6,1550],t:7,e:"ui-section",f:[{t:2,r:"name",p:[36,18,1562]}," : ",{t:2,r:"amount",p:[36,29,1573]}," cm3 - ",{t:4,f:[{p:[38,7,1623],t:7,e:"input",a:{value:[{t:2,r:"number",p:[38,20,1636]}],placeholder:["1-",{t:2,r:"sheets",p:[38,46,1662]}],"class":"number"}}," ",{p:[39,7,1698],t:7,e:"ui-button",a:{action:"releasemats",params:['{"latheType" : "circuit", "mat_id" : ',{t:2,r:"mat_id",p:[39,84,1775]},', "sheets" : ',{t:2,r:"number",p:[39,107,1798]},"}"]},f:["Release"]}],n:50,x:{r:["sheets"],s:"_0>0"},p:[37,6,1597]}]}],n:52,r:"data.circuitmat_list",p:[35,5,1513]}]}," ",{p:[44,4,1895],t:7,e:"tab",a:{name:"Chemicals"},f:[{t:4,f:[{p:[46,6,1961],t:7,e:"ui-section",f:[{t:2,r:"name",p:[46,18,1973]}," : ",{t:2,r:"amount",p:[46,29,1984]}," - ",{p:[47,7,2005],t:7,e:"ui-button",a:{action:"purgechem",params:['{"latheType" : "circuit", "name" : ',{t:2,r:"name",p:[47,80,2078]},', "id" : ',{t:2,r:"reagentid",p:[47,97,2095]},"}"]},f:["Purge"]}]}],n:52,r:"data.circuitchem_list",p:[45,5,1923]}]}]}]}]}],r:"data.circuitbusy"}],n:50,r:"data.circuit_linked",p:[1,1,0]},{t:4,n:51,f:[{p:[55,2,2216],t:7,e:"ui-display",a:{title:"No Linked Circuit Imprinter"}}],r:"data.circuit_linked"}]},e.exports=a.extend(r.exports)},{341:341}],443:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,31],t:7,e:"ui-display",a:{title:[{t:2,r:"data.sdesign_name",p:[2,21,50]}]},f:[{p:[3,3,77],t:7,e:"ui-section",a:{title:"Description"},f:[{t:2,r:"data.sdesign_desc",p:[3,35,109]}]}]}," ",{p:[5,2,162],t:7,e:"ui-display",a:{title:"Lathe Types"},f:[{t:4,f:[{p:[7,4,239],t:7,e:"ui-section",a:{title:"Circuit Imprinter"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&1"},p:[6,3,198]}," ",{t:4,f:[{p:[10,4,346],t:7,e:"ui-section",a:{title:"Protolathe"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&2"},p:[9,3,305]}," ",{t:4,f:[{p:[13,4,446],t:7,e:"ui-section",a:{title:"Autolathe"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&4"},p:[12,3,405]}," ",{t:4,f:[{p:[16,4,545],t:7,e:"ui-section",a:{title:"Crafting Fabricator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&8"},p:[15,3,504]}," ",{t:4,f:[{p:[19,4,655],t:7,e:"ui-section",a:{title:"Exosuit Fabricator"}}],n:50,x:{r:["data.sdesign_buildtype"], -s:"_0&16"},p:[18,3,613]}," ",{t:4,f:[{p:[22,4,764],t:7,e:"ui-section",a:{title:"Biogenerator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&32"},p:[21,3,722]}," ",{t:4,f:[{p:[25,4,867],t:7,e:"ui-section",a:{title:"Limb Grower"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&64"},p:[24,3,825]}," ",{t:4,f:[{p:[28,4,970],t:7,e:"ui-section",a:{title:"Ore Smelter"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&128"},p:[27,3,927]}]}," ",{p:[31,2,1045],t:7,e:"ui-display",a:{title:"Materials"},f:[{t:4,f:[{p:[33,4,1116],t:7,e:"ui-section",a:{title:[{t:2,r:"matname",p:[33,23,1135]}]},f:[{t:2,r:"matamt",p:[33,36,1148]}," cm^3"]}],n:52,r:"data.sdesign_materials",p:[32,3,1079]}]}],n:50,r:"data.design_selected",p:[1,1,0]},{t:4,f:[{p:[38,2,1248],t:7,e:"ui-display",a:{title:"No Design Selected."}}],n:50,x:{r:["data.design_selected"],s:"!_0"},p:[37,1,1216]}]},e.exports=a.extend(r.exports)},{341:341}],444:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[4,3,60],t:7,e:"ui-display",a:{title:"Destructive Analyzer Busy!"}}],n:50,r:"data.destroybusy",p:[3,2,32]},{t:4,n:51,f:[{t:4,f:[{p:[7,4,168],t:7,e:"ui-display",a:{title:"Destructive Analyzer Unloaded"}}],n:50,x:{r:["data.destroy_loaded"],s:"!_0"},p:[6,3,135]},{t:4,n:51,f:[{p:[9,4,248],t:7,e:"ui-display",a:{title:"Loaded Item"},f:[{p:[10,4,285],t:7,e:"ui-section",a:{title:"Name"},f:[{t:2,r:"data.destroy_name",p:[10,29,310]}]}]}," ",{p:[12,4,367],t:7,e:"ui-display",a:{title:"Boost Nodes"},f:[{t:4,f:[{p:[14,6,438],t:7,e:"ui-section",a:{title:[{t:2,r:"name",p:[14,25,457]}," | ",{t:2,r:"value",p:[14,36,468]}]},f:[{p:[15,7,487],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["allow"],s:'_0?null:"disabled"'},p:[15,25,505]}],action:"deconstruct",params:['{"id":',{t:2,r:"id",p:[15,90,570]},"}"]},f:["Deconstruct and Boost"]}]}],n:52,r:"data.boost_paths",p:[13,5,405]}]}," ",{p:[19,4,670],t:7,e:"ui-button",a:{action:"eject_da"},f:["Eject Item"]}],x:{r:["data.destroy_loaded"],s:"!_0"}}],r:"data.destroybusy"}],n:50,r:"data.destroy_linked",p:[2,1,2]},{t:4,n:51,f:[{p:[23,2,755],t:7,e:"ui-display",a:{title:"No Linked Destructive Analyzer"}}],r:"data.destroy_linked"}]},e.exports=a.extend(r.exports)},{341:341}],445:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[3,2,24],t:7,e:"ui-display",a:{title:"No Design Disk Loaded"}}],n:50,x:{r:["data.ddisk"],s:"!_0"},p:[2,1,2]},{t:4,n:51,f:[{t:4,f:[{p:[6,3,121],t:7,e:"ui-display",a:{title:"Design Disk Updating"}}],n:50,r:"data.ddisk_update",p:[5,2,92]},{t:4,n:51,f:[{t:4,f:[{p:[9,4,221],t:7,e:"ui-display",a:{title:"Design Disk"},f:[{p:[10,5,259],t:7,e:"ui-section",a:{title:"Disk Space"},f:["Disk Capacity: ",{t:2,r:"data.ddisk_size",p:[10,51,305]}," blueprints."]}," ",{p:[11,5,355],t:7,e:"ui-section",a:{title:"Disk IO"},f:[{p:[11,33,383],t:7,e:"ui-button",a:{action:"ddisk_upall"},f:["Upload all designs"]}]}," ",{p:[12,5,464],t:7,e:"ui-section",a:{title:"Clear Disk"},f:[{p:[12,36,495],t:7,e:"ui-button",a:{action:"clear_designdisk",style:"danger"},f:["WIPE ALL DATA"]}]}," ",{p:[13,5,591],t:7,e:"ui-section",a:{title:"Eject Disk"},f:[{p:[13,36,622],t:7,e:"ui-button",a:{action:"eject_designdisk"},f:["Eject Disk"]}]}]}," ",{p:[15,4,717],t:7,e:"ui-display",a:{title:"Disk Contents"},f:[{t:4,f:[{p:[17,6,792],t:7,e:"ui-section",a:{title:"Number"},f:["#",{t:2,r:"pos",p:[17,34,820]},": ",{t:4,f:[{p:[19,8,866],t:7,e:"ui-button",a:{action:"upload_empty_ddisk_slot",params:['{"slot": "',{t:2,r:"pos",p:[19,70,928]},'"}']},f:["Upload to Empty Slot"]}],n:50,x:{r:["id"],s:'_0=="null"'},p:[18,7,837]},{t:4,n:51,f:[{p:[21,8,996],t:7,e:"ui-button",a:{action:"select_design",params:['{"id": "',{t:2,r:"id",p:[21,58,1046]},'"}'],state:[{t:2,x:{r:["data.sdesign_id","id"],s:'_0==_1?"selected":null'},p:[21,75,1063]}]},f:[{t:2,r:"name",p:[21,122,1110]}]}," ",{p:[22,8,1139],t:7,e:"ui-button",a:{action:"ddisk_erasepos",style:"danger",params:['{"id": "',{t:2,r:"id",p:[22,74,1205]},'"}'],state:[{t:2,x:{r:["id"],s:'_0=="null"?"disabled":null'},p:[22,91,1222]}]},f:["Delete Slot"]}],x:{r:["id"],s:'_0=="null"'}}]}],n:52,r:"data.ddisk_designs",p:[16,5,757]}]}],n:50,x:{r:["data.ddisk_upload"],s:"!_0"},p:[8,3,190]},{t:4,n:51,f:[{p:[28,4,1367],t:7,e:"ui-display",a:{title:"Upload Design to Disk"},f:[{p:[28,46,1409],t:7,e:"ui-section",f:["Available Designs:"]}]}," ",{t:4,f:[{p:[30,5,1513],t:7,e:"ui-section",f:[{p:[30,17,1525],t:7,e:"ui-button",a:{action:"ddisk_uploaddesign",params:['{"id": "',{t:2,r:"id",p:[30,72,1580]},'"}']},f:[{t:2,r:"name",p:[30,82,1590]}]}]}],n:52,r:"data.ddisk_possible_designs",p:[29,4,1470]}],x:{r:["data.ddisk_upload"],s:"!_0"}}],r:"data.ddisk_update"}],x:{r:["data.ddisk"],s:"!_0"}}]},e.exports=a.extend(r.exports)},{341:341}],446:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[3,2,24],t:7,e:"ui-display",a:{title:"No Technology Disk Loaded"}}],n:50,x:{r:["data.tdisk"],s:"!_0"},p:[2,1,2]},{t:4,n:51,f:[{t:4,f:[{p:[6,3,125],t:7,e:"ui-display",a:{title:"Technology Disk Updating"}}],n:50,r:"data.tdisk_update",p:[5,2,96]},{t:4,n:51,f:[{p:[8,3,198],t:7,e:"ui-display",a:{title:"Technology Disk"},f:[{p:[9,4,239],t:7,e:"ui-section",a:{title:"Disk IO"},f:[{p:[9,32,267],t:7,e:"ui-button",a:{action:"tdisk_down"},f:["Download Research to Disk"]},{p:[9,100,335],t:7,e:"ui-button",a:{action:"tdisk_up"},f:["Upload Research from Disk"]}," ",{p:[10,4,406],t:7,e:"ui-section",a:{title:"Clear Disk"},f:[{p:[10,35,437],t:7,e:"ui-button",a:{action:"clear_techdisk",style:"danger"},f:["WIPE ALL DATA"]}]}," ",{p:[11,4,530],t:7,e:"ui-section",a:{title:"Eject Disk"},f:[{p:[11,35,561],t:7,e:"ui-button",a:{action:"eject_techdisk"},f:["Eject Disk"]}]}]}]}," ",{p:[13,3,652],t:7,e:"ui-display",a:{title:"Disk Contents"},f:[{t:4,f:[{p:[15,5,723],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[15,53,771]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[15,70,788]}]},f:[{t:2,r:"display_name",p:[15,115,833]}]}],n:52,r:"data.tdisk_nodes",p:[14,4,691]}]}],r:"data.tdisk_update"}],x:{r:["data.tdisk"],s:"!_0"}}]},e.exports=a.extend(r.exports)},{341:341}],447:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,29],t:7,e:"ui-display",a:{title:[{t:2,r:"data.snode_name",p:[2,21,48]}]},f:[{p:[3,3,73],t:7,e:"ui-section",a:{title:"Description"},f:["Description: ",{t:2,r:"data.snode_desc",p:[3,48,118]}]}," ",{p:[4,3,154],t:7,e:"ui-section",a:{title:"Point Cost"},f:["Point Cost: ",{t:2,r:"data.snode_cost",p:[4,46,197]}]}," ",{p:[5,3,233],t:7,e:"ui-section",a:{title:"Export Price"},f:["Export Price: ",{t:2,r:"data.snode_export",p:[5,50,280]}]}," ",{p:[6,3,318],t:7,e:"ui-button",a:{action:"research_node",params:['{"id"="',{t:2,r:"id",p:[6,52,367]},'"}'],state:[{t:2,x:{r:["data.snode_researched"],s:'_0?"disabled":null'},p:[6,69,384]}]},f:[{t:2,x:{r:["data.snode_researched"],s:'_0?"Researched":"Research Node"'},p:[6,115,430]}]}]}," ",{p:[8,2,518],t:7,e:"ui-display",a:{title:"Prerequisites"},f:[{t:4,f:[{p:[10,4,588],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[10,52,636]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[10,69,653]}]},f:[{t:2,r:"display_name",p:[10,114,698]}]}],n:52,r:"data.node_prereqs",p:[9,3,556]}]}," ",{p:[13,2,759],t:7,e:"ui-display",a:{title:"Unlocks"},f:[{t:4,f:[{p:[15,4,823],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[15,52,871]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[15,69,888]}]},f:[{t:2,r:"display_name",p:[15,114,933]}]}],n:52,r:"data.node_unlocks",p:[14,3,791]}]}," ",{p:[18,2,994],t:7,e:"ui-display",a:{title:"Designs"},f:[{t:4,f:[{p:[20,4,1058],t:7,e:"ui-button",a:{action:"select_design",params:['{"id": "',{t:2,r:"id",p:[20,54,1108]},'"}'],state:[{t:2,x:{r:["data.sdesign_id","id"],s:'_0==_1?"selected":null'},p:[20,71,1125]}]},f:[{t:2,r:"name",p:[20,118,1172]}]}],n:52,r:"data.node_designs",p:[19,3,1026]}]}],n:50,r:"data.node_selected",p:[1,1,0]},{t:4,f:[{p:[25,2,1263],t:7,e:"ui-display",a:{title:"No Node Selected."}}],n:50,x:{r:["data.node_selected"],s:"!_0"},p:[24,1,1233]}]},e.exports=a.extend(r.exports)},{341:341}],448:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[3,3,59],t:7,e:"ui-display",a:{title:"Protolathe Busy!"}}],n:50,r:"data.protobusy",p:[2,2,33]},{t:4,n:51,f:[{p:[5,3,124],t:7,e:"ui-display",f:[{p:[6,4,141],t:7,e:"ui-section",f:["Search Available Designs: ",{p:[7,4,183],t:7,e:"input",a:{value:[{t:2,r:"textsearch",p:[7,17,196]}],placeholder:"Type Here","class":"text"}}," ",{p:[8,5,255],t:7,e:"ui-button",a:{action:"textSearch",params:['{"latheType" : "proto", "inputText" : ',{t:2,r:"textsearch",p:[8,82,332]},"}"]},f:["Search"]}]}," ",{p:[10,4,390],t:7,e:"ui-section",f:["Materials: ",{t:2,r:"data.protomats",p:[10,27,413]}," / ",{t:2,r:"data.protomaxmats",p:[10,48,434]}]}," ",{p:[11,4,473],t:7,e:"ui-section",f:["Reagents: ",{t:2,r:"data.protochems",p:[11,26,495]}," / ",{t:2,r:"data.protomaxchems",p:[11,48,517]}]}," ",{p:[12,3,556],t:7,e:"ui-display",f:[{p:[14,3,574],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.lathe_tabs",p:[14,18,589]}]},f:[{p:[15,4,615],t:7,e:"tab",a:{name:"Category List"},f:[{t:4,f:[{p:[17,6,678],t:7,e:"ui-button",a:{action:"switchcat",state:[{t:2,x:{r:["data.protocat","name"],s:'_0==_1?"selected":null'},p:[17,43,715]}],params:['{"type" : "proto", "cat" : "',{t:2,r:"name",p:[17,125,797]},'"}']},f:[{t:2,r:"name",p:[17,137,809]}]}],n:52,r:"data.protocats",p:[16,5,647]}]}," ",{p:[20,4,860],t:7,e:"tab",a:{name:"Selected Category"},f:[{t:4,f:[{p:[22,6,926],t:7,e:"ui-section",f:[{t:2,r:"name",p:[22,18,938]},{t:2,r:"matstring",p:[22,26,946]}," ",{t:4,f:[{p:[24,8,996],t:7,e:"input",a:{value:[{t:2,r:"number",p:[24,21,1009]}],placeholder:["1-",{t:2,x:{r:["canprint"],s:"_0>10?10:_0"},p:[24,47,1035]}],"class":"number"}}],n:50,x:{r:["canprint"],s:"_0>1"},p:[23,7,967]}," ",{p:[26,7,1108],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[26,40,1141]}],params:['{"latheType" : "proto", "id" : "',{t:2,r:"id",p:[26,117,1218]},'", "amount" : "',{t:2,r:"number",p:[26,138,1239]},'"}']},f:["Print"]}]}],n:52,r:"data.protodes",p:[21,5,896]}]}," ",{p:[30,4,1321],t:7,e:"tab",a:{name:"Search Results"},f:[{t:4,f:[{p:[32,6,1386],t:7,e:"ui-section",f:[{t:2,r:"name",p:[32,18,1398]},{t:2,r:"matstring",p:[32,26,1406]}," ",{t:4,f:[{p:[34,8,1456],t:7,e:"input",a:{value:[{t:2,r:"number",p:[34,21,1469]}],placeholder:["1-",{t:2,x:{r:["canprint"],s:"_0>10?10:_0"},p:[34,47,1495]}],"class":"number"}}],n:50,x:{r:["canprint"],s:"_0>1"},p:[33,7,1427]}," ",{p:[36,7,1568],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[36,40,1601]}],params:['{"latheType" : "proto", "id" : "',{t:2,r:"id",p:[36,117,1678]},'", "amount" : "',{t:2,r:"number",p:[36,138,1699]},'"}']},f:["Print"]}]}],n:52,r:"data.protomatch",p:[31,5,1354]}]}," ",{p:[40,4,1781],t:7,e:"tab",a:{name:"Materials"},f:[{t:4,f:[{p:[42,6,1844],t:7,e:"ui-section",f:[{t:2,r:"name",p:[42,18,1856]}," : ",{t:2,r:"amount",p:[42,29,1867]}," cm3 - ",{t:4,f:[{p:[44,7,1917],t:7,e:"input",a:{value:[{t:2,r:"number",p:[44,20,1930]}],placeholder:["1-",{t:2,r:"sheets",p:[44,46,1956]}],"class":"number"}}," ",{p:[45,7,1992],t:7,e:"ui-button",a:{action:"releasemats",params:['{"latheType" : "proto", "mat_id" : ',{t:2,r:"mat_id",p:[45,82,2067]},', "sheets" : ',{t:2,r:"number",p:[45,105,2090]},"}"]},f:["Release"]}],n:50,x:{r:["sheets"],s:"_0>0"},p:[43,6,1891]}]}],n:52,r:"data.protomat_list",p:[41,5,1809]}]}," ",{p:[50,4,2187],t:7,e:"tab",a:{name:"Chemicals"},f:[{t:4,f:[{p:[52,6,2251],t:7,e:"ui-section",f:[{t:2,r:"name",p:[52,18,2263]}," : ",{t:2,r:"amount",p:[52,29,2274]}," - ",{p:[53,7,2295],t:7,e:"ui-button",a:{action:"purgechem",params:['{"latheType" : "proto", "name" : ',{t:2,r:"name",p:[53,78,2366]},', "id" : ',{t:2,r:"reagentid",p:[53,95,2383]},"}"]},f:["Purge"]}]}],n:52,r:"data.protochem_list",p:[51,5,2215]}]}]}]}]}],r:"data.protobusy"}],n:50,r:"data.protolathe_linked",p:[1,1,0]},{t:4,n:51,f:[{p:[61,2,2504],t:7,e:"ui-display",a:{title:"No Linked Protolathe"}}],r:"data.protolathe_linked"}]},e.exports=a.extend(r.exports)},{341:341}],449:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,1,14],t:7,e:"span",a:{"class":"memoedit"},f:["Nanotrasen R&D Console"]},{p:[2,53,66],t:7,e:"br"}," Available Points: ",{p:[3,19,91],t:7,e:"ui-section",a:{title:"Research Points"},f:[{t:2,r:"data.research_points_stored",p:[3,55,127]}]}," ",{p:[4,1,173],t:7,e:"ui-section",a:{title:["Page Selection - ",{t:2,r:"page",p:[4,37,209]}]},f:[{p:[4,47,219],t:7,e:"input",a:{value:[{t:2,r:"pageselect",p:[4,60,232]}],placeholder:"1","class":"number"}}," Select Page: ",{p:[5,14,294],t:7,e:"ui-button",a:{action:"page",params:['{"num" : "',{t:2,r:"pageselect",p:[5,57,337]},'"}']},f:["[Go]"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],450:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"span",a:{"class":"bad"},f:["Settings"]},{p:[1,34,33],t:7,e:"br"},{p:[1,39,38],t:7,e:"br"}," ",{p:[2,1,45],t:7,e:"ui-button",a:{action:"Resync"},f:["RESYNC MACHINERY"]},{p:[2,56,100],t:7,e:"br"}," ",{p:[3,1,107],t:7,e:"ui-button",a:{action:"Lock"},f:["LOCK"]}," ",{p:[4,1,150],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "destroy"}',state:[{t:2,x:{r:["data.destroy_linked"],s:'_0?null:"disabled"'},p:[4,71,220]}]},f:["Disconnect Destructive Analyzer"]}," ",{p:[5,1,309],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "lathe"}',state:[{t:2,x:{r:["data.protolathe_linked"],s:'_0?null:"disabled"'},p:[5,69,377]}]},f:["Disconnect Protolathe"]}," ",{p:[6,1,459],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "imprinter"}',state:[{t:2,x:{r:["data.circuit_linked"],s:'_0?null:"disabled"'},p:[6,73,531]}]},f:["Disconnect Circuit Imprinter"]}]},e.exports=a.extend(r.exports)},{341:341}],451:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Available for Research"},f:[{t:4,f:[{p:[3,3,78],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[3,51,126]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[3,68,143]}]},f:[{t:2,r:"display_name",p:[3,113,188]}]}],n:52,r:"data.techweb_avail",p:[2,2,46]}]}," ",{p:[6,1,245],t:7,e:"ui-display",a:{title:"Locked Nodes"},f:[{t:4,f:[{p:[8,3,314],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[8,51,362]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[8,68,379]}]},f:[{t:2,r:"display_name",p:[8,113,424]}]}],n:52,r:"data.techweb_locked",p:[7,2,281]}]}," ",{p:[11,1,482],t:7,e:"ui-display",a:{title:"Researched Nodes"},f:[{t:4,f:[{p:[13,3,559],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[13,51,607]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[13,68,624]}]},f:[{t:2,r:"display_name",p:[13,113,669]}]}],n:52,r:"data.techweb_researched",p:[12,2,522]}]}]},e.exports=a.extend(r.exports)},{341:341}],452:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,1,25],t:7,e:"ui-notice",f:[{p:[3,3,40],t:7,e:"span",f:["The grinder is currently processing and cannot be used."]}]}],n:50,r:"data.processing",p:[1,1,0]},{p:{button:[{p:[8,5,208],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.operating","data.contents"],s:'(_0==0)&&_1?null:"disabled"'},p:[8,36,239]}],action:"eject"},f:["Eject Contents"]}]},t:7,e:"ui-display",a:{title:"Processing Chamber",button:0},f:[" ",{p:[10,3,364],t:7,e:"ui-section",a:{label:"Grinding"},f:[{p:[11,5,399],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.operating"],s:'_0?"average":"good"'},p:[11,18,412]}]},f:[{t:2,x:{r:["data.operating"],s:'_0?"Busy":"Ready"'},p:[11,59,453]}]}," ",{p:[12,2,500],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.operating","data.contents"],s:'(_0==0)&&_1?null:"disabled"'},p:[12,35,533]}],action:"grind"},f:["Activate"]}]}," ",{p:[14,3,653],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{t:4,f:[{p:[17,9,755],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:["The ",{t:2,r:"name",p:[17,56,802]}]},{p:[17,71,817],t:7,e:"br"}],n:52,r:"adata.contentslist",p:[16,7,717]},{t:4,n:51,f:[{p:[19,9,848],t:7,e:"span",f:["No Contents"]}],r:"adata.contentslist"}],n:50,r:"data.contents",p:[15,5,688]},{t:4,n:51,f:[{p:[22,7,911],t:7,e:"span",f:["No Contents"]}],r:"data.contents"}]}]}," ",{p:{button:[{p:[28,5,1047],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.operating","data.isBeakerLoaded"],s:'(_0==0)&&_1?null:"disabled"'},p:[28,36,1078]}],action:"detach"},f:["Detach"]}]},t:7,e:"ui-display",a:{title:"Container",button:0},f:[" ",{p:[30,3,1202],t:7,e:"ui-section",a:{label:"Reagents"},f:[{t:4,f:[{p:[32,7,1272],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[32,13,1278]},"/",{t:2,r:"data.beakerMaxVolume",p:[32,55,1320]}," Units"]}," ",{p:[33,7,1365],t:7,e:"br"}," ",{t:4,f:[{p:[35,9,1418],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[35,52,1461]}," units of ",{t:2,r:"name",p:[35,87,1496]}]},{p:[35,102,1511],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[34,7,1378]},{t:4,n:51,f:[{p:[37,9,1542],t:7,e:"span",a:{"class":"bad"},f:["Container Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[31,5,1237]},{t:4,n:51,f:[{p:[40,7,1621],t:7,e:"span",a:{"class":"average"},f:["No Container"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],453:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Direction"},f:[{t:4,f:[{p:[3,3,64],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,5,105],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[5,23,123]}],action:"setdir",params:['{"dir": ',{t:2,r:"dir",p:[6,22,195]},', "flipped": ',{t:2,r:"flipped",p:[6,42,215]},"}"]},f:[{p:[6,56,229],t:7,e:"span",a:{"class":["pipes32x32 ",{t:2,r:"dir",p:[6,80,253]},"-",{t:2,r:"icon_state",p:[6,88,261]}],title:[{t:2,r:"dir_name",p:[6,111,284]}]}}]}],n:52,r:"previews",p:[4,4,81]}]}],n:52,r:"data.preview_rows",p:[2,2,33]}]}," ",{t:4,f:[{p:[12,2,406],t:7,e:"ui-display",a:{title:"Color"},f:[{t:4,f:[{p:[14,4,468],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["@key","data.selected_color"],s:'_0==_1?"selected":null'},p:[14,22,486]}],action:"color",params:['{"paint_color": ',{t:2,r:"@key",p:[15,44,583]},"}"]},f:[{t:2,r:"@key",p:[15,55,594]}]}],n:52,r:"data.paint_colors",p:[13,3,436]}]}],n:50,x:{r:["data.category"],s:"_0==0"},p:[11,1,377]},{p:[19,1,654],t:7,e:"ui-display",a:{title:"Utilities"},f:[{p:[20,2,687],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&1?"check-square-o":"square-o"'},p:[20,19,704]}],action:"mode",params:'{"mode": 1}'},f:["Build"]}," ",{p:[22,2,813],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&2?"check-square-o":"square-o"'},p:[22,19,830]}],action:"mode",params:'{"mode": 2}'},f:["Wrench"]}," ",{p:[24,2,940],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&4?"check-square-o":"square-o"'},p:[24,19,957]}],action:"mode",params:'{"mode": 4}'},f:["Destroy"]}," ",{t:4,f:[{p:[27,3,1098],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&8?"check-square-o":"square-o"'},p:[27,20,1115]}],action:"mode",params:'{"mode": 8}'},f:["Paint"]}],n:50,x:{r:["data.category"],s:"_0==0"},p:[26,2,1068]}]}," ",{p:[31,1,1249],t:7,e:"ui-display",a:{title:"Category"},f:[{p:[32,2,1281],t:7,e:"ui-section",f:[{p:[33,3,1297],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.category"],s:'_0==0?"check-square-o":"square-o"'},p:[33,20,1314]}],state:[{t:2,x:{r:["data.category"],s:'_0<=0?"selected":null'},p:[33,83,1377]}],action:"category",params:'{"category": 0}'},f:["Atmospherics"]}," ",{p:[35,3,1496],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.category"],s:'_0==1?"check-square-o":"square-o"'},p:[35,20,1513]}],state:[{t:2,x:{r:["data.category"],s:'_0==1?"selected":null'},p:[35,83,1576]}],action:"category",params:'{"category": 1}'},f:["Disposals"]}," ",{p:[37,3,1692],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.category"],s:'_0==2?"check-square-o":"square-o"'},p:[37,20,1709]}],state:[{t:2,x:{r:["data.category"],s:'_0==2?"selected":null'},p:[37,83,1772]}],action:"category",params:'{"category": 2}'},f:["Transit Tubes"]}]}," ",{t:4,f:[{p:[41,3,1937],t:7,e:"ui-section",a:{label:"Piping Layer"},f:[{p:[42,4,1975],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==1?"selected":null'},p:[42,22,1993]}],action:"piping_layer",params:'{"piping_layer": 1}'},f:["1"]}," ",{p:[44,4,2115],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==2?"selected":null'},p:[44,22,2133]}],action:"piping_layer",params:'{"piping_layer": 2}'},f:["2"]}," ",{p:[46,4,2255],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==3?"selected":null'},p:[46,22,2273]}],action:"piping_layer",params:'{"piping_layer": 3}'},f:["3"]}]}],n:50,x:{r:["data.category"],s:"_0==0"},p:[40,2,1907]}]}," ",{t:4,f:[{p:[52,2,2462],t:7,e:"ui-display",a:{title:[{t:2,r:"cat_name",p:[52,21,2481]}]},f:[{t:4,f:[{p:[54,4,2521],t:7,e:"ui-section",f:[{p:[55,5,2539],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[55,23,2557]}],action:"pipe_type",params:['{"pipe_type": ',{t:2,r:"pipe_index",p:[56,28,2638]},', "category": ',{t:2,r:"cat_name",p:[56,56,2666]},"}"]},f:[{t:2,r:"pipe_name",p:[56,71,2681]}]}]}],n:52,r:"recipes",p:[53,3,2499]}]}],n:52,r:"data.categories",p:[51,1,2434]}]},e.exports=a.extend(r.exports)},{341:341}],454:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Color"},f:[{t:4,f:[{p:[3,3,60],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[3,21,78]}],action:"color",params:['{"paint_color": ',{t:2,r:"color_name",p:[4,28,155]},"}"]},f:[{t:2,r:"color_name",p:[4,45,172]}]}],n:52,r:"data.paint_colors",p:[2,2,29]}]}]},e.exports=a.extend(r.exports)},{341:341}],455:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Direction"},f:[{t:4,f:[{p:[3,3,64],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,5,105],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[5,23,123]}],action:"setdir",params:['{"dir": ',{t:2,r:"dir",p:[6,22,195]},', "flipped": ',{t:2,r:"flipped",p:[6,42,215]},"}"]},f:[{p:[6,56,229],t:7,e:"img",a:{src:["pipe.",{t:2,r:"dir",p:[6,71,244]},".",{t:2,r:"icon_state",p:[6,79,252]},".png"],title:[{t:2,r:"dir_name",p:[6,106,279]}]}}]}],n:52,r:"previews",p:[4,4,81]}]}],n:52,r:"data.preview_rows",p:[2,2,33]}]}]},e.exports=a.extend(r.exports)},{341:341}],456:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,23],t:7,e:"ui-notice",f:[{t:2,r:"data.notice",p:[3,5,40]}]}],n:50,r:"data.notice",p:[1,1,0]},{p:[6,1,82],t:7,e:"ui-display",a:{title:"Satellite Network Control",button:0},f:[{t:4,f:[{p:[8,4,168],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[9,9,209],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[9,31,231]}]}," ",{p:[10,9,253],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"mode",p:[10,30,274]}]}," ",{p:[11,9,298],t:7,e:"div",a:{"class":"content"},f:[{p:[12,11,331],t:7,e:"ui-button",a:{action:"toggle",params:['{"id": "',{t:2,r:"id",p:[12,54,374]},'"}']},f:[{t:2,x:{r:["active"],s:'_0?"Deactivate":"Activate"'},p:[12,64,384]}]}]}]}],n:52,r:"data.satellites",p:[7,2,138]}]}," ",{t:4,f:[{p:[18,1,528],t:7,e:"ui-display",a:{title:"Station Shield Coverage"},f:[{p:[19,3,576],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.meteor_shield_coverage_max",p:[19,24,597]}],value:[{t:2,r:"data.meteor_shield_coverage",p:[19,68,641]}]},f:[{t:2,x:{r:["data.meteor_shield_coverage","data.meteor_shield_coverage_max"],s:"100*_0/_1"},p:[19,101,674]}," %"]}," ",{p:[20,1,758],t:7,e:"ui-display",f:[]}]}],n:50,r:"data.meteor_shield",p:[17,1,500]}]},e.exports=a.extend(r.exports)},{341:341}],457:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,26],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["enabled"],s:'_0?"check-square-o":"square-o"'},p:[2,20,43]}],style:[{t:2,x:{r:["enabled"],s:'_0?"selected":null'},p:[2,72,95]}],action:"toggle_filter",params:['{"id_tag": "',{t:2,r:"id_tag",p:[3,48,176]},'", "val": ',{t:2,r:"gas_id",p:[3,68,196]},"}"]},f:[{t:2,r:"gas_name",p:[3,81,209]}]}],n:52,r:"filter_types",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],458:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" "," "," ",{p:[5,1,200],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.tabs",p:[5,16,215]}]},f:[{p:[6,2,233],t:7,e:"tab",a:{name:"Status"},f:[{p:[7,3,256],t:7,e:"status"}]}," ",{p:[9,2,277],t:7,e:"tab",a:{name:"Templates"},f:[{p:[10,3,303],t:7,e:"templates"}]}," ",{p:[12,2,327],t:7,e:"tab",a:{name:"Modification"},f:[{t:4,f:[{p:[14,3,381],t:7,e:"modification"}],n:50,r:"data.selected",p:[13,3,356]}," ",{t:4,f:[{p:[17,3,437],t:7,e:"span",a:{"class":"bad"},f:["No shuttle selected."]}],n:50,x:{r:["data.selected"],s:"!_0"},p:[16,3,411]}]}]}]},r.exports.components=r.exports.components||{};var i={modification:t(459),templates:t(461),status:t(460)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,459:459,460:460,461:461}],459:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:["Selected: ",{t:2,r:"data.selected.name",p:[1,30,29]}]},f:[{t:4,f:[{p:[3,5,96],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.selected.description",p:[3,37,128]}]}],n:50,r:"data.selected.description",p:[2,3,57]}," ",{t:4,f:[{p:[6,5,224],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"data.selected.admin_notes",p:[6,37,256]}]}],n:50,r:"data.selected.admin_notes",p:[5,3,185]}]}," ",{t:4,f:[{p:[11,3,361],t:7,e:"ui-display",a:{title:["Existing Shuttle: ",{t:2,r:"data.existing_shuttle.name",p:[11,40,398]}]},f:["Status: ",{t:2,r:"data.existing_shuttle.status",p:[12,13,444]}," ",{t:4,f:["(",{t:2,r:"data.existing_shuttle.timeleft",p:[14,8,526]},")"],n:50,r:"data.existing_shuttle.timer",p:[13,5,482]}," ",{p:[16,5,580],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"data.existing_shuttle.id",p:[17,41,649]},'"}']},f:["Jump To"]}]}],n:50,r:"data.existing_shuttle",p:[10,1,328]},{t:4,f:[{p:[24,3,778],t:7,e:"ui-display",a:{title:"Existing Shuttle: None"}}],n:50,x:{r:["data.existing_shuttle"],s:"!_0"},p:[23,1,744]},{p:[27,1,847],t:7,e:"ui-button",a:{action:"preview",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[28,27,902]},'"}']},f:["Preview"]}," ",{p:[31,1,961],t:7,e:"ui-button",a:{action:"load",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[32,27,1013]},'"}'],style:"danger"},f:["Load"]}," ",{p:[37,1,1089],t:7,e:"ui-display",a:{title:"Status"},f:[]}]},e.exports=a.extend(r.exports)},{341:341}],460:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"table",a:{width:"100%"},f:[{t:4,f:[{p:[3,3,49],t:7,e:"tr",f:[{p:[4,5,59],t:7,e:"td",f:[{p:[5,7,71],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"id",p:[5,69,133]},'"}']},f:["JMP"]}]}," ",{p:[9,5,193],t:7,e:"td",f:[{p:[10,7,205],t:7,e:"ui-button",a:{action:"fly",params:['{"id": "',{t:2,r:"id",p:[10,47,245]},'"}'],state:[{t:2,x:{r:["can_fly"],s:'_0?null:"disabled"'},p:[10,64,262]}]},f:["Fly"]}]}," ",{p:[14,5,345],t:7,e:"td",f:[{t:2,r:"name",p:[15,7,357]}," (",{p:[15,17,367],t:7,e:"code",f:[{t:2,r:"id",p:[15,23,373]}]},")"]}," ",{p:[17,5,404],t:7,e:"td",f:[{t:2,r:"status",p:[18,7,416]}]}," ",{p:[20,5,443],t:7,e:"td",f:[{t:4,f:[{t:2,r:"mode",p:[22,9,477]}],n:50,r:"mode",p:[21,7,455]}," ",{t:4,f:["(",{t:2,r:"timeleft",p:[25,10,532]},") ",{p:[26,9,555],t:7,e:"ui-button",a:{action:"fast_travel",params:['{"id": "',{t:2,r:"id",p:[26,57,603]},'"}'],state:[{t:2,x:{r:["can_fast_travel"],s:'_0?null:"disabled"'},p:[26,74,620]}]},f:["Fast Travel"]}],n:50,r:"timer",p:[24,7,508]}]}]}],n:52,r:"data.shuttles",p:[2,1,22]}]}]},e.exports=a.extend(r.exports)},{341:341}],461:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.templates_tabs",p:[1,16,15]}]},f:[{t:4,f:[{p:[3,5,74],t:7,e:"tab",a:{name:[{t:2,r:"port_id",p:[3,16,85]}]},f:[{t:4,f:[{p:[5,9,135],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[5,28,154]}]},f:[{t:4,f:[{p:[7,13,209],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"description",p:[7,45,241]}]}],n:50,r:"description",p:[6,11,176]}," ",{t:4,f:[{p:[10,13,333],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"admin_notes",p:[10,45,365]}]}],n:50,r:"admin_notes",p:[9,11,300]}," ",{p:[13,11,426],t:7,e:"ui-button",a:{action:"select_template",params:['{"shuttle_id": "',{t:2,r:"shuttle_id",p:[14,37,499]},'"}'],state:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"selected":null'},p:[15,20,537]}]},f:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"Selected":"Select"'},p:[17,13,630]}]}]}],n:52,r:"templates",p:[4,7,106]}]}],n:52,r:"data.templates",p:[2,3,44]}]}]},e.exports=a.extend(r.exports)},{341:341}],462:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,186],t:7,e:"ui-section",a:{label:"State"},f:[{p:[7,7,220],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[7,20,233]}]},f:[{t:2,r:"data.occupant.stat",p:[7,49,262]}]}]}," ",{p:[9,5,315],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[10,7,350],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[10,20,363]}],max:[{t:2,r:"data.occupant.maxHealth",p:[10,54,397]}],value:[{t:2,r:"data.occupant.health",p:[10,90,433]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[11,16,475]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[11,68,527]}]}]}," ",{t:4,f:[{p:[14,7,764],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[14,26,783]}]},f:[{p:[15,9,804],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[15,30,825]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[15,66,861]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[15,103,898]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[13,5,598]}," ",{t:4,f:[{p:[19,7,1020],t:7,e:"ui-section",a:{label:"Blood"},f:[{p:[20,9,1056],t:7,e:"ui-section",a:{label:"Volume"},f:[{p:[21,11,1095],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.blood.maxBloodVolume",p:[21,32,1116]}],value:[{t:2,r:"data.occupant.blood.currentBloodVolume",p:[21,79,1163]}],state:[{t:2,x:{r:["data.occupant.blood.currentBloodVolume","data.occupant.blood.dangerBloodVolume"],s:'_0<=_1?"bad":"good"'},p:[21,130,1214]}]},f:[{t:3,x:{r:["data.occupant.blood.currentBloodVolume","data.occupant.blood.dangerBloodVolume"],s:'_0<=_1?"LOW":"OK"'},p:[21,232,1316]}," - ",{t:2,x:{r:["data.occupant.blood.currentBloodVolume"],s:"Math.round(_0)"},p:[21,342,1426]}," cl"]}]}," ",{p:[23,9,1525],t:7,e:"ui-section",a:{label:"Type"},f:[{p:[24,11,1562],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:"data.occupant.blood.bloodType",p:[24,35,1586]}]}]}]}],n:50,r:"data.occupant.blood",p:[18,5,985]}," ",{p:[28,5,1689],t:7,e:"ui-section",a:{label:"Cells"},f:[{p:[29,9,1725],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"bad":"good"'},p:[29,22,1738]}]},f:[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"Damaged":"Healthy"'},p:[29,68,1784]}]}]}," ",{p:[31,5,1867],t:7,e:"ui-section",a:{label:"Brain"},f:[{p:[32,9,1903],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.brainLoss"], -s:'_0?"bad":"good"'},p:[32,22,1916]}]},f:[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"Abnormal":"Healthy"'},p:[32,68,1962]}]}]}," ",{p:[34,5,2046],t:7,e:"ui-section",a:{label:"Bloodstream"},f:[{t:4,f:[{p:[36,11,2133],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,1)"},p:[36,54,2176]}," units of ",{t:2,r:"name",p:[36,89,2211]}]},{p:[36,104,2226],t:7,e:"br"}],n:52,r:"adata.occupant.reagents",p:[35,9,2088]},{t:4,n:51,f:[{p:[38,11,2261],t:7,e:"span",a:{"class":"good"},f:["Pure"]}],r:"adata.occupant.reagents"}]}],n:50,r:"data.occupied",p:[5,3,159]}]}," ",{p:[43,1,2357],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[44,2,2389],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[45,5,2420],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[45,22,2437]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[45,71,2486]}]}]}," ",{p:[47,3,2551],t:7,e:"ui-section",a:{label:"Inject"},f:[{t:4,f:[{p:[49,7,2612],t:7,e:"ui-button",a:{icon:"flask",state:[{t:2,x:{r:["data.occupied","allowed"],s:'_0&&_1?null:"disabled"'},p:[49,38,2643]}],action:"inject",params:['{"chem": "',{t:2,r:"id",p:[49,122,2727]},'"}']},f:[{t:2,r:"name",p:[49,132,2737]}]},{p:[49,152,2757],t:7,e:"br"}],n:52,r:"data.chems",p:[48,5,2584]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],463:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,25],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[2,22,44]}],labelcolor:[{t:2,r:"htmlcolor",p:[2,44,66]}],candystripe:0,right:0},f:[{p:[3,5,105],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[3,32,132],t:7,e:"span",a:{"class":[{t:2,x:{r:["status"],s:'_0=="Dead"?"bad bold":_0=="Unconscious"?"average bold":"good"'},p:[3,45,145]}]},f:[{t:2,r:"status",p:[3,132,232]}]}]}," ",{p:[4,5,268],t:7,e:"ui-section",a:{label:"Jelly"},f:[{t:2,r:"exoticblood",p:[4,31,294]}]}," ",{p:[5,5,328],t:7,e:"ui-section",a:{label:"Location"},f:[{t:2,r:"area",p:[5,34,357]}]}," ",{p:[7,5,386],t:7,e:"ui-button",a:{state:[{t:2,r:"swap_button_state",p:[8,14,411]}],action:"swap",params:['{"ref": "',{t:2,r:"ref",p:[9,38,472]},'"}']},f:[{t:4,f:["You Are Here"],n:50,x:{r:["occupied"],s:'_0=="owner"'},p:[10,7,491]},{t:4,n:51,f:[{t:4,f:["Occupied"],n:50,x:{r:["occupied"],s:'_0=="stranger"'},p:[13,9,566]},{t:4,n:51,f:["Swap"],x:{r:["occupied"],s:'_0=="stranger"'}}],x:{r:["occupied"],s:'_0=="owner"'}}]}]}],n:52,r:"data.bodies",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],464:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{t:4,f:[{p:[4,23,82],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.drying"],s:'_0?"stop":"tint"'},p:[4,40,99]}],action:"Dry"},f:[{t:2,x:{r:["data.drying"],s:'_0?"Stop drying":"Dry"'},p:[4,88,147]}]}],n:50,r:"data.isdryer",p:[4,3,62]}]},t:7,e:"ui-display",a:{title:"Storage",button:0},f:[" ",{t:4,f:[{p:[7,3,258],t:7,e:"ui-notice",f:[{p:[8,5,275],t:7,e:"span",f:["Unfortunately, this ",{t:2,r:"data.name",p:[8,31,301]}," is empty."]}]}],n:50,x:{r:["data.contents.length"],s:"_0==0"},p:[6,1,221]},{t:4,n:51,f:[{p:[11,1,359],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[12,2,391],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[13,4,425],t:7,e:"section",a:{"class":"cell bold"},f:["Item"]}," ",{p:[16,4,482],t:7,e:"section",a:{"class":"cell bold"},f:["Quantity"]}," ",{p:[19,4,543],t:7,e:"section",a:{"class":"cell bold",align:"center"},f:[{t:4,f:[{t:2,r:"data.verb",p:[20,22,608]}],n:50,r:"data.verb",p:[20,5,591]},{t:4,n:51,f:["Dispense"],r:"data.verb"}]}]}," ",{t:4,f:[{p:[24,3,703],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[25,4,737],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[26,5,765]}]}," ",{p:[28,4,793],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[29,5,835]}]}," ",{p:[31,4,865],t:7,e:"section",a:{"class":"table",alight:"right"},f:[{p:[32,5,909],t:7,e:"section",a:{"class":"cell"}}," ",{p:[33,5,947],t:7,e:"section",a:{"class":"cell"},f:[{p:[34,6,976],t:7,e:"ui-button",a:{grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[34,45,1015]}],params:['{ "name" : ',{t:2,r:"name",p:[34,102,1072]},', "amount" : 1 }']},f:["One"]}]}," ",{p:[38,5,1151],t:7,e:"section",a:{"class":"cell"},f:[{p:[39,6,1180],t:7,e:"ui-button",a:{grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>1)?null:"disabled"'},p:[39,45,1219]}],params:['{ "name" : ',{t:2,r:"name",p:[39,101,1275]}," }"]},f:["Many"]}]}]}]}],n:52,r:"data.contents",p:[23,2,676]}]}],x:{r:["data.contents.length"],s:"_0==0"}}]}]},e.exports=a.extend(r.exports)},{341:341}],465:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{capacityPercentState:function(){var t=this.get("data.capacityPercent");return t>50?"good":t>15?"average":"bad"},inputState:function(){return this.get("data.capacityPercent")>=100?"good":this.get("data.inputting")?"average":"bad"},outputState:function(){return this.get("data.outputting")?"good":this.get("data.charge")>0?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[24,1,663],t:7,e:"ui-display",a:{title:"Storage"},f:[{p:[25,3,695],t:7,e:"ui-section",a:{label:"Stored Energy"},f:[{p:[26,5,735],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.capacityPercent",p:[26,38,768]}],state:[{t:2,r:"capacityPercentState",p:[26,71,801]}]},f:[{t:2,x:{r:["adata.capacityPercent"],s:"Math.fixed(_0)"},p:[26,97,827]},"%"]}]}]}," ",{p:[29,1,908],t:7,e:"ui-display",a:{title:"Input"},f:[{p:[30,3,938],t:7,e:"ui-section",a:{label:"Charge Mode"},f:[{p:[31,5,976],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"refresh":"close"'},p:[31,22,993]}],style:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"selected":null'},p:[31,74,1045]}],action:"tryinput"},f:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"Auto":"Off"'},p:[32,25,1113]}]},"   [",{p:[34,6,1182],t:7,e:"span",a:{"class":[{t:2,r:"inputState",p:[34,19,1195]}]},f:[{t:2,x:{r:["data.capacityPercent","data.inputting"],s:'_0>=100?"Fully Charged":_1?"Charging":"Not Charging"'},p:[34,35,1211]}]},"]"]}," ",{p:[36,3,1335],t:7,e:"ui-section",a:{label:"Target Input"},f:[{p:[37,5,1374],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.inputLevelMax",p:[37,26,1395]}],value:[{t:2,r:"data.inputLevel",p:[37,57,1426]}]},f:[{t:2,r:"adata.inputLevel_text",p:[37,78,1447]}]}]}," ",{p:[39,3,1501],t:7,e:"ui-section",a:{label:"Adjust Input"},f:[{p:[40,5,1540],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[40,44,1579]}],action:"input",params:'{"target": "min"}'}}," ",{p:[41,5,1674],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[41,39,1708]}],action:"input",params:'{"adjust": -10000}'}}," ",{p:[42,5,1804],t:7,e:"ui-button",a:{icon:"pencil",action:"input",params:'{"target": "input"}'},f:["Set"]}," ",{p:[43,5,1894],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[43,38,1927]}],action:"input",params:'{"adjust": 10000}'}}," ",{p:[44,5,2039],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[44,43,2077]}],action:"input",params:'{"target": "max"}'}}]}," ",{p:[46,3,2204],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[47,3,2238],t:7,e:"span",f:[{t:2,r:"adata.inputAvailable",p:[47,9,2244]}]}]}]}," ",{p:[50,1,2308],t:7,e:"ui-display",a:{title:"Output"},f:[{p:[51,3,2339],t:7,e:"ui-section",a:{label:"Output Mode"},f:[{p:[52,5,2377],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"power-off":"close"'},p:[52,22,2394]}],style:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"selected":null'},p:[52,77,2449]}],action:"tryoutput"},f:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"On":"Off"'},p:[53,26,2519]}]},"   [",{p:[55,6,2587],t:7,e:"span",a:{"class":[{t:2,r:"outputState",p:[55,19,2600]}]},f:[{t:2,x:{r:["data.outputting","data.charge"],s:'_0?"Sending":_1>0?"Not Sending":"No Charge"'},p:[55,36,2617]}]},"]"]}," ",{p:[57,3,2724],t:7,e:"ui-section",a:{label:"Target Output"},f:[{p:[58,5,2764],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.outputLevelMax",p:[58,26,2785]}],value:[{t:2,r:"data.outputLevel",p:[58,58,2817]}]},f:[{t:2,r:"adata.outputLevel_text",p:[58,80,2839]}]}]}," ",{p:[60,3,2894],t:7,e:"ui-section",a:{label:"Adjust Output"},f:[{p:[61,5,2934],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[61,44,2973]}],action:"output",params:'{"target": "min"}'}}," ",{p:[62,5,3070],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[62,39,3104]}],action:"output",params:'{"adjust": -10000}'}}," ",{p:[63,5,3202],t:7,e:"ui-button",a:{icon:"pencil",action:"output",params:'{"target": "input"}'},f:["Set"]}," ",{p:[64,5,3293],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[64,38,3326]}],action:"output",params:'{"adjust": 10000}'}}," ",{p:[65,5,3441],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[65,43,3479]}],action:"output",params:'{"target": "max"}'}}]}," ",{p:[67,3,3609],t:7,e:"ui-section",a:{label:"Outputting"},f:[{p:[68,3,3644],t:7,e:"span",f:[{t:2,r:"adata.outputUsed",p:[68,9,3650]}]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],466:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:["\ufeff",{t:4,f:[" ",{p:[2,2,33],t:7,e:"ui-display",a:{title:"Dispersal Tank"},f:[{p:[3,3,73],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[4,4,104],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.active"],s:'_0?"power-off":"close"'},p:[4,21,121]}],style:[{t:2,x:{r:["data.active"],s:'_0?"selected":null'},p:[5,12,174]}],state:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?null:"disabled"'},p:[6,12,223]}],action:"power"},f:[{t:2,x:{r:["data.active"],s:'_0?"On":"Off"'},p:[7,20,286]}]}]}," ",{p:[10,3,354],t:7,e:"ui-section",a:{label:"Smoke Radius Setting"},f:[{p:[11,5,401],t:7,e:"div",a:{"class":"content",style:"float:left"},f:[{p:[12,6,448],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=1?null:"disabled"'},p:[12,36,478]}],style:[{t:2,x:{r:["data.setting"],s:'_0==1?"selected":null'},p:[12,89,531]}],action:"setting",params:'{"amount": 1}'},f:["3"]}," ",{p:[13,6,634],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=2?null:"disabled"'},p:[13,36,664]}],style:[{t:2,x:{r:["data.setting"],s:'_0==2?"selected":null'},p:[13,89,717]}],action:"setting",params:'{"amount": 2}'},f:["6"]}," ",{p:[14,6,820],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=3?null:"disabled"'},p:[14,36,850]}],style:[{t:2,x:{r:["data.setting"],s:'_0==3?"selected":null'},p:[14,89,903]}],action:"setting",params:'{"amount": 3}'},f:["9"]}," ",{p:[15,6,1006],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=4?null:"disabled"'},p:[15,36,1036]}],style:[{t:2,x:{r:["data.setting"],s:'_0==4?"selected":null'},p:[15,89,1089]}],action:"setting",params:'{"amount": 4}'},f:["12"]}," ",{p:[16,6,1193],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=5?null:"disabled"'},p:[16,36,1223]}],style:[{t:2,x:{r:["data.setting"],s:'_0==5?"selected":null'},p:[16,89,1276]}],action:"setting",params:'{"amount": 5}'},f:["15"]}]}]}," ",{p:[19,3,1410],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[21,6,1476],t:7,e:"span",f:[{t:2,x:{r:["adata.TankCurrentVolume"],s:"Math.round(_0)"},p:[21,12,1482]},"/",{t:2,r:"data.TankMaxVolume",p:[21,52,1522]}," Units"]}," ",{p:[22,6,1564],t:7,e:"br"}," ",{p:[23,5,1575],t:7,e:"br"}," ",{t:4,f:[{p:[25,7,1623],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[25,50,1666]}," units of ",{t:2,r:"name",p:[25,85,1701]}]},{p:[25,100,1716],t:7,e:"br"}],n:52,r:"adata.TankContents",p:[24,6,1587]}],n:50,r:"data.isTankLoaded",p:[20,4,1444]},{t:4,n:51,f:[{p:[28,6,1757],t:7,e:"span",a:{"class":"bad"},f:["Tank Empty"]}],r:"data.isTankLoaded"}," ",{p:[30,4,1809],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"Eject":"Close"'},p:[30,21,1826]}],style:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"selected":null'},p:[31,12,1881]}],state:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?null:"disabled"'},p:[32,12,1936]}],action:"purge"},f:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"Purge Contents":"No chemicals detected"'},p:[33,20,1999]}]}]}]}],n:50,x:{r:["data.screen"],s:'_0=="home"'},p:[1,2,1]}]},e.exports=a.extend(r.exports)},{341:341}],467:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Generated Power"},f:[{t:2,x:{r:["adata.generated"],s:"Math.round(_0)"},p:[3,5,73]},"W"]}," ",{p:[5,3,126],t:7,e:"ui-section",a:{label:"Orientation"},f:[{p:[6,5,164],t:7,e:"span",f:[{t:2,x:{r:["adata.angle"],s:"Math.round(_0)"},p:[6,11,170]},"° (",{t:2,r:"data.direction",p:[6,45,204]},")"]}]}," ",{p:[8,3,251],t:7,e:"ui-section",a:{label:"Adjust Angle"},f:[{p:[9,5,290],t:7,e:"ui-button",a:{icon:"step-backward",action:"angle",params:'{"adjust": -15}'},f:["15°"]}," ",{p:[10,5,387],t:7,e:"ui-button",a:{icon:"backward",action:"angle",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[11,5,477],t:7,e:"ui-button",a:{icon:"forward",action:"angle",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[12,5,565],t:7,e:"ui-button",a:{icon:"step-forward",action:"angle",params:'{"adjust": 15}'},f:["15°"]}]}]}," ",{p:[15,1,687],t:7,e:"ui-display",a:{title:"Tracking"},f:[{p:[16,3,720],t:7,e:"ui-section",a:{label:"Tracker Mode"},f:[{p:[17,5,759],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==0?"selected":null'},p:[17,36,790]}],action:"tracking",params:'{"mode": 0}'},f:["Off"]}," ",{p:[19,5,907],t:7,e:"ui-button",a:{icon:"clock-o",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==1?"selected":null'},p:[19,38,940]}],action:"tracking",params:'{"mode": 1}'},f:["Timed"]}," ",{p:[21,5,1059],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.connected_tracker","data.tracking_state"],s:'_0?_1==2?"selected":null:"disabled"'},p:[21,38,1092]}],action:"tracking",params:'{"mode": 2}'},f:["Auto"]}]}," ",{p:[24,3,1262],t:7,e:"ui-section",a:{label:"Tracking Rate"},f:[{p:[25,3,1300],t:7,e:"span",f:[{t:2,x:{r:["adata.tracking_rate"],s:"Math.round(_0)"},p:[25,9,1306]},"°/h (",{t:2,r:"data.rotating_way",p:[25,53,1350]},")"]}]}," ",{p:[27,3,1399],t:7,e:"ui-section",a:{label:"Adjust Rate"},f:[{p:[28,5,1437],t:7,e:"ui-button",a:{icon:"fast-backward",action:"rate",params:'{"adjust": -180}'},f:["180°"]}," ",{p:[29,5,1535],t:7,e:"ui-button",a:{icon:"step-backward",action:"rate",params:'{"adjust": -30}'},f:["30°"]}," ",{p:[30,5,1631],t:7,e:"ui-button",a:{icon:"backward",action:"rate",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[31,5,1720],t:7,e:"ui-button",a:{icon:"forward",action:"rate",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[32,5,1807],t:7,e:"ui-button",a:{icon:"step-forward",action:"rate",params:'{"adjust": 30}'},f:["30°"]}," ",{p:[33,5,1901],t:7,e:"ui-button",a:{icon:"fast-forward",action:"rate",params:'{"adjust": 180}'},f:["180°"]}]}]}," ",{p:{button:[{p:[38,5,2088],t:7,e:"ui-button",a:{icon:"refresh",action:"refresh"},f:["Refresh"]}]},t:7,e:"ui-display",a:{title:"Devices",button:0},f:[" ",{p:[40,2,2169],t:7,e:"ui-section",a:{label:"Solar Tracker"},f:[{p:[41,5,2209],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_tracker"],s:'_0?"good":"bad"'},p:[41,18,2222]}]},f:[{t:2,x:{r:["data.connected_tracker"],s:'_0?"":"Not "'},p:[41,63,2267]},"Found"]}]}," ",{p:[43,2,2338],t:7,e:"ui-section",a:{label:"Solar Panels"},f:[{p:[44,3,2375],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_panels"],s:'_0?"good":"bad"'},p:[44,16,2388]}]},f:[{t:2,x:{r:["adata.connected_panels"],s:"Math.round(_0)"},p:[44,60,2432]}," Panels Connected"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],468:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{t:4,f:[{p:[4,7,87],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[4,38,118]}],action:"eject"},f:["Eject"]}],n:50,r:"data.open",p:[3,5,62]}]},t:7,e:"ui-display",a:{title:"Power",button:0},f:[" ",{p:[7,3,226],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[8,5,258],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[8,22,275]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[9,14,326]}],state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[9,54,366]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[10,22,431]}]}]}," ",{p:[12,3,490],t:7,e:"ui-section",a:{label:"Cell"},f:[{t:4,f:[{p:[14,7,554],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.powerLevel",p:[14,40,587]}]},f:[{t:2,x:{r:["adata.powerLevel"],s:"Math.fixed(_0)"},p:[14,61,608]},"%"]}],n:50,r:"data.hasPowercell",p:[13,5,521]},{t:4,n:51,f:[{p:[16,4,667],t:7,e:"span",a:{"class":"bad"},f:["No Cell"]}],r:"data.hasPowercell"}]}]}," ",{p:[20,1,744],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[21,3,779],t:7,e:"ui-section",a:{label:"Current Temperature"},f:[{p:[22,3,823],t:7,e:"span",f:[{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[22,9,829]},"°C"]}]}," ",{p:[24,2,894],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[25,3,937],t:7,e:"span",f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[25,9,943]},"°C"]}]}," ",{t:4,f:[{p:[28,5,1031],t:7,e:"ui-section",a:{label:"Adjust Target"},f:[{p:[29,7,1073],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[29,46,1112]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[30,7,1218],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[30,41,1252]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[31,7,1357],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:["Set"]}," ",{p:[32,7,1450],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[32,40,1483]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[33,7,1587],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[33,45,1625]}],action:"target",params:'{"adjust": 20}'}}]}],n:50,r:"data.open",p:[27,3,1008]}," ",{p:[36,3,1754],t:7,e:"ui-section",a:{label:"Mode"},f:[{t:4,f:[{p:[38,7,1808],t:7,e:"ui-button",a:{icon:"long-arrow-up",state:[{t:2,x:{r:["data.mode"],s:'_0=="heat"?"selected":null'},p:[38,46,1847]}],action:"mode",params:'{"mode": "heat"}'},f:["Heat"]}," ",{p:[39,7,1956],t:7,e:"ui-button",a:{icon:"long-arrow-down",state:[{t:2,x:{r:["data.mode"],s:'_0=="cool"?"selected":null'},p:[39,48,1997]}],action:"mode",params:'{"mode": "cool"}'},f:["Cool"]}," ",{p:[40,7,2106],t:7,e:"ui-button",a:{icon:"arrows-v",state:[{t:2,x:{r:["data.mode"],s:'_0=="auto"?"selected":null'},p:[40,41,2140]}],action:"mode",params:'{"mode": "auto"}'},f:["Auto"]}],n:50,r:"data.open",p:[37,3,1783]},{t:4,n:51,f:[{p:[42,4,2258],t:7,e:"span",f:[{t:2,x:{r:["text","data.mode"],s:"_0.titleCase(_1)"},p:[42,10,2264]}]}],r:"data.open"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],469:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:{button:[{p:[4,8,97],t:7,e:"ui-button",a:{action:"jump",params:['{"name" : ',{t:2,r:"name",p:[4,51,140]},"}"]},f:["Jump"]}," ",{p:[7,9,195],t:7,e:"ui-button",a:{action:"spawn",params:['{"name" : ',{t:2,r:"name",p:[7,53,239]},"}"]},f:["Spawn"]}]},t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[2,22,46]}],button:0},f:[" ",{p:[11,3,308],t:7,e:"ui-section",a:{label:"Description"},f:[{p:[12,5,346],t:7,e:"span",f:[{t:3,r:"desc",p:[12,11,352]}]}]}," ",{p:[14,3,390],t:7,e:"ui-section",a:{label:"Spawners left"},f:[{p:[15,5,430],t:7,e:"span",f:[{t:2,r:"amount_left",p:[15,11,436]}]}]}]}],n:52,r:"data.spawners",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],470:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,31],t:7,e:"ui-display",a:{title:[{t:2,r:"class",p:[2,22,50]}," Alarms"]},f:[{p:[3,5,74],t:7,e:"ul",f:[{t:4,f:[{p:[5,9,107],t:7,e:"li",f:[{t:2,r:".",p:[5,13,111]}]}],n:52,r:".",p:[4,7,86]},{t:4,n:51,f:[{p:[7,9,147],t:7,e:"li",f:["System Nominal"]}],r:"."}]}]}],n:52,i:"class",r:"data.alarms",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],471:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,42],t:7,e:"ui-notice",f:[{p:[3,5,59],t:7,e:"span",f:["Biological entity detected in contents. Please remove."]}]}],n:50,x:{r:["data.occupied","data.safeties"],s:"_0&&_1"},p:[1,1,0]},{t:4,f:[{p:[7,3,179],t:7,e:"ui-notice",f:[{p:[8,5,196],t:7,e:"span",f:["Contents are being disinfected. Please wait."]}]}],n:50,r:"data.uv_active",p:[6,1,153]},{t:4,n:51,f:[{p:{button:[{t:4,f:[{p:[13,25,369],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[13,42,386]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Unlock":"Lock"'},p:[13,93,437]}]}],n:50,x:{r:["data.open"],s:"!_0"},p:[13,7,351]}," ",{t:4,f:[{p:[14,27,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"sign-out":"sign-in"'},p:[14,44,536]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Close":"Open"'},p:[14,98,590]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[14,7,499]}]},t:7,e:"ui-display",a:{title:"Storage",button:0},f:[" ",{t:4,f:[{p:[17,7,692],t:7,e:"ui-notice",f:[{p:[18,9,713],t:7,e:"span",f:["Unit Locked"]}]}],n:50,r:"data.locked",p:[16,5,665]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.open"],s:"_0"},f:[{p:[21,9,793],t:7,e:"ui-section",a:{label:"Helmet"},f:[{p:[22,11,832],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.helmet"],s:'_0?"square":"square-o"'},p:[22,28,849]}],state:[{t:2,x:{r:["data.helmet"],s:'_0?null:"disabled"'},p:[22,75,896]}],action:"dispense",params:'{"item": "helmet"}'},f:[{t:2,x:{r:["data.helmet"],s:'_0||"Empty"'},p:[23,59,992]}]}]}," ",{p:[25,9,1063],t:7,e:"ui-section",a:{label:"Suit"},f:[{p:[26,11,1100],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.suit"],s:'_0?"square":"square-o"'},p:[26,28,1117]}],state:[{t:2,x:{r:["data.suit"],s:'_0?null:"disabled"'},p:[26,74,1163]}],action:"dispense",params:'{"item": "suit"}'},f:[{t:2,x:{r:["data.suit"],s:'_0||"Empty"'},p:[27,57,1255]}]}]}," ",{p:[29,9,1324],t:7,e:"ui-section",a:{label:"Mask"},f:[{p:[30,11,1361],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mask"],s:'_0?"square":"square-o"'},p:[30,28,1378]}],state:[{t:2,x:{r:["data.mask"],s:'_0?null:"disabled"'},p:[30,74,1424]}],action:"dispense",params:'{"item": "mask"}'},f:[{t:2,x:{r:["data.mask"],s:'_0||"Empty"'},p:[31,57,1516]}]}]}," ",{p:[33,9,1585],t:7,e:"ui-section",a:{label:"Storage"},f:[{p:[34,11,1625],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.storage"],s:'_0?"square":"square-o"'},p:[34,28,1642]}],state:[{t:2,x:{r:["data.storage"],s:'_0?null:"disabled"'},p:[34,77,1691]}],action:"dispense",params:'{"item": "storage"}'},f:[{t:2,x:{r:["data.storage"],s:'_0||"Empty"'},p:[35,60,1789]}]}]}]},{t:4,n:50,x:{r:["data.open"],s:"!(_0)"},f:[" ",{p:[38,7,1873],t:7,e:"ui-button",a:{icon:"recycle",state:[{t:2,x:{r:["data.occupied","data.safeties"],s:'_0&&_1?"disabled":null'},p:[38,40,1906]}],action:"uv"},f:["Disinfect"]}]}],r:"data.locked"}]}],r:"data.uv_active"}]},e.exports=a.extend(r.exports)},{341:341}],472:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,5,18],t:7,e:"ui-section",a:{label:"Dispense"},f:[{p:[3,9,57],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.plasma"],s:'_0?"square":"square-o"'},p:[3,26,74]}],state:[{t:2,x:{r:["data.plasma"],s:'_0?null:"disabled"'},p:[3,74,122]}],action:"plasma"},f:["Plasma (",{t:2,x:{r:["adata.plasma"],s:"Math.round(_0)"},p:[4,37,196]},")"]}," ",{p:[5,9,247],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.oxygen"],s:'_0?"square":"square-o"'},p:[5,26,264]}],state:[{t:2,x:{r:["data.oxygen"],s:'_0?null:"disabled"'},p:[5,74,312]}],action:"oxygen"},f:["Oxygen (",{t:2,x:{r:["adata.oxygen"],s:"Math.round(_0)"},p:[6,37,386]},")"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],473:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{tankPressureState:function(){var t=this.get("data.tankPressure");return t>=200?"good":t>=100?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[14,1,295],t:7,e:"ui-notice",f:[{p:[15,3,310],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.connected"],s:'_0?"is":"is not"'},p:[15,23,330]}," connected to a mask."]}]}," ",{p:[17,1,409],t:7,e:"ui-display",f:[{p:[18,3,425],t:7,e:"ui-section",a:{label:"Tank Pressure"},f:[{p:[19,7,467],t:7,e:"ui-bar",a:{min:"0",max:"1013",value:[{t:2,r:"data.tankPressure",p:[19,41,501]}],state:[{t:2,r:"tankPressureState",p:[20,16,540]}]},f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[20,39,563]}," kPa"]}]}," ",{p:[22,3,631],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[23,5,674],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[23,18,687]}],max:[{t:2,r:"data.maxReleasePressure",p:[23,52,721]}],value:[{t:2,r:"data.releasePressure",p:[24,14,764]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[24,40,790]}," kPa"]}]}," ",{p:[26,3,861],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,906],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,939]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1095],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1126]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1273],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1368],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1398]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],474:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,5,33],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[3,9,75],t:7,e:"span",f:[{t:2,x:{r:["adata.temperature"],s:"Math.fixed(_0,2)"},p:[3,15,81]}," K"]}]}," ",{p:[5,5,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,9,190],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.fixed(_0,2)"},p:[6,15,196]}," kPa"]}]}]}," ",{p:[9,1,276],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[10,5,311],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[11,9,347],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[11,26,364]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[11,70,408]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[12,28,469]}]}]}," ",{p:[14,5,531],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[15,9,580],t:7,e:"ui-button",a:{icon:"fast-backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[15,48,619]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[17,9,733],t:7,e:"ui-button",a:{icon:"backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[17,43,767]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[19,9,880],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:[{t:2,x:{r:["adata.target"],s:"Math.fixed(_0,2)"},p:[19,79,950]}]}," ",{p:[20,9,1003],t:7,e:"ui-button",a:{icon:"forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[20,42,1036]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[22,9,1148],t:7,e:"ui-button",a:{icon:"fast-forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[22,47,1186]}],action:"target",params:'{"adjust": 20}'}}]}]}]},e.exports=a.extend(r.exports)},{341:341}],475:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{powerState:function(t){switch(t){case 1:return"good";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[13,1,173],t:7,e:"ui-notice",f:[{p:[14,2,187],t:7,e:"ui-section",a:{label:"Reconnect"},f:[{p:[15,3,221],t:7,e:"div",a:{style:"float:right"},f:[{p:[16,4,251],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}]}]}]}," ",{p:[20,1,359],t:7,e:"ui-display",a:{title:"Turbine Controller"},f:[{p:[21,2,401],t:7,e:"ui-section",a:{label:"Status"},f:[{t:4,f:[{p:[23,4,456],t:7,e:"span",a:{"class":"bad"},f:["Broken"]}],n:50,r:"data.broken",p:[22,3,432]},{t:4,n:51,f:[{p:[25,4,504],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.online"],s:"_0(_1)"},p:[25,17,517]}]},f:[{t:2,x:{r:["data.online","data.compressor_broke","data.turbine_broke"],s:'_0&&!(_1||_2)?"Online":"Offline"'},p:[25,46,546]}]}],r:"data.broken"}," ",{p:[27,3,656],t:7,e:"div",a:{style:"float:right"},f:[{p:[28,4,686],t:7,e:"ui-button",a:{icon:"power-off",action:"power-on",state:[{t:2,r:"data.broken",p:[28,57,739]}],style:[{t:2,x:{r:["data.online"],s:'_0?"selected":""'},p:[28,81,763]}]},f:["On"]}," ",{p:[29,4,817],t:7,e:"ui-button",a:{icon:"close",action:"power-off",state:[{t:2,r:"data.broken",p:[29,54,867]}],style:[{t:2,x:{r:["data.online"],s:'_0?"":"selected"'},p:[29,78,891]}]},f:["Off"]}]}," ",{t:4,f:[{p:[32,4,989],t:7,e:"br"}," [ ",{p:[33,6,1e3],t:7,e:"span",a:{"class":"bad"},f:["Compressor is inoperable"]}," ]"],n:50,r:"data.compressor_broke",p:[31,3,955]}," ",{t:4,f:[{p:[36,4,1097],t:7,e:"br"}," [ ",{p:[37,6,1108],t:7,e:"span",a:{"class":"bad"},f:["Turbine is inoperable"]}," ]"],n:50,r:"data.turbine_broke",p:[35,3,1066]}]}]}," ",{p:[41,1,1200],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[42,2,1230],t:7,e:"ui-section",a:{label:"Turbine Speed"},f:[{p:[43,3,1268],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.rpm"],s:'_0?"--":_1'},p:[43,9,1274]}," RPM"]}]}," ",{p:[45,2,1337],t:7,e:"ui-section",a:{label:"Internal Temp"},f:[{p:[46,3,1375],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.temp"],s:'_0?"--":_1'},p:[46,9,1381]}," K"]}]}," ",{p:[48,2,1443],t:7,e:"ui-section",a:{label:"Generated Power"},f:[{p:[49,3,1483],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.power"],s:'_0?"--":_1'},p:[49,9,1489]}]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],476:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{},oninit:function(){this.on({hover:function(t){var e=this.get("data.telecrystals");e>=t.context.params.cost&&this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}})}}}(r),r.exports.template={v:3,t:[" ",{p:{button:[{t:4,f:[{p:[23,7,482],t:7,e:"ui-button",a:{icon:"lock",action:"lock"},f:["Lock"]}],n:50,r:"data.lockable",p:[22,5,453]}]},t:7,e:"ui-display",a:{title:"Uplink",button:0},f:[" ",{p:[26,3,568],t:7,e:"ui-section",a:{label:"Telecrystals",right:0},f:[{p:[27,5,613],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.telecrystals"],s:'_0>0?"good":"bad"'},p:[27,18,626]}]},f:[{t:2,r:"data.telecrystals",p:[27,62,670]}," TC"]}]}]}," ",{t:4,f:[{p:[31,3,764],t:7,e:"ui-display",f:[{p:[32,2,779],t:7,e:"ui-button",a:{action:"select",params:['{"category": "',{t:2,r:"name",p:[32,51,828]},'"}']},f:[{t:2,r:"name",p:[32,63,840]}]}," ",{t:4,f:[{p:[34,4,883],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[34,23,902]}],candystripe:0,right:0},f:[{p:[35,3,934],t:7,e:"ui-button",a:{tooltip:[{t:2,r:"name",p:[35,23,954]},": ",{t:2,r:"desc",p:[35,33,964]}],"tooltip-side":"left",state:[{t:2,x:{r:["data.telecrystals","hovered.cost","cost","hovered.item","name"],s:'_0<_2||(_0-_1<_2&&_3!=_4)?"disabled":null'},p:[36,12,1006]}],action:"buy",params:['{"category": "',{t:2,r:"category",p:[37,40,1165]},'", "item": ',{t:2,r:"name",p:[37,63,1188]},', "cost": ',{t:2,r:"cost",p:[37,81,1206]},"}"]},v:{hover:"hover",unhover:"unhover" -},f:[{t:2,r:"cost",p:[38,43,1260]}," TC"]}]}],n:52,r:"items",p:[33,2,863]}]}],n:52,r:"data.categories",p:[30,1,735]}]},e.exports=a.extend(r.exports)},{341:341}],477:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{healthState:function(t){var e=this.get("data.vr_avatar.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[14,1,292],t:7,e:"ui-display",f:[{t:4,f:[{p:[16,3,331],t:7,e:"ui-notice",f:[{p:[17,4,347],t:7,e:"span",f:["Safety restraints disabled."]}]}],n:50,r:"data.emagged",p:[15,2,307]}," ",{t:4,f:[{p:[21,3,442],t:7,e:"ui-display",a:{title:"Virtual Avatar"},f:[{p:[22,4,482],t:7,e:"ui-section",a:{label:"Name"},f:[{t:2,r:"data.vr_avatar.name",p:[23,5,513]}]}," ",{p:[25,4,559],t:7,e:"ui-section",a:{label:"Status"},f:[{t:2,r:"data.vr_avatar.status",p:[26,5,592]}]}," ",{p:[28,4,640],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[29,5,673],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.vr_avatar.maxhealth",p:[29,26,694]}],value:[{t:2,r:"adata.vr_avatar.health",p:[29,64,732]}],state:[{t:2,x:{r:["healthState","adata.vr_avatar.health"],s:"_0(_1)"},p:[29,99,767]}]},f:[{t:2,x:{r:["adata.vr_avatar.health"],s:"Math.round(_0)"},p:[29,140,808]},"/",{t:2,r:"adata.vr_avatar.maxhealth",p:[29,179,847]}]}]}]}],n:50,r:"data.vr_avatar",p:[20,2,416]},{t:4,n:51,f:[{p:[33,3,935],t:7,e:"ui-display",a:{title:"Virtual Avatar"},f:["No Virtual Avatar detected"]}],r:"data.vr_avatar"}," ",{p:[37,2,1031],t:7,e:"ui-display",a:{title:"VR Commands"},f:[{p:[38,3,1067],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.toggle_open"],s:'_0?"times":"plus"'},p:[38,20,1084]}],action:"toggle_open"},f:[{t:2,x:{r:["data.toggle_open"],s:'_0?"Close":"Open"'},p:[39,4,1151]}," the VR Sleeper"]}," ",{t:4,f:[{p:[42,4,1253],t:7,e:"ui-button",a:{icon:"signal",action:"vr_connect"},f:["Connect to VR"]}],n:50,r:"data.isoccupant",p:[41,3,1225]}," ",{t:4,f:[{p:[47,4,1376],t:7,e:"ui-button",a:{icon:"ban",action:"delete_avatar"},f:["Delete Virtual Avatar"]}],n:50,r:"data.vr_avatar",p:[46,3,1349]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],478:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{t:4,f:[{p:[3,5,42],t:7,e:"ui-section",a:{label:[{t:2,r:"color",p:[3,24,61]},{t:2,x:{r:["wire"],s:'_0?" ("+_0+")":""'},p:[3,33,70]}],labelcolor:[{t:2,r:"color",p:[3,80,117]}],candystripe:0,right:0},f:[{p:[4,7,154],t:7,e:"ui-button",a:{action:"cut",params:['{"wire":"',{t:2,r:"color",p:[4,48,195]},'"}']},f:[{t:2,x:{r:["cut"],s:'_0?"Mend":"Cut"'},p:[4,61,208]}]}," ",{p:[5,7,252],t:7,e:"ui-button",a:{action:"pulse",params:['{"wire":"',{t:2,r:"color",p:[5,50,295]},'"}']},f:["Pulse"]}," ",{p:[6,7,333],t:7,e:"ui-button",a:{action:"attach",params:['{"wire":"',{t:2,r:"color",p:[6,51,377]},'"}']},f:[{t:2,x:{r:["attached"],s:'_0?"Detach":"Attach"'},p:[6,64,390]}]}]}],n:52,r:"data.wires",p:[2,3,16]}]}," ",{t:4,f:[{p:[11,3,508],t:7,e:"ui-display",f:[{t:4,f:[{p:[13,7,555],t:7,e:"ui-section",f:[{t:2,r:".",p:[13,19,567]}]}],n:52,r:"data.status",p:[12,5,526]}]}],n:50,r:"data.status",p:[10,1,485]}]},e.exports=a.extend(r.exports)},{341:341}],479:[function(t,e,n){(function(e){"use strict";var n=t(341),a=e.interopRequireDefault(n);t(331),t(1),t(327),t(330);var r=t(480),i=e.interopRequireDefault(r),o=t(481),s=t(328),p=t(329),u=e.interopRequireDefault(p);a["default"].DEBUG=/minified/.test(function(){}),Object.assign(Math,t(485)),window.initialize=function(e){window.tgui=window.tgui||new i["default"]({el:"#container",data:function(){var n=JSON.parse(e);return{constants:t(482),text:t(486),config:n.config,data:n.data,adata:n.data}}})};var c=document.getElementById("data"),l=c.textContent,d=c.getAttribute("data-ref");"{}"!==l&&(window.initialize(l),c.remove()),(0,o.act)(d,"tgui:initialize"),(0,s.loadCSS)("font-awesome.min.css");var f=new u["default"]("FontAwesome");f.check("").then(function(){return document.body.classList.add("icons")})["catch"](function(){return document.body.classList.add("no-icons")})}).call(this,t("babel/external-helpers"))},{1:1,327:327,328:328,329:329,330:330,331:331,341:341,480:480,481:481,482:482,485:485,486:486,"babel/external-helpers":"babel/external-helpers"}],480:[function(t,e,n){var a=t(341),r={exports:{}};!function(e){"use strict";var n=t(481),a=t(483);e.exports={components:{"ui-bar":t(342),"ui-button":t(343),"ui-display":t(344),"ui-input":t(345),"ui-linegraph":t(346),"ui-notice":t(347),"ui-section":t(349),"ui-subdisplay":t(350),"ui-tabs":t(351)},events:{enter:t(339).enter,space:t(339).space},transitions:{fade:t(340)},onconfig:function(){var e=this.get("config.interface"),n={ai_airlock:t(355),airalarm:t(356),"airalarm/back":t(357),"airalarm/modes":t(358),"airalarm/scrubbers":t(359),"airalarm/status":t(360),"airalarm/thresholds":t(361),"airalarm/vents":t(362),airlock_electronics:t(363),apc:t(364),atmos_alert:t(365),atmos_control:t(366),atmos_filter:t(367),atmos_mixer:t(368),atmos_pump:t(369),borgopanel:t(370),brig_timer:t(371),bsa:t(372),canister:t(373),cargo:t(374),cargo_express:t(375),cellular_emporium:t(376),centcom_podlauncher:t(377),chem_dispenser:t(378),chem_heater:t(379),chem_master:t(380),chem_synthesizer:t(381),clockwork_slab:t(382),codex_gigas:t(383),computer_fabricator:t(384),crayon:t(385),crew:t(386),cryo:t(387),disposal_unit:t(388),dna_vault:t(389),dogborg_sleeper:t(390),eightball:t(391),emergency_shuttle_console:t(392),engraved_message:t(393),error:t(394),"exofab - Copia":t(395),exonet_node:t(396),firealarm:t(397),gps:t(398),gulag_console:t(399),gulag_item_reclaimer:t(400),holodeck:t(401),implantchair:t(402),intellicard:t(403),keycard_auth:t(404),labor_claim_console:t(405),language_menu:t(406),launchpad_remote:t(407),mech_bay_power_console:t(408),mulebot:t(409),nanite_chamber_control:t(410),nanite_cloud_control:t(411),nanite_program_hub:t(412),nanite_programmer:t(413),nanite_remote:t(414),notificationpanel:t(415),ntnet_relay:t(416),ntos_ai_restorer:t(417),ntos_card:t(418),ntos_configuration:t(419),ntos_file_manager:t(420),ntos_main:t(421),ntos_net_chat:t(422),ntos_net_dos:t(423),ntos_net_downloader:t(424),ntos_net_monitor:t(425),ntos_net_transfer:t(426),ntos_power_monitor:t(427),ntos_revelation:t(428),ntos_station_alert:t(429),ntos_supermatter_monitor:t(430),ntosheader:t(431),nuclear_bomb:t(432),operating_computer:t(433),ore_redemption_machine:t(434),pandemic:t(435),personal_crafting:t(436),portable_pump:t(437),portable_scrubber:t(438),power_monitor:t(439),radio:t(440),rdconsole:t(441),"rdconsole/circuit":t(442),"rdconsole/designview":t(443),"rdconsole/destruct":t(444),"rdconsole/diskopsdesign":t(445),"rdconsole/diskopstech":t(446),"rdconsole/nodeview":t(447),"rdconsole/protolathe":t(448),"rdconsole/rdheader":t(449),"rdconsole/settings":t(450),"rdconsole/techweb":t(451),reagentgrinder:t(452),rpd:t(453),"rpd/colorsel":t(454),"rpd/dirsel":t(455),sat_control:t(456),scrubbing_types:t(457),shuttle_manipulator:t(458),"shuttle_manipulator/modification":t(459),"shuttle_manipulator/status":t(460),"shuttle_manipulator/templates":t(461),sleeper:t(462),slime_swap_body:t(463),smartvend:t(464),smes:t(465),smoke_machine:t(466),solar_control:t(467),space_heater:t(468),spawners_menu:t(469),station_alert:t(470),suit_storage_unit:t(471),tank_dispenser:t(472),tanks:t(473),thermomachine:t(474),turbine_computer:t(475),uplink:t(476),vr_sleeper:t(477),wires:t(478)};e in n?this.components["interface"]=n[e]:this.components["interface"]=n.error},oninit:function(){this.observe("config.style",function(t,e,n){t&&document.body.classList.add(t),e&&document.body.classList.remove(e)})},oncomplete:function(){if(this.get("config.locked")){var t=(0,a.lock)(window.screenLeft,window.screenTop),e=t.x,r=t.y;(0,n.winset)(this.get("config.window"),"pos",e+","+r)}(0,n.winset)("mapwindow.map","focus",!0)}}}(r),r.exports.template={v:3,t:[" "," "," "," ",{p:[56,1,1874],t:7,e:"titlebar",f:[{t:3,r:"config.title",p:[56,11,1884]}]}," ",{p:[57,1,1915],t:7,e:"main",f:[{p:[58,3,1925],t:7,e:"warnings"}," ",{p:[59,3,1940],t:7,e:"interface"}]}," ",{t:4,f:[{p:[62,3,1990],t:7,e:"resize"}],n:50,r:"config.titlebar",p:[61,1,1963]}]},r.exports.components=r.exports.components||{};var i={warnings:t(354),titlebar:t(353),resize:t(348)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{339:339,340:340,341:341,342:342,343:343,344:344,345:345,346:346,347:347,348:348,349:349,350:350,351:351,353:353,354:354,355:355,356:356,357:357,358:358,359:359,360:360,361:361,362:362,363:363,364:364,365:365,366:366,367:367,368:368,369:369,370:370,371:371,372:372,373:373,374:374,375:375,376:376,377:377,378:378,379:379,380:380,381:381,382:382,383:383,384:384,385:385,386:386,387:387,388:388,389:389,390:390,391:391,392:392,393:393,394:394,395:395,396:396,397:397,398:398,399:399,400:400,401:401,402:402,403:403,404:404,405:405,406:406,407:407,408:408,409:409,410:410,411:411,412:412,413:413,414:414,415:415,416:416,417:417,418:418,419:419,420:420,421:421,422:422,423:423,424:424,425:425,426:426,427:427,428:428,429:429,430:430,431:431,432:432,433:433,434:434,435:435,436:436,437:437,438:438,439:439,440:440,441:441,442:442,443:443,444:444,445:445,446:446,447:447,448:448,449:449,450:450,451:451,452:452,453:453,454:454,455:455,456:456,457:457,458:458,459:459,460:460,461:461,462:462,463:463,464:464,465:465,466:466,467:467,468:468,469:469,470:470,471:471,472:472,473:473,474:474,475:475,476:476,477:477,478:478,481:481,483:483}],481:[function(t,e,n){"use strict";function a(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return"byond://"+e+"?"+Object.keys(t).map(function(e){return o(e)+"="+o(t[e])}).join("&")}function r(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};window.location.href=a(Object.assign({src:t,action:e},n))}function i(t,e,n){var r;window.location.href=a((r={},r[t+"."+e]=n,r),"winset")}n.__esModule=!0,n.href=a,n.act=r,n.winset=i;var o=encodeURIComponent},{}],482:[function(t,e,n){"use strict";n.__esModule=!0;n.UI_INTERACTIVE=2,n.UI_UPDATE=1,n.UI_DISABLED=0,n.UI_CLOSE=-1},{}],483:[function(t,e,n){"use strict";function a(t,e){return 0>t?t=0:t+window.innerWidth>window.screen.availWidth&&(t=window.screen.availWidth-window.innerWidth),0>e?e=0:e+window.innerHeight>window.screen.availHeight&&(e=window.screen.availHeight-window.innerHeight),{x:t,y:e}}function r(t){if(t.preventDefault(),this.get("drag")){if(this.get("x")){var e=t.screenX-this.get("x")+window.screenLeft,n=t.screenY-this.get("y")+window.screenTop;if(this.get("config.locked")){var r=a(e,n);e=r.x,n=r.y}(0,s.winset)(this.get("config.window"),"pos",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}function i(t,e){return t=Math.clamp(100,window.screen.width,t),e=Math.clamp(100,window.screen.height,e),{x:t,y:e}}function o(t){if(t.preventDefault(),this.get("resize")){if(this.get("x")){var e=t.screenX-this.get("x")+window.innerWidth,n=t.screenY-this.get("y")+window.innerHeight,a=i(e,n);e=a.x,n=a.y,(0,s.winset)(this.get("config.window"),"size",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}n.__esModule=!0,n.lock=a,n.drag=r,n.sane=i,n.resize=o;var s=t(481)},{481:481}],484:[function(t,e,n){"use strict";function a(t,e){for(var n=t,a=Array.isArray(n),i=0,n=a?n:n[Symbol.iterator]();;){var o;if(a){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;s.textContent.toLowerCase().includes(e)?(s.style.display="",r(s,e)):s.style.display="none"}}function r(t,e){for(var n=t.queryAll("section"),a=t.query("header").textContent.toLowerCase().includes(e),r=n,i=Array.isArray(r),o=0,r=i?r:r[Symbol.iterator]();;){var s;if(i){if(o>=r.length)break;s=r[o++]}else{if(o=r.next(),o.done)break;s=o.value}var p=s;a||p.textContent.toLowerCase().includes(e)?p.style.display="":p.style.display="none"}}n.__esModule=!0,n.filterMulti=a,n.filter=r},{}],485:[function(t,e,n){"use strict";function a(t,e,n){return Math.max(t,Math.min(n,e))}function r(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return+(Math.round(t+"e"+e)+"e-"+e)}n.__esModule=!0,n.clamp=a,n.fixed=r},{}],486:[function(t,e,n){"use strict";function a(t){return t[0].toUpperCase()+t.slice(1).toLowerCase()}function r(t){return t.replace(/\w\S*/g,a)}function i(t,e){for(t=""+t;t.length1){for(var p=Array(o),u=0;o>u;u++)p[u]=arguments[u+3];n.children=p}return{$$typeof:t,type:e,key:void 0===a?null:""+a,ref:null,props:n,_owner:null}}}(),e.asyncIterator=function(t){if("function"==typeof Symbol){if(Symbol.asyncIterator){var e=t[Symbol.asyncIterator];if(null!=e)return e.call(t)}if(Symbol.iterator)return t[Symbol.iterator]()}throw new TypeError("Object is not async iterable")},e.asyncGenerator=function(){function t(t){this.value=t}function e(e){function n(t,e){return new Promise(function(n,r){var s={key:t,arg:e,resolve:n,reject:r,next:null};o?o=o.next=s:(i=o=s,a(t,e))})}function a(n,i){try{var o=e[n](i),s=o.value;s instanceof t?Promise.resolve(s.value).then(function(t){a("next",t)},function(t){a("throw",t)}):r(o.done?"return":"normal",o.value)}catch(p){r("throw",p)}}function r(t,e){switch(t){case"return":i.resolve({value:e,done:!0});break;case"throw":i.reject(e);break;default:i.resolve({value:e,done:!1})}i=i.next,i?a(i.key,i.arg):o=null}var i,o;this._invoke=n,"function"!=typeof e["return"]&&(this["return"]=void 0)}return"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype["throw"]=function(t){return this._invoke("throw",t)},e.prototype["return"]=function(t){return this._invoke("return",t)},{wrap:function(t){return function(){return new e(t.apply(this,arguments))}},await:function(e){return new t(e)}}}(),e.asyncGeneratorDelegate=function(t,e){function n(n,a){return r=!0,a=new Promise(function(e){e(t[n](a))}),{done:!1,value:e(a)}}var a={},r=!1;return"function"==typeof Symbol&&Symbol.iterator&&(a[Symbol.iterator]=function(){return this}),a.next=function(t){return r?(r=!1,t):n("next",t)},"function"==typeof t["throw"]&&(a["throw"]=function(t){if(r)throw r=!1,t;return n("throw",t)}),"function"==typeof t["return"]&&(a["return"]=function(t){return n("return",t)}),a},e.asyncToGenerator=function(t){return function(){var e=t.apply(this,arguments);return new Promise(function(t,n){function a(r,i){try{var o=e[r](i),s=o.value}catch(p){return void n(p)}return o.done?void t(s):Promise.resolve(s).then(function(t){a("next",t)},function(t){a("throw",t)})}return a("next")})}},e.classCallCheck=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},e.createClass=function(){function t(t,e){for(var n=0;n=0||Object.prototype.hasOwnProperty.call(t,a)&&(n[a]=t[a]);return n},e.possibleConstructorReturn=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e},e.selfGlobal=void 0===t?self:t,e.set=function a(t,e,n,r){var i=Object.getOwnPropertyDescriptor(t,e);if(void 0===i){var o=Object.getPrototypeOf(t);null!==o&&a(o,e,n,r)}else if("value"in i&&i.writable)i.value=n;else{var s=i.set;void 0!==s&&s.call(r,n)}return n},e.slicedToArray=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(p){r=!0,i=p}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),e.slicedToArrayLoose=function(t,e){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t)){for(var n,a=[],r=t[Symbol.iterator]();!(n=r.next()).done&&(a.push(n.value),!e||a.length!==e););return a}throw new TypeError("Invalid attempt to destructure non-iterable instance")},e.taggedTemplateLiteral=function(t,e){return Object.freeze(Object.defineProperties(t,{raw:{value:Object.freeze(e)}}))},e.taggedTemplateLiteralLoose=function(t,e){return t.raw=e,t},e.temporalRef=function(t,e,n){if(t===n)throw new ReferenceError(e+" is not defined - temporal dead zone");return t},e.temporalUndefined={},e.toArray=function(t){return Array.isArray(t)?t:Array.from(t)},e.toConsumableArray=function(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e=4?null:"disabled"'},p:[48,21,3959]}],action:"search"},f:["search"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],384:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[2,1,2],t:7,e:"ui-button",a:{icon:"circle",action:"clean_order"},f:["Clear Order"]},{p:[2,70,71],t:7,e:"br"},{p:[2,74,75],t:7,e:"br"}," ",{p:[3,1,81],t:7,e:"i",f:["Your new computer device you always dreamed of is just four steps away..."]},{p:[3,81,161],t:7,e:"hr"}," ",{t:4,f:[" ",{p:[5,1,223],t:7,e:"div",a:{"class":"item"},f:[{p:[6,2,244],t:7,e:"h2",f:["Step 1: Select your device type"]}," ",{p:[7,2,287],t:7,e:"ui-button",a:{icon:"calc",action:"pick_device",params:'{"pick" : "1"}'},f:["Laptop"]}," ",{p:[8,2,377],t:7,e:"ui-button",a:{icon:"calc",action:"pick_device",params:'{"pick" : "2"}'},f:["LTablet"]}]}],n:50,x:{r:["data.state"],s:"_0==0"},p:[4,1,167]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.state"],s:"_0==1"},f:[{p:[11,1,502],t:7,e:"div",a:{"class":"item"},f:[{p:[12,2,523],t:7,e:"h2",f:["Step 2: Personalise your device"]}," ",{p:[13,2,566],t:7,e:"table",f:[{p:[14,3,577],t:7,e:"tr",f:[{p:[15,4,586],t:7,e:"td",f:[{p:[15,8,590],t:7,e:"b",f:["Current Price:"]}]},{p:[16,4,616],t:7,e:"td",f:[{t:2,r:"data.totalprice",p:[16,8,620]},"C"]}]}," ",{p:[18,3,653],t:7,e:"tr",f:[{p:[19,4,663],t:7,e:"td",f:[{p:[19,8,667],t:7,e:"b",f:["Battery:"]}]},{p:[20,4,687],t:7,e:"td",f:[{p:[20,8,691],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "1"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==1?"selected":null'},p:[20,73,756]}]},f:["Standard"]}]},{p:[21,4,827],t:7,e:"td",f:[{p:[21,8,831],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "2"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==2?"selected":null'},p:[21,73,896]}]},f:["Upgraded"]}]},{p:[22,4,967],t:7,e:"td",f:[{p:[22,8,971],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "3"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==3?"selected":null'},p:[22,73,1036]}]},f:["Advanced"]}]}]}," ",{p:[24,3,1115],t:7,e:"tr",f:[{p:[25,4,1124],t:7,e:"td",f:[{p:[25,8,1128],t:7,e:"b",f:["Hard Drive:"]}]},{p:[26,4,1151],t:7,e:"td",f:[{p:[26,8,1155],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "1"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==1?"selected":null'},p:[26,67,1214]}]},f:["Standard"]}]},{p:[27,4,1282],t:7,e:"td",f:[{p:[27,8,1286],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "2"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==2?"selected":null'},p:[27,67,1345]}]},f:["Upgraded"]}]},{p:[28,4,1413],t:7,e:"td",f:[{p:[28,8,1417],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "3"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==3?"selected":null'},p:[28,67,1476]}]},f:["Advanced"]}]}]}," ",{p:[30,3,1552],t:7,e:"tr",f:[{p:[31,4,1561],t:7,e:"td",f:[{p:[31,8,1565],t:7,e:"b",f:["Network Card:"]}]},{p:[32,4,1590],t:7,e:"td",f:[{p:[32,8,1594],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "0"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==0?"selected":null'},p:[32,73,1659]}]},f:["None"]}]},{p:[33,4,1726],t:7,e:"td",f:[{p:[33,8,1730],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "1"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==1?"selected":null'},p:[33,73,1795]}]},f:["Standard"]}]},{p:[34,4,1866],t:7,e:"td",f:[{p:[34,8,1870],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "2"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==2?"selected":null'},p:[34,73,1935]}]},f:["Advanced"]}]}]}," ",{p:[36,3,2014],t:7,e:"tr",f:[{p:[37,4,2023],t:7,e:"td",f:[{p:[37,8,2027],t:7,e:"b",f:["Nano Printer:"]}]},{p:[38,4,2052],t:7,e:"td",f:[{p:[38,8,2056],t:7,e:"ui-button",a:{action:"hw_nanoprint",params:'{"print" : "0"}',state:[{t:2,x:{r:["data.hw_nanoprint"],s:'_0==0?"selected":null'},p:[38,73,2121]}]},f:["None"]}]},{p:[39,4,2190],t:7,e:"td",f:[{p:[39,8,2194],t:7,e:"ui-button",a:{action:"hw_nanoprint",params:'{"print" : "1"}',state:[{t:2,x:{r:["data.hw_nanoprint"],s:'_0==1?"selected":null'},p:[39,73,2259]}]},f:["Standard"]}]}]}," ",{p:[41,3,2340],t:7,e:"tr",f:[{p:[42,4,2349],t:7,e:"td",f:[{p:[42,8,2353],t:7,e:"b",f:["Card Reader:"]}]},{p:[43,4,2377],t:7,e:"td",f:[{p:[43,8,2381],t:7,e:"ui-button",a:{action:"hw_card",params:'{"card" : "0"}',state:[{t:2,x:{r:["data.hw_card"],s:'_0==0?"selected":null'},p:[43,67,2440]}]},f:["None"]}]},{p:[44,4,2504],t:7,e:"td",f:[{p:[44,8,2508],t:7,e:"ui-button",a:{action:"hw_card",params:'{"card" : "1"}',state:[{t:2,x:{r:["data.hw_card"],s:'_0==1?"selected":null'},p:[44,67,2567]}]},f:["Standard"]}]}]}]}," ",{t:4,f:[" ",{p:[49,4,2706],t:7,e:"table",f:[{p:[50,5,2719],t:7,e:"tr",f:[{p:[51,6,2730],t:7,e:"td",f:[{p:[51,10,2734],t:7,e:"b",f:["Processor Unit:"]}]},{p:[52,6,2763],t:7,e:"td",f:[{p:[52,10,2767],t:7,e:"ui-button",a:{action:"hw_cpu",params:'{"cpu" : "1"}',state:[{t:2,x:{r:["data.hw_cpu"],s:'_0==1?"selected":null'},p:[52,67,2824]}]},f:["Standard"]}]},{p:[53,6,2893],t:7,e:"td",f:[{p:[53,10,2897],t:7,e:"ui-button",a:{action:"hw_cpu",params:'{"cpu" : "2"}',state:[{t:2,x:{r:["data.hw_cpu"],s:'_0==2?"selected":null'},p:[53,67,2954]}]},f:["Advanced"]}]}]}," ",{p:[55,5,3033],t:7,e:"tr",f:[{p:[56,6,3044],t:7,e:"td",f:[{p:[56,10,3048],t:7,e:"b",f:["Tesla Relay:"]}]},{p:[57,6,3074],t:7,e:"td",f:[{p:[57,10,3078],t:7,e:"ui-button",a:{action:"hw_tesla",params:'{"tesla" : "0"}',state:[{t:2,x:{r:["data.hw_tesla"],s:'_0==0?"selected":null'},p:[57,71,3139]}]},f:["None"]}]},{p:[58,6,3206],t:7,e:"td",f:[{p:[58,10,3210],t:7,e:"ui-button",a:{action:"hw_tesla",params:'{"tesla" : "1"}',state:[{t:2,x:{r:["data.hw_tesla"],s:'_0==1?"selected":null'},p:[58,71,3271]}]},f:["Standard"]}]}]}]}],n:50,x:{r:["data.devtype"],s:"_0!=2"},p:[48,3,2659]}," ",{p:[62,3,3374],t:7,e:"table",f:[{p:[63,4,3386],t:7,e:"tr",f:[{p:[64,5,3396],t:7,e:"td",f:[{p:[64,9,3400],t:7,e:"b",f:["Confirm Order:"]}]},{p:[65,5,3427],t:7,e:"td",f:[{p:[65,9,3431],t:7,e:"ui-button",a:{action:"confirm_order"},f:["CONFIRM"]}]}]}]}," ",{p:[69,2,3512],t:7,e:"hr"}," ",{p:[70,2,3519],t:7,e:"b",f:["Battery"]}," allows your device to operate without external utility power source. Advanced batteries increase battery life.",{p:[70,127,3644],t:7,e:"br"}," ",{p:[71,2,3651],t:7,e:"b",f:["Hard Drive"]}," stores file on your device. Advanced drives can store more files, but use more power, shortening battery life.",{p:[71,130,3779],t:7,e:"br"}," ",{p:[72,2,3786],t:7,e:"b",f:["Network Card"]}," allows your device to wirelessly connect to stationwide NTNet network. Basic cards are limited to on-station use, while advanced cards can operate anywhere near the station, which includes the asteroid outposts.",{p:[72,233,4017],t:7,e:"br"}," ",{p:[73,2,4024],t:7,e:"b",f:["Processor Unit"]}," is critical for your device's functionality. It allows you to run programs from your hard drive. Advanced CPUs use more power, but allow you to run more programs on background at once.",{p:[73,208,4230],t:7,e:"br"}," ",{p:[74,2,4237],t:7,e:"b",f:["Tesla Relay"]}," is an advanced wireless power relay that allows your device to connect to nearby area power controller to provide alternative power source. This component is currently unavailable on tablet computers due to size restrictions.",{p:[74,246,4481],t:7,e:"br"}," ",{p:[75,2,4488],t:7,e:"b",f:["Nano Printer"]}," is device that allows for various paperwork manipulations, such as, scanning of documents or printing new ones. This device was certified EcoFriendlyPlus and is capable of recycling existing paper for printing purposes.",{p:[75,241,4727],t:7,e:"br"}," ",{p:[76,2,4734],t:7,e:"b",f:["Card Reader"]}," adds a slot that allows you to manipulate RFID cards. Please note that this is not necessary to allow the device to read your identification, it is just necessary to manipulate other cards."]}]},{t:4,n:50,x:{r:["data.state"],s:"(!(_0==1))&&(_0==2)"},f:[" ",{p:[79,2,4981],t:7,e:"h2",f:["Step 3: Payment"]}," ",{p:[80,2,5008],t:7,e:"b",f:["Your device is now ready for fabrication.."]},{p:[80,51,5057],t:7,e:"br"}," ",{p:[81,2,5064],t:7,e:"i",f:["Please ensure the required amount of credits are in the machine, then press purchase."]},{p:[81,94,5156],t:7,e:"br"}," ",{p:[82,2,5163],t:7,e:"i",f:["Current credits: ",{p:[82,22,5183],t:7,e:"b",f:[{t:2,r:"data.credits",p:[82,25,5186]},"C"]}]},{p:[82,50,5211],t:7,e:"br"}," ",{p:[83,2,5218],t:7,e:"i",f:["Total price: ",{p:[83,18,5234],t:7,e:"b",f:[{t:2,r:"data.totalprice",p:[83,21,5237]},"C"]}]},{p:[83,49,5265],t:7,e:"br"},{p:[83,53,5269],t:7,e:"br"}," ",{p:[84,2,5276],t:7,e:"ui-button",a:{action:"purchase",state:[{t:2,x:{r:["data.credits","data.totalprice"],s:'_0>=_1?null:"disabled"'},p:[84,38,5312]}]},f:["PURCHASE"]}]},{t:4,n:50,x:{r:["data.state"],s:"(!(_0==1))&&((!(_0==2))&&(_0==3))"},f:[" ",{p:[87,2,5423],t:7,e:"h2",f:["Step 4: Thank you for your purchase"]},{p:[87,46,5467],t:7,e:"br"}," ",{p:[88,2,5474],t:7,e:"b",f:["Should you experience any issues with your new device, contact your local network admin for assistance."]}]}],x:{r:["data.state"],s:"_0==0"}}]},e.exports=a.extend(r.exports)},{341:341}],385:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,1,22],t:7,e:"ui-display",f:[{p:[3,2,37],t:7,e:"ui-section",a:{label:"Cap"},f:[{p:[4,3,65],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.is_capped"],s:'_0?"power-off":"close"'},p:[4,20,82]}],style:[{t:2,x:{r:["data.is_capped"],s:'_0?null:"selected"'},p:[4,71,133]}],action:"toggle_cap"},f:[{t:2,x:{r:["data.is_capped"],s:'_0?"On":"Off"'},p:[6,4,202]}]}]}]}],n:50,r:"data.has_cap",p:[1,1,0]},{p:[10,1,288],t:7,e:"ui-display",f:[{t:4,f:[{p:[14,2,419],t:7,e:"ui-section",f:[{p:[15,3,435],t:7,e:"ui-button",a:{action:"select_colour"},f:["Select New Colour"]}]}],n:50,r:"data.can_change_colour",p:[13,1,386]}]}," ",{p:[19,1,540],t:7,e:"ui-display",a:{title:"Stencil"},f:[{t:4,f:[{p:[21,2,599],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[21,21,618]}]},f:[{t:4,f:[{p:[23,7,655],t:7,e:"ui-button",a:{action:"select_stencil",params:['{"item":"',{t:2,r:"item",p:[23,59,707]},'"}'],style:[{t:2,x:{r:["item","data.selected_stencil"],s:'_0==_1?"selected":null'},p:[24,12,731]}]},f:[{t:2,r:"item",p:[25,4,791]}]}],n:52,r:"items",p:[22,3,632]}]}],n:52,r:"data.drawables",p:[20,3,572]}]}," ",{p:[31,1,874],t:7,e:"ui-display",a:{title:"Text Mode"},f:[{p:[32,2,907],t:7,e:"ui-section",a:{label:"Current Buffer"},f:[{t:2,r:"data.text_buffer",p:[32,37,942]}]}," ",{p:[34,2,981],t:7,e:"ui-section",f:[{p:[34,14,993],t:7,e:"ui-button",a:{action:"enter_text"},f:["New Text"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],386:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{isHead:function(t){return t%10==0},dept_class:function(t){return 0==t?"dept-cap":t>=10&&20>t?"dept-sec":t>=20&&30>t?"dept-med":t>=30&&40>t?"dept-sci":t>=40&&50>t?"dept-eng":t>=50&&60>t?"dept-cargo":t>=200&&230>t?"dept-cent":"dept-other"},health_state:function(t,e,n,a){var r=t+e+n+a;return 0>=r?"health-5":25>=r?"health-4":50>=r?"health-3":75>=r?"health-2":"health-0"}}}}(r),r.exports.css=" .health {\r\n width: 16px;\r\n height: 16px;\r\n background-color: #FFF;\r\n border: 1px solid #434343;\r\n position: relative;\r\n top: 2px;\r\n display: inline-block;\r\n }\r\n .health-5 { background-color: #17d568; }\r\n .health-4 { background-color: #2ecc71; }\r\n .health-3 { background-color: #e67e22; }\r\n .health-2 { background-color: #ed5100; }\r\n .health-1 { background-color: #e74c3c; }\r\n .health-0 { background-color: #ed2814; }\r\n\r\n .dept-cap {color : #C06616;}\r\n .dept-sec {color : #E74C3C;}\r\n .dept-med {color : #3498DB;}\r\n .dept-sci {color : #9B59B6;}\r\n .dept-eng {color : #F1C40F;}\r\n .dept-cargo {color : #F39C12;}\r\n .dept-cent {color : #00C100;}\r\n .dept-other {color: #C38312;}\r\n\r\n .oxy { color : #3498db; }\r\n .toxin { color : #2ecc71; }\r\n .burn { color : #e67e22; }\r\n .brute { color : #e74c3c; }\r\n\r\n table.crew{\r\n border-collapse: collapse;\r\n }\r\n\r\n table.crew td {\r\n padding : 0px 10px;\r\n }",r.exports.template={v:3,t:[" ",{p:[27,1,1030],t:7,e:"ui-display",f:[{p:[28,2,1045],t:7,e:"ui-section",f:[{p:[29,3,1061],t:7,e:"table",a:{"class":"crew"},f:[{p:[30,3,1085],t:7,e:"thead",f:[{p:[31,3,1096],t:7,e:"tr",f:[{p:[32,4,1105],t:7,e:"th",f:["Name"]}," ",{p:[33,4,1123],t:7,e:"th",f:["Status"]}," ",{p:[34,4,1143],t:7,e:"th",f:["Vitals"]}," ",{p:[35,4,1163],t:7,e:"th",f:["Position"]}," ",{t:4,f:[{p:[37,5,1216],t:7,e:"th",f:["Tracking"]}],n:50,r:"data.link_allowed",p:[36,4,1185]}]}]}," ",{p:[41,3,1270],t:7,e:"tbody",f:[{t:4,f:[{p:[43,4,1308],t:7,e:"tr",f:[{p:[44,5,1318],t:7,e:"td",f:[{p:[45,6,1329],t:7,e:"span",a:{"class":[{t:2,x:{r:["isHead","ijob"],s:'_0(_1)?"bold ":""'},p:[45,19,1342]},{t:2,x:{r:["dept_class","ijob"],s:"_0(_1)"},p:[45,49,1372]}]},f:[{t:2,r:"name",p:[46,7,1402]}," (",{t:2,r:"assignment",p:[46,17,1412]},") ",{p:[47,6,1434],t:7,e:"span",f:[]}]}]}," ",{p:[49,5,1457],t:7,e:"td",f:[{t:4,f:[{p:[51,7,1498],t:7,e:"span",a:{"class":["health ",{t:2,x:{r:["health_state","oxydam","toxdam","burndam","brutedam"],s:"_0(_1,_2,_3,_4)"},p:[51,27,1518]}]}}],n:50,x:{r:["oxydam"],s:"_0!=null"},p:[50,6,1468]},{t:4,n:51,f:[{t:4,f:[{p:[54,8,1626],t:7,e:"span",a:{"class":"health health-5"}}],n:50,r:"life_status",p:[53,7,1598]},{t:4,n:51,f:[{p:[56,8,1688],t:7,e:"span",a:{"class":"health health-0"}}],r:"life_status"}],x:{r:["oxydam"],s:"_0!=null"}}]}," ",{p:[60,5,1771],t:7,e:"td",f:[{t:4,f:[{p:[62,7,1812],t:7,e:"span",f:["( ",{p:[64,8,1836],t:7,e:"span",a:{"class":"oxy"},f:[{t:2,r:"oxydam",p:[64,26,1854]}]}," / ",{p:[66,8,1890],t:7,e:"span",a:{"class":"toxin"},f:[{t:2,r:"toxdam",p:[66,28,1910]}]}," / ",{p:[68,8,1946],t:7,e:"span",a:{"class":"burn"},f:[{t:2,r:"burndam",p:[68,27,1965]}]}," / ",{p:[70,8,2002],t:7,e:"span",a:{"class":"brute"},f:[{t:2,r:"brutedam",p:[70,28,2022]}]}," )"]}],n:50,x:{r:["oxydam"],s:"_0!=null"},p:[61,6,1782]},{t:4,n:51,f:[{t:4,f:[{p:[75,8,2116],t:7,e:"span",f:["Alive"]}],n:50,r:"life_status",p:[74,7,2088]},{t:4,n:51,f:[{p:[77,8,2159],t:7,e:"span",f:["Dead"]}],r:"life_status"}],x:{r:["oxydam"],s:"_0!=null"}}]}," ",{p:[81,5,2222],t:7,e:"td",f:[{t:4,f:[{p:[83,6,2260],t:7,e:"span",f:[{t:2,r:"area",p:[83,12,2266]}]}],n:50,x:{r:["pos_x"],s:"_0!=null"},p:[82,5,2232]},{t:4,n:51,f:[{p:[85,6,2302],t:7,e:"span",f:["N/A"]}],x:{r:["pos_x"],s:"_0!=null"}}]}," ",{t:4,f:[{p:[89,6,2381],t:7,e:"td",f:[{p:[90,7,2393],t:7,e:"ui-button",a:{action:"select_person",state:[{t:2,x:{r:["can_track"],s:'_0?null:"disabled"'},p:[90,48,2434]}],params:['{"name":"',{t:2,r:"name",p:[90,100,2486]},'"}']},f:["Track"]}]}],n:50,r:"data.link_allowed",p:[88,5,2348]}]}],n:52,r:"data.sensors",p:[42,3,1281]}]}]}]}]}," "]},e.exports=a.extend(r.exports)},{341:341}],387:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,189],t:7,e:"ui-section",a:{label:"State"},f:[{p:[7,7,223],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[7,20,236]}]},f:[{t:2,r:"data.occupant.stat",p:[7,49,265]}]}]}," ",{p:[9,4,317],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[10,6,356],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.temperaturestatus",p:[10,19,369]}]},f:[{t:2,r:"data.occupant.bodyTemperature",p:[10,56,406]}," K"]}]}," ",{p:[12,5,472],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[13,7,507],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[13,20,520]}],max:[{t:2,r:"data.occupant.maxHealth",p:[13,54,554]}],value:[{t:2,r:"data.occupant.health",p:[13,90,590]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[14,16,632]}]},f:[{t:2,r:"data.occupant.health",p:[14,68,684]}]}]}," ",{t:4,f:[{p:[17,7,908],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[17,26,927]}]},f:[{p:[18,9,948],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[18,30,969]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[18,66,1005]}],state:"bad"},f:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[18,103,1042]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[16,5,742]}],n:50,r:"data.hasOccupant",p:[5,3,159]}]}," ",{p:[23,1,1138],t:7,e:"ui-display",a:{title:"Cell"},f:[{p:[24,3,1167],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[25,5,1199],t:7,e:"ui-button",a:{ +icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[25,22,1216]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[26,14,1276]}],state:[{t:2,x:{r:["data.isOpen"],s:'_0?"disabled":null'},p:[27,14,1332]}],action:"power"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[28,22,1391]}]}]}," ",{p:[30,3,1459],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[31,3,1495],t:7,e:"span",a:{"class":[{t:2,r:"data.temperaturestatus",p:[31,16,1508]}]},f:[{t:2,r:"data.cellTemperature",p:[31,44,1536]}," K"]}]}," ",{p:[33,2,1588],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[34,5,1619],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOpen"],s:'_0?"unlock":"lock"'},p:[34,22,1636]}],action:"door"},f:[{t:2,x:{r:["data.isOpen"],s:'_0?"Open":"Closed"'},p:[34,73,1687]}]}," ",{p:[35,5,1740],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoEject"],s:'_0?"sign-out":"sign-in"'},p:[35,22,1757]}],action:"autoeject"},f:[{t:2,x:{r:["data.autoEject"],s:'_0?"Auto":"Manual"'},p:[35,86,1821]}]}]}]}," ",{p:{button:[{p:[40,5,1967],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[40,36,1998]}],action:"ejectbeaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[42,3,2101],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{t:4,f:[{p:[45,9,2211],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,r:"volume",p:[45,52,2254]}," units of ",{t:2,r:"name",p:[45,72,2274]}]},{p:[45,87,2289],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[44,7,2171]},{t:4,n:51,f:[{p:[47,9,2320],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[43,5,2136]},{t:4,n:51,f:[{p:[50,7,2396],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],388:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"ui-section",a:{label:"State"},f:[{t:4,f:[{p:[4,4,76],t:7,e:"span",a:{"class":"good"},f:["Ready"]}],n:50,r:"data.full_pressure",p:[3,3,45]},{t:4,n:51,f:[{t:4,f:[{p:[7,5,153],t:7,e:"span",a:{"class":"bad"},f:["Power Disabled"]}],n:50,r:"data.panel_open",p:[6,4,124]},{t:4,n:51,f:[{t:4,f:[{p:[10,6,248],t:7,e:"span",a:{"class":"average"},f:["Pressurizing"]}],n:50,r:"data.pressure_charging",p:[9,5,211]},{t:4,n:51,f:[{p:[12,6,310],t:7,e:"span",a:{"class":"bad"},f:["Off"]}],r:"data.pressure_charging"}],r:"data.panel_open"}],r:"data.full_pressure"}]}," ",{p:[17,2,393],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[18,3,426],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.per",p:[18,36,459]}],state:"good"},f:[{t:2,r:"data.per",p:[18,63,486]},"%"]}]}," ",{p:[20,5,530],t:7,e:"ui-section",a:{label:"Handle"},f:[{p:[21,9,567],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.flush"],s:'_0?"toggle-on":"toggle-off"'},p:[22,10,589]}],state:[{t:2,x:{r:["data.isai","data.panel_open"],s:'_0||_1?"disabled":null'},p:[23,11,647]}],action:[{t:2,x:{r:["data.flush"],s:'_0?"handle-0":"handle-1"'},p:[24,12,714]}]},f:[{t:2,x:{r:["data.flush"],s:'_0?"Disengage":"Engage"'},p:[25,5,763]}]}]}," ",{p:[27,2,837],t:7,e:"ui-section",a:{label:"Eject"},f:[{p:[28,3,867],t:7,e:"ui-button",a:{icon:"sign-out",state:[{t:2,x:{r:["data.isai"],s:'_0?"disabled":null'},p:[28,37,901]}],action:"eject"},f:["Eject Contents"]},{p:[28,114,978],t:7,e:"br"}]}," ",{p:[30,2,1002],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,3,1032],t:7,e:"ui-button",a:{icon:"power-off",state:[{t:2,x:{r:["data.panel_open"],s:'_0?"disabled":null'},p:[31,38,1067]}],action:[{t:2,x:{r:["data.pressure_charging"],s:'_0?"pump-0":"pump-1"'},p:[31,87,1116]}],style:[{t:2,x:{r:["data.pressure_charging"],s:'_0?"selected":null'},p:[31,145,1174]}]}},{p:[31,206,1235],t:7,e:"br"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],389:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"DNA Vault Database"},f:[{p:[2,3,43],t:7,e:"ui-section",a:{label:"Human DNA"},f:[{p:[3,7,81],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.dna_max",p:[3,28,102]}],value:[{t:2,r:"data.dna",p:[3,53,127]}]},f:[{t:2,r:"data.dna",p:[3,67,141]},"/",{t:2,r:"data.dna_max",p:[3,80,154]}," Samples"]}]}," ",{p:[5,3,208],t:7,e:"ui-section",a:{label:"Plant Data"},f:[{p:[6,5,245],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.plants_max",p:[6,26,266]}],value:[{t:2,r:"data.plants",p:[6,54,294]}]},f:[{t:2,r:"data.plants",p:[6,71,311]},"/",{t:2,r:"data.plants_max",p:[6,87,327]}," Samples"]}]}," ",{p:[8,3,384],t:7,e:"ui-section",a:{label:"Animal Data"},f:[{p:[9,5,422],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.animals_max",p:[9,26,443]}],value:[{t:2,r:"data.animals",p:[9,55,472]}]},f:[{t:2,r:"data.animals",p:[9,73,490]},"/",{t:2,r:"data.animals_max",p:[9,90,507]}," Samples"]}]}]}," ",{t:4,f:[{p:[13,1,616],t:7,e:"ui-display",a:{title:"Personal Gene Therapy"},f:[{p:[14,3,663],t:7,e:"ui-section",f:[{p:[15,2,678],t:7,e:"span",f:["Applicable gene therapy treatments:"]}]}," ",{p:[17,3,747],t:7,e:"ui-section",f:[{p:[18,2,762],t:7,e:"ui-button",a:{action:"gene",params:['{"choice": "',{t:2,r:"data.choiceA",p:[18,47,807]},'"}']},f:[{t:2,r:"data.choiceA",p:[18,67,827]}]}," ",{p:[19,2,858],t:7,e:"ui-button",a:{action:"gene",params:['{"choice": "',{t:2,r:"data.choiceB",p:[19,47,903]},'"}']},f:[{t:2,r:"data.choiceB",p:[19,67,923]}]}]}]}],n:50,x:{r:["data.completed","data.used"],s:"_0&&!_1"},p:[12,1,578]}]},e.exports=a.extend(r.exports)},{341:341}],390:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,183],t:7,e:"ui-section",a:{label:"Items in storage"},f:[{p:[7,4,225],t:7,e:"span",f:[{t:2,r:"data.items",p:[7,10,231]}]}]}],n:50,r:"data.items",p:[5,3,159]}," ",{t:4,f:[{p:[11,5,310],t:7,e:"ui-section",a:{label:"State"},f:[{p:[12,7,344],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[12,20,357]}]},f:[{t:2,r:"data.occupant.stat",p:[12,49,386]}]}]}," ",{p:[14,5,439],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[15,7,474],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[15,20,487]}],max:[{t:2,r:"data.occupant.maxHealth",p:[15,54,521]}],value:[{t:2,r:"data.occupant.health",p:[15,90,557]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[16,16,599]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[16,68,651]}]}]}," ",{t:4,f:[{p:[19,7,888],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[19,26,907]}]},f:[{p:[20,9,928],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[20,30,949]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[20,66,985]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[20,103,1022]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[18,5,722]}," ",{p:[23,5,1109],t:7,e:"ui-section",a:{label:"Cells"},f:[{p:[24,9,1145],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"bad":"good"'},p:[24,22,1158]}]},f:[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"Damaged":"Healthy"'},p:[24,68,1204]}]}]}," ",{p:[26,5,1287],t:7,e:"ui-section",a:{label:"Brain"},f:[{p:[27,9,1323],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"bad":"good"'},p:[27,22,1336]}]},f:[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"Abnormal":"Healthy"'},p:[27,68,1382]}]}]}," ",{p:[29,5,1466],t:7,e:"ui-section",a:{label:"Bloodstream"},f:[{t:4,f:[{p:[31,11,1553],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,1)"},p:[31,54,1596]}," units of ",{t:2,r:"name",p:[31,89,1631]}]},{p:[31,104,1646],t:7,e:"br"}],n:52,r:"adata.occupant.reagents",p:[30,9,1508]},{t:4,n:51,f:[{p:[33,11,1681],t:7,e:"span",a:{"class":"good"},f:["Pure"]}],r:"adata.occupant.reagents"}]}],n:50,r:"data.occupied",p:[10,3,283]}]}," ",{p:[38,1,1777],t:7,e:"ui-display",a:{title:"Operations"},f:[{p:[39,3,1812],t:7,e:"ui-section",a:{label:"Inject"},f:[{t:4,f:[{p:[41,7,1872],t:7,e:"ui-button",a:{icon:"flask",state:[{t:2,x:{r:["data.occupied"],s:'_0?null:"disabled"'},p:[41,38,1903]}],action:"inject",params:['{"chem": "',{t:2,r:"id",p:[41,111,1976]},'"}']},f:[{t:2,r:"name",p:[41,121,1986]}]},{p:[41,141,2006],t:7,e:"br"}],n:52,r:"data.chem",p:[40,5,1845]}]}," ",{p:[44,2,2046],t:7,e:"ui-section",a:{label:"Eject"},f:[{p:[45,6,2079],t:7,e:"ui-button",a:{icon:"sign-out",action:"eject"},f:["Eject Contents"]}]}," ",{p:[47,2,2166],t:7,e:"ui-section",a:{label:"Self Cleaning"},f:[{p:[48,3,2204],t:7,e:"ui-button",a:{icon:"recycle",action:"cleaning"},f:["Self-Clean Cycle"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],391:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,24],t:7,e:"ui-display",a:{title:[{t:2,r:"data.question",p:[2,21,42]}]},f:[{p:[3,5,66],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,9,118],t:7,e:"ui-button",a:{action:"vote",params:['{"answer": "',{t:2,r:"answer",p:[6,45,174]},'"}'],style:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[7,18,206]}]},f:[{t:2,r:"answer",p:[7,53,241]}," (",{t:2,r:"amount",p:[7,65,253]},")"]}],n:52,r:"data.answers",p:[4,7,86]}]}]}],n:50,r:"data.shaking",p:[1,1,0]},{t:4,n:51,f:[{p:[13,3,353],t:7,e:"ui-notice",f:["The eightball is not currently being shaken."]}],r:"data.shaking"}]},e.exports=a.extend(r.exports)},{341:341}],392:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,5,17],t:7,e:"span",f:["Time Until Launch: ",{t:2,r:"data.timer_str",p:[2,30,42]}]}]}," ",{p:[4,1,83],t:7,e:"ui-notice",f:[{p:[5,3,98],t:7,e:"span",f:["Engines: ",{t:2,x:{r:["data.engines_started"],s:'_0?"Online":"Idle"'},p:[5,18,113]}]}]}," ",{p:[7,1,180],t:7,e:"ui-display",a:{title:"Early Launch"},f:[{p:[8,2,216],t:7,e:"span",f:["Authorizations Remaining: ",{t:2,x:{r:["data.emagged","data.authorizations_remaining"],s:'_0?"ERROR":_1'},p:[9,2,250]}]}," ",{p:[10,2,318],t:7,e:"ui-button",a:{icon:"exclamation-triangle",action:"authorize",style:"danger",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[12,10,404]}]},f:["AUTHORIZE"]}," ",{p:[15,2,473],t:7,e:"ui-button",a:{icon:"minus",action:"repeal",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[16,10,523]}]},f:["Repeal"]}," ",{p:[19,2,589],t:7,e:"ui-button",a:{icon:"close",action:"abort",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[20,10,638]}]},f:["Repeal All"]}]}," ",{p:[24,1,722],t:7,e:"ui-display",a:{title:"Authorizations"},f:[{t:4,f:[{p:[26,3,793],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{t:2,r:"name",p:[26,34,824]}," (",{t:2,r:"job",p:[26,44,834]},")"]}],n:52,r:"data.authorizations",p:[25,2,760]},{t:4,n:51,f:[{p:[28,3,870],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:["No authorizations."]}],r:"data.authorizations"}]}]},e.exports=a.extend(r.exports)},{341:341}],393:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Message"},f:[{t:2,r:"data.hidden_message",p:[3,5,50]}]}," ",{p:[5,3,94],t:7,e:"ui-section",a:{label:"Created On"},f:[{t:2,r:"data.realdate",p:[6,5,131]}]}," ",{p:[8,3,169],t:7,e:"ui-section",a:{label:"Approval"},f:[{p:[9,5,204],t:7,e:"ui-button",a:{icon:"arrow-up",state:[{t:2,x:{r:["data.is_creator","data.has_liked"],s:'_0?"disabled":_1?"selected":null'},p:[11,14,252]}],action:"like"},f:[{t:2,r:"data.num_likes",p:[12,21,344]}]}," ",{p:[13,5,380],t:7,e:"ui-button",a:{icon:"circle",state:[{t:2,x:{r:["data.is_creator","data.has_liked","data.has_disliked"],s:'_0?"disabled":!_1&&!_2?"selected":null'},p:[15,14,426]}],action:"neutral"}}," ",{p:[17,5,562],t:7,e:"ui-button",a:{icon:"arrow-down",state:[{t:2,x:{r:["data.is_creator","data.has_disliked"],s:'_0?"disabled":_1?"selected":null'},p:[19,14,612]}],action:"dislike"},f:[{t:2,r:"data.num_dislikes",p:[20,24,710]}]}]}]}," ",{t:4,f:[{p:[24,3,805],t:7,e:"ui-display",a:{title:"Admin Panel"},f:[{p:[25,5,843],t:7,e:"ui-section",a:{label:"Creator Ckey"},f:[{t:2,r:"data.creator_key",p:[25,38,876]}]}," ",{p:[26,5,915],t:7,e:"ui-section",a:{label:"Creator Character Name"},f:[{t:2,r:"data.creator_name",p:[26,48,958]}]}," ",{p:[27,5,998],t:7,e:"ui-button",a:{icon:"remove",action:"delete",style:"danger"},f:["Delete"]}]}],n:50,r:"data.admin_mode",p:[23,1,778]}]},e.exports=a.extend(r.exports)},{341:341}],394:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The requested interface (",{t:2,r:"config.interface",p:[2,34,46]},") was not found. Does it exist?"]}]}]},e.exports=a.extend(r.exports)},{341:341}],395:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,20],t:7,e:"ui-notice",f:["Currently syncing with the database"]}],n:50,r:"data.sync",p:[1,1,0]},{t:4,n:51,f:[{p:{button:[{p:[8,4,163],t:7,e:"ui-button",a:{icon:"eject",action:"eject_all"},f:["Eject all"]}," ",{p:[9,4,232],t:7,e:"ui-button",a:{icon:["toggle-",{t:2,x:{r:["data.show_materials"],s:'_0?"off":"on"'},p:[9,28,256]}],action:"toggle_materials_visibility"},f:[{t:2,x:{r:["data.show_materials"],s:'_0?"Hide":"Show"'},p:[10,5,339]}]}]},t:7,e:"ui-display",a:{title:"Materials",button:0},f:[" ",{t:4,f:[{p:[14,4,449],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[15,5,484],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[16,6,520],t:7,e:"section",a:{"class":"cell"}}," ",{p:[17,6,559],t:7,e:"section",a:{"class":"cell"},f:["Mineral"]}," ",{p:[20,6,620],t:7,e:"section",a:{"class":"cell"},f:["Amount"]}," ",{p:[23,6,680],t:7,e:"section",a:{"class":"cell"}}," ",{p:[24,6,719],t:7,e:"section",a:{"class":"cell"}}]}," ",{t:4,f:[{p:[27,6,808],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[28,7,845],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[29,8,876]}]}," ",{p:[31,7,910],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"amount",p:[32,8,941]}]}," ",{p:[34,7,977],t:7,e:"section",a:{"class":"cell"},f:[{p:[35,8,1008],t:7,e:"ui-button",a:{icon:"eject"},f:["Release amount"]}]}," ",{p:[37,7,1084],t:7,e:"section",a:{"class":"cell",style:"width: 40px;"},f:[{p:[38,8,1136],t:7,e:"ui-button",a:{icon:"eject"},f:["Release all"]}]}]}],n:52,r:"data.all_materials",p:[26,5,773]}]}],n:50,r:"data.show_materials",p:[13,3,417]}]}," ",{p:[45,2,1274],t:7,e:"ui-display",a:{title:"Categories"},f:[{t:4,f:[{p:[47,4,1334],t:7,e:"ui-button",f:[{t:2,r:".",p:[47,15,1345]}]}],r:"data.categories",p:[46,3,1309]}]}],r:"data.sync"}]},e.exports=a.extend(r.exports)},{341:341}],396:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[3,5,49],t:7,e:"ui-button",a:{action:"toggle_power",style:[{t:2,x:{r:["data.toggle"],s:'_0?"selected":null'},p:[5,18,111]}]},f:["Turn ",{t:2,x:{r:["data.toggle"],s:'_0?"off":"on"'},p:[6,16,166]}]}]}," ",{p:[9,3,235],t:7,e:"ui-display",a:{title:"Logging"},f:[{t:4,f:[{p:[11,3,292],t:7,e:"ui-section",a:{label:">"},f:[{t:2,r:".",p:[11,25,314]},{p:[11,30,319],t:7,e:"ui-section",f:[]}]}],n:52,r:"data.logs",p:[10,5,269]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],397:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{seclevelState:function(){switch(this.get("data.seclevel")){case"blue":return"average";case"red":return"bad";case"delta":return"bad bold";default:return"good"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[16,1,323],t:7,e:"ui-display",f:[{p:[17,5,341],t:7,e:"ui-section",a:{label:"Alert Level"},f:[{p:[18,9,383],t:7,e:"span",a:{"class":[{t:2,r:"seclevelState",p:[18,22,396]}]},f:[{t:2,x:{r:["text","data.seclevel"],s:"_0.titleCase(_1)"},p:[18,41,415]}]}]}," ",{p:[20,5,480],t:7,e:"ui-section",a:{label:"Controls"},f:[{p:[21,9,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.alarm"],s:'_0?"close":"bell-o"'},p:[21,26,536]}],action:[{t:2,x:{r:["data.alarm"],s:'_0?"reset":"alarm"'},p:[21,71,581]}]},f:[{t:2,x:{r:["data.alarm"],s:'_0?"Reset":"Activate"'},p:[22,13,631]}]}]}," ",{t:4,f:[{p:[25,7,733],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[26,9,771],t:7,e:"span",a:{"class":"bad bold"},f:["Safety measures offline. Device may exhibit abnormal behavior."]}]}],n:50,r:"data.emagged",p:[24,5,705]}]}]},e.exports=a.extend(r.exports)},{341:341}],398:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[2,1,31],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,2,60],t:7,e:"ui-button",a:{icon:"power-off",style:[{t:2,x:{r:["data.power"],s:'_0?"selected":"danger"'},p:[3,37,95]}],action:"power"},f:[{t:2,x:{r:["data.power"],s:'_0?"Enabled":"Disabled"'},p:[3,92,150]}]}]}," ",{p:[5,1,218],t:7,e:"ui-section",a:{label:"Tag"},f:[{p:[6,2,245],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:[{t:2,r:"data.tag",p:[6,43,286]}]}]}," ",{p:[8,1,327],t:7,e:"ui-section",a:{label:"Scanning mode"},f:[{p:[9,2,364],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.updating"],s:'_0?"unlock":"lock"'},p:[9,18,380]}],style:[{t:2,x:{r:["data.updating"],s:'_0?null:"danger"'},p:[9,63,425]}],action:"updating",tooltip:"Toggle between automatic scanning or scan only when a button is pressed.","tooltip-side":"right"},f:[{t:2,x:{r:["data.updating"],s:'_0?"AUTO":"MANUAL"'},p:[9,221,583]}]}]}," ",{p:[11,1,649],t:7,e:"ui-section",a:{label:"Detection range"},f:[{p:[12,2,688],t:7,e:"ui-button",a:{icon:"refresh",style:[{t:2,x:{r:["data.globalmode"],s:'_0?null:"selected"'},p:[12,35,721]}],action:"globalmode",tooltip:"Local sector or whole region scanning.","tooltip-side":"right"},f:[{t:2,x:{r:["data.globalmode"],s:'_0?"MAXIMUM":"LOCAL"'},p:[12,165,851]}]}]}]}," ",{t:4,f:[{p:[16,2,957],t:7,e:"ui-display",a:{title:"Current Location"},f:[{p:[17,3,998],t:7,e:"span",f:[{t:2,r:"data.current",p:[17,9,1004]}]}]}," ",{p:[20,2,1048],t:7,e:"ui-display",a:{title:"Detected Signals"},f:[{t:4,f:[{p:[22,3,1114],t:7,e:"ui-section",a:{label:[{t:2,r:"entrytag",p:[22,21,1132]}]},f:[{p:[23,3,1149],t:7,e:"span",f:[{t:2,r:"area",p:[23,9,1155]}," (",{t:2,r:"coord",p:[23,19,1165]},")"]}," ",{t:4,f:[{p:[25,4,1209],t:7,e:"span",f:["Dist: ",{t:2,r:"dist",p:[25,16,1221]},"m Dir: ",{t:2,r:"degrees",p:[25,31,1236]},"° (",{t:2,r:"direction",p:[25,45,1250]},")"]}],n:50,r:"direction",p:[24,3,1187]}]}],n:52,r:"data.signals",p:[21,2,1088]}]}],n:50,r:"data.power",p:[15,1,936]}]},e.exports=a.extend(r.exports)},{341:341}],399:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Labor Camp Teleporter"},f:[{p:[2,2,45],t:7,e:"ui-section",a:{label:"Teleporter Status"},f:[{p:[3,3,87],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.teleporter"],s:'_0?"good":"bad"'},p:[3,16,100]}]},f:[{t:2,x:{r:["data.teleporter"],s:'_0?"Connected":"Not connected"'},p:[3,54,138]}]}]}," ",{t:4,f:[{p:[6,4,244],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[7,5,279],t:7,e:"span",f:[{t:2,r:"data.teleporter_location",p:[7,11,285]}]}]}," ",{p:[9,4,343],t:7,e:"ui-section",a:{label:"Locked status"},f:[{p:[10,5,383],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"lock":"unlock"'},p:[10,22,400]}],action:"teleporter_lock"},f:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"Locked":"Unlocked"'},p:[10,93,471]}]}," ",{p:[11,5,537],t:7,e:"ui-button",a:{action:"toggle_open"},f:[{t:2,x:{r:["data.teleporter_state_open"],s:'_0?"Open":"Closed"'},p:[11,37,569]}]}]}],n:50,r:"data.teleporter",p:[5,3,216]},{t:4,n:51,f:[{p:[14,4,666],t:7,e:"span",f:[{p:[14,10,672],t:7,e:"ui-button",a:{action:"scan_teleporter"},f:["Scan Teleporter"]}]}],r:"data.teleporter"}]}," ",{p:[17,1,770],t:7,e:"ui-display",a:{title:"Labor Camp Beacon"},f:[{p:[18,2,811],t:7,e:"ui-section",a:{label:"Beacon Status"},f:[{p:[19,3,849],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.beacon"],s:'_0?"good":"bad"'},p:[19,16,862]}]},f:[{t:2,x:{r:["data.beacon"],s:'_0?"Connected":"Not connected"'},p:[19,50,896]}]}]}," ",{t:4,f:[{p:[22,3,992],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[23,4,1026],t:7,e:"span",f:[{t:2,r:"data.beacon_location",p:[23,10,1032]}]}]}],n:50,r:"data.beacon",p:[21,2,969]},{t:4,n:51,f:[{p:[26,4,1097],t:7,e:"span",f:[{p:[26,10,1103],t:7,e:"ui-button",a:{action:"scan_beacon"},f:["Scan Beacon"]}]}],r:"data.beacon"}]}," ",{p:[29,1,1193],t:7,e:"ui-display",a:{title:"Prisoner details"},f:[{p:[30,2,1233],t:7,e:"ui-section",a:{label:"Prisoner ID"},f:[{p:[31,3,1269],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[31,33,1299]}]}]}," ",{t:4,f:[{p:[34,2,1392],t:7,e:"ui-section",a:{label:"Set ID goal"},f:[{p:[35,4,1429],t:7,e:"ui-button",a:{action:"set_goal"},f:[{t:2,r:"data.goal",p:[35,33,1458]}]}]}],n:50,r:"data.id",p:[33,2,1374]}," ",{p:[38,2,1512],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[39,3,1545],t:7,e:"span",f:[{t:2,x:{r:["data.prisoner.name"],s:'_0?_0:"No Occupant"'},p:[39,9,1551]}]}]}," ",{t:4,f:[{p:[42,3,1661],t:7,e:"ui-section",a:{label:"Criminal Status"},f:[{p:[43,4,1702],t:7,e:"span",f:[{t:2,r:"data.prisoner.crimstat",p:[43,10,1708]}]}]}],n:50,r:"data.prisoner",p:[41,2,1636]}]}," ",{p:[47,1,1785],t:7,e:"ui-display",f:[{p:[48,2,1800],t:7,e:"center",f:[{p:[48,10,1808],t:7,e:"ui-button",a:{action:"teleport",state:[{t:2,x:{r:["data.can_teleport"],s:'_0?null:"disabled"'},p:[48,45,1843]}]},f:["Process Prisoner"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],400:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Stored Items"},f:[{t:4,f:[{p:[3,3,59],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[3,22,78]}]},f:[{p:[4,4,93],t:7,e:"ui-button",a:{action:"release_items",params:['{"mobref":',{t:2,r:"mob",p:[4,56,145]},"}"],state:[{t:2,x:{r:["data.can_reclaim"],s:'_0?null:"disabled"'},p:[4,72,161]}]},f:["Drop Items"]}]}],n:52,r:"data.mobs",p:[2,2,36]}]}]},e.exports=a.extend(r.exports)},{341:341}],401:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{p:[3,3,70],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.emagged"],s:'_0?"un":null'},p:[3,20,87]},"lock"],state:[{t:2,x:{r:["data.can_toggle_safety"],s:'_0?null:"disabled"'},p:[3,63,130]}],action:"safety"},f:["Safeties: ",{p:[4,14,209],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.emagged"],s:'_0?"bad":"good"'},p:[4,27,222]}]},f:[{t:2,x:{r:["data.emagged"],s:'_0?"OFF":"ON"'},p:[4,62,257]}]}]}]},t:7,e:"ui-display",a:{title:"Default Programs",button:0},f:[" ",{t:4,f:[{p:[8,2,363],t:7,e:"ui-button",a:{action:"load_program",params:['{"type": ',{t:2,r:"type",p:[8,52,413]},"}"],style:[{t:2,x:{r:["data.program","type"],s:'_0==_1?"selected":null'},p:[8,70,431]}]},f:[{t:2,r:"name",p:[9,5,483]}," "]},{p:[10,14,506],t:7,e:"br"}],n:52,r:"data.default_programs",p:[7,2,329]}]}," ",{t:4,f:[{p:[14,2,562],t:7,e:"ui-display",a:{title:"Dangerous Programs"},f:[{t:4,f:[{p:[16,4,638],t:7,e:"ui-button",a:{icon:"warning",action:"load_program",params:['{"type": ',{t:2,r:"type",p:[16,69,703]},"}"],style:[{t:2,x:{r:["data.program","type"],s:'_0==_1?"selected":null'},p:[16,87,721]}]},f:[{t:2,r:"name",p:[17,5,773]}," "]},{p:[18,16,798],t:7,e:"br"}],n:52,r:"data.emag_programs",p:[15,3,605]}]}],n:50,r:"data.emagged",p:[13,1,539]}]},e.exports=a.extend(r.exports)},{341:341}],402:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{occupantStatState:function(){switch(this.get("data.occupant.stat")){case 0:return"good";case 1:return"average";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[15,1,280],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[16,3,313],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[17,3,346],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[17,9,352]}]}]}," ",{t:4,f:[{p:[20,5,466],t:7,e:"ui-section",a:{label:"State"},f:[{p:[21,7,500],t:7,e:"span",a:{"class":[{t:2,r:"occupantStatState",p:[21,20,513]}]},f:[{t:2,x:{r:["data.occupant.stat"],s:'_0==0?"Conscious":_0==1?"Unconcious":"Dead"'},p:[21,43,536]}]}]}],n:50,r:"data.occupied",p:[19,3,439]}]}," ",{p:[25,1,680],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[26,2,712],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[27,5,743],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[27,22,760]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[27,71,809]}]}]}," ",{p:[29,3,874],t:7,e:"ui-section",a:{label:"Uses"},f:[{t:2,r:"data.ready_implants",p:[30,5,905]}," ",{t:4,f:[{p:[32,7,969],t:7,e:"span",a:{"class":"fa fa-cog fa-spin"}}],n:50,r:"data.replenishing",p:[31,5,936]}]}," ",{p:[35,3,1036],t:7,e:"ui-section",a:{label:"Activate"},f:[{p:[36,7,1073],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.occupied","data.ready_implants","data.ready"],s:'_0&&_1>0&&_2?null:"disabled"'},p:[36,25,1091]}],action:"implant"},f:[{t:2,x:{r:["data.ready","data.special_name"],s:'_0?(_1?_1:"Implant"):"Recharging"'},p:[37,9,1198]}," "]},{p:[38,19,1302],t:7,e:"br"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],403:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[15,3,296],t:7,e:"ui-notice",f:[{p:[16,5,313],t:7,e:"span",f:["Wipe in progress!"]}]}],n:50,r:"data.wiping",p:[14,1,273]},{p:{button:[{t:4,f:[{p:[22,7,479],t:7,e:"ui-button",a:{icon:"trash",state:[{t:2,x:{r:["data.isDead"],s:'_0?"disabled":null'},p:[22,38,510]}],action:"wipe"},f:[{t:2,x:{r:["data.wiping"],s:'_0?"Stop Wiping":"Wipe"'},p:[22,89,561]}," AI"]}],n:50,r:"data.name",p:[21,5,454]}]},t:7,e:"ui-display",a:{title:[{t:2,x:{r:["data.name"],s:'_0||"Empty Card"'},p:[19,19,388]}],button:0},f:[" ",{t:4,f:[{p:[26,5,672],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[27,9,709],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"bad":"good"'},p:[27,22,722]}]},f:[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"Offline":"Operational"'},p:[27,76,776]}]}]}," ",{p:[29,5,871],t:7,e:"ui-section",a:{label:"Software Integrity"},f:[{p:[30,7,918],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[30,40,951]}],state:[{t:2,r:"healthState",p:[30,64,975]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[30,81,992]},"%"]}]}," ",{p:[32,5,1055],t:7,e:"ui-section",a:{label:"Laws"},f:[{t:4,f:[{p:[34,9,1117],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[34,33,1141]}]},{p:[34,45,1153],t:7,e:"br"}],n:52,r:"data.laws",p:[33,7,1088]}]}," ",{p:[37,5,1200],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[38,7,1237],t:7,e:"ui-button",a:{icon:"signal",style:[{t:2,x:{r:["data.wireless"],s:'_0?"selected":null'},p:[38,39,1269]}],action:"wireless"},f:["Wireless Activity"]}," ",{p:[39,7,1363],t:7,e:"ui-button",a:{icon:"microphone",style:[{t:2,x:{r:["data.radio"],s:'_0?"selected":null'},p:[39,43,1399]}],action:"radio"},f:["Subspace Radio"]}]}],n:50,r:"data.name",p:[25,3,649]}]}]},e.exports=a.extend(r.exports)},{341:341}],404:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,23],t:7,e:"ui-notice",f:[{p:[3,3,38],t:7,e:"span",f:["Waiting for another device to confirm your request..."]}]}],n:50,r:"data.waiting",p:[1,1,0]},{t:4,n:51,f:[{p:[6,2,132],t:7,e:"ui-display",f:[{p:[7,3,148],t:7,e:"ui-section",f:[{t:4,f:[{p:[9,5,197],t:7,e:"ui-button",a:{icon:"check",action:"auth_swipe"},f:["Authorize ",{t:2,r:"data.auth_required",p:[9,59,251]}]}],n:50,r:"data.auth_required",p:[8,4,165]},{t:4,n:51,f:[{p:[11,5,304],t:7,e:"ui-button",a:{icon:"warning",state:[{t:2,x:{r:["data.red_alert"],s:'_0?"disabled":null'},p:[11,38,337]}],action:"red_alert"},f:["Red Alert"]}," ",{p:[12,5,423],t:7,e:"ui-button",a:{icon:"wrench",state:[{t:2,x:{r:["data.emergency_maint"],s:'_0?"disabled":null'},p:[12,37,455]}],action:"emergency_maint"},f:["Emergency Maintenance Access"]}," ",{p:[13,5,572],t:7,e:"ui-button",a:{icon:"warning",state:"null",action:"bsa_unlock"},f:["Bluespace Artillery Unlock"]}],r:"data.auth_required"}]}]}],r:"data.waiting"}]},e.exports=a.extend(r.exports)},{341:341}],405:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Ore values"},f:[{t:4,f:[{p:[3,3,57],t:7,e:"ui-section",a:{label:[{t:2,r:"ore",p:[3,22,76]}]},f:[{p:[4,4,90],t:7,e:"span",f:[{t:2,r:"value",p:[4,10,96]}]}]}],n:52,r:"data.ores",p:[2,2,34]}]}," ",{p:[8,1,158],t:7,e:"ui-display",a:{title:"Points"},f:[{p:[9,2,188],t:7,e:"ui-section",a:{label:"Unclaimed points"},f:[{p:[10,3,229],t:7,e:"span",f:[{t:2,r:"data.unclaimed_points",p:[10,9,235]}]}," ",{p:[11,3,271],t:7,e:"ui-button",a:{action:"claim_points",state:[{t:2,x:{r:["data.unclaimed_points"],s:'_0?null:"disabled"'},p:[11,42,310]}]},f:["Claim points"]}]}]}," ",{p:[14,1,413],t:7,e:"ui-display",f:[{p:[15,2,428],t:7,e:"span",f:["Points: ",{t:2,r:"data.id_points",p:[15,16,442]}]}," ",{p:[16,2,470],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[17,3,501],t:7,e:"span",f:[{t:2,r:"data.status_info",p:[17,9,507]}]}," ",{p:[18,3,538],t:7,e:"ui-button",a:{action:"move_shuttle",state:[{t:2,x:{r:["data.can_go_home"],s:'_0?null:"disabled"'},p:[18,42,577]}]},f:["Move shuttle"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],406:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Known Languages"},f:[{t:4,f:[{p:[3,5,70],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[3,23,88]}]},f:[{p:[4,7,105],t:7,e:"span",f:[{t:2,r:"desc",p:[4,13,111]}]}," ",{p:[5,7,134],t:7,e:"span",f:["Key: ,",{t:2,r:"key",p:[5,19,146]}]}," ",{t:4,f:[{p:[7,9,192],t:7,e:"span",f:["(gained from mob)"]}],n:50,r:"shadow",p:[6,7,168]}," ",{p:[9,7,245],t:7,e:"span",f:[{t:2,x:{r:["can_speak"],s:'_0?"Can Speak":"Cannot Speak"'},p:[9,13,251]}]}," ",{t:4,f:[{p:[11,9,342],t:7,e:"ui-button",a:{action:"select_default",params:['{"language_name":"',{t:2,r:"name",p:[13,37,425]},'"}'],style:[{t:2,x:{r:["is_default","can_speak"],s:'_0?"selected":_1?null:"disabled"'},p:[14,18,455]}]},f:[{t:2,x:{r:["is_default"],s:'_0?"Default Language":"Select as Default"'},p:[15,10,526]}]}],n:50,r:"data.is_living",p:[10,7,310]}," ",{t:4,f:[{t:4,f:[{p:[20,11,685],t:7,e:"ui-button",a:{action:"grant_language",params:['{"language_name":"',{t:2,r:"name",p:[20,72,746]},'"}']},f:["Grant"]}],n:50,r:"shadow",p:[19,9,659]},{t:4,n:51,f:[{p:[22,11,805],t:7,e:"ui-button",a:{action:"remove_language",params:['{"language_name":"',{t:2,r:"name",p:[22,73,867]},'"}']},f:["Remove"]}],r:"shadow"}],n:50,r:"data.admin_mode",p:[18,7,626]}]}],n:52,r:"data.languages",p:[2,3,40]}]}," ",{t:4,f:[{t:4,f:[{p:[30,5,1033],t:7,e:"ui-button",a:{action:"toggle_omnitongue",style:[{t:2,x:{r:["data.omnitongue"],s:'_0?"selected":null'},p:[32,14,1092]}]},f:["Omnitongue ",{t:2,x:{r:["data.omnitongue"],s:'_0?"Enabled":"Disabled"'},p:[33,19,1152]}]}],n:50,r:"data.is_living",p:[29,3,1005]}," ",{p:[36,3,1231],t:7,e:"ui-display",a:{title:"Unknown Languages"},f:[{t:4,f:[{p:[38,7,1315],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[38,25,1333]}]},f:[{p:[39,9,1352],t:7,e:"span",f:[{t:2,r:"desc",p:[39,15,1358]}]}," ",{p:[40,9,1383],t:7,e:"span",f:["Key: ,",{t:2,r:"key",p:[40,21,1395]}]}," ",{p:[41,9,1419],t:7,e:"ui-button",a:{action:"grant_language",params:['{"language_name":"',{t:2,r:"name",p:[43,37,1502]},'"}']},f:["Grant"]}]}],n:52,r:"data.unknown_languages",p:[37,5,1275]}]}],n:50,r:"data.admin_mode",p:[28,1,978]}]},e.exports=a.extend(r.exports)},{341:341}],407:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Controls"},f:[{t:4,f:[{t:4,f:[{p:[4,4,84],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[5,5,118],t:7,e:"span",f:["Launchpad closed."]}]}],n:50,r:"data.pad_closed",p:[3,3,56]},{t:4,n:51,f:[{p:[8,4,183],t:7,e:"ui-section",a:{label:"Launchpad"},f:[{p:[9,4,218],t:7,e:"span",f:[{p:[9,10,224],t:7,e:"b",f:[{t:2, +r:"data.pad_name",p:[9,13,227]}]}]},{p:[9,41,255],t:7,e:"br"}," ",{p:[10,4,264],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:["Rename"]}," ",{p:[11,4,328],t:7,e:"ui-button",a:{icon:"remove",style:"danger",action:"remove"},f:["Remove"]}]}," ",{p:[14,4,427],t:7,e:"ui-section",a:{label:"Set Target"},f:[{p:[15,4,463],t:7,e:"table",f:[{p:[16,4,475],t:7,e:"tr",f:[{p:[17,5,485],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[17,38,518],t:7,e:"ui-button",a:{action:"up-left"},f:["↖"]}]}," ",{p:[18,5,570],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[18,57,622],t:7,e:"ui-button",a:{action:"up"},f:["↑"]}]}," ",{p:[19,5,669],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[19,56,720],t:7,e:"ui-button",a:{action:"up-right"},f:["↗"]}]}]}," ",{p:[21,4,782],t:7,e:"tr",f:[{p:[22,5,792],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[22,38,825],t:7,e:"ui-button",a:{action:"left",style:"width:35px!important"},f:["←"]}]}," ",{p:[23,5,903],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[23,57,955],t:7,e:"ui-button",a:{action:"reset"},f:["R"]}]}," ",{p:[24,5,1005],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[24,56,1056],t:7,e:"ui-button",a:{action:"right"},f:["→"]}]}]}," ",{p:[26,4,1115],t:7,e:"tr",f:[{p:[27,5,1125],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[27,38,1158],t:7,e:"ui-button",a:{action:"down-left"},f:["↙"]}]}," ",{p:[28,5,1212],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[28,57,1264],t:7,e:"ui-button",a:{action:"down"},f:["↓"]}]}," ",{p:[29,5,1313],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[29,56,1364],t:7,e:"ui-button",a:{action:"down-right"},f:["↘"]}]}]}]}]}," ",{p:[33,4,1459],t:7,e:"ui-section",a:{label:"Current Target"},f:[{p:[34,5,1500],t:7,e:"span",f:[{t:2,r:"data.abs_y",p:[34,11,1506]}," ",{t:2,r:"data.north_south",p:[34,26,1521]}]},{p:[34,53,1548],t:7,e:"br"}," ",{p:[35,5,1558],t:7,e:"span",f:[{t:2,r:"data.abs_x",p:[35,11,1564]}," ",{t:2,r:"data.east_west",p:[35,26,1579]}]}]}," ",{p:[37,4,1627],t:7,e:"ui-section",a:{label:"Activate"},f:[{p:[38,5,1662],t:7,e:"ui-button",a:{action:"launch",tooltip:"Teleport everything on the pad to the target.","tooltip-side":"down"},f:["Launch"]}," ",{p:[39,5,1789],t:7,e:"ui-button",a:{action:"pull",tooltip:"Teleport everything from the target to the pad.","tooltip-side":"down"},f:["Pull"]}]}],r:"data.pad_closed"}],n:50,r:"data.has_pad",p:[2,2,32]},{t:4,n:51,f:[{p:[45,3,1956],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[46,4,1989],t:7,e:"span",f:["No launchpad found. Link the remote to a launchpad."]}]}],r:"data.has_pad"}]}]},e.exports=a.extend(r.exports)},{341:341}],408:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{mechChargeState:function(t){var e=this.get("data.recharge_port.mech.cell.maxcharge");return t>=e/1.5?"good":t>=e/3?"average":"bad"},mechHealthState:function(t){var e=this.get("data.recharge_port.mech.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[20,1,545],t:7,e:"ui-display",a:{title:"Mech Status"},f:[{t:4,f:[{t:4,f:[{p:[23,4,646],t:7,e:"ui-section",a:{label:"Integrity"},f:[{p:[24,6,683],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,27,704]}],value:[{t:2,r:"adata.recharge_port.mech.health",p:[24,74,751]}],state:[{t:2,x:{r:["mechHealthState","adata.recharge_port.mech.health"],s:"_0(_1)"},p:[24,117,794]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.health"],s:"Math.round(_0)"},p:[24,171,848]},"/",{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,219,896]}]}]}," ",{t:4,f:[{t:4,f:[{p:[28,5,1061],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[28,31,1087],t:7,e:"span",a:{"class":"bad"},f:["Cell Critical Failure"]}]}],n:50,r:"data.recharge_port.mech.cell.critfail",p:[27,3,1010]},{t:4,n:51,f:[{p:[30,11,1170],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,13,1210],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.cell.maxcharge",p:[31,34,1231]}],value:[{t:2,r:"adata.recharge_port.mech.cell.charge",p:[31,86,1283]}],state:[{t:2,x:{r:["mechChargeState","adata.recharge_port.mech.cell.charge"],s:"_0(_1)"},p:[31,134,1331]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.cell.charge"],s:"Math.round(_0)"},p:[31,193,1390]},"/",{t:2,x:{r:["adata.recharge_port.mech.cell.maxcharge"],s:"Math.round(_0)"},p:[31,246,1443]}]}]}],r:"data.recharge_port.mech.cell.critfail"}],n:50,r:"data.recharge_port.mech.cell",p:[26,4,970]},{t:4,n:51,f:[{p:[35,3,1558],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[35,29,1584],t:7,e:"span",a:{"class":"bad"},f:["Cell Missing"]}]}],r:"data.recharge_port.mech.cell"}],n:50,r:"data.recharge_port.mech",p:[22,2,610]},{t:4,n:51,f:[{p:[38,4,1662],t:7,e:"ui-section",f:["Mech Not Found"]}],r:"data.recharge_port.mech"}],n:50,r:"data.recharge_port",p:[21,3,581]},{t:4,n:51,f:[{p:[41,5,1729],t:7,e:"ui-section",f:["Recharging Port Not Found"]}," ",{p:[42,2,1782],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}],r:"data.recharge_port"}]}]},e.exports=a.extend(r.exports)},{341:341}],409:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{t:4,f:[{p:[3,5,45],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[4,7,88],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[4,24,105]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[4,75,156]}]}]}],n:50,r:"data.siliconUser",p:[2,3,15]},{t:4,n:51,f:[{p:[7,5,247],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[7,31,273]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[10,1,358],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[11,3,389],t:7,e:"ui-section",a:{label:"Power"},f:[{t:4,f:[{p:[13,7,470],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[13,24,487]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[13,68,531]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[13,116,579]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[12,5,421]},{t:4,n:51,f:[{p:[15,7,639],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.on"],s:'_0?"good":"bad"'},p:[15,20,652]}],state:[{t:2,x:{r:["data.cell"],s:'_0?null:"disabled"'},p:[15,57,689]}]},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[15,92,724]}]}],x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"}}]}," ",{p:[18,3,791],t:7,e:"ui-section",a:{label:"Cell"},f:[{p:[19,5,822],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.cell"],s:'_0?null:"bad"'},p:[19,18,835]}]},f:[{t:2,x:{r:["data.cell","data.cellPercent"],s:'_0?_1+"%":"No Cell"'},p:[19,48,865]}]}]}," ",{p:[21,3,943],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[22,5,974],t:7,e:"span",a:{"class":[{t:2,r:"data.modeStatus",p:[22,18,987]}]},f:[{t:2,r:"data.mode",p:[22,39,1008]}]}]}," ",{p:[24,3,1049],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[25,5,1080],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.load"],s:'_0?"good":"average"'},p:[25,18,1093]}]},f:[{t:2,x:{r:["data.load"],s:'_0?_0:"None"'},p:[25,54,1129]}]}]}," ",{p:[27,3,1191],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[28,5,1229],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.destination"],s:'_0?"good":"average"'},p:[28,18,1242]}]},f:[{t:2,x:{r:["data.destination"],s:'_0?_0:"None"'},p:[28,60,1284]}]}]}]}," ",{t:4,f:[{p:{button:[{t:4,f:[{p:[35,9,1513],t:7,e:"ui-button",a:{icon:"eject",action:"unload"},f:["Unload"]}],n:50,r:"data.load",p:[34,7,1486]}," ",{t:4,f:[{p:[38,9,1623],t:7,e:"ui-button",a:{icon:"eject",action:"ejectpai"},f:["Eject PAI"]}],n:50,r:"data.haspai",p:[37,7,1594]}," ",{p:[40,7,1709],t:7,e:"ui-button",a:{icon:"pencil",action:"setid"},f:["Set ID"]}]},t:7,e:"ui-display",a:{title:"Controls",button:0},f:[" ",{p:[42,5,1791],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[43,7,1831],t:7,e:"ui-button",a:{icon:"pencil",action:"destination"},f:["Set Destination"]}," ",{p:[44,7,1912],t:7,e:"ui-button",a:{icon:"stop",action:"stop"},f:["Stop"]}," ",{p:[45,7,1973],t:7,e:"ui-button",a:{icon:"play",action:"go"},f:["Go"]}]}," ",{p:[47,5,2047],t:7,e:"ui-section",a:{label:"Home"},f:[{p:[48,7,2080],t:7,e:"ui-button",a:{icon:"home",action:"home"},f:["Go Home"]}," ",{p:[49,7,2144],t:7,e:"ui-button",a:{icon:"pencil",action:"sethome"},f:["Set Home"]}]}," ",{p:[51,5,2231],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[52,7,2268],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoReturn"],s:'_0?"check-square-o":"square-o"'},p:[52,24,2285]}],style:[{t:2,x:{r:["data.autoReturn"],s:'_0?"selected":null'},p:[52,84,2345]}],action:"autoret"},f:["Auto-Return Home"]}," ",{p:[54,7,2449],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoPickup"],s:'_0?"check-square-o":"square-o"'},p:[54,24,2466]}],style:[{t:2,x:{r:["data.autoPickup"],s:'_0?"selected":null'},p:[54,84,2526]}],action:"autopick"},f:["Auto-Pickup Crate"]}," ",{p:[56,7,2632],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"check-square-o":"square-o"'},p:[56,24,2649]}],style:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"selected":null'},p:[56,88,2713]}],action:"report"},f:["Report Deliveries"]}]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[31,1,1373]}]},e.exports=a.extend(r.exports)},{341:341}],410:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Chamber Console"},f:[{p:[2,1,45],t:7,e:"ui-display",a:{title:"Program Disk"},f:[{t:4,f:[{p:[4,2,104],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]},{p:[4,63,165],t:7,e:"br"}," ",{t:4,f:[{p:[6,3,200],t:7,e:"ui-section",a:{label:"Program Name"},f:[{t:2,r:"data.disk.name",p:[6,36,233]}]}," ",{p:[7,3,268],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.disk.desc",p:[7,35,300]}]}," ",{p:[8,3,335],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["data.disk.activated"],s:'_0?"Active":"Inactive"'},p:[8,41,373]}]}," ",{t:4,f:[{p:[10,4,477],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"data.disk.activation_delay",p:[10,41,514]}]}],n:50,r:"data.disk.activation_delay",p:[9,3,438]}," ",{t:4,f:[{p:[13,4,600],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"data.disk.timer",p:[13,30,626]}]}," ",{p:[14,4,663],t:7,e:"ui-section",a:{label:"Timer Type "},f:[{t:2,r:"data.disk.timer_type",p:[14,36,695]}]}],n:50,r:"data.disk.timer",p:[12,3,572]}," ",{t:4,f:[{p:[17,4,785],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"data.disk.activation_code",p:[17,40,821]}]}],n:50,r:"data.disk.activation_code",p:[16,3,747]}," ",{t:4,f:[{p:[20,4,918],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"data.disk.deactivation_code",p:[20,42,956]}]}],n:50,r:"data.disk.deactivation_code",p:[19,3,878]}," ",{t:4,f:[{p:[23,4,1047],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"data.disk.kill_code",p:[23,34,1077]}]}],n:50,r:"data.disk.kill_code",p:[22,3,1015]}," ",{t:4,f:[{p:[26,4,1163],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"data.disk.trigger_code",p:[26,37,1196]}]}],n:50,r:"data.disk.trigger_code",p:[25,3,1128]}," ",{t:4,f:[{t:4,f:[{p:[30,6,1332],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[30,25,1351]}]},f:[{t:2,r:"value",p:[30,35,1361]}]}],n:52,r:"data.disk.extra_settings",p:[29,4,1291]}],n:50,r:"data.disk.has_extra_settings",p:[28,3,1250]}],n:50,r:"data.has_program",p:[5,2,172]},{t:4,n:51,f:[{p:[34,3,1423],t:7,e:"ui-notice",f:["No program detected."]}],r:"data.has_program"}],n:50,r:"data.has_disk",p:[3,1,80]},{t:4,n:51,f:[{p:[37,2,1489],t:7,e:"ui-notice",f:["Insert disk."]}],r:"data.has_disk"}]}," ",{p:[40,1,1550],t:7,e:"br"}," ",{t:4,f:[{p:[42,2,1582],t:7,e:"ui-notice",f:[{t:2,r:"data.status_msg",p:[42,13,1593]}]}],n:50,r:"data.status_msg",p:[41,1,1556]},{t:4,n:51,f:[{p:[44,2,1637],t:7,e:"ui-display",a:{title:"Chamber"},f:[{p:[45,2,1668],t:7,e:"ui-section",f:[{p:[45,14,1680],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock-open":"lock"'},p:[45,30,1696]}],action:"toggle_lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Unlock":"Lock"'},p:[45,90,1756]}," Chamber"]},{p:[45,146,1812],t:7,e:"br"}]}," ",{p:[46,2,1832],t:7,e:"ui-section",f:[{p:[46,14,1844],t:7,e:"b",f:["Occupant:"]}," ",{t:2,r:"data.occupant_name",p:[46,31,1861]}]}," ",{t:4,f:[{p:[48,4,1929],t:7,e:"ui-section",f:[{p:[48,16,1941],t:7,e:"ui-notice",f:["No nanites detected."]}]}," ",{p:[49,4,2002],t:7,e:"ui-section",f:[{p:[49,16,2014],t:7,e:"ui-button",a:{icon:"syringe",action:"nanite_injection"},f:["Implant Nanites"]}]}],n:50,x:{r:["data.has_nanites"],s:"!_0"},p:[47,2,1899]},{t:4,n:51,f:[{p:[51,3,2121],t:7,e:"ui-display",a:{title:"Nanites"},f:[{t:4,f:[{p:[53,5,2181],t:7,e:"ui-button",a:{icon:"download",action:"add_program"},f:["Install Program From Disk"]},{p:[53,90,2266],t:7,e:"br"}," ",{p:[54,5,2276],t:7,e:"br"}],n:50,r:"data.has_disk",p:[52,4,2154]}," ",{p:[56,4,2297],t:7,e:"ui-section",f:[{p:[57,5,2315],t:7,e:"ui-section",a:{label:"Nanite Volume"},f:[{t:2,r:"data.nanite_volume",p:[57,39,2349]}]}," ",{p:[58,5,2390],t:7,e:"ui-section",a:{label:"Growth Rate"},f:[{t:2,r:"data.regen_rate",p:[58,37,2422]}]}," ",{p:[59,5,2460],t:7,e:"ui-section",a:{label:"Safety Threshold"},f:[{t:2,r:"data.safety_threshold",p:[59,42,2497]}," ",{p:[59,68,2523],t:7,e:"ui-button",a:{icon:"pencil",action:"set_safety"},f:["Set"]}]}," ",{p:[60,5,2603],t:7,e:"ui-section",a:{label:"Cloud ID"},f:[{t:2,x:{r:["data.cloud_id"],s:'_0?_0:"No Cloud"'},p:[60,34,2632]}," ",{p:[60,82,2680],t:7,e:"ui-button",a:{icon:"pencil",action:"set_cloud"},f:["Set"]}]}]}," ",{p:[62,4,2776],t:7,e:"ui-display",a:{title:"Programs"},f:[{t:4,f:[{p:[64,6,2845],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[64,25,2864]}],button:0},f:[{p:[65,6,2888],t:7,e:"ui-button",a:{icon:"minus",action:"remove_program",params:['{"program_id": "',{t:2,r:"id",p:[65,78,2960]},'"}']},f:["Uninstall"]}," ",{p:[66,6,2998],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"desc",p:[66,38,3030]}]}," ",{t:4,f:[{p:[68,7,3094],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["activated"],s:'_0?"Active":"Inactive"'},p:[68,45,3132]}]}," ",{p:[69,7,3191],t:7,e:"ui-section",a:{label:"Nanites Consumed"},f:[{t:2,r:"use_rate",p:[69,44,3228]},"/s"]}," ",{t:4,f:[{p:[71,8,3291],t:7,e:"ui-section",a:{label:"Trigger Cost"},f:[{t:2,r:"trigger_cost",p:[71,41,3324]}]}," ",{p:[72,8,3362],t:7,e:"ui-section",a:{label:"Trigger Cooldown"},f:[{t:2,r:"trigger_cooldown",p:[72,45,3399]}," seconds"]}],n:50,r:"can_trigger",p:[70,7,3263]}," ",{t:4,f:[{t:4,f:[{p:[76,9,3534],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"activation_delay",p:[76,46,3571]}]}],n:50,r:"activation_delay",p:[75,8,3500]}," ",{t:4,f:[{p:[79,9,3652],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"timer",p:[79,35,3678]}]}," ",{p:[80,9,3710],t:7,e:"ui-section",a:{label:"Timer Type"},f:[{t:2,r:"timer_type",p:[80,40,3741]}]}],n:50,r:"timer",p:[78,8,3629]}," ",{t:4,f:[{t:4,f:[{p:[84,11,3865],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[84,30,3884]}]},f:[{t:2,r:"value",p:[84,40,3894]}]}],n:52,r:"extra_settings",p:[83,9,3829]}],n:50,r:"has_extra_settings",p:[82,8,3793]}," ",{t:4,f:[{t:4,f:[{p:[89,10,4032],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"activation_code",p:[89,46,4068]}]}],n:50,r:"activation_code",p:[88,9,3998]}," ",{t:4,f:[{p:[92,10,4163],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"deactivation_code",p:[92,48,4201]}]}],n:50,r:"deactivation_code",p:[91,9,4127]}," ",{t:4,f:[{p:[95,10,4290],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"kill_code",p:[95,40,4320]}]}],n:50,r:"kill_code",p:[94,9,4262]}," ",{t:4,f:[{p:[98,10,4404],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"trigger_code",p:[98,43,4437]}]}],n:50,r:"trigger_code",p:[97,9,4373]}],n:50,x:{r:["data.scan_level"],s:"_0>=4"},p:[87,8,3960]}],n:50,x:{r:["data.scan_level"],s:"_0>=3"},p:[74,7,3463]}],n:50,x:{r:["data.scan_level"],s:"_0>=2"},p:[67,6,3058]}]}],n:52,r:"data.mob_programs",p:[63,5,2811]}]}]}],x:{r:["data.has_nanites"],s:"!_0"}}]}],r:"data.status_msg"}]}]},e.exports=a.extend(r.exports)},{341:341}],411:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Cloud Console"},f:[{p:[2,1,43],t:7,e:"ui-display",a:{title:"Program Disk"},f:[{t:4,f:[{p:[4,3,104],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]},{p:[4,64,165],t:7,e:"br"}," ",{t:4,f:[{p:[6,4,202],t:7,e:"ui-section",f:[{p:[7,5,220],t:7,e:"ui-section",a:{label:"Program Name"},f:[{t:2,r:"data.disk.name",p:[7,38,253]}]}," ",{p:[8,5,290],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.disk.desc",p:[8,37,322]}]}," ",{p:[9,5,359],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["data.disk.activated"],s:'_0?"Active":"Inactive"'},p:[9,43,397]}]}," ",{t:4,f:[{p:[11,6,505],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"data.disk.activation_delay",p:[11,43,542]}]}],n:50,r:"data.disk.activation_delay",p:[10,5,464]}," ",{t:4,f:[{p:[14,6,634],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"data.disk.timer",p:[14,32,660]}]}," ",{p:[15,6,699],t:7,e:"ui-section",a:{label:"Timer Type "},f:[{t:2,r:"data.disk.timer_type",p:[15,38,731]}]}],n:50,r:"data.disk.timer",p:[13,5,604]}," ",{t:4,f:[{p:[18,6,827],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"data.disk.activation_code",p:[18,42,863]}]}],n:50,r:"data.disk.activation_code",p:[17,5,787]}," ",{t:4,f:[{p:[21,6,966],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"data.disk.deactivation_code",p:[21,44,1004]}]}],n:50,r:"data.disk.deactivation_code",p:[20,5,924]}," ",{t:4,f:[{p:[24,6,1101],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"data.disk.kill_code",p:[24,36,1131]}]}],n:50,r:"data.disk.kill_code",p:[23,5,1067]}," ",{t:4,f:[{p:[27,6,1223],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"data.disk.trigger_code",p:[27,39,1256]}]}],n:50,r:"data.disk.trigger_code",p:[26,5,1186]}," ",{t:4,f:[{t:4,f:[{p:[31,8,1400],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[31,27,1419]}]},f:[{t:2,r:"value",p:[31,37,1429]}]}],n:52,r:"data.disk.extra_settings",p:[30,6,1357]}],n:50,r:"data.disk.has_extra_settings",p:[29,5,1314]}]}],n:50,r:"data.has_program",p:[5,3,173]},{t:4,n:51,f:[{p:[36,4,1515],t:7,e:"ui-notice",f:["No program detected."]}],r:"data.has_program"}],n:50,r:"data.has_disk",p:[3,2,79]},{t:4,n:51,f:[{p:[39,3,1584],t:7,e:"ui-notice",f:["Insert disk."]}],r:"data.has_disk"}]}," ",{p:[42,1,1646],t:7,e:"ui-display",a:{title:"Cloud Storage"},f:[{t:4,f:[{p:[44,3,1713],t:7,e:"ui-button",a:{icon:"plus-circle",action:"create_backup"},f:["Create New Backup"]}," ",{p:[45,3,1799],t:7,e:"ui-display",a:{title:"Active Backups"},f:[{t:4,f:[{p:[47,5,1873],t:7,e:"ui-button",a:{action:"set_view",params:['{"view": "',{t:2,r:"cloud_id",p:[47,52,1920]},'"}']},f:["Backup #",{t:2,r:"cloud_id",p:[47,76,1944]}]}],n:52,r:"data.cloud_backups",p:[46,4,1839]}]}],n:50,x:{r:["data.current_view"],s:"!_0"},p:[43,2,1683]},{t:4,n:51,f:[{p:[51,3,2014],t:7,e:"ui-button",a:{icon:"undo",action:"set_view",params:'{"view": "0"}'},f:["Return"]}," ",{t:4,f:[{p:[53,4,2131],t:7,e:"ui-notice",f:["ERROR: Backup not found."]}],n:50,x:{r:["data.cloud_backup"],s:"!_0"},p:[52,3,2100]},{t:4,n:51,f:[{p:[55,4,2195],t:7,e:"ui-display",a:{title:["Backup #",{t:2,r:"data.current_view",p:[55,31,2222]}]},f:[{t:4,f:[{p:[57,6,2282],t:7,e:"ui-button",a:{icon:"upload",action:"upload_program",style:"selected"},f:["Upload Program From Disk"]},{p:[57,108,2384],t:7,e:"br"}],n:50,r:"data.has_program",p:[56,5,2251]}," ",{t:4,f:[{p:[60,6,2443],t:7,e:"hr"}," ",{p:[61,6,2454],t:7,e:"ui-section",f:[{p:[62,7,2474],t:7,e:"h3",f:[{t:2,r:"name",p:[62,11,2478]}]}," ",{p:[63,7,2499],t:7,e:"div",a:{style:"float:right"},f:[{p:[64,8,2533],t:7,e:"ui-button",a:{icon:"minus-circle",action:"remove_program",style:"danger",params:['{"program_id": "',{t:2,r:"id",p:[64,102,2627]},'"}']},f:["Uninstall"]}]}]}," ",{p:[67,6,2699],t:7,e:"ui-section",f:[{p:[68,7,2719],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"desc",p:[68,39,2751]}]}," ",{p:[69,7,2780],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["activated"],s:'_0?"Active":"Inactive"'},p:[69,45,2818]}]}," ",{p:[70,7,2877],t:7,e:"ui-section",a:{label:"Nanites Consumed"},f:[{t:2,r:"use_rate",p:[70,44,2914]},"/s"]}," ",{t:4,f:[{p:[72,8,2977],t:7,e:"ui-section",a:{label:"Trigger Cost"},f:[{t:2,r:"trigger_cost",p:[72,41,3010]},"/s"]}," ",{p:[73,8,3050],t:7,e:"ui-section",a:{label:"Trigger Cooldown"},f:[{t:2,r:"trigger_cooldown",p:[73,45,3087]},"/s"]}],n:50,r:"can_trigger",p:[71,7,2949]}," ",{t:4,f:[{p:[76,8,3178],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"activation_delay",p:[76,45,3215]}]}],n:50,r:"activation_delay",p:[75,7,3145]}," ",{t:4,f:[{p:[79,8,3293],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"timer",p:[79,34,3319]}]}," ",{p:[80,8,3350],t:7,e:"ui-section",a:{label:"Timer Type "},f:[{t:2,r:"timer_type",p:[80,40,3382]}]}],n:50,r:"timer",p:[78,7,3271]}," ",{t:4,f:[{p:[83,8,3464],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"activation_code",p:[83,44,3500]}]}],n:50,r:"activation_code",p:[82,7,3432]}," ",{t:4,f:[{p:[86,8,3589],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"deactivation_code",p:[86,46,3627]}]}],n:50,r:"deactivation_code",p:[85,7,3555]}," ",{t:4,f:[{p:[89,8,3710],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"kill_code",p:[89,38,3740]}]}],n:50,r:"kill_code",p:[88,7,3684]}," ",{t:4,f:[{p:[92,8,3818],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"trigger_code",p:[92,41,3851]}]}],n:50,r:"trigger_code",p:[91,7,3789]}," ",{t:4,f:[{t:4,f:[{p:[96,10,3973],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[96,29,3992]}]},f:[{t:2,r:"value",p:[96,39,4002]}]}],n:52,r:"extra_settings",p:[95,8,3938]}],n:50,r:"has_extra_settings",p:[94,7,3903]}]}],n:52,r:"data.cloud_programs",p:[59,5,2407]}]}],x:{r:["data.cloud_backup"],s:"!_0"}}],x:{r:["data.current_view"],s:"!_0"}}]}]}]},e.exports=a.extend(r.exports)},{341:341}],412:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Program Hub"},f:[{t:4,f:[{p:[3,2,65],t:7,e:"ui-display",a:{title:"Program Disk"},f:[{p:[4,3,102],t:7,e:"ui-section",f:[{p:[5,4,119],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]}," ",{p:[6,4,185],t:7,e:"ui-button",a:{icon:"minus-circle",action:"clear"},f:["Delete Program"]}]}," ",{t:4,f:[{p:[9,4,307],t:7,e:"ui-section",a:{label:"Program Name"},f:[{t:2,r:"data.disk.name",p:[9,37,340]}]}," ",{p:[10,4,376],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.disk.desc",p:[10,36,408]}]}],n:50,r:"data.has_program",p:[8,3,278]},{t:4,n:51,f:[{p:[12,4,456],t:7,e:"ui-notice",f:["No program installed."]}],r:"data.has_program"}]}],n:50,r:"data.has_disk",p:[2,1,41]},{t:4,n:51,f:[{p:[16,2,540],t:7,e:"ui-notice",f:["Insert disk."]}],r:"data.has_disk"},{p:[18,1,586],t:7,e:"br"}," ",{p:[19,1,592],t:7,e:"ui-display",a:{title:"Programs"},f:[{p:[20,2,624],t:7,e:"ui-section",f:[{p:[21,3,640],t:7,e:"ui-button",a:{icon:"undo",action:"set_category",params:'{"category": "Main"}'},f:["Return"]}," ",{p:[22,3,737],t:7,e:"ui-button",a:{icon:"align-justify ",action:"toggle_details"},f:[{t:2,x:{r:["data.detail_view"],s:'_0?"Compact View":"Detailed View"'},p:[22,60,794]}]}]}," ",{t:4,f:[{p:[25,3,916],t:7,e:"ui-display",f:[{t:4,f:[{p:[27,5,964],t:7,e:"ui-section",f:[{p:[27,17,976],t:7,e:"ui-button",a:{action:"set_category",params:['{"category": "',{t:2,r:"name",p:[27,72,1031]},'"}']},f:[{t:2,r:"name",p:[27,84,1043]}]}]}],n:52,r:"data.categories",p:[26,4,933]}]}],n:50,x:{r:["data.category"],s:'_0=="Main"'},p:[24,2,881]},{t:4,n:51,f:[{p:[31,3,1122],t:7,e:"ui-display",a:{title:[{t:2,r:"data.category",p:[31,22,1141]}]},f:[{t:4,f:[{t:4,f:[{p:[34,6,1229],t:7,e:"ui-display",f:[{p:[35,7,1249],t:7,e:"ui-section",f:[{p:[35,19,1261],t:7,e:"b",f:[{t:2,r:"name",p:[35,22,1264]}]}]}," ",{p:[36,7,1297],t:7,e:"ui-section",f:[{t:2,r:"desc",p:[36,19,1309]}]}," ",{p:[37,7,1338],t:7,e:"ui-section",f:[{p:[38,8,1359],t:7,e:"ui-button",a:{icon:"download",action:"download",params:['{"program_id": "',{t:2,r:"id",p:[38,77,1428]},'"}'],state:[{t:2,x:{r:["data.has_disk"],s:'_0?null:"disabled"'},p:[38,94,1445]}]},f:["Download"]}]}]}],n:50,r:"data.detail_view",p:[33,5,1198]},{t:4,n:51,f:[{p:[44,6,1585],t:7,e:"ui-section",f:[{p:[44,18,1597],t:7,e:"ui-button",a:{action:"download",params:['{"program_id": "',{t:2,r:"id",p:[44,71,1650]},'"}']},f:[{t:2,r:"name",p:[44,81,1660]}]}]}],r:"data.detail_view"}],n:52,r:"data.program_list",p:[32,4,1165]}]}],x:{r:["data.category"],s:'_0=="Main"'}}]}]}]},e.exports=a.extend(r.exports)},{341:341}],413:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Programming"},f:[{t:4,f:[{p:[3,3,67],t:7,e:"ui-notice",f:["Insert a nanite program disk."]}],n:50,x:{r:["data.has_disk"],s:"!_0"},p:[2,1,41]},{t:4,n:51,f:[{p:[5,3,133],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]}," ",{t:4,f:[{p:[7,5,229],t:7,e:"ui-notice",f:["No program detected."]}],n:50,x:{r:["data.has_program"],s:"!_0"},p:[6,3,198]},{t:4,n:51,f:[{p:[9,5,290],t:7,e:"ui-section",f:[{p:[10,7,310],t:7,e:"ui-display",a:{title:[{t:2,r:"data.name",p:[10,26,329]}]},f:[{t:2,r:"data.desc",p:[11,9,354]}]}]}," ",{p:[14,5,413],t:7,e:"ui-section",f:[{p:[15,7,433],t:7,e:"ui-section",a:{label:"Program Info"},f:["Nanites Consumed: ",{t:2,r:"data.use_rate",p:[16,26,493]},{p:[16,43,510],t:7,e:"br"}," ",{t:4,f:["Trigger Cost: ",{t:2,r:"data.trigger_cost",p:[18,25,574]},"u",{p:[18,47,596],t:7,e:"br"}],n:50,r:"data.can_trigger",p:[17,9,524]}]}," ",{p:[22,7,648],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[23,9,685],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.activated"],s:'_0?"toggle-on":"toggle-off"'},p:[24,17,713]}],action:"toggle_active"},f:[{t:2,x:{r:["data.activated"],s:'_0?"Active":"Inactive"'},p:[26,11,809]}]}]}," ",{p:[30,7,905],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[31,9,944],t:7,e:"ui-button",a:{icon:"pencil",action:"set_activation_delay"}}," Activation Delay: ",{t:2,r:"data.activation_delay",p:[31,95,1030]}," ",{p:[31,121,1056],t:7,e:"br"}," ",{p:[32,9,1070],t:7,e:"ui-button",a:{icon:"pencil",action:"set_timer"}}," Timer: ",{t:2,r:"data.timer",p:[32,73,1134]}," ",{p:[32,88,1149],t:7,e:"br"}," ",{p:[33,9,1163],t:7,e:"ui-button",a:{icon:"pencil",action:"set_timer_type"}}," Timer Type: ",{t:2,r:"data.timer_type",p:[33,83,1237]}," ",{p:[33,103,1257],t:7,e:"br"}]}," ",{p:[36,7,1292],t:7,e:"ui-section",a:{label:"Codes"},f:[{p:[37,9,1328],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "activation"}'}}," Activation Code: ",{t:2,r:"data.activation_code",p:[37,121,1440]}," ",{p:[37,146,1465],t:7,e:"br"}," ",{p:[38,9,1479],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "deactivation"}'}}," Deactivation Code: ",{t:2,r:"data.deactivation_code",p:[38,125,1595]}," ",{p:[38,152,1622],t:7,e:"br"}," ",{p:[39,9,1636],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "kill"}'}}," Kill Code: ",{t:2,r:"data.kill_code",p:[39,109,1736]}," ",{p:[39,128,1755],t:7,e:"br"}," ",{t:4,f:[{p:[41,11,1805],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "trigger"}'}}," Trigger Code: ",{t:2,r:"data.trigger_code",p:[41,117,1911]}," ",{p:[41,139,1933],t:7,e:"br"}],n:50,r:"data.can_trigger",p:[40,9,1769]}]}," ",{t:4,f:[{p:[46,9,2026],t:7,e:"ui-section",a:{label:"Special"},f:[{t:4,f:[{p:[48,13,2109],t:7,e:"ui-button",a:{icon:"pencil",action:"set_extra_setting",params:['{"target_setting": "',{t:2,r:"name",p:[48,93,2189]},'"}']}}," ",{t:2,r:"name",p:[48,118,2214]},": ",{t:2,r:"value",p:[48,128,2224]}," ",{p:[48,138,2234],t:7,e:"br"}],n:52,r:"data.extra_settings",p:[47,11,2066]}]}],n:50,r:"data.has_extra_settings",p:[45,7,1985]}]}],x:{r:["data.has_program"],s:"!_0"}}],x:{r:["data.has_disk"],s:"!_0"}}]}]},e.exports=a.extend(r.exports)},{341:341}],414:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Control"},f:[{t:4,f:[{p:[3,3,60],t:7,e:"ui-notice",f:["The interface is locked."]}],n:50,r:"data.locked",p:[2,1,37]},{t:4,n:51,f:[{p:[5,3,121],t:7,e:"ui-button",a:{icon:"lock",action:"lock"},f:["Lock Interface"]}," ",{p:[6,3,188],t:7,e:"ui-button",a:{icon:"save",action:"save"},f:["Save Current Setting"]}," ",{p:[7,3,261],t:7,e:"ui-section",a:{label:"Signal Code"},f:[{p:[8,5,299],t:7,e:"span",f:[{t:2,r:"data.code",p:[8,11,305]}]}," ",{p:[9,4,330],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code"},f:["Set"]}]}," ",{t:4,f:[{p:[12,5,443],t:7,e:"ui-section",a:{label:"Relay Code"},f:[{p:[13,7,482],t:7,e:"span",f:[{t:2,r:"data.relay_code",p:[13,13,488]}]}," ",{p:[14,5,520],t:7,e:"ui-button",a:{icon:"pencil",action:"set_relay_code"},f:["Set"]}]}],n:50,x:{r:["data.mode"],s:'_0=="Relay"'},p:[11,3,409]}," ",{p:[17,3,618],t:7,e:"ui-section",a:{label:"Signal Mode"},f:[{p:[18,5,656],t:7,e:"span",f:[{t:2,r:"data.mode",p:[18,11,662]}]}," ",{p:[19,5,688],t:7,e:"br"}," ",{p:[20,4,697],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Off"}'},f:["Off"]}," ",{p:[21,5,775],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Local"}'},f:["Local"]}," ",{p:[22,5,857],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Targeted"}'},f:["Targeted"]}," ",{p:[23,5,945],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Area"}'},f:["Area"]}," ",{p:[24,5,1025],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Relay"}'},f:["Relay"]}]}],r:"data.locked"}]}," ",{p:[28,1,1144],t:7,e:"ui-display",a:{title:"Saved Settings"},f:[{t:4,f:[{p:[30,3,1215],t:7,e:"ui-button",a:{icon:"load",action:"load",params:['{"save_id": "',{t:2,r:"id",p:[30,61,1273]},'"}']},f:[{t:2,r:"name",p:[30,71,1283]}]}," ",{t:4,f:[{p:[32,4,1332],t:7,e:"ui-button",a:{icon:"remove",action:"remove_save",params:['{"save_id": "',{t:2,r:"id",p:[32,71,1399]},'"}']},f:["Remove"]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[31,3,1307]}," ",{p:[34,3,1442],t:7,e:"br"}],n:52,r:"data.saved_settings",p:[29,2,1182]}]}]},e.exports=a.extend(r.exports)},{341:341}],415:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Ghost roles"},f:[{p:[2,2,35],t:7,e:"ui-section",a:{label:"Ignored roles"},f:[{t:4,f:[{p:[4,4,99],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["enabled"],s:'_0?"check-square-o":"square-o"'},p:[4,21,116]}],style:[{t:2,x:{r:["enabled"],s:'_0?"danger":null'},p:[4,73,168]}],action:"toggle_ignore",params:['{"key": "',{t:2,r:"key",p:[4,144,239]},'"}']},f:[{t:2,r:"desc",p:[4,155,250]}]}],n:52,r:"data.ignore",p:[3,3,73]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],416:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Relay"},f:[{t:4,f:[{p:[3,3,57],t:7,e:"h2",f:["NETWORK BUFFERS OVERLOADED"]}," ",{p:[4,3,96],t:7,e:"h3",f:["Overload Recovery Mode"]}," ",{p:[5,3,131],t:7,e:"i",f:["This system is suffering temporary outage due to overflow of traffic buffers. Until buffered traffic is processed, all further requests will be dropped. Frequent occurences of this error may indicate insufficient hardware capacity of your network. Please contact your network planning department for instructions on how to resolve this issue."]}," ",{p:[6,3,484],t:7,e:"h3",f:["ADMINISTRATIVE OVERRIDE"]}," ",{p:[7,3,520],t:7,e:"b",f:["CAUTION - Data loss may occur"]}," ",{p:[8,3,562],t:7,e:"ui-button",a:{icon:"signal",action:"restart"},f:["Purge buffered traffic"]}],n:50,r:"data.dos_crashed",p:[2,2,29]},{t:4,n:51,f:[{p:[12,3,663],t:7,e:"ui-section",a:{label:"Relay status"},f:[{p:[13,4,701],t:7,e:"ui-button",a:{icon:"power-off",action:"toggle"},f:[{t:2,x:{r:["data.enabled"],s:'_0?"ENABLED":"DISABLED"'},p:[14,6,752]}]}]}," ",{p:[18,3,836],t:7,e:"ui-section",a:{label:"Network buffer status"},f:[{t:2,r:"data.dos_overload",p:[19,4,883]}," / ",{t:2,r:"data.dos_capacity",p:[19,28,907]}," GQ"]}],r:"data.dos_crashed"}]}]},e.exports=a.extend(r.exports)},{ +341:341}],417:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[15,1,320],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[18,3,363],t:7,e:"ui-notice",f:[{p:[19,5,380],t:7,e:"span",f:["Reconstruction in progress!"]}]}],n:50,r:"data.restoring",p:[17,1,337]},{p:[24,1,451],t:7,e:"ui-display",f:[{p:[26,1,467],t:7,e:"div",a:{"class":"item"},f:[{p:[27,3,489],t:7,e:"div",a:{"class":"itemLabel"},f:["Inserted AI:"]}," ",{p:[30,3,541],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[31,2,569],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",state:[{t:2,x:{r:["data.nocard"],s:'_0?"disabled":null'},p:[31,52,619]}]},f:[{t:2,x:{r:["data.name"],s:'_0?_0:"---"'},p:[31,89,656]}]}]}]}," ",{t:4,f:[{p:[36,2,744],t:7,e:"b",f:["ERROR: ",{t:2,r:"data.error",p:[36,12,754]}]}],n:50,r:"data.error",p:[35,1,723]},{t:4,n:51,f:[{p:[38,2,785],t:7,e:"h2",f:["System Status"]}," ",{p:[39,2,810],t:7,e:"div",a:{"class":"item"},f:[{p:[40,3,832],t:7,e:"div",a:{"class":"itemLabel"},f:["Current AI:"]}," ",{p:[43,3,885],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.name",p:[44,4,915]}]}," ",{p:[46,3,942],t:7,e:"div",a:{"class":"itemLabel"},f:["Status:"]}," ",{p:[49,3,991],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["Nonfunctional"],n:50,r:"data.isDead",p:[50,4,1021]},{t:4,n:51,f:["Functional"],r:"data.isDead"}]}," ",{p:[56,3,1114],t:7,e:"div",a:{"class":"itemLabel"},f:["System Integrity:"]}," ",{p:[59,3,1173],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[60,4,1203],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[60,37,1236]}],state:[{t:2,r:"healthState",p:[61,11,1264]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[61,28,1281]},"%"]}]}," ",{p:[63,3,1336],t:7,e:"div",a:{"class":"itemLabel"},f:["Active Laws:"]}," ",{p:[66,3,1390],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[67,4,1420],t:7,e:"table",f:[{t:4,f:[{p:[69,6,1462],t:7,e:"tr",f:[{p:[69,10,1466],t:7,e:"td",f:[{p:[69,14,1470],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[69,38,1494]}]}]}]}],n:52,r:"data.ai_laws",p:[68,5,1433]}]}]}," ",{p:[73,2,1547],t:7,e:"ui-section",a:{label:"Operations"},f:[{p:[74,3,1582],t:7,e:"ui-button",a:{icon:"plus",style:[{t:2,x:{r:["data.restoring"],s:'_0?"disabled":null'},p:[74,33,1612]}],action:"PRG_beginReconstruction"},f:["Begin Reconstruction"]}]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],418:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[5,1,91],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"home",params:'{"target" : "mod"}',state:[{t:2,x:{r:["data.mmode"],s:'_0==1?"disabled":null'},p:[5,80,170]}]},f:["Access Modification"]}],n:50,r:"data.have_id_slot",p:[4,1,64]},{p:[7,1,253],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"folder-open",params:'{"target" : "manage"}',state:[{t:2,x:{r:["data.mmode"],s:'_0==2?"disabled":null'},p:[7,90,342]}]},f:["Job Management"]}," ",{p:[8,1,411],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"folder-open",params:'{"target" : "manifest"}',state:[{t:2,x:{r:["data.mmode"],s:'!_0?"disabled":null'},p:[8,92,502]}]},f:["Crew Manifest"]}," ",{t:4,f:[{p:[10,1,593],t:7,e:"ui-button",a:{action:"PRG_print",icon:"print",state:[{t:2,x:{r:["data.has_id","data.mmode"],s:'!_1||_0&&_1==1?null:"disabled"'},p:[10,51,643]}]},f:["Print"]}],n:50,r:"data.have_printer",p:[9,1,566]},{t:4,f:[{p:[14,1,766],t:7,e:"div",a:{"class":"item"},f:[{p:[15,3,788],t:7,e:"h2",f:["Crew Manifest"]}," ",{p:[16,3,814],t:7,e:"br"},"Please use security record computer to modify entries.",{p:[16,61,872],t:7,e:"br"},{p:[16,65,876],t:7,e:"br"}]}," ",{t:4,f:[{p:[19,2,916],t:7,e:"div",a:{"class":"item"},f:[{t:2,r:"name",p:[20,2,937]}," - ",{t:2,r:"rank",p:[20,13,948]}]}],n:52,r:"data.manifest",p:[18,1,890]}],n:50,x:{r:["data.mmode"],s:"!_0"},p:[13,1,745]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.mmode"],s:"_0==2"},f:[{p:[25,1,1008],t:7,e:"div",a:{"class":"item"},f:[{p:[26,3,1030],t:7,e:"h2",f:["Job Management"]}]}," ",{p:[28,1,1063],t:7,e:"table",f:[{p:[29,1,1072],t:7,e:"tr",f:[{p:[29,5,1076],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,27,1098],t:7,e:"b",f:["Job"]}]},{p:[29,42,1113],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,64,1135],t:7,e:"b",f:["Slots"]}]},{p:[29,81,1152],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,103,1174],t:7,e:"b",f:["Open job"]}]},{p:[29,123,1194],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,145,1216],t:7,e:"b",f:["Close job"]}]}]}," ",{t:4,f:[{p:[32,2,1269],t:7,e:"tr",f:[{p:[32,6,1273],t:7,e:"td",f:[{t:2,r:"title",p:[32,10,1277]}]},{p:[32,24,1291],t:7,e:"td",f:[{t:2,r:"current",p:[32,28,1295]},"/",{t:2,r:"total",p:[32,40,1307]}]},{p:[32,54,1321],t:7,e:"td",f:[{p:[32,58,1325],t:7,e:"ui-button",a:{action:"PRG_open_job",params:['{"target" : "',{t:2,r:"title",p:[32,112,1379]},'"}'],state:[{t:2,x:{r:["status_open"],s:'_0?null:"disabled"'},p:[32,132,1399]}]},f:[{t:2,r:"desc_open",p:[32,169,1436]}]},{p:[32,194,1461],t:7,e:"br"}]},{p:[32,203,1470],t:7,e:"td",f:[{p:[32,207,1474],t:7,e:"ui-button",a:{action:"PRG_close_job",params:['{"target" : "',{t:2,r:"title",p:[32,262,1529]},'"}'],state:[{t:2,x:{r:["status_close"],s:'_0?null:"disabled"'},p:[32,282,1549]}]},f:[{t:2,r:"desc_close",p:[32,320,1587]}]}]}]}],n:52,r:"data.slots",p:[30,1,1244]}]}]},{t:4,n:50,x:{r:["data.mmode"],s:"!(_0==2)"},f:[" ",{p:[40,1,1665],t:7,e:"div",a:{"class":"item"},f:[{p:[41,3,1687],t:7,e:"h2",f:["Access Modification"]}]}," ",{t:4,f:[{p:[45,3,1751],t:7,e:"span",a:{"class":"alert"},f:[{p:[45,23,1771],t:7,e:"i",f:["Please insert the ID into the terminal to proceed."]}]},{p:[45,87,1835],t:7,e:"br"}],n:50,x:{r:["data.has_id"],s:"!_0"},p:[44,1,1727]},{p:[48,1,1852],t:7,e:"div",a:{"class":"item"},f:[{p:[49,3,1874],t:7,e:"div",a:{"class":"itemLabel"},f:["Target Identity:"]}," ",{p:[52,3,1930],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[53,2,1958],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",params:'{"target" : "id"}'},f:[{t:2,r:"data.id_name",p:[53,72,2028]}]}]}]}," ",{p:[56,1,2076],t:7,e:"div",a:{"class":"item"},f:[{p:[57,3,2098],t:7,e:"div",a:{"class":"itemLabel"},f:["Auth Identity:"]}," ",{p:[60,3,2152],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[61,2,2180],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",params:'{"target" : "auth"}'},f:[{t:2,r:"data.auth_name",p:[61,74,2252]}]}]}]}," ",{p:[64,1,2302],t:7,e:"hr"}," ",{t:4,f:[{t:4,f:[{p:[68,2,2362],t:7,e:"div",a:{"class":"item"},f:[{p:[69,4,2385],t:7,e:"h2",f:["Details"]}]}," ",{t:4,f:[{p:[73,2,2436],t:7,e:"div",a:{"class":"item"},f:[{p:[74,4,2459],t:7,e:"div",a:{"class":"itemLabel"},f:["Registered Name:"]}," ",{p:[77,4,2518],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.id_owner",p:[78,3,2547]}]}]}," ",{p:[81,2,2587],t:7,e:"div",a:{"class":"item"},f:[{p:[82,4,2610],t:7,e:"div",a:{"class":"itemLabel"},f:["Rank:"]}," ",{p:[85,4,2658],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.id_rank",p:[86,3,2687]}]}]}," ",{p:[89,2,2726],t:7,e:"div",a:{"class":"item"},f:[{p:[90,4,2749],t:7,e:"div",a:{"class":"itemLabel"},f:["Demote:"]}," ",{p:[93,4,2799],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[94,3,2828],t:7,e:"ui-button",a:{action:"PRG_terminate",icon:"gear",state:[{t:2,x:{r:["data.id_rank"],s:'_0=="Unassigned"?"disabled":null'},p:[94,56,2881]}]},f:["Demote ",{t:2,r:"data.id_owner",p:[94,117,2942]}]}]}]}],n:50,r:"data.minor",p:[72,2,2415]},{t:4,n:51,f:[{p:[99,2,3007],t:7,e:"div",a:{"class":"item"},f:[{p:[100,4,3030],t:7,e:"div",a:{"class":"itemLabel"},f:["Registered Name:"]}," ",{p:[103,4,3089],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[104,3,3118],t:7,e:"ui-button",a:{action:"PRG_edit",icon:"pencil",params:'{"name" : "1"}'},f:[{t:2,r:"data.id_owner",p:[104,70,3185]}]}]}]}," ",{p:[108,2,3239],t:7,e:"div",a:{"class":"item"},f:[{p:[109,4,3262],t:7,e:"h2",f:["Assignment"]}]}," ",{p:[111,3,3294],t:7,e:"ui-button",a:{action:"PRG_togglea",icon:"gear"},f:[{t:2,x:{r:["data.assignments"],s:'_0?"Hide assignments":"Show assignments"'},p:[111,47,3338]}]}," ",{p:[112,2,3415],t:7,e:"div",a:{"class":"item"},f:[{p:[113,4,3438],t:7,e:"span",a:{id:"allvalue.jobsslot"},f:[]}]}," ",{p:[117,2,3495],t:7,e:"div",a:{"class":"item"},f:[{t:4,f:[{p:[119,4,3547],t:7,e:"div",a:{id:"all-value.jobs"},f:[{p:[120,3,3576],t:7,e:"table",f:[{p:[121,5,3589],t:7,e:"tr",f:[{p:[122,4,3598],t:7,e:"th",f:["Command"]}," ",{p:[123,4,3619],t:7,e:"td",f:[{p:[124,6,3630],t:7,e:"ui-button",a:{action:"PRG_assign",params:'{"assign_target" : "Captain"}',state:[{t:2,x:{r:["data.id_rank"],s:'_0=="Captain"?"selected":null'},p:[124,83,3707]}]},f:["Captain"]}]}]}," ",{p:[127,5,3804],t:7,e:"tr",f:[{p:[128,4,3813],t:7,e:"th",f:["Special"]}," ",{p:[129,4,3834],t:7,e:"td",f:[{p:[130,6,3845],t:7,e:"ui-button",a:{action:"PRG_assign",params:'{"assign_target" : "Custom"}'},f:["Custom"]}]}]}," ",{p:[133,5,3959],t:7,e:"tr",f:[{p:[134,4,3968],t:7,e:"th",a:{style:"color: '#FFA500';"},f:["Engineering"]}," ",{p:[135,4,4019],t:7,e:"td",f:[{t:4,f:[{p:[137,5,4067],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[137,64,4126]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[137,82,4144]}]},f:[{t:2,r:"display_name",p:[137,127,4189]}]}],n:52,r:"data.engineering_jobs",p:[136,6,4030]}]}]}," ",{p:[141,5,4260],t:7,e:"tr",f:[{p:[142,4,4269],t:7,e:"th",a:{style:"color: '#008000';"},f:["Medical"]}," ",{p:[143,4,4316],t:7,e:"td",f:[{t:4,f:[{p:[145,5,4360],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[145,64,4419]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[145,82,4437]}]},f:[{t:2,r:"display_name",p:[145,127,4482]}]}],n:52,r:"data.medical_jobs",p:[144,6,4327]}]}]}," ",{p:[149,5,4553],t:7,e:"tr",f:[{p:[150,4,4562],t:7,e:"th",a:{style:"color: '#800080';"},f:["Science"]}," ",{p:[151,4,4609],t:7,e:"td",f:[{t:4,f:[{p:[153,5,4653],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[153,64,4712]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[153,82,4730]}]},f:[{t:2,r:"display_name",p:[153,127,4775]}]}],n:52,r:"data.science_jobs",p:[152,6,4620]}]}]}," ",{p:[157,5,4846],t:7,e:"tr",f:[{p:[158,4,4855],t:7,e:"th",a:{style:"color: '#DD0000';"},f:["Security"]}," ",{p:[159,4,4903],t:7,e:"td",f:[{t:4,f:[{p:[161,5,4948],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[161,64,5007]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[161,82,5025]}]},f:[{t:2,r:"display_name",p:[161,127,5070]}]}],n:52,r:"data.security_jobs",p:[160,6,4914]}]}]}," ",{p:[165,5,5141],t:7,e:"tr",f:[{p:[166,4,5150],t:7,e:"th",a:{style:"color: '#cc6600';"},f:["Cargo"]}," ",{p:[167,4,5195],t:7,e:"td",f:[{t:4,f:[{p:[169,5,5237],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[169,64,5296]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[169,82,5314]}]},f:[{t:2,r:"display_name",p:[169,127,5359]}]}],n:52,r:"data.cargo_jobs",p:[168,6,5206]}]}]}," ",{p:[173,5,5430],t:7,e:"tr",f:[{p:[174,4,5439],t:7,e:"th",a:{style:"color: '#808080';"},f:["Civilian"]}," ",{p:[175,4,5487],t:7,e:"td",f:[{t:4,f:[{p:[177,5,5532],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[177,64,5591]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[177,82,5609]}]},f:[{t:2,r:"display_name",p:[177,127,5654]}]}],n:52,r:"data.civilian_jobs",p:[176,6,5498]}]}]}," ",{t:4,f:[{p:[182,4,5757],t:7,e:"tr",f:[{p:[183,6,5768],t:7,e:"th",a:{style:"color: '#A52A2A';"},f:["CentCom"]}," ",{p:[184,6,5817],t:7,e:"td",f:[{t:4,f:[{p:[186,7,5862],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[186,66,5921]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[186,84,5939]}]},f:[{t:2,r:"display_name",p:[186,129,5984]}]}],n:52,r:"data.centcom_jobs",p:[185,5,5827]}]}]}],n:50,r:"data.centcom_access",p:[181,5,5725]}]}]}],n:50,r:"data.assignments",p:[118,4,3518]}]}],r:"data.minor"}," ",{t:4,f:[{p:[198,4,6153],t:7,e:"div",a:{"class":"item"},f:[{p:[199,3,6175],t:7,e:"h2",f:["Central Command"]}]}," ",{p:[201,4,6215],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[203,5,6296],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[204,5,6331],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[204,64,6390]},'", "allowed" : "',{t:2,r:"allowed",p:[204,87,6413]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[204,109,6435]}]},f:[{t:2,r:"desc",p:[204,140,6466]}]}]}],n:52,r:"data.all_centcom_access",p:[202,3,6257]}]}],n:50,r:"data.centcom_access",p:[197,2,6121]},{t:4,n:51,f:[{p:[209,4,6538],t:7,e:"div",a:{"class":"item"},f:[{p:[210,3,6560],t:7,e:"h2",f:[{t:2,r:"data.station_name",p:[210,7,6564]}]}]}," ",{p:[212,4,6606],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[214,5,6676],t:7,e:"div",a:{style:"float: left; width: 175px; min-height: 250px"},f:[{p:[215,4,6739],t:7,e:"div",a:{"class":"average"},f:[{p:[215,25,6760],t:7,e:"ui-button",a:{action:"PRG_regsel",state:[{t:2,x:{r:["selected"],s:'_0?"toggle":null'},p:[215,63,6798]}],params:['{"region" : "',{t:2,r:"regid",p:[215,116,6851]},'"}']},f:[{p:[215,129,6864],t:7,e:"b",f:[{t:2,r:"name",p:[215,132,6867]}]}]}]}," ",{p:[216,4,6902],t:7,e:"br"}," ",{t:4,f:[{p:[218,6,6938],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[219,5,6973],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[219,64,7032]},'", "allowed" : "',{t:2,r:"allowed",p:[219,87,7055]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[219,109,7077]}]},f:[{t:2,r:"desc",p:[219,140,7108]}]}]}],n:52,r:"accesses",p:[217,6,6913]}]}],n:52,r:"data.regions",p:[213,3,6648]}]}],r:"data.centcom_access"}],n:50,r:"data.has_id",p:[67,3,2340]}],n:50,r:"data.authenticated",p:[66,1,2310]}]}],x:{r:["data.mmode"],s:"!_0"}}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],419:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{chargeState:function(t){var e=this.get("data.battery.max");return t>e/2?"good":t>e/4?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[15,1,311],t:7,e:"ntosheader"}," ",{p:[17,1,328],t:7,e:"ui-display",f:[{p:[18,2,343],t:7,e:"i",f:["Welcome to computer configuration utility. Please consult your system administrator if you have any questions about your device."]},{p:[18,137,478],t:7,e:"hr"}," ",{p:[19,2,485],t:7,e:"ui-display",a:{title:"Power Supply"},f:[{p:[20,3,522],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"data.power_usage",p:[21,4,559]},"W"]}," ",{t:4,f:[{p:[25,4,630],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Active"]}," ",{p:[28,4,701],t:7,e:"ui-section",a:{label:"Battery Rating"},f:[{t:2,r:"data.battery.max",p:[29,5,742]}]}," ",{p:[31,4,785],t:7,e:"ui-section",a:{label:"Battery Charge"},f:[{p:[32,5,826],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.battery.max",p:[32,26,847]}],value:[{t:2,r:"adata.battery.charge",p:[32,56,877]}],state:[{t:2,x:{r:["chargeState","adata.battery.charge"],s:"_0(_1)"},p:[32,89,910]}]},f:[{t:2,x:{r:["adata.battery.charge"],s:"Math.round(_0)"},p:[32,128,949]},"/",{t:2,r:"adata.battery.max",p:[32,165,986]}]}]}],n:50,r:"data.battery",p:[24,3,605]},{t:4,n:51,f:[{p:[35,4,1051],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Not Available"]}],r:"data.battery"}]}," ",{p:[41,2,1156],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,3,1192],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,4,1231],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,25,1252]}],value:[{t:2,r:"adata.disk_used",p:[43,53,1280]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,87,1314]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,123,1350]},"GQ"]}]}]}," ",{p:[47,2,1419],t:7,e:"ui-display",a:{title:"Computer Components"},f:[{t:4,f:[{p:[49,4,1491],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"name",p:[49,26,1513]}]},f:[{p:[50,5,1529],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"desc",p:[50,59,1583]}]}," ",{p:[52,5,1605],t:7,e:"ui-section",a:{label:"State"},f:[{p:[53,6,1638],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["critical"],s:'_0?"disabled":null'},p:[53,24,1656]}],action:"PC_toggle_component",params:['{"name": "',{t:2,r:"name",p:[53,105,1737]},'"}']},f:[{t:2,x:{r:["enabled"],s:'_0?"Enabled":"Disabled"'},p:[54,7,1757]}]}]}," ",{t:4,f:[{p:[59,6,1868],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"powerusage",p:[60,7,1908]},"W"]}],n:50,r:"powerusage",p:[58,5,1843]}]}," ",{p:[64,4,1985],t:7,e:"br"}],n:52,r:"data.hardware",p:[48,3,1463]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],420:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,3,103],t:7,e:"h2",f:["An error has occurred and this program can not continue."]}," Additional information: ",{t:2,r:"data.error",p:[8,27,196]},{p:[8,41,210],t:7,e:"br"}," ",{p:[9,3,218],t:7,e:"i",f:["Please try again. If the problem persists contact your system administrator for assistance."]}," ",{p:[10,3,320],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["Restart program"]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,f:[{p:[13,4,422],t:7,e:"h2",f:["Viewing file ",{t:2,r:"data.filename",p:[13,21,439]}]}," ",{p:[14,4,466],t:7,e:"div",a:{"class":"item"},f:[{p:[15,4,489],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["CLOSE"]}," ",{p:[16,4,545],t:7,e:"ui-button",a:{action:"PRG_edit"},f:["EDIT"]}," ",{p:[17,4,595],t:7,e:"ui-button",a:{action:"PRG_printfile"},f:["PRINT"]}," "]},{p:[18,10,657],t:7,e:"hr"}," ",{t:3,r:"data.filedata",p:[19,4,666]}],n:50,r:"data.filename",p:[12,3,396]},{t:4,n:51,f:[{p:[21,4,702],t:7,e:"h2",f:["Available files (local):"]}," ",{p:[22,4,740],t:7,e:"table",f:[{p:[23,5,753],t:7,e:"tr",f:[{p:[24,6,764],t:7,e:"th",f:["File name"]}," ",{p:[25,6,789],t:7,e:"th",f:["File type"]}," ",{p:[26,6,814],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[27,6,844],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[30,6,907],t:7,e:"tr",f:[{p:[31,7,919],t:7,e:"td",f:[{t:2,r:"name",p:[31,11,923]}]}," ",{p:[32,7,944],t:7,e:"td",f:[".",{t:2,r:"type",p:[32,12,949]}]}," ",{p:[33,7,970],t:7,e:"td",f:[{t:2,r:"size",p:[33,11,974]},"GQ"]}," ",{p:[34,7,997],t:7,e:"td",f:[{p:[35,8,1010],t:7,e:"ui-button",a:{action:"PRG_openfile",params:['{"name": "',{t:2,r:"name",p:[35,59,1061]},'"}']},f:["VIEW"]}," ",{p:[36,8,1098],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[36,26,1116]}],action:"PRG_deletefile",params:['{"name": "',{t:2,r:"name",p:[36,105,1195]},'"}']},f:["DELETE"]}," ",{p:[37,8,1234],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[37,26,1252]}],action:"PRG_rename",params:['{"name": "',{t:2,r:"name",p:[37,101,1327]},'"}']},f:["RENAME"]}," ",{p:[38,8,1366],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[38,26,1384]}],action:"PRG_clone",params:['{"name": "',{t:2,r:"name",p:[38,100,1458]},'"}']},f:["CLONE"]}," ",{t:4,f:[{p:[40,9,1531],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[40,27,1549]}],action:"PRG_copytousb",params:['{"name": "',{t:2,r:"name",p:[40,105,1627]},'"}']},f:["EXPORT"]}],n:50,r:"data.usbconnected",p:[39,8,1496]}]}]}],n:52,r:"data.files",p:[29,5,880]}]}," ",{t:4,f:[{p:[47,4,1761],t:7,e:"h2",f:["Available files (portable device):"]}," ",{p:[48,4,1809],t:7,e:"table",f:[{p:[49,5,1822],t:7,e:"tr",f:[{p:[50,6,1833],t:7,e:"th",f:["File name"]}," ",{p:[51,6,1858],t:7,e:"th",f:["File type"]}," ",{p:[52,6,1883],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[53,6,1913],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[56,6,1979],t:7,e:"tr",f:[{p:[57,7,1991],t:7,e:"td",f:[{t:2,r:"name",p:[57,11,1995]}]}," ",{p:[58,7,2016],t:7,e:"td",f:[".",{t:2,r:"type",p:[58,12,2021]}]}," ",{p:[59,7,2042],t:7,e:"td",f:[{t:2,r:"size",p:[59,11,2046]},"GQ"]}," ",{p:[60,7,2069],t:7,e:"td",f:[{p:[61,8,2082],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[61,26,2100]}],action:"PRG_usbdeletefile",params:['{"name": "',{t:2,r:"name",p:[61,108,2182]},'"}']},f:["DELETE"]}," ",{t:4,f:[{p:[63,9,2256],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[63,27,2274]}],action:"PRG_copyfromusb",params:['{"name": "',{t:2,r:"name",p:[63,107,2354]},'"}']},f:["IMPORT"]}],n:50,r:"data.usbconnected",p:[62,8,2221]}]}]}],n:52,r:"data.usbfiles",p:[55,5,1949]}]}],n:50,r:"data.usbconnected",p:[46,4,1731]}," ",{p:[70,4,2470],t:7,e:"ui-button",a:{action:"PRG_newtextfile"},f:["NEW DATA FILE"]}],r:"data.filename"}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],421:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["No program loaded. Please select program from list below."]}," ",{p:[6,2,146],t:7,e:"table",f:[{t:4,f:[{p:[8,4,185],t:7,e:"tr",f:[{p:[8,8,189],t:7,e:"td",f:[{p:[8,12,193],t:7,e:"ui-button",a:{action:"PC_runprogram",params:['{"name": "',{t:2,r:"name",p:[8,64,245]},'"}']},f:[{t:2,r:"desc",p:[9,5,263]}]}]},{p:[11,4,293],t:7,e:"td",f:[{p:[11,8,297],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["running"],s:'_0?null:"disabled"'},p:[11,26,315]}],icon:"close",action:"PC_killprogram",params:['{"name": "',{t:2,r:"name",p:[11,114,403]},'"}']}}]}]}],n:52,r:"data.programs",p:[7,3,157]}]}," ",{p:[14,2,454],t:7,e:"br"},{p:[14,6,458],t:7,e:"br"}," ",{t:4,f:[{p:[16,3,491],t:7,e:"ui-button",a:{action:"PC_toggle_light",style:[{t:2,x:{r:["data.light_on"],s:'_0?"selected":null'},p:[16,46,534]}]},f:["Toggle Flashlight"]},{p:[16,114,602],t:7,e:"br"}," ",{p:[17,3,610],t:7,e:"ui-button",a:{action:"PC_light_color"},f:["Change Flashlight Color ",{p:[17,62,669],t:7,e:"span",a:{style:["border:1px solid #161616; background-color: ",{t:2,r:"data.comp_light_color",p:[17,119,726]},";"]},f:["   "]}]}],n:50,r:"data.has_light",p:[15,2,465]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],422:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[6,3,105],t:7,e:"h1",f:["ADMINISTRATIVE MODE"]}],n:50,r:"data.adminmode",p:[5,2,79]}," ",{t:4,f:[{p:[10,3,170],t:7,e:"div",a:{"class":"itemLabel"},f:["Current channel:"]}," ",{p:[13,3,229],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.title",p:[14,4,259]}]}," ",{p:[16,3,287],t:7,e:"div",a:{"class":"itemLabel"},f:["Operator access:"]}," ",{p:[19,3,346],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:[{p:[21,5,406],t:7,e:"b",f:["Enabled"]}],n:50,r:"data.is_operator",p:[20,4,376]},{t:4,n:51,f:[{p:[23,5,439],t:7,e:"b",f:["Disabled"]}],r:"data.is_operator"}]}," ",{p:[26,3,480],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[29,3,532],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[30,4,562],t:7,e:"table",f:[{p:[31,5,575],t:7,e:"tr",f:[{p:[31,9,579],t:7,e:"td",f:[{p:[31,13,583],t:7,e:"ui-button",a:{action:"PRG_speak"},f:["Send message"]}]}]},{p:[32,5,643],t:7,e:"tr",f:[{p:[32,9,647],t:7,e:"td",f:[{p:[32,13,651],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[33,5,719],t:7,e:"tr",f:[{p:[33,9,723],t:7,e:"td",f:[{p:[33,13,727],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]},{p:[34,5,807],t:7,e:"tr",f:[{p:[34,9,811],t:7,e:"td",f:[{p:[34,13,815],t:7,e:"ui-button",a:{action:"PRG_leavechannel"},f:["Leave channel"]}]}]},{p:[35,5,883],t:7,e:"tr",f:[{p:[35,9,887],t:7,e:"td",f:[{p:[35,13,891],t:7,e:"ui-button",a:{action:"PRG_savelog"},f:["Save log to local drive"]}," ",{t:4,f:[{p:[37,6,995],t:7,e:"tr",f:[{p:[37,10,999],t:7,e:"td",f:[{p:[37,14,1003],t:7,e:"ui-button",a:{action:"PRG_renamechannel"},f:["Rename channel"]}]}]},{p:[38,6,1074],t:7,e:"tr",f:[{p:[38,10,1078],t:7,e:"td",f:[{p:[38,14,1082],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}]}]},{p:[39,6,1149],t:7,e:"tr",f:[{p:[39,10,1153],t:7,e:"td",f:[{p:[39,14,1157],t:7,e:"ui-button",a:{action:"PRG_deletechannel"},f:["Delete channel"]}]}]}],n:50,r:"data.is_operator",p:[36,5,964]}]}]}]}]}," ",{p:[43,3,1263],t:7,e:"b",f:["Chat Window"]}," ",{p:[44,4,1286],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[45,4,1342],t:7,e:"div",a:{"class":"item"},f:[{p:[46,5,1366],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"msg",p:[48,7,1450]},{p:[48,14,1457],t:7,e:"br"}],n:52,r:"data.messages",p:[47,6,1419]}]}]}]}," ",{p:[53,3,1516],t:7,e:"b",f:["Connected Users"]},{p:[53,25,1538],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"name",p:[55,4,1573]},{p:[55,12,1581],t:7,e:"br"}],n:52,r:"data.clients",p:[54,3,1546]}],n:50,r:"data.title",p:[9,2,148]},{t:4,n:51,f:[{p:[58,3,1613],t:7,e:"b",f:["Controls:"]}," ",{p:[59,3,1633],t:7,e:"table",f:[{p:[60,4,1645],t:7,e:"tr",f:[{p:[60,8,1649],t:7,e:"td",f:[{p:[60,12,1653],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[61,4,1720],t:7,e:"tr",f:[{p:[61,8,1724],t:7,e:"td",f:[{p:[61,12,1728],t:7,e:"ui-button",a:{action:"PRG_newchannel"},f:["New Channel"]}]}]},{p:[62,4,1791],t:7,e:"tr",f:[{p:[62,8,1795],t:7,e:"td",f:[{p:[62,12,1799],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]}]}," ",{p:[64,3,1889],t:7,e:"b",f:["Available channels:"]}," ",{p:[65,3,1919],t:7,e:"table",f:[{t:4,f:[{p:[67,4,1964],t:7,e:"tr",f:[{p:[67,8,1968],t:7,e:"td",f:[{p:[67,12,1972],t:7,e:"ui-button",a:{action:"PRG_joinchannel",params:['{"id": "',{t:2,r:"id",p:[67,64,2024]},'"}']},f:[{t:2,r:"chan",p:[67,74,2034]}]},{p:[67,94,2054],t:7,e:"br"}]}]}],n:52,r:"data.all_channels",p:[66,3,1930]}]}],r:"data.title"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],423:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:["##SYSTEM ERROR: ",{t:2,r:"data.error",p:[6,19,117]},{p:[6,33,131],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["RESET"]}],n:50,r:"data.error",p:[5,2,79]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.target"],s:"_0"},f:["##DoS traffic generator active. Tx: ",{t:2,r:"data.speed",p:[8,39,243]},"GQ/s",{p:[8,57,261],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"nums",p:[10,4,300]},{p:[10,12,308],t:7,e:"br"}],n:52,r:"data.dos_strings",p:[9,3,269]}," ",{p:[12,3,329],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["ABORT"]}]},{t:4,n:50,x:{r:["data.target"],s:"!(_0)"},f:[" ##DoS traffic generator ready. Select target device.",{p:[14,55,443],t:7,e:"br"}," ",{t:4,f:["Targeted device ID: ",{t:2,r:"data.focus",p:[16,24,494]}],n:50,r:"data.focus",p:[15,3,451]},{t:4,n:51,f:["Targeted device ID: None"],r:"data.focus"}," ",{p:[20,3,564],t:7,e:"ui-button",a:{action:"PRG_execute"},f:["EXECUTE"]},{p:[20,54,615],t:7,e:"div",a:{style:"clear:both"}}," Detected devices on network:",{p:[21,31,677],t:7,e:"br"}," ",{t:4,f:[{p:[23,4,711],t:7,e:"ui-button",a:{action:"PRG_target_relay",params:['{"targid": "',{t:2,r:"id",p:[23,61,768]},'"}']},f:[{t:2,r:"id",p:[23,71,778]}]}],n:52,r:"data.relays",p:[22,3,685]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],424:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["Welcome to software download utility. Please select which software you wish to download."]},{p:[5,97,174],t:7,e:"hr"}," ",{t:4,f:[{p:[7,3,203],t:7,e:"ui-display",a:{title:"Download Error"},f:[{p:[8,4,243],t:7,e:"ui-section",a:{label:"Information"},f:[{t:2,r:"data.error",p:[9,5,281]}]}," ",{p:[11,4,318],t:7,e:"ui-section",a:{label:"Reset Program"},f:[{p:[12,5,358],t:7,e:"ui-button",a:{icon:"times",action:"PRG_reseterror"},f:["RESET"]}]}]}],n:50,r:"data.error",p:[6,2,181]},{t:4,n:51,f:[{t:4,f:[{p:[19,4,516],t:7,e:"ui-display",a:{title:"Download Running"},f:[{p:[20,5,559],t:7,e:"i",f:["Please wait..."]}," ",{p:[21,5,586],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"data.downloadname",p:[22,6,623]}]}," ",{p:[24,5,669],t:7,e:"ui-section",a:{label:"File description"},f:[{t:2,r:"data.downloaddesc",p:[25,6,713]}]}," ",{p:[27,5,759],t:7,e:"ui-section",a:{label:"File size"},f:[{t:2,r:"data.downloadsize",p:[28,6,796]},"GQ"]}," ",{p:[30,5,844],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{t:2,r:"data.downloadspeed",p:[31,6,885]}," GQ/s"]}," ",{p:[33,5,937],t:7,e:"ui-section",a:{label:"Download progress"},f:[{p:[34,6,982],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.downloadsize",p:[34,27,1003]}],value:[{t:2,r:"adata.downloadcompletion",p:[34,58,1034]}],state:"good"},f:[{t:2,x:{r:["adata.downloadcompletion"],s:"Math.round(_0)"},p:[34,101,1077]},"GQ / ",{t:2,r:"adata.downloadsize",p:[34,146,1122]},"GQ"]}]}]}],n:50,r:"data.downloadname",p:[18,3,486]}],r:"data.error"}," ",{t:4,f:[{t:4,f:[{p:[41,4,1270],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,5,1308],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,6,1349],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,27,1370]}],value:[{t:2,r:"adata.disk_used",p:[43,55,1398]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,89,1432]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,125,1468]},"GQ"]}]}]}," ",{p:[47,4,1545],t:7,e:"ui-display",a:{title:"Primary Software Repository"},f:[{t:4,f:[{p:[49,6,1642],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[49,28,1664]}]},f:[{p:[50,7,1686],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[50,61,1740]}]}," ",{p:[52,7,1774],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[53,8,1813]}," (",{t:2,r:"size",p:[53,22,1827]}," GQ)"]}," ",{p:[55,7,1868],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[56,8,1911]}]}," ",{p:[58,7,1957],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[58,80,2030]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[62,6,2113],t:7,e:"br"}],n:52,r:"data.downloadable_programs",p:[48,5,1599]}]}," ",{t:4,f:[{p:[67,5,2194],t:7,e:"ui-display",a:{title:"UNKNOWN Software Repository"},f:[{p:[68,6,2249],t:7,e:"i",f:["Please note that Nanotrasen does not recommend download of software from non-official servers."]}," ",{t:4,f:[{p:[70,7,2395],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[70,29,2417]}]},f:[{p:[71,8,2440],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[71,62,2494]}]}," ",{p:[73,8,2530],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[74,9,2570]}," (",{t:2,r:"size",p:[74,23,2584]}," GQ)"]}," ",{p:[76,8,2627],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[77,9,2671]}]}," ",{p:[79,8,2719],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename", +p:[79,81,2792]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[83,7,2879],t:7,e:"br"}],n:52,r:"data.hacked_programs",p:[69,6,2357]}]}],n:50,r:"data.hackedavailable",p:[66,4,2160]}],n:50,x:{r:["data.error"],s:"!_0"},p:[40,3,1246]}],n:50,x:{r:["data.downloadname"],s:"!_0"},p:[39,2,1216]}," ",{p:[89,2,2954],t:7,e:"br"},{p:[89,6,2958],t:7,e:"br"},{p:[89,10,2962],t:7,e:"hr"},{p:[89,14,2966],t:7,e:"i",f:["NTOS v2.0.4b Copyright Nanotrasen 2557 - 2559"]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],425:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[6,2,81],t:7,e:"ui-display",a:{title:"WIRELESS CONNECTIVITY"},f:[{p:[8,3,129],t:7,e:"ui-section",a:{label:"Active NTNetRelays"},f:[{p:[9,4,173],t:7,e:"b",f:[{t:2,r:"data.ntnetrelays",p:[9,7,176]}]}]}," ",{t:4,f:[{p:[12,4,250],t:7,e:"ui-section",a:{label:"System status"},f:[{p:[13,6,291],t:7,e:"b",f:[{t:2,x:{r:["data.ntnetstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[13,9,294]}]}]}," ",{p:[15,4,366],t:7,e:"ui-section",a:{label:"Control"},f:[{p:[17,4,401],t:7,e:"ui-button",a:{icon:"plus",action:"toggleWireless"},f:["TOGGLE"]}]}," ",{p:[21,4,500],t:7,e:"br"},{p:[21,8,504],t:7,e:"br"}," ",{p:[22,4,513],t:7,e:"i",f:["Caution - Disabling wireless transmitters when using wireless device may prevent you from re-enabling them again!"]}],n:50,r:"data.ntnetrelays",p:[11,3,221]},{t:4,n:51,f:[{p:[24,4,650],t:7,e:"br"},{p:[24,8,654],t:7,e:"p",f:["Wireless coverage unavailable, no relays are connected."]}],r:"data.ntnetrelays"}]}," ",{p:[29,2,750],t:7,e:"ui-display",a:{title:"FIREWALL CONFIGURATION"},f:[{p:[31,2,798],t:7,e:"table",f:[{p:[32,3,809],t:7,e:"tr",f:[{p:[33,4,818],t:7,e:"th",f:["PROTOCOL"]},{p:[34,4,835],t:7,e:"th",f:["STATUS"]},{p:[35,4,850],t:7,e:"th",f:["CONTROL"]}]},{p:[36,3,865],t:7,e:"tr",f:[" ",{p:[37,4,874],t:7,e:"td",f:["Software Downloads"]},{p:[38,4,901],t:7,e:"td",f:[{t:2,x:{r:["data.config_softwaredownload"],s:'_0?"ENABLED":"DISABLED"'},p:[38,8,905]}]},{p:[39,4,967],t:7,e:"td",f:[" ",{p:[39,9,972],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "1"}'},f:["TOGGLE"]}]}]},{p:[40,3,1051],t:7,e:"tr",f:[" ",{p:[41,4,1060],t:7,e:"td",f:["Peer to Peer Traffic"]},{p:[42,4,1089],t:7,e:"td",f:[{t:2,x:{r:["data.config_peertopeer"],s:'_0?"ENABLED":"DISABLED"'},p:[42,8,1093]}]},{p:[43,4,1149],t:7,e:"td",f:[{p:[43,8,1153],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "2"}'},f:["TOGGLE"]}]}]},{p:[44,3,1232],t:7,e:"tr",f:[" ",{p:[45,4,1241],t:7,e:"td",f:["Communication Systems"]},{p:[46,4,1271],t:7,e:"td",f:[{t:2,x:{r:["data.config_communication"],s:'_0?"ENABLED":"DISABLED"'},p:[46,8,1275]}]},{p:[47,4,1334],t:7,e:"td",f:[{p:[47,8,1338],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "3"}'},f:["TOGGLE"]}]}]},{p:[48,3,1417],t:7,e:"tr",f:[" ",{p:[49,4,1426],t:7,e:"td",f:["Remote System Control"]},{p:[50,4,1456],t:7,e:"td",f:[{t:2,x:{r:["data.config_systemcontrol"],s:'_0?"ENABLED":"DISABLED"'},p:[50,8,1460]}]},{p:[51,4,1519],t:7,e:"td",f:[{p:[51,8,1523],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "4"}'},f:["TOGGLE"]}]}]}]}]}," ",{p:[55,2,1630],t:7,e:"ui-display",a:{title:"SECURITY SYSTEMS"},f:[{t:4,f:[{p:[58,4,1699],t:7,e:"ui-notice",f:[{p:[59,5,1716],t:7,e:"h1",f:["NETWORK INCURSION DETECTED"]}]}," ",{p:[61,5,1774],t:7,e:"i",f:["An abnormal activity has been detected in the network. Please verify system logs for more information"]}],n:50,r:"data.idsalarm",p:[57,3,1673]}," ",{p:[64,3,1902],t:7,e:"ui-section",a:{label:"Intrusion Detection System"},f:[{p:[65,4,1954],t:7,e:"b",f:[{t:2,x:{r:["data.idsstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[65,7,1957]}]}]}," ",{p:[68,3,2029],t:7,e:"ui-section",a:{label:"Maximal Log Count"},f:[{p:[69,4,2072],t:7,e:"b",f:[{t:2,r:"data.ntnetmaxlogs",p:[69,7,2075]}]}]}," ",{p:[72,3,2125],t:7,e:"ui-section",a:{label:"Controls"},f:[]}," ",{p:[74,4,2176],t:7,e:"table",f:[{p:[75,4,2188],t:7,e:"tr",f:[{p:[75,8,2192],t:7,e:"td",f:[{p:[75,12,2196],t:7,e:"ui-button",a:{action:"resetIDS"},f:["RESET IDS"]}]}]},{p:[76,4,2251],t:7,e:"tr",f:[{p:[76,8,2255],t:7,e:"td",f:[{p:[76,12,2259],t:7,e:"ui-button",a:{action:"toggleIDS"},f:["TOGGLE IDS"]}]}]},{p:[77,4,2316],t:7,e:"tr",f:[{p:[77,8,2320],t:7,e:"td",f:[{p:[77,12,2324],t:7,e:"ui-button",a:{action:"updatemaxlogs"},f:["SET LOG LIMIT"]}]}]},{p:[78,4,2388],t:7,e:"tr",f:[{p:[78,8,2392],t:7,e:"td",f:[{p:[78,12,2396],t:7,e:"ui-button",a:{action:"purgelogs"},f:["PURGE LOGS"]}]}]}]}," ",{p:[81,3,2467],t:7,e:"ui-subdisplay",a:{title:"System Logs"},f:[{p:[82,3,2506],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[83,3,2561],t:7,e:"div",a:{"class":"item"},f:[{p:[84,4,2584],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"entry",p:[86,6,2667]},{p:[86,15,2676],t:7,e:"br"}],n:52,r:"data.ntnetlogs",p:[85,5,2636]}]}]}]}]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],426:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,2,102],t:7,e:"div",a:{"class":"item"},f:[{p:[8,3,124],t:7,e:"h2",f:["An error has occurred during operation..."]}," ",{p:[9,3,178],t:7,e:"b",f:["Additional information:"]},{t:2,r:"data.error",p:[9,34,209]},{p:[9,48,223],t:7,e:"br"}," ",{p:[10,3,231],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Clear"]}]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.downloading"],s:"_0"},f:[{p:[13,3,321],t:7,e:"h2",f:["Download in progress..."]}," ",{p:[14,3,357],t:7,e:"div",a:{"class":"itemLabel"},f:["Downloaded file:"]}," ",{p:[17,3,416],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_name",p:[18,4,446]}]}," ",{p:[20,3,483],t:7,e:"div",a:{"class":"itemLabel"},f:["Download progress:"]}," ",{p:[23,3,544],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_progress",p:[24,4,574]}," / ",{t:2,r:"data.download_size",p:[24,33,603]}," GQ"]}," ",{p:[26,3,642],t:7,e:"div",a:{"class":"itemLabel"},f:["Transfer speed:"]}," ",{p:[29,3,700],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_netspeed",p:[30,4,730]},"GQ/s"]}," ",{p:[32,3,774],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[35,3,826],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[36,4,856],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Abort download"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading"],s:"(!(_0))&&(_1)"},f:[" ",{p:[39,3,954],t:7,e:"h2",f:["Server enabled"]}," ",{p:[40,3,981],t:7,e:"div",a:{"class":"itemLabel"},f:["Connected clients:"]}," ",{p:[43,3,1042],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_clients",p:[44,4,1072]}]}," ",{p:[46,3,1109],t:7,e:"div",a:{"class":"itemLabel"},f:["Provided file:"]}," ",{p:[49,3,1166],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_filename",p:[50,4,1196]}]}," ",{p:[52,3,1234],t:7,e:"div",a:{"class":"itemLabel"},f:["Server password:"]}," ",{p:[55,3,1293],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ENABLED"],n:50,r:"data.upload_haspassword",p:[56,4,1323]},{t:4,n:51,f:["DISABLED"],r:"data.upload_haspassword"}]}," ",{p:[62,3,1420],t:7,e:"div",a:{"class":"itemLabel"},f:["Commands:"]}," ",{p:[65,3,1472],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[66,4,1502],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[67,4,1567],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Exit server"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(_2))"},f:[" ",{p:[70,3,1668],t:7,e:"h2",f:["File transfer server ready. Select file to upload:"]}," ",{p:[71,3,1732],t:7,e:"table",f:[{p:[72,3,1743],t:7,e:"tr",f:[{p:[72,7,1747],t:7,e:"th",f:["File name"]},{p:[72,20,1760],t:7,e:"th",f:["File size"]},{p:[72,33,1773],t:7,e:"th",f:["Controls ",{t:4,f:[{p:[74,4,1824],t:7,e:"tr",f:[{p:[74,8,1828],t:7,e:"td",f:[{t:2,r:"filename",p:[74,12,1832]}]},{p:[75,4,1849],t:7,e:"td",f:[{t:2,r:"size",p:[75,8,1853]},"GQ"]},{p:[76,4,1868],t:7,e:"td",f:[{p:[76,8,1872],t:7,e:"ui-button",a:{action:"PRG_uploadfile",params:['{"id": "',{t:2,r:"uid",p:[76,59,1923]},'"}']},f:["Select"]}]}]}],n:52,r:"data.upload_filelist",p:[73,3,1789]}]}]}]}," ",{p:[79,3,1981],t:7,e:"hr"}," ",{p:[80,3,1989],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[81,3,2053],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Return"]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(!(_2)))"},f:[" ",{p:[83,3,2116],t:7,e:"h2",f:["Available files:"]}," ",{p:[84,3,2145],t:7,e:"table",a:{border:"1",style:"border-collapse: collapse"},f:[{p:[84,55,2197],t:7,e:"tr",f:[{p:[84,59,2201],t:7,e:"th",f:["Server UID"]},{p:[84,73,2215],t:7,e:"th",f:["File Name"]},{p:[84,86,2228],t:7,e:"th",f:["File Size"]},{p:[84,99,2241],t:7,e:"th",f:["Password Protection"]},{p:[84,122,2264],t:7,e:"th",f:["Operations ",{t:4,f:[{p:[86,5,2311],t:7,e:"tr",f:[{p:[86,9,2315],t:7,e:"td",f:[{t:2,r:"uid",p:[86,13,2319]}]},{p:[87,5,2332],t:7,e:"td",f:[{t:2,r:"filename",p:[87,9,2336]}]},{p:[88,5,2354],t:7,e:"td",f:[{t:2,r:"size",p:[88,9,2358]},"GQ ",{t:4,f:[{p:[90,6,2400],t:7,e:"td",f:["Enabled"]}],n:50,r:"haspassword",p:[89,5,2374]}," ",{t:4,f:[{p:[93,6,2457],t:7,e:"td",f:["Disabled"]}],n:50,x:{r:["haspassword"],s:"!_0"},p:[92,5,2430]}]},{p:[96,5,2494],t:7,e:"td",f:[{p:[96,9,2498],t:7,e:"ui-button",a:{action:"PRG_downloadfile",params:['{"id": "',{t:2,r:"uid",p:[96,62,2551]},'"}']},f:["Download"]}]}]}],n:52,r:"data.servers",p:[85,4,2283]}]}]}]}," ",{p:[99,3,2612],t:7,e:"hr"}," ",{p:[100,3,2620],t:7,e:"ui-button",a:{action:"PRG_uploadmenu"},f:["Send file"]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],427:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[43,1,1082],t:7,e:"ntosheader"}," ",{p:[45,1,1099],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[47,5,1157],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",p:[47,27,1179]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[49,38,1331]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[50,15,1387]}],yinc:"9"}}],n:50,r:"config.fancy",p:[46,3,1131]},{t:4,n:51,f:[{p:[52,5,1437],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[53,7,1475],t:7,e:"span",f:[{t:2,r:"data.supply",p:[53,13,1481]}]}]}," ",{p:[55,5,1528],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[56,9,1563],t:7,e:"span",f:[{t:2,r:"data.demand",p:[56,15,1569]}]}]}],r:"config.fancy"}]}," ",{p:[60,1,1638],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[61,3,1668],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[62,5,1693],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[63,5,1730],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[64,5,1769],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[65,5,1806],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[66,5,1845],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[67,5,1887],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[68,5,1928],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[71,5,2013],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[71,24,2032]}],nowrap:0},f:[{p:[72,7,2057],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[72,28,2078]}," %"]}," ",{p:[73,7,2136],t:7,e:"div",a:{"class":"content"},f:[{t:2,rx:{r:"adata.areas",m:[{t:30,n:"@index"},"load"]},p:[73,28,2157]}]}," ",{p:[74,7,2199],t:7,e:"div",a:{"class":"content"},f:[{p:[74,28,2220],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[74,41,2233]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[74,70,2262]}]}]}," ",{p:[75,7,2309],t:7,e:"div",a:{"class":"content"},f:[{p:[75,28,2330],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[75,41,2343]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[75,64,2366]}," [",{p:[75,87,2389],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[75,93,2395]}]},"]"]}]}," ",{p:[76,7,2444],t:7,e:"div",a:{"class":"content"},f:[{p:[76,28,2465],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[76,41,2478]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[76,64,2501]}," [",{p:[76,87,2524],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[76,93,2530]}]},"]"]}]}," ",{p:[77,7,2579],t:7,e:"div",a:{"class":"content"},f:[{p:[77,28,2600],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[77,41,2613]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[77,64,2636]}," [",{p:[77,87,2659],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[77,93,2665]}]},"]"]}]}]}],n:52,r:"data.areas",p:[70,3,1987]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],428:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"div",a:{"class":"item"},f:[{p:[6,3,101],t:7,e:"div",a:{"class":"itemLabel"},f:["Payload status:"]}," ",{p:[9,3,158],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ARMED"],n:50,r:"data.armed",p:[10,4,188]},{t:4,n:51,f:["DISARMED"],r:"data.armed"}]}," ",{p:[16,3,270],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[19,3,321],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[20,4,351],t:7,e:"table",f:[{p:[21,4,363],t:7,e:"tr",f:[{p:[21,8,367],t:7,e:"td",f:[{p:[21,12,371],t:7,e:"ui-button",a:{action:"PRG_obfuscate"},f:["OBFUSCATE PROGRAM NAME"]}]}]},{p:[22,4,444],t:7,e:"tr",f:[{p:[22,8,448],t:7,e:"td",f:[{p:[22,12,452],t:7,e:"ui-button",a:{action:"PRG_arm",state:[{t:2,x:{r:["data.armed"],s:'_0?"danger":null'},p:[22,47,487]}]},f:[{t:2,x:{r:["data.armed"],s:'_0?"DISARM":"ARM"'},p:[22,81,521]}]}," ",{p:[23,4,571],t:7,e:"ui-button",a:{icon:"radiation",state:[{t:2,x:{r:["data.armed"],s:'_0?null:"disabled"'},p:[23,39,606]}],action:"PRG_activate"},f:["ACTIVATE"]}]}]}]}]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],429:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[5,3,95],t:7,e:"ui-display",a:{title:[{t:2,r:"class",p:[5,22,114]}," Alarms"]},f:[{p:[6,5,138],t:7,e:"ul",f:[{t:4,f:[{p:[8,9,171],t:7,e:"li",f:[{t:2,r:".",p:[8,13,175]}]}],n:52,r:".",p:[7,7,150]},{t:4,n:51,f:[{p:[10,9,211],t:7,e:"li",f:["System Nominal"]}],r:"."}]}]}],n:52,i:"class",r:"data.alarms",p:[4,1,64]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],430:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{integState:function(t){var e=100;return t==e?"good":t>e/2?"average":"bad"},bigState:function(t,e,n){return charge>n?"bad":t>e?"average":"good"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[23,1,421],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[27,2,462],t:7,e:"ui-button",a:{action:"PRG_clear"},f:["Back to Menu"]},{p:[27,56,516],t:7,e:"br"}," ",{p:[28,3,524],t:7,e:"ui-display",a:{title:"Supermatter Status:"},f:[{p:[29,3,568],t:7,e:"ui-section",a:{label:"Core Integrity"},f:[{p:[30,5,609],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"adata.SM_integrity",p:[30,38,642]}],state:[{t:2,x:{r:["integState","adata.SM_integrity"],s:"_0(_1)"},p:[30,69,673]}]},f:[{t:2,r:"data.SM_integrity",p:[30,105,709]},"%"]}]}," ",{p:[32,3,761],t:7,e:"ui-section",a:{label:"Relative EER"},f:[{p:[33,5,800],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_power"],s:"_0(_1,150,300)"},p:[33,18,813]}]},f:[{t:2,r:"data.SM_power",p:[33,55,850]}," MeV/cm3"]}]}," ",{p:[35,3,903],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[36,5,941],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_ambienttemp"],s:"_0(_1,4000,5000)"},p:[36,18,954]}]},f:[{t:2,r:"data.SM_ambienttemp",p:[36,63,999]}," K"]}]}," ",{p:[38,3,1052],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[39,5,1087],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_ambientpressure"],s:"_0(_1,5000,10000)"},p:[39,18,1100]}]},f:[{t:2,r:"data.SM_ambientpressure",p:[39,68,1150]}," kPa"]}]}]}," ",{p:[42,3,1227],t:7,e:"hr"},{p:[42,7,1231],t:7,e:"br"}," ",{p:[43,3,1239],t:7,e:"ui-display",a:{title:"Gas Composition:"},f:[{t:4,f:[{p:[45,5,1307],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[45,24,1326]}]},f:[{t:2,r:"amount",p:[46,6,1343]}," %"]}],n:52,r:"data.gases",p:[44,4,1281]}]}],n:50,r:"data.active",p:[26,1,440]},{t:4,n:51,f:[{p:[51,2,1418],t:7,e:"ui-button",a:{action:"PRG_refresh"},f:["Refresh"]},{p:[51,53,1469],t:7,e:"br"}," ",{p:[52,2,1476],t:7,e:"ui-display",a:{title:"Detected Supermatters"},f:[{t:4,f:[{p:[54,3,1552],t:7,e:"ui-section",a:{label:"Area"},f:[{t:2,r:"area_name",p:[55,5,1583]}," - (#",{t:2,r:"uid",p:[55,23,1601]},")"]}," ",{p:[57,3,1630],t:7,e:"ui-section",a:{label:"Integrity"},f:[{t:2,r:"integrity",p:[58,5,1666]}," %"]}," ",{p:[60,3,1702],t:7,e:"ui-section",a:{label:"Options"},f:[{p:[61,5,1736],t:7,e:"ui-button",a:{action:"PRG_set",params:['{"target" : "',{t:2,r:"uid",p:[61,54,1785]},'"}']},f:["View Details"]}]}],n:52,r:"data.supermatters",p:[53,2,1521]}]}],r:"data.active"}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],431:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"item",style:"float: left"},f:[{p:[2,2,41],t:7,e:"table",f:[{p:[2,9,48],t:7,e:"tr",f:[{t:4,f:[{p:[4,3,113],t:7,e:"td",f:[{p:[4,7,117],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[4,17,127]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[3,2,55]}," ",{t:4,f:[{p:[7,3,226],t:7,e:"td",f:[{p:[7,7,230],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[7,10,233]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[6,2,165]}," ",{t:4,f:[{p:[10,3,305],t:7,e:"td",f:[{p:[10,7,309],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[10,17,319]}]}}]}],n:50,r:"data.PC_ntneticon",p:[9,2,276]}," ",{t:4,f:[{p:[13,3,386],t:7,e:"td",f:[{p:[13,7,390],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[13,17,400]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[12,2,355]}," ",{t:4,f:[{p:[16,3,469],t:7,e:"td",f:[{p:[16,7,473],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[16,10,476]}]}]}],n:50,r:"data.PC_stationtime",p:[15,2,438]}," ",{t:4,f:[{p:[19,3,552],t:7,e:"td",f:[{p:[19,7,556],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[19,17,566]}]}}]}],n:52,r:"data.PC_programheaders",p:[18,2,516]}]}]}]}," ",{p:[23,1,609],t:7,e:"div",a:{style:"float: right; margin-top: 5px"},f:[{p:[24,2,655],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[26,3,745],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}," ",{p:[27,3,801],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}],n:50,r:"data.PC_showexitprogram",p:[25,2,710]}]}," ",{p:[30,1,881],t:7,e:"div",a:{style:"clear: both"}}]},e.exports=a.extend(r.exports)},{341:341}],432:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Auth. Disk:"},f:[{t:4,f:[{p:[3,7,69],t:7,e:"ui-button",a:{icon:"eject",style:"selected",action:"eject_disk"},f:["++++++++++"]}],n:50,r:"data.disk_present",p:[2,3,36]},{t:4,n:51,f:[{p:[5,7,172],t:7,e:"ui-button",a:{icon:"plus",action:"insert_disk"},f:["----------"]}],r:"data.disk_present"}]}," ",{p:[8,1,266],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[9,3,297],t:7,e:"span",f:[{t:2,r:"data.status1",p:[9,9,303]},"-",{t:2,r:"data.status2",p:[9,26,320]}]}]}," ",{p:[11,1,360],t:7,e:"ui-display",a:{title:"Timer"},f:[{p:[12,3,390],t:7,e:"ui-section",a:{label:"Time to Detonation"},f:[{p:[13,5,435],t:7,e:"span",f:[{t:2,x:{r:["data.timing","data.time_left","data.timer_set"],s:"_0?_1:_2"},p:[13,11,441]}]}]}," ",{t:4,f:[{p:[16,5,540],t:7,e:"ui-section",a:{label:"Adjust Timer"},f:[{p:[17,7,581],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_default"],s:'_0&&_1&&_2?null:"disabled"'},p:[17,40,614]}],action:"timer",params:'{"change": "reset"}'},f:["Reset"]}," ",{p:[19,7,786],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_min"],s:'_0&&_1&&_2?null:"disabled"'},p:[19,38,817]}],action:"timer",params:'{"change": "decrease"}'},f:["Decrease"]}," ",{p:[21,7,991],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[21,39,1023]}],action:"timer",params:'{"change": "input"}'},f:["Set"]}," ",{p:[22,7,1155],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_max"],s:'_0&&_1&&_2?null:"disabled"'},p:[22,37,1185]}],action:"timer",params:'{"change": "increase"}'},f:["Increase"]}]}],n:51,r:"data.timing",p:[15,3,518]}," ",{p:[26,3,1394],t:7,e:"ui-section",a:{label:"Timer"},f:[{p:[27,5,1426],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"danger":"caution"'},p:[27,38,1459]}],action:"toggle_timer",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.safety"],s:'_0&&_1&&!_2?null:"disabled"'},p:[29,14,1542]}]},f:[{t:2,x:{r:["data.timing"],s:'_0?"On":"Off"'},p:[30,7,1631]}]}]}]}," ",{p:[34,1,1713],t:7,e:"ui-display",a:{title:"Anchoring"},f:[{p:[35,3,1747],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[36,12,1770]}],icon:[{t:2,x:{r:["data.anchored"],s:'_0?"lock":"unlock"'},p:[37,11,1846]}],style:[{t:2,x:{r:["data.anchored"],s:'_0?null:"caution"'},p:[38,12,1897]}],action:"anchor"},f:[{t:2,x:{r:["data.anchored"],s:'_0?"Engaged":"Off"'},p:[39,21,1956]}]}]}," ",{p:[41,1,2022],t:7,e:"ui-display",a:{title:"Safety"},f:[{p:[42,3,2053],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[43,12,2076]}],icon:[{t:2,x:{r:["data.safety"],s:'_0?"lock":"unlock"'},p:[44,11,2152]}],action:"safety",style:[{t:2,x:{r:["data.safety"],s:'_0?"caution":"danger"'},p:[45,12,2217]}]},f:[{p:[46,7,2265],t:7,e:"span",f:[{t:2,x:{r:["data.safety"],s:'_0?"On":"Off"'},p:[46,13,2271]}]}]}]}," ",{p:[49,1,2341],t:7,e:"ui-display",a:{title:"Code"},f:[{p:[50,3,2370],t:7,e:"ui-section",a:{label:"Message"},f:[{t:2,r:"data.message",p:[50,31,2398]}]}," ",{p:[51,3,2431],t:7,e:"ui-section",a:{label:"Keypad"},f:[{p:[52,5,2464],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[52,39,2498]}],params:'{"digit":"1"}'},f:["1"]}," ",{p:[53,5,2583],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[53,39,2617]}],params:'{"digit":"2"}'},f:["2"]}," ",{p:[54,5,2702],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[54,39,2736]}],params:'{"digit":"3"}'},f:["3"]}," ",{p:[55,5,2821],t:7,e:"br"}," ",{p:[56,5,2831],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[56,39,2865]}],params:'{"digit":"4"}'},f:["4"]}," ",{p:[57,5,2950],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[57,39,2984]}],params:'{"digit":"5"}'},f:["5"]}," ",{p:[58,5,3069],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[58,39,3103]}],params:'{"digit":"6"}'},f:["6"]}," ",{p:[59,5,3188],t:7,e:"br"}," ",{p:[60,5,3198],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[60,39,3232]}],params:'{"digit":"7"}'},f:["7"]}," ",{p:[61,5,3317],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[61,39,3351]}],params:'{"digit":"8"}'},f:["8"]}," ",{p:[62,5,3436],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[62,39,3470]}],params:'{"digit":"9"}'},f:["9"]}," ",{p:[63,5,3555],t:7,e:"br"}," ",{p:[64,5,3565],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[64,39,3599]}],params:'{"digit":"R"}'},f:["R"]}," ",{p:[65,5,3684],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[65,39,3718]}],params:'{"digit":"0"}'},f:["0"]}," ",{p:[66,5,3803],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[66,39,3837]}],params:'{"digit":"E"}'},f:["E"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],433:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,25],t:7,e:"ui-button",a:{icon:"undo",action:"change_menu",params:'{"menu": "1"}'},f:["Return"]}," ",{p:[3,2,113],t:7,e:"ui-display",a:{title:"Advanced Surgery Procedures"},f:[{p:[4,3,165],t:7,e:"ui-button",a:{icon:"download",action:"sync"},f:["Sync with research database"]}," ",{t:4,f:[{p:[6,4,278],t:7,e:"ui-display",f:[{p:[7,6,297],t:7,e:"ui-section",f:[{p:[7,18,309],t:7,e:"b",f:[{t:2,r:"name",p:[7,21,312]}]}]}," ",{p:[8,6,344],t:7,e:"ui-section",f:[{t:2,r:"desc",p:[8,18,356]}]}]}],n:52,r:"data.surgeries",p:[5,3,249]}]}],n:50,x:{r:["data.menu"],s:"_0==2"},p:[1,1,0]},{t:4,n:51,f:[{p:[13,2,437],t:7,e:"ui-button",a:{action:"change_menu",params:'{"menu": "2"}'},f:["View Surgery Procedures"]}," ",{t:4,f:[{p:[15,3,556],t:7,e:"ui-notice",f:["No table detected!"]}],n:51,r:"data.table",p:[14,2,530]}," ",{p:[19,2,623],t:7,e:"ui-display",f:[{p:[20,3,639],t:7,e:"ui-display",a:{title:"Patient State"},f:[{t:4,f:[{p:[22,5,704],t:7,e:"ui-section",a:{label:"State"},f:[{p:[23,6,737],t:7,e:"span",a:{"class":[{t:2,r:"data.patient.statstate",p:[23,19,750]}]},f:[{t:2,r:"data.patient.stat",p:[23,47,778]}]}]}," ",{p:[25,5,831],t:7,e:"ui-section",a:{label:"Blood Type"},f:[{p:[26,6,869],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.patient.blood_type",p:[26,28,891]}]}]}," ",{p:[28,5,950],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[29,6,984],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.patient.minHealth",p:[29,19,997]}],max:[{t:2,r:"data.patient.maxHealth",p:[29,52,1030]}],value:[{t:2,r:"data.patient.health",p:[29,87,1065]}],state:[{t:2,x:{r:["data.patient.health"],s:'_0>=0?"good":"average"'},p:[30,13,1103]}]},f:[{t:2,x:{r:["adata.patient.health"],s:"Math.round(_0)"},p:[30,64,1154]}]}]}," ",{t:4,f:[{p:[33,6,1389],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[33,25,1408]}]},f:[{p:[34,7,1427],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.patient.maxHealth",p:[34,28,1448]}],value:[{t:2,rx:{r:"data.patient",m:[{t:30,n:"type"}]},p:[34,63,1483]}],state:"bad"},f:[{t:2,x:{r:["type","adata.patient"],s:"Math.round(_1[_0])"},p:[34,99,1519]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Burn",type:"fireLoss"},{label:"Toxin",type:"toxLoss"},{label:"Respiratory",type:"oxyLoss"}]'},p:[32,5,1224]}],n:50,r:"data.patient",p:[21,4,678]},{t:4,n:51,f:["No patient detected."],r:"data.patient"}]}," ",{p:[41,3,1670],t:7,e:"ui-display",a:{title:"Initiated Procedures"},f:[{t:4,f:[{t:4,f:[{p:[44,6,1777],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"name",p:[44,28,1799]}]},f:[{p:[45,7,1817],t:7,e:"ui-section",a:{label:"Next Step"},f:[{p:[46,8,1856],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"next_step",p:[46,30,1878]}]}," ",{t:4,f:[{p:[48,9,1937],t:7,e:"span",a:{"class":"content"},f:[{p:[48,31,1959],t:7,e:"b",f:["Required chemicals:"]},{p:[48,57,1985],t:7,e:"br"}," ",{t:2,r:"chems_needed",p:[48,62,1990]}]}],n:50,r:"chems_needed",p:[47,8,1907]}]}," ",{t:4,f:[{p:[52,8,2091],t:7,e:"ui-section",a:{label:"Alternative Step"},f:[{p:[53,9,2138],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"alternative_step",p:[53,31,2160]}]}," ",{t:4,f:[{p:[55,10,2232],t:7,e:"span",a:{"class":"content"},f:[{p:[55,32,2254],t:7,e:"b",f:["Required chemicals:"]},{p:[55,58,2280],t:7,e:"br"}," ",{t:2,r:"chems_needed",p:[55,63,2285]}]}],n:50,r:"alt_chems_needed",p:[54,9,2197]}]}],n:50,r:"alternative_step",p:[51,7,2058]}]}],n:52,r:"data.procedures",p:[43,5,1745]}],n:50,r:"data.procedures",p:[42,4,1716]},{t:4,n:51,f:["No active procedures."],r:"data.procedures"}]}]}],x:{r:["data.menu"],s:"_0==2"}}]},e.exports=a.extend(r.exports)},{341:341}],434:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"ui-section",f:["This machine only accepts ore. Gibtonite and Slag are not accepted."]}," ",{p:[5,2,117],t:7,e:"ui-section",f:["Current unclaimed credits: ",{t:2,r:"data.unclaimedPoints",p:[6,30,160]}," ",{p:[7,4,189],t:7,e:"ui-button",a:{action:"Claim"},f:["Claim"]}]}]}," ",{p:[12,1,276],t:7,e:"ui-display",f:[{t:4,f:[{p:[14,3,315],t:7,e:"ui-section",f:[{p:[15,4,332],t:7,e:"ui-button",a:{action:"diskEject",icon:"eject"},f:["Eject Disk"]}]}," ",{t:4,f:[{p:[20,4,460],t:7,e:"ui-section",a:{"class":"candystripe"},f:[{p:[21,5,496],t:7,e:"ui-button",a:{action:"diskUpload",state:[{t:2,x:{r:["canupload"],s:'(_0)?null:"disabled"'},p:[21,42,533]}],icon:"upload",align:"right",params:['{ "design" : "',{t:2,r:"index",p:[21,129,620]},'" }']},f:["Upload"]}," File ",{t:2,r:"index",p:[24,10,676]},": ",{t:2,r:"name",p:[24,21,687]}]}],n:52,r:"data.diskDesigns",p:[19,3,429]}],n:50,r:"data.hasDisk",p:[13,2,291]},{t:4,n:51,f:[{p:[28,3,741],t:7,e:"ui-section",f:[{p:[29,4,758],t:7,e:"ui-button",a:{action:"diskInsert",icon:"floppy-o"},f:["Insert Disk"]}]}],r:"data.hasDisk"}]}," ",{t:4,f:[{p:[36,2,911],t:7,e:"ui-display",f:[{p:[37,3,927],t:7,e:"ui-section",f:[{p:[38,4,944],t:7,e:"b",f:["Warning"]},": ",{t:2,r:"data.disconnected",p:[38,20,960]},". Please contact the quartermaster."]}]}],n:50,r:"data.disconnected",p:[35,1,883]},{t:4,f:[{p:[43,2,1100],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[44,3,1133],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[45,5,1168],t:7,e:"section",a:{"class":"cell"},f:["Mineral"]}," ",{p:[48,5,1226],t:7,e:"section",a:{"class":"cell"},f:["Sheets"]}," ",{p:[51,5,1283],t:7,e:"section",a:{"class":"cell"},f:[]}," ",{p:[53,5,1327],t:7,e:"section",a:{"class":"cell"},f:[]}," ",{p:[55,5,1371],t:7,e:"section",a:{"class":"cell"},f:["Ore Value"]}]}," ",{t:4,f:[{p:[60,4,1473],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[61,5,1508],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[62,6,1537]}]}," ",{p:[64,5,1567],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[65,6,1610]}]}," ",{p:[67,5,1642],t:7,e:"section",a:{"class":"cell"},f:[{p:[68,6,1671],t:7,e:"input",a:{value:[{t:2,r:"sheets",p:[68,19,1684]}],placeholder:"###","class":"number"}}]}," ",{p:[70,5,1751],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[71,6,1794], +t:7,e:"ui-button",a:{"class":"center",grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[71,60,1848]}],params:['{ "id" : ',{t:2,r:"id",p:[71,115,1903]},', "sheets" : ',{t:2,r:"sheets",p:[71,134,1922]}," }"]},f:["Release"]}]}," ",{p:[75,5,1993],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"value",p:[76,6,2036]}]}]}],n:52,r:"data.materials",p:[59,3,1444]}," ",{t:4,f:[{p:[81,4,2119],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[82,5,2154],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[83,6,2183]}]}," ",{p:[85,5,2213],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[86,6,2256]}]}," ",{p:[88,5,2288],t:7,e:"section",a:{"class":"cell"},f:[{p:[89,6,2317],t:7,e:"input",a:{value:[{t:2,r:"sheets",p:[89,19,2330]}],placeholder:"###","class":"number"}}]}," ",{p:[91,5,2397],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[92,6,2440],t:7,e:"ui-button",a:{"class":"center",grid:0,action:"Smelt",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[92,58,2492]}],params:['{ "id" : ',{t:2,r:"id",p:[92,114,2548]},', "sheets" : ',{t:2,r:"sheets",p:[92,133,2567]}," }"]},f:["Smelt"]}]}," ",{p:[96,5,2635],t:7,e:"section",a:{"class":"cell",align:"right"},f:[]}]}],n:52,r:"data.alloys",p:[80,3,2093]}]}],n:50,x:{r:["data.materials","data.alloys"],s:"_0||_1"},p:[42,1,1060]}]},e.exports=a.extend(r.exports)},{341:341}],435:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:{button:[{p:[4,4,87],t:7,e:"ui-button",a:{icon:"remove",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[4,36,119]}],action:"empty_eject_beaker"},f:["Empty and eject"]}," ",{p:[7,4,231],t:7,e:"ui-button",a:{icon:"trash",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[7,35,262]}],action:"empty_beaker"},f:["Empty"]}," ",{p:[10,4,358],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[10,35,389]}],action:"eject_beaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{t:4,f:[{p:[15,4,528],t:7,e:"ui-section",f:[{t:4,f:[{p:[17,6,578],t:7,e:"span",a:{"class":"bad"},f:["The beaker is empty!"]}],n:50,r:"data.beaker_empty",p:[16,5,546]},{t:4,n:51,f:[{p:[19,6,644],t:7,e:"ui-subdisplay",a:{title:"Blood"},f:[{t:4,f:[{p:[21,8,712],t:7,e:"ui-section",a:{label:"Blood DNA"},f:[{t:2,r:"data.blood.dna",p:[21,38,742]}]}," ",{p:[22,8,782],t:7,e:"ui-section",a:{label:"Blood type"},f:[{t:2,r:"data.blood.type",p:[22,39,813]}]}],n:50,r:"data.has_blood",p:[20,7,681]},{t:4,n:51,f:[{p:[24,8,870],t:7,e:"ui-section",f:[{p:[25,9,892],t:7,e:"span",a:{"class":"average"},f:["No blood sample detected."]}]}],r:"data.has_blood"}]}],r:"data.beaker_empty"}]}],n:50,r:"data.has_beaker",p:[14,3,500]},{t:4,n:51,f:[{p:[32,4,1054],t:7,e:"ui-section",f:[{p:[33,5,1072],t:7,e:"span",a:{"class":"bad"},f:["No beaker loaded."]}]}],r:"data.has_beaker"}]}," ",{t:4,f:[{p:[38,3,1188],t:7,e:"ui-display",a:{title:"Diseases"},f:[{t:4,f:[{p:{button:[{t:4,f:[{p:[43,8,1343],t:7,e:"ui-button",a:{icon:"pencil",action:"rename_disease",state:[{t:2,x:{r:["can_rename"],s:'_0?"":"disabled"'},p:[43,64,1399]}],params:['{"index": ',{t:2,r:"index",p:[43,116,1451]},"}"]},f:["Name advanced disease"]}],n:50,r:"is_adv",p:[42,7,1320]}," ",{p:[47,7,1538],t:7,e:"ui-button",a:{icon:"flask",action:"create_culture_bottle",state:[{t:2,x:{r:["data.is_ready"],s:'_0?"":"disabled"'},p:[47,69,1600]}],params:['{"index": ',{t:2,r:"index",p:[47,124,1655]},"}"]},f:["Create virus culture bottle"]}]},t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[40,24,1269]}],button:0},f:[" ",{p:[51,6,1749],t:7,e:"ui-section",a:{label:"Disease agent"},f:[{t:2,r:"agent",p:[51,40,1783]}]}," ",{p:[52,6,1812],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"description",p:[52,38,1844]}]}," ",{p:[53,6,1879],t:7,e:"ui-section",a:{label:"Spread"},f:[{t:2,r:"spread",p:[53,33,1906]}]}," ",{p:[54,6,1936],t:7,e:"ui-section",a:{label:"Possible cure"},f:[{t:2,r:"cure",p:[54,40,1970]}]}," ",{t:4,f:[{p:[56,7,2021],t:7,e:"ui-section",a:{label:"Symptoms"},f:[{t:4,f:[{p:[58,9,2087],t:7,e:"ui-button",a:{action:"symptom_details",state:"",params:['{"picked_symptom": ',{t:2,r:"sym_index",p:[58,81,2159]},', "index": ',{t:2,r:"index",p:[58,105,2183]},"}"]},f:[{t:2,r:"name",p:[59,10,2206]}," "]},{p:[60,21,2236],t:7,e:"br"}],n:52,r:"symptoms",p:[57,8,2059]}]}," ",{p:[63,7,2289],t:7,e:"ui-section",a:{label:"Resistance"},f:[{t:2,r:"resistance",p:[63,38,2320]}]}," ",{p:[64,7,2355],t:7,e:"ui-section",a:{label:"Stealth"},f:[{t:2,r:"stealth",p:[64,35,2383]}]}," ",{p:[65,7,2415],t:7,e:"ui-section",a:{label:"Stage speed"},f:[{t:2,r:"stage_speed",p:[65,39,2447]}]}," ",{p:[66,7,2483],t:7,e:"ui-section",a:{label:"Transmittability"},f:[{t:2,r:"transmission",p:[66,44,2520]}]}],n:50,r:"is_adv",p:[55,6,1999]}]}],n:52,r:"data.viruses",p:[39,4,1222]},{t:4,n:51,f:[{p:[70,5,2601],t:7,e:"ui-section",f:[{p:[71,6,2620],t:7,e:"span",a:{"class":"average"},f:["No detectable virus in the blood sample."]}]}],r:"data.viruses"}]}," ",{p:[75,3,2743],t:7,e:"ui-display",a:{title:"Antibodies"},f:[{t:4,f:[{p:[77,5,2811],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[77,24,2830]}]},f:[{p:[78,7,2848],t:7,e:"ui-button",a:{icon:"eyedropper",state:[{t:2,x:{r:["data.is_ready"],s:'_0?"":"disabled"'},p:[78,43,2884]}],action:"create_vaccine_bottle",params:['{"index": ',{t:2,r:"id",p:[78,129,2970]},"}"]},f:["Create vaccine bottle"]}]}],n:52,r:"data.resistances",p:[76,4,2779]},{t:4,n:51,f:[{p:[83,5,3067],t:7,e:"ui-section",f:[{p:[84,6,3086],t:7,e:"span",a:{"class":"average"},f:["No antibodies detected in the blood sample."]}]}],r:"data.resistances"}]}],n:50,r:"data.has_blood",p:[37,2,1162]}],n:50,x:{r:["data.mode"],s:"_0==1"},p:[1,1,0]},{t:4,n:51,f:[{p:[90,2,3231],t:7,e:"ui-button",a:{icon:"undo",state:"",action:"back"},f:["Back"]}," ",{t:4,f:[{p:[94,4,3330],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[94,23,3349]}]},f:[{p:[95,4,3364],t:7,e:"ui-section",f:[{t:2,r:"desc",p:[96,5,3382]}," ",{t:4,f:[{p:[98,5,3417],t:7,e:"br"}," ",{p:[99,5,3428],t:7,e:"b",f:["This symptom has been neutered, and has no effect. It will still affect the virus' statistics."]}],n:50,r:"neutered",p:[97,4,3395]}]}," ",{p:[102,4,3564],t:7,e:"ui-section",f:[{p:[103,5,3582],t:7,e:"ui-section",a:{label:"Level"},f:[{t:2,r:"level",p:[103,31,3608]}]}," ",{p:[104,5,3636],t:7,e:"ui-section",a:{label:"Resistance"},f:[{t:2,r:"resistance",p:[104,36,3667]}]}," ",{p:[105,5,3700],t:7,e:"ui-section",a:{label:"Stealth"},f:[{t:2,r:"stealth",p:[105,33,3728]}]}," ",{p:[106,5,3758],t:7,e:"ui-section",a:{label:"Stage speed"},f:[{t:2,r:"stage_speed",p:[106,37,3790]}]}," ",{p:[107,5,3824],t:7,e:"ui-section",a:{label:"Transmittability"},f:[{t:2,r:"transmission",p:[107,42,3861]}]}]}," ",{p:[109,4,3913],t:7,e:"ui-subdisplay",a:{title:"Effect Thresholds"},f:[{p:[110,5,3960],t:7,e:"ui-section",f:[{t:3,r:"threshold_desc",p:[110,17,3972]}]}]}]}],n:53,r:"data.symptom",p:[93,2,3303]}],x:{r:["data.mode"],s:"_0==1"}}]},e.exports=a.extend(r.exports)},{341:341}],436:[function(t,e,n){var a=t(341),r={exports:{}};!function(e){"use strict";var n=t(484);e.exports={data:{filter:"",tooltiptext:function(t,e,n){var a="";return t&&(a+="REQUIREMENTS: "+t+" "),e&&(a+="CATALYSTS: "+e+" "),n&&(a+="TOOLS: "+n),a}},oninit:function(){var t=this;this.on({hover:function(t){this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}}),this.observe("filter",function(e,a,r){var i=null;i=t.get("data.display_compact")?t.findAll(".section"):t.findAll(".display:not(:first-child)"),(0,n.filterMulti)(i,t.get("filter").toLowerCase())},{init:!1})}}}(r),r.exports.template={v:3,t:[" ",{p:[48,1,1342],t:7,e:"ui-display",a:{title:[{t:2,r:"data.category",p:[48,20,1361]},{t:4,f:[" : ",{t:2,r:"data.subcategory",p:[48,64,1405]}],n:50,r:"data.subcategory",p:[48,37,1378]}]},f:[{t:4,f:[{p:[50,3,1459],t:7,e:"ui-section",f:["Crafting... ",{p:[51,16,1488],t:7,e:"i",a:{"class":"fa-spin fa fa-spinner"}}]}],n:50,r:"data.busy",p:[49,2,1438]},{t:4,n:51,f:[{p:[54,3,1557],t:7,e:"ui-section",f:[{p:[55,4,1574],t:7,e:"table",a:{style:"width:100%"},f:[{p:[56,5,1606],t:7,e:"tr",f:[{p:[57,6,1617],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[58,7,1659],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardCat"},f:[{t:2,r:"data.prev_cat",p:[59,8,1718]}]}]}," ",{p:[62,6,1774],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[63,7,1816],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardCat"},f:[{t:2,r:"data.next_cat",p:[64,7,1874]}]}]}," ",{p:[67,6,1930],t:7,e:"td",a:{style:"float:right!important"},f:[{t:4,f:[{p:[69,7,2014],t:7,e:"ui-button",a:{icon:"lock",action:"toggle_recipes"},f:["Showing Craftable Recipes"]}],n:50,r:"data.display_craftable_only",p:[68,6,1971]},{t:4,n:51,f:[{p:[73,7,2138],t:7,e:"ui-button",a:{icon:"unlock",action:"toggle_recipes"},f:["Showing All Recipes"]}],r:"data.display_craftable_only"}]}," ",{p:[78,6,2268],t:7,e:"td",a:{style:"float:right!important"},f:[{p:[79,7,2310],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.display_compact"],s:'_0?"check-square-o":"square-o"'},p:[79,24,2327]}],action:"toggle_compact"},f:["Compact"]}]}]}," ",{p:[84,5,2474],t:7,e:"tr",f:[{t:4,f:[{p:[86,6,2515],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[87,7,2557],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardSubCat"},f:[{t:2,r:"data.prev_subcat",p:[88,8,2619]}]}]}," ",{p:[91,6,2678],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[92,7,2720],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardSubCat"},f:[{t:2,r:"data.next_subcat",p:[93,8,2782]}]}]}],n:50,r:"data.subcategory",p:[85,5,2484]}]}]}," ",{t:4,f:[{t:4,f:[" ",{p:[101,6,2992],t:7,e:"ui-input",a:{value:[{t:2,r:"filter",p:[101,23,3009]}],placeholder:"Filter.."}}],n:51,r:"data.display_compact",p:[100,5,2902]}],n:50,r:"config.fancy",p:[99,4,2876]}]}," ",{t:4,f:[{p:[106,5,3144],t:7,e:"ui-display",f:[{t:4,f:[{p:[108,6,3193],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[108,25,3212]}]},f:[{p:[109,7,3230],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[109,27,3250]}],"tooltip-side":"right",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[109,135,3358]},'"}'],icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.can_craft",p:[107,5,3162]}," ",{t:4,f:[{t:4,f:[{p:[116,7,3567],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[116,26,3586]}]},f:[{p:[117,8,3605],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[117,28,3625]}],"tooltip-side":"right",state:"disabled",icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.cant_craft",p:[115,6,3534]}],n:51,r:"data.display_craftable_only",p:[114,5,3495]}]}],n:50,r:"data.display_compact",p:[105,4,3110]},{t:4,n:51,f:[{t:4,f:[{p:[126,6,3947],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[126,25,3966]}]},f:[{t:4,f:[{p:[128,8,4009],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[129,9,4052]}]}],n:50,r:"req_text",p:[127,7,3984]}," ",{t:4,f:[{p:[133,8,4139],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[134,9,4179]}]}],n:50,r:"catalyst_text",p:[132,7,4109]}," ",{t:4,f:[{p:[138,8,4267],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[139,9,4303]}]}],n:50,r:"tool_text",p:[137,7,4241]}," ",{p:[142,7,4361],t:7,e:"ui-section",f:[{p:[143,8,4382],t:7,e:"ui-button",a:{icon:"gears",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[143,66,4440]},'"}']},f:["Craft"]}]}]}],n:52,r:"data.can_craft",p:[125,5,3916]}," ",{t:4,f:[{t:4,f:[{p:[151,7,4621],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[151,26,4640]}]},f:[{t:4,f:[{p:[153,9,4685],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[154,10,4729]}]}],n:50,r:"req_text",p:[152,8,4659]}," ",{t:4,f:[{p:[158,9,4820],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[159,10,4861]}]}],n:50,r:"catalyst_text",p:[157,8,4789]}," ",{t:4,f:[{p:[163,9,4953],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[164,10,4990]}]}],n:50,r:"tool_text",p:[162,8,4926]}]}],n:52,r:"data.cant_craft",p:[150,6,4588]}],n:51,r:"data.display_craftable_only",p:[149,5,4549]}],r:"data.display_compact"}],r:"data.busy"}]}]},e.exports=a.extend(r.exports)},{341:341,484:484}],437:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:[4,1,113],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[5,3,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,5,186],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[6,11,192]}," kPa"]}]}," ",{p:[8,3,254],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[9,5,285],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[9,18,298]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[9,59,339]}]}]}]}," ",{p:[12,1,430],t:7,e:"ui-display",a:{title:"Pump"},f:[{p:[13,3,459],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,5,491],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[14,22,508]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[15,14,559]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[16,22,616]}]}]}," ",{p:[18,3,675],t:7,e:"ui-section",a:{label:"Direction"},f:[{p:[19,5,711],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"sign-out":"sign-in"'},p:[19,22,728]}],action:"direction"},f:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"Out":"In"'},p:[20,26,808]}]}]}," ",{p:[22,3,883],t:7,e:"ui-section",a:{label:"Target Pressure"},f:[{p:[23,5,925],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.min_pressure",p:[23,18,938]}],max:[{t:2,r:"data.max_pressure",p:[23,46,966]}],value:[{t:2,r:"data.target_pressure",p:[24,14,1003]}]},f:[{t:2,x:{r:["adata.target_pressure"],s:"Math.round(_0)"},p:[24,40,1029]}," kPa"]}]}," ",{p:[26,3,1100],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,1145],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.target_pressure","data.default_pressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,1178]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1328],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.target_pressure","data.min_pressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1359]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1500],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1595],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.target_pressure","data.max_pressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1625]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}," ",{p:{button:[{t:4,f:[{p:[39,7,1891],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[39,38,1922]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[38,5,1863]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[43,3,2042],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[44,4,2073]}]}," ",{p:[46,3,2115],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[47,4,2149]}," kPa"]}],n:50,r:"data.holding",p:[42,3,2018]},{t:4,n:51,f:[{p:[50,3,2223],t:7,e:"ui-section",f:[{p:[51,4,2240],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}]},e.exports=a.extend(r.exports)},{341:341}],438:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[3,1,69],t:7,e:"ui-notice",f:[{p:[4,3,84],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[4,23,104]}," connected to a tank."]}]}," ",{p:[6,1,182],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[7,3,220],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[8,5,255],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[8,11,261]}," kPa"]}]}," ",{p:[10,3,323],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[11,5,354],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[11,18,367]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[11,59,408]}]}]}]}," ",{p:[14,1,499],t:7,e:"ui-display",a:{title:"Filter"},f:[{p:[15,3,530],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[16,5,562],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[16,22,579]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[17,14,630]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[18,22,687]}]}]}]}," ",{p:{button:[{t:4,f:[{p:[24,7,856],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[24,38,887]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[23,5,828]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[28,3,1007],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[29,4,1038]}]}," ",{p:[31,3,1080],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[32,4,1114]}," kPa"]}],n:50,r:"data.holding",p:[27,3,983]},{t:4,n:51,f:[{p:[35,3,1188],t:7,e:"ui-section",f:[{p:[36,4,1205],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}," ",{p:[40,1,1293],t:7,e:"ui-display",a:{title:"Filters"},f:[{t:4,f:[{p:[42,5,1345],t:7,e:"filters"}],n:53,r:"data",p:[41,3,1325]}]}]},r.exports.components=r.exports.components||{};var i={filters:t(457)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,457:457}],439:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(r),r.exports.template={v:3,t:[" ",{p:[42,1,1035],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[44,5,1093],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",p:[44,27,1115]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[46,38,1267]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[47,15,1323]}],yinc:"9"}}],n:50,r:"config.fancy",p:[43,3,1067]},{t:4,n:51,f:[{p:[49,5,1373],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[50,7,1411],t:7,e:"span",f:[{t:2,r:"data.supply",p:[50,13,1417]}]}]}," ",{p:[52,5,1464],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[53,9,1499],t:7,e:"span",f:[{t:2,r:"data.demand",p:[53,15,1505]}]}]}],r:"config.fancy"}]}," ",{p:[57,1,1574],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[58,3,1604],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[59,5,1629],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[60,5,1666],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[61,5,1705],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[62,5,1742],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[63,5,1781],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[64,5,1823],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[65,5,1864],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[68,5,1949],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[68,24,1968]}],nowrap:0},f:[{p:[69,7,1993],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[69,28,2014]}," %"]}," ",{p:[70,7,2072],t:7,e:"div",a:{"class":"content"},f:[{t:2,rx:{r:"adata.areas",m:[{t:30,n:"@index"},"load"]},p:[70,28,2093]}]}," ",{p:[71,7,2135],t:7,e:"div",a:{"class":"content"},f:[{p:[71,28,2156],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[71,41,2169]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[71,70,2198]}]}]}," ",{p:[72,7,2245],t:7,e:"div",a:{"class":"content"},f:[{p:[72,28,2266],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[72,41,2279]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[72,64,2302]}," [",{p:[72,87,2325],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[72,93,2331]}]},"]"]}]}," ",{p:[73,7,2380],t:7,e:"div",a:{"class":"content"},f:[{p:[73,28,2401],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[73,41,2414]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[73,64,2437]}," [",{p:[73,87,2460],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[73,93,2466]}]},"]"]}]}," ",{p:[74,7,2515],t:7,e:"div",a:{"class":"content"},f:[{p:[74,28,2536],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[74,41,2549]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[74,64,2572]}," [",{p:[74,87,2595],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[74,93,2601]}]},"]"]}]}]}],n:52,r:"data.areas",p:[67,3,1923]}]}]},e.exports=a.extend(r.exports)},{341:341}],440:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{readableFrequency:function(){return Math.round(this.get("adata.frequency"))/10}}}}(r),r.exports.template={v:3,t:[" ",{p:[11,1,177],t:7,e:"ui-display",a:{title:"Settings"},f:[{t:4,f:[{p:[13,5,236],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,7,270],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[14,24,287]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[14,75,338]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"On":"Off"'},p:[16,9,413]}]}]}],n:50,r:"data.headset",p:[12,3,210]},{t:4,n:51,f:[{p:[19,5,494],t:7,e:"ui-section",a:{label:"Microphone"},f:[{p:[20,7,533],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.broadcasting"],s:'_0?"power-off":"close"'},p:[20,24,550]}],style:[{t:2,x:{r:["data.broadcasting"],s:'_0?"selected":null'},p:[20,78,604]}],action:"broadcast"},f:[{t:2,x:{r:["data.broadcasting"],s:'_0?"Engaged":"Disengaged"'},p:[22,9,685]}]}]}," ",{p:[24,5,769],t:7,e:"ui-section",a:{label:"Speaker"},f:[{p:[25,7,805],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[25,24,822]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[25,75,873]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"Engaged":"Disengaged"'},p:[27,9,948]}]}]}],r:"data.headset"}," ",{t:4,f:[{p:[31,5,1064],t:7,e:"ui-section",a:{label:"High Volume"},f:[{p:[32,7,1104],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.useCommand"],s:'_0?"power-off":"close"'},p:[32,24,1121]}],style:[{t:2,x:{r:["data.useCommand"],s:'_0?"selected":null'},p:[32,76,1173]}],action:"command"},f:[{t:2,x:{r:["data.useCommand"],s:'_0?"On":"Off"'},p:[34,9,1250]}]}]}],n:50,r:"data.command",p:[30,3,1038]}]}," ",{p:[38,1,1342],t:7,e:"ui-display",a:{title:"Channel"},f:[{p:[39,3,1374],t:7,e:"ui-section",a:{label:"Frequency"},f:[{t:4,f:[{p:[41,7,1439],t:7,e:"span",f:[{t:2,r:"readableFrequency",p:[41,13,1445]}]}],n:50,r:"data.freqlock",p:[40,5,1410]},{t:4,n:51,f:[{p:[43,7,1495],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[43,46,1534]}],action:"frequency",params:'{"adjust": -1}'}}," ",{p:[44,7,1646],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[44,41,1680]}],action:"frequency",params:'{"adjust": -.2}'}}," ",{p:[45,7,1793],t:7,e:"ui-button",a:{icon:"pencil",action:"frequency",params:'{"tune": "input"}'},f:[{t:2,r:"readableFrequency",p:[45,78,1864]}]}," ",{p:[46,7,1905],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[46,40,1938]}],action:"frequency",params:'{"adjust": .2}'}}," ",{p:[47,7,2050],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[47,45,2088]}],action:"frequency",params:'{"adjust": 1}'}}],r:"data.freqlock"}]}," ",{t:4,f:[{p:[51,5,2262],t:7,e:"ui-section",a:{label:"Subspace Transmission"},f:[{p:[52,7,2312],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.subspace"],s:'_0?"power-off":"close"'},p:[52,24,2329]}],style:[{t:2,x:{r:["data.subspace"],s:'_0?"selected":null'},p:[52,74,2379]}],action:"subspace"},f:[{t:2,x:{r:["data.subspace"],s:'_0?"Active":"Inactive"'},p:[53,29,2447]}]}]}],n:50,r:"data.subspaceSwitchable",p:[50,3,2225]}," ",{t:4,f:[{p:[57,5,2578],t:7,e:"ui-section",a:{label:"Channels"},f:[{t:4,f:[{p:[59,9,2656],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["."],s:'_0?"check-square-o":"square-o"'},p:[59,26,2673]}],style:[{t:2,x:{r:["."],s:'_0?"selected":null'},p:[60,18,2730]}],action:"channel",params:['{"channel": "',{t:2,r:"channel",p:[61,49,2806]},'"}']},f:[{t:2,r:"channel",p:[62,11,2833]}]},{p:[62,34,2856],t:7,e:"br"}],n:52,i:"channel",r:"data.channels",p:[58,7,2615]}]}],n:50,x:{r:["data.subspace","data.channels"],s:"_0&&_1"},p:[56,3,2534]}]}]},e.exports=a.extend(r.exports)},{341:341}],441:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" "," "," "," "," "," "," "," "," "," ",{p:[11,1,560],t:7,e:"rdheader"}," ",{t:4,f:[{p:[13,2,595],t:7,e:"ui-display",a:{title:"CONSOLE LOCKED"},f:[{p:[14,3,634],t:7,e:"ui-button",a:{action:"Unlock"},f:["Unlock"]}]}],n:50,r:"data.locked",p:[12,1,573]},{t:4,f:[{p:[18,2,729],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.tabs",p:[18,17,744]}]},f:[{p:[19,3,763],t:7,e:"tab",a:{name:"Technology"},f:[{p:[20,4,791],t:7,e:"techweb"}]}," ",{p:[22,3,815],t:7,e:"tab",a:{name:"View Node"},f:[{p:[23,4,842],t:7,e:"nodeview"}]}," ",{p:[25,3,867],t:7,e:"tab",a:{name:"View Design"},f:[{p:[26,4,896],t:7,e:"designview"}]}," ",{p:[28,3,923],t:7,e:"tab",a:{name:"Disk Operations - Design"},f:[{p:[29,4,965],t:7,e:"diskopsdesign"}]}," ",{p:[31,3,995],t:7,e:"tab",a:{name:"Disk Operations - Technology"},f:[{p:[32,4,1041],t:7,e:"diskopstech"}]}," ",{p:[34,3,1069],t:7,e:"tab",a:{name:"Deconstructive Analyzer"},f:[{p:[35,4,1110],t:7,e:"destruct"}]}," ",{p:[37,3,1135],t:7,e:"tab",a:{name:"Protolathe"},f:[{p:[38,4,1163],t:7,e:"protolathe"}]}," ",{p:[40,3,1190],t:7,e:"tab",a:{name:"Circuit Imprinter"},f:[{p:[41,4,1225],t:7,e:"circuit"}]}," ",{p:[43,3,1249],t:7,e:"tab",a:{name:"Settings"},f:[{p:[44,4,1275],t:7,e:"settings"}]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[17,1,706]}]},r.exports.components=r.exports.components||{};var i={settings:t(450),circuit:t(442),protolathe:t(448),destruct:t(444),diskopsdesign:t(445),diskopstech:t(446),designview:t(443),nodeview:t(447),techweb:t(451),rdheader:t(449)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,442:442,443:443,444:444,445:445,446:446,447:447,448:448,449:449,450:450,451:451}],442:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[3,3,58],t:7,e:"ui-display",a:{title:"Circuit Imprinter Busy!"}}],n:50,r:"data.circuitbusy",p:[2,2,30]},{t:4,n:51,f:[{p:[5,3,130],t:7,e:"ui-display",f:[{p:[6,4,147],t:7,e:"ui-section",f:["Search Available Designs: ",{p:[7,4,189],t:7,e:"input",a:{value:[{t:2,r:"textsearch",p:[7,17,202]}],placeholder:"Type Here","class":"text"}}," ",{p:[8,5,261],t:7,e:"ui-button",a:{action:"textSearch",params:['{"latheType" : "circuit", "inputText" : ',{t:2,r:"textsearch",p:[8,84,340]},"}"]},f:["Search"]}]}," ",{p:[10,4,398],t:7,e:"ui-section",f:["Materials: ",{t:2,r:"data.circuitmats",p:[10,27,421]}," / ",{t:2,r:"data.circuitmaxmats",p:[10,50,444]}]}," ",{p:[11,4,485],t:7,e:"ui-section",f:["Reagents: ",{t:2,r:"data.circuitchems",p:[11,26,507]}," / ",{t:2,r:"data.circuitmaxchems",p:[11,50,531]}]}," ",{p:[12,3,572],t:7,e:"ui-display",f:[{p:[14,3,590],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.lathe_tabs",p:[14,18,605]}]},f:[{p:[15,4,631],t:7,e:"tab",a:{name:"Category List"},f:[{t:4,f:[{p:[17,6,696],t:7,e:"ui-button",a:{action:"switchcat",state:[{t:2,x:{r:["data.circuitcat"],s:'_0=="{{name}}"?"selected":null'},p:[17,43,733]}],params:['{"type" : "circuit", "cat" : "',{t:2,r:"name",p:[17,135,825]},'"}']},f:[{t:2,r:"name",p:[17,147,837]}]}],n:52,r:"data.circuitcats",p:[16,5,663]}]}," ",{p:[20,4,888],t:7,e:"tab",a:{name:"Selected Category"},f:[{t:4,f:[{p:[22,6,956],t:7,e:"ui-section",f:[{t:2,r:"name",p:[22,18,968]},{t:2,r:"matstring",p:[22,26,976]}," ",{p:[23,7,997],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[23,40,1030]}],params:['{"latheType" : "circuit", "id" : "',{t:2,r:"id",p:[23,119,1109]},'"}']},f:["Print"]}]}],n:52,r:"data.circuitdes",p:[21,5,924]}]}," ",{p:[27,4,1187],t:7,e:"tab",a:{name:"Search Results"},f:[{t:4,f:[{p:[29,6,1254],t:7,e:"ui-section",f:[{t:2,r:"name",p:[29,18,1266]},{t:2,r:"matstring",p:[29,26,1274]}," ",{p:[30,7,1295],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[30,40,1328]}],params:['{"latheType" : "circuit", "id" : "',{t:2,r:"id",p:[30,119,1407]},'"}']},f:["Print"]}]}],n:52,r:"data.circuitmatch",p:[28,5,1220]}]}," ",{p:[34,4,1485],t:7,e:"tab",a:{name:"Materials"},f:[{t:4,f:[{p:[36,6,1550],t:7,e:"ui-section",f:[{t:2,r:"name",p:[36,18,1562]}," : ",{t:2,r:"amount",p:[36,29,1573]}," cm3 - ",{t:4,f:[{p:[38,7,1623],t:7,e:"input",a:{value:[{t:2,r:"number",p:[38,20,1636]}],placeholder:["1-",{t:2,r:"sheets",p:[38,46,1662]}],"class":"number"}}," ",{p:[39,7,1698],t:7,e:"ui-button",a:{action:"releasemats",params:['{"latheType" : "circuit", "mat_id" : ',{t:2,r:"mat_id",p:[39,84,1775]},', "sheets" : ',{t:2,r:"number",p:[39,107,1798]},"}"]},f:["Release"]}],n:50,x:{r:["sheets"],s:"_0>0"},p:[37,6,1597]}]}],n:52,r:"data.circuitmat_list",p:[35,5,1513]}]}," ",{p:[44,4,1895],t:7,e:"tab",a:{name:"Chemicals"},f:[{t:4,f:[{p:[46,6,1961],t:7,e:"ui-section",f:[{t:2,r:"name",p:[46,18,1973]}," : ",{t:2,r:"amount",p:[46,29,1984]}," - ",{p:[47,7,2005],t:7,e:"ui-button",a:{action:"purgechem",params:['{"latheType" : "circuit", "name" : ',{t:2,r:"name",p:[47,80,2078]},', "id" : ',{t:2,r:"reagentid",p:[47,97,2095]},"}"]},f:["Purge"]}]}],n:52,r:"data.circuitchem_list",p:[45,5,1923]}]}]}]}]}],r:"data.circuitbusy"}],n:50,r:"data.circuit_linked",p:[1,1,0]},{t:4,n:51,f:[{p:[55,2,2216],t:7,e:"ui-display",a:{title:"No Linked Circuit Imprinter"}}],r:"data.circuit_linked"}]},e.exports=a.extend(r.exports)},{341:341}],443:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,31],t:7,e:"ui-display",a:{title:[{t:2,r:"data.sdesign_name",p:[2,21,50]}]},f:[{p:[3,3,77],t:7,e:"ui-section",a:{title:"Description"},f:[{t:2,r:"data.sdesign_desc",p:[3,35,109]}]}]}," ",{p:[5,2,162],t:7,e:"ui-display",a:{title:"Lathe Types"},f:[{t:4,f:[{p:[7,4,239],t:7,e:"ui-section",a:{title:"Circuit Imprinter"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&1"},p:[6,3,198]}," ",{t:4,f:[{p:[10,4,346],t:7,e:"ui-section",a:{title:"Protolathe"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&2"},p:[9,3,305]}," ",{t:4,f:[{p:[13,4,446],t:7,e:"ui-section",a:{title:"Autolathe"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&4"},p:[12,3,405]}," ",{t:4,f:[{p:[16,4,545],t:7,e:"ui-section",a:{title:"Crafting Fabricator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&8"},p:[15,3,504]}," ",{t:4,f:[{p:[19,4,655],t:7,e:"ui-section",a:{title:"Exosuit Fabricator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&16"},p:[18,3,613]}," ",{t:4,f:[{p:[22,4,764],t:7,e:"ui-section",a:{title:"Biogenerator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&32"},p:[21,3,722]}," ",{t:4,f:[{p:[25,4,867],t:7,e:"ui-section",a:{title:"Limb Grower"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&64"},p:[24,3,825]}," ",{t:4,f:[{p:[28,4,970],t:7,e:"ui-section",a:{title:"Ore Smelter"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&128" +},p:[27,3,927]}]}," ",{p:[31,2,1045],t:7,e:"ui-display",a:{title:"Materials"},f:[{t:4,f:[{p:[33,4,1116],t:7,e:"ui-section",a:{title:[{t:2,r:"matname",p:[33,23,1135]}]},f:[{t:2,r:"matamt",p:[33,36,1148]}," cm^3"]}],n:52,r:"data.sdesign_materials",p:[32,3,1079]}]}],n:50,r:"data.design_selected",p:[1,1,0]},{t:4,f:[{p:[38,2,1248],t:7,e:"ui-display",a:{title:"No Design Selected."}}],n:50,x:{r:["data.design_selected"],s:"!_0"},p:[37,1,1216]}]},e.exports=a.extend(r.exports)},{341:341}],444:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[4,3,60],t:7,e:"ui-display",a:{title:"Destructive Analyzer Busy!"}}],n:50,r:"data.destroybusy",p:[3,2,32]},{t:4,n:51,f:[{t:4,f:[{p:[7,4,168],t:7,e:"ui-display",a:{title:"Destructive Analyzer Unloaded"}}],n:50,x:{r:["data.destroy_loaded"],s:"!_0"},p:[6,3,135]},{t:4,n:51,f:[{p:[9,4,248],t:7,e:"ui-display",a:{title:"Loaded Item"},f:[{p:[10,4,285],t:7,e:"ui-section",a:{title:"Name"},f:[{t:2,r:"data.destroy_name",p:[10,29,310]}]}]}," ",{p:[12,4,367],t:7,e:"ui-display",a:{title:"Boost Nodes"},f:[{t:4,f:[{p:[14,6,438],t:7,e:"ui-section",a:{title:[{t:2,r:"name",p:[14,25,457]}," | ",{t:2,r:"value",p:[14,36,468]}]},f:[{p:[15,7,487],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["allow"],s:'_0?null:"disabled"'},p:[15,25,505]}],action:"deconstruct",params:['{"id":',{t:2,r:"id",p:[15,90,570]},"}"]},f:["Deconstruct and Boost"]}]}],n:52,r:"data.boost_paths",p:[13,5,405]}]}," ",{p:[19,4,670],t:7,e:"ui-button",a:{action:"eject_da"},f:["Eject Item"]}],x:{r:["data.destroy_loaded"],s:"!_0"}}],r:"data.destroybusy"}],n:50,r:"data.destroy_linked",p:[2,1,2]},{t:4,n:51,f:[{p:[23,2,755],t:7,e:"ui-display",a:{title:"No Linked Destructive Analyzer"}}],r:"data.destroy_linked"}]},e.exports=a.extend(r.exports)},{341:341}],445:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[3,2,24],t:7,e:"ui-display",a:{title:"No Design Disk Loaded"}}],n:50,x:{r:["data.ddisk"],s:"!_0"},p:[2,1,2]},{t:4,n:51,f:[{t:4,f:[{p:[6,3,121],t:7,e:"ui-display",a:{title:"Design Disk Updating"}}],n:50,r:"data.ddisk_update",p:[5,2,92]},{t:4,n:51,f:[{t:4,f:[{p:[9,4,221],t:7,e:"ui-display",a:{title:"Design Disk"},f:[{p:[10,5,259],t:7,e:"ui-section",a:{title:"Disk Space"},f:["Disk Capacity: ",{t:2,r:"data.ddisk_size",p:[10,51,305]}," blueprints."]}," ",{p:[11,5,355],t:7,e:"ui-section",a:{title:"Disk IO"},f:[{p:[11,33,383],t:7,e:"ui-button",a:{action:"ddisk_upall"},f:["Upload all designs"]}]}," ",{p:[12,5,464],t:7,e:"ui-section",a:{title:"Clear Disk"},f:[{p:[12,36,495],t:7,e:"ui-button",a:{action:"clear_designdisk",style:"danger"},f:["WIPE ALL DATA"]}]}," ",{p:[13,5,591],t:7,e:"ui-section",a:{title:"Eject Disk"},f:[{p:[13,36,622],t:7,e:"ui-button",a:{action:"eject_designdisk"},f:["Eject Disk"]}]}]}," ",{p:[15,4,717],t:7,e:"ui-display",a:{title:"Disk Contents"},f:[{t:4,f:[{p:[17,6,792],t:7,e:"ui-section",a:{title:"Number"},f:["#",{t:2,r:"pos",p:[17,34,820]},": ",{t:4,f:[{p:[19,8,866],t:7,e:"ui-button",a:{action:"upload_empty_ddisk_slot",params:['{"slot": "',{t:2,r:"pos",p:[19,70,928]},'"}']},f:["Upload to Empty Slot"]}],n:50,x:{r:["id"],s:'_0=="null"'},p:[18,7,837]},{t:4,n:51,f:[{p:[21,8,996],t:7,e:"ui-button",a:{action:"select_design",params:['{"id": "',{t:2,r:"id",p:[21,58,1046]},'"}'],state:[{t:2,x:{r:["data.sdesign_id","id"],s:'_0==_1?"selected":null'},p:[21,75,1063]}]},f:[{t:2,r:"name",p:[21,122,1110]}]}," ",{p:[22,8,1139],t:7,e:"ui-button",a:{action:"ddisk_erasepos",style:"danger",params:['{"id": "',{t:2,r:"id",p:[22,74,1205]},'"}'],state:[{t:2,x:{r:["id"],s:'_0=="null"?"disabled":null'},p:[22,91,1222]}]},f:["Delete Slot"]}],x:{r:["id"],s:'_0=="null"'}}]}],n:52,r:"data.ddisk_designs",p:[16,5,757]}]}],n:50,x:{r:["data.ddisk_upload"],s:"!_0"},p:[8,3,190]},{t:4,n:51,f:[{p:[28,4,1367],t:7,e:"ui-display",a:{title:"Upload Design to Disk"},f:[{p:[28,46,1409],t:7,e:"ui-section",f:["Available Designs:"]}]}," ",{t:4,f:[{p:[30,5,1513],t:7,e:"ui-section",f:[{p:[30,17,1525],t:7,e:"ui-button",a:{action:"ddisk_uploaddesign",params:['{"id": "',{t:2,r:"id",p:[30,72,1580]},'"}']},f:[{t:2,r:"name",p:[30,82,1590]}]}]}],n:52,r:"data.ddisk_possible_designs",p:[29,4,1470]}],x:{r:["data.ddisk_upload"],s:"!_0"}}],r:"data.ddisk_update"}],x:{r:["data.ddisk"],s:"!_0"}}]},e.exports=a.extend(r.exports)},{341:341}],446:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[3,2,24],t:7,e:"ui-display",a:{title:"No Technology Disk Loaded"}}],n:50,x:{r:["data.tdisk"],s:"!_0"},p:[2,1,2]},{t:4,n:51,f:[{t:4,f:[{p:[6,3,125],t:7,e:"ui-display",a:{title:"Technology Disk Updating"}}],n:50,r:"data.tdisk_update",p:[5,2,96]},{t:4,n:51,f:[{p:[8,3,198],t:7,e:"ui-display",a:{title:"Technology Disk"},f:[{p:[9,4,239],t:7,e:"ui-section",a:{title:"Disk IO"},f:[{p:[9,32,267],t:7,e:"ui-button",a:{action:"tdisk_down"},f:["Download Research to Disk"]},{p:[9,100,335],t:7,e:"ui-button",a:{action:"tdisk_up"},f:["Upload Research from Disk"]}," ",{p:[10,4,406],t:7,e:"ui-section",a:{title:"Clear Disk"},f:[{p:[10,35,437],t:7,e:"ui-button",a:{action:"clear_techdisk",style:"danger"},f:["WIPE ALL DATA"]}]}," ",{p:[11,4,530],t:7,e:"ui-section",a:{title:"Eject Disk"},f:[{p:[11,35,561],t:7,e:"ui-button",a:{action:"eject_techdisk"},f:["Eject Disk"]}]}]}]}," ",{p:[13,3,652],t:7,e:"ui-display",a:{title:"Disk Contents"},f:[{t:4,f:[{p:[15,5,723],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[15,53,771]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[15,70,788]}]},f:[{t:2,r:"display_name",p:[15,115,833]}]}],n:52,r:"data.tdisk_nodes",p:[14,4,691]}]}],r:"data.tdisk_update"}],x:{r:["data.tdisk"],s:"!_0"}}]},e.exports=a.extend(r.exports)},{341:341}],447:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,29],t:7,e:"ui-display",a:{title:[{t:2,r:"data.snode_name",p:[2,21,48]}]},f:[{p:[3,3,73],t:7,e:"ui-section",a:{title:"Description"},f:["Description: ",{t:2,r:"data.snode_desc",p:[3,48,118]}]}," ",{p:[4,3,154],t:7,e:"ui-section",a:{title:"Point Cost"},f:["Point Cost: ",{t:2,r:"data.snode_cost",p:[4,46,197]}]}," ",{p:[5,3,233],t:7,e:"ui-section",a:{title:"Export Price"},f:["Export Price: ",{t:2,r:"data.snode_export",p:[5,50,280]}]}," ",{p:[6,3,318],t:7,e:"ui-button",a:{action:"research_node",params:['{"id"="',{t:2,r:"id",p:[6,52,367]},'"}'],state:[{t:2,x:{r:["data.snode_researched"],s:'_0?"disabled":null'},p:[6,69,384]}]},f:[{t:2,x:{r:["data.snode_researched"],s:'_0?"Researched":"Research Node"'},p:[6,115,430]}]}]}," ",{p:[8,2,518],t:7,e:"ui-display",a:{title:"Prerequisites"},f:[{t:4,f:[{p:[10,4,588],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[10,52,636]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[10,69,653]}]},f:[{t:2,r:"display_name",p:[10,114,698]}]}],n:52,r:"data.node_prereqs",p:[9,3,556]}]}," ",{p:[13,2,759],t:7,e:"ui-display",a:{title:"Unlocks"},f:[{t:4,f:[{p:[15,4,823],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[15,52,871]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[15,69,888]}]},f:[{t:2,r:"display_name",p:[15,114,933]}]}],n:52,r:"data.node_unlocks",p:[14,3,791]}]}," ",{p:[18,2,994],t:7,e:"ui-display",a:{title:"Designs"},f:[{t:4,f:[{p:[20,4,1058],t:7,e:"ui-button",a:{action:"select_design",params:['{"id": "',{t:2,r:"id",p:[20,54,1108]},'"}'],state:[{t:2,x:{r:["data.sdesign_id","id"],s:'_0==_1?"selected":null'},p:[20,71,1125]}]},f:[{t:2,r:"name",p:[20,118,1172]}]}],n:52,r:"data.node_designs",p:[19,3,1026]}]}],n:50,r:"data.node_selected",p:[1,1,0]},{t:4,f:[{p:[25,2,1263],t:7,e:"ui-display",a:{title:"No Node Selected."}}],n:50,x:{r:["data.node_selected"],s:"!_0"},p:[24,1,1233]}]},e.exports=a.extend(r.exports)},{341:341}],448:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[3,3,59],t:7,e:"ui-display",a:{title:"Protolathe Busy!"}}],n:50,r:"data.protobusy",p:[2,2,33]},{t:4,n:51,f:[{p:[5,3,124],t:7,e:"ui-display",f:[{p:[6,4,141],t:7,e:"ui-section",f:["Search Available Designs: ",{p:[7,4,183],t:7,e:"input",a:{value:[{t:2,r:"textsearch",p:[7,17,196]}],placeholder:"Type Here","class":"text"}}," ",{p:[8,5,255],t:7,e:"ui-button",a:{action:"textSearch",params:['{"latheType" : "proto", "inputText" : ',{t:2,r:"textsearch",p:[8,82,332]},"}"]},f:["Search"]}]}," ",{p:[10,4,390],t:7,e:"ui-section",f:["Materials: ",{t:2,r:"data.protomats",p:[10,27,413]}," / ",{t:2,r:"data.protomaxmats",p:[10,48,434]}]}," ",{p:[11,4,473],t:7,e:"ui-section",f:["Reagents: ",{t:2,r:"data.protochems",p:[11,26,495]}," / ",{t:2,r:"data.protomaxchems",p:[11,48,517]}]}," ",{p:[12,3,556],t:7,e:"ui-display",f:[{p:[14,3,574],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.lathe_tabs",p:[14,18,589]}]},f:[{p:[15,4,615],t:7,e:"tab",a:{name:"Category List"},f:[{t:4,f:[{p:[17,6,678],t:7,e:"ui-button",a:{action:"switchcat",state:[{t:2,x:{r:["data.protocat","name"],s:'_0==_1?"selected":null'},p:[17,43,715]}],params:['{"type" : "proto", "cat" : "',{t:2,r:"name",p:[17,125,797]},'"}']},f:[{t:2,r:"name",p:[17,137,809]}]}],n:52,r:"data.protocats",p:[16,5,647]}]}," ",{p:[20,4,860],t:7,e:"tab",a:{name:"Selected Category"},f:[{t:4,f:[{p:[22,6,926],t:7,e:"ui-section",f:[{t:2,r:"name",p:[22,18,938]},{t:2,r:"matstring",p:[22,26,946]}," ",{t:4,f:[{p:[24,8,996],t:7,e:"input",a:{value:[{t:2,r:"number",p:[24,21,1009]}],placeholder:["1-",{t:2,x:{r:["canprint"],s:"_0>10?10:_0"},p:[24,47,1035]}],"class":"number"}}],n:50,x:{r:["canprint"],s:"_0>1"},p:[23,7,967]}," ",{p:[26,7,1108],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[26,40,1141]}],params:['{"latheType" : "proto", "id" : "',{t:2,r:"id",p:[26,117,1218]},'", "amount" : "',{t:2,r:"number",p:[26,138,1239]},'"}']},f:["Print"]}]}],n:52,r:"data.protodes",p:[21,5,896]}]}," ",{p:[30,4,1321],t:7,e:"tab",a:{name:"Search Results"},f:[{t:4,f:[{p:[32,6,1386],t:7,e:"ui-section",f:[{t:2,r:"name",p:[32,18,1398]},{t:2,r:"matstring",p:[32,26,1406]}," ",{t:4,f:[{p:[34,8,1456],t:7,e:"input",a:{value:[{t:2,r:"number",p:[34,21,1469]}],placeholder:["1-",{t:2,x:{r:["canprint"],s:"_0>10?10:_0"},p:[34,47,1495]}],"class":"number"}}],n:50,x:{r:["canprint"],s:"_0>1"},p:[33,7,1427]}," ",{p:[36,7,1568],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[36,40,1601]}],params:['{"latheType" : "proto", "id" : "',{t:2,r:"id",p:[36,117,1678]},'", "amount" : "',{t:2,r:"number",p:[36,138,1699]},'"}']},f:["Print"]}]}],n:52,r:"data.protomatch",p:[31,5,1354]}]}," ",{p:[40,4,1781],t:7,e:"tab",a:{name:"Materials"},f:[{t:4,f:[{p:[42,6,1844],t:7,e:"ui-section",f:[{t:2,r:"name",p:[42,18,1856]}," : ",{t:2,r:"amount",p:[42,29,1867]}," cm3 - ",{t:4,f:[{p:[44,7,1917],t:7,e:"input",a:{value:[{t:2,r:"number",p:[44,20,1930]}],placeholder:["1-",{t:2,r:"sheets",p:[44,46,1956]}],"class":"number"}}," ",{p:[45,7,1992],t:7,e:"ui-button",a:{action:"releasemats",params:['{"latheType" : "proto", "mat_id" : ',{t:2,r:"mat_id",p:[45,82,2067]},', "sheets" : ',{t:2,r:"number",p:[45,105,2090]},"}"]},f:["Release"]}],n:50,x:{r:["sheets"],s:"_0>0"},p:[43,6,1891]}]}],n:52,r:"data.protomat_list",p:[41,5,1809]}]}," ",{p:[50,4,2187],t:7,e:"tab",a:{name:"Chemicals"},f:[{t:4,f:[{p:[52,6,2251],t:7,e:"ui-section",f:[{t:2,r:"name",p:[52,18,2263]}," : ",{t:2,r:"amount",p:[52,29,2274]}," - ",{p:[53,7,2295],t:7,e:"ui-button",a:{action:"purgechem",params:['{"latheType" : "proto", "name" : ',{t:2,r:"name",p:[53,78,2366]},', "id" : ',{t:2,r:"reagentid",p:[53,95,2383]},"}"]},f:["Purge"]}]}],n:52,r:"data.protochem_list",p:[51,5,2215]}]}]}]}]}],r:"data.protobusy"}],n:50,r:"data.protolathe_linked",p:[1,1,0]},{t:4,n:51,f:[{p:[61,2,2504],t:7,e:"ui-display",a:{title:"No Linked Protolathe"}}],r:"data.protolathe_linked"}]},e.exports=a.extend(r.exports)},{341:341}],449:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,1,14],t:7,e:"span",a:{"class":"memoedit"},f:["Nanotrasen R&D Console"]},{p:[2,53,66],t:7,e:"br"}," Available Points: ",{p:[3,19,91],t:7,e:"ui-section",a:{title:"Research Points"},f:[{t:2,r:"data.research_points_stored",p:[3,55,127]}]}," ",{p:[4,1,173],t:7,e:"ui-section",a:{title:["Page Selection - ",{t:2,r:"page",p:[4,37,209]}]},f:[{p:[4,47,219],t:7,e:"input",a:{value:[{t:2,r:"pageselect",p:[4,60,232]}],placeholder:"1","class":"number"}}," Select Page: ",{p:[5,14,294],t:7,e:"ui-button",a:{action:"page",params:['{"num" : "',{t:2,r:"pageselect",p:[5,57,337]},'"}']},f:["[Go]"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],450:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"span",a:{"class":"bad"},f:["Settings"]},{p:[1,34,33],t:7,e:"br"},{p:[1,39,38],t:7,e:"br"}," ",{p:[2,1,45],t:7,e:"ui-button",a:{action:"Resync"},f:["RESYNC MACHINERY"]},{p:[2,56,100],t:7,e:"br"}," ",{p:[3,1,107],t:7,e:"ui-button",a:{action:"Lock"},f:["LOCK"]}," ",{p:[4,1,150],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "destroy"}',state:[{t:2,x:{r:["data.destroy_linked"],s:'_0?null:"disabled"'},p:[4,71,220]}]},f:["Disconnect Destructive Analyzer"]}," ",{p:[5,1,309],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "lathe"}',state:[{t:2,x:{r:["data.protolathe_linked"],s:'_0?null:"disabled"'},p:[5,69,377]}]},f:["Disconnect Protolathe"]}," ",{p:[6,1,459],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "imprinter"}',state:[{t:2,x:{r:["data.circuit_linked"],s:'_0?null:"disabled"'},p:[6,73,531]}]},f:["Disconnect Circuit Imprinter"]}]},e.exports=a.extend(r.exports)},{341:341}],451:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Available for Research"},f:[{t:4,f:[{p:[3,3,78],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[3,51,126]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[3,68,143]}]},f:[{t:2,r:"display_name",p:[3,113,188]}]}],n:52,r:"data.techweb_avail",p:[2,2,46]}]}," ",{p:[6,1,245],t:7,e:"ui-display",a:{title:"Locked Nodes"},f:[{t:4,f:[{p:[8,3,314],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[8,51,362]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[8,68,379]}]},f:[{t:2,r:"display_name",p:[8,113,424]}]}],n:52,r:"data.techweb_locked",p:[7,2,281]}]}," ",{p:[11,1,482],t:7,e:"ui-display",a:{title:"Researched Nodes"},f:[{t:4,f:[{p:[13,3,559],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[13,51,607]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[13,68,624]}]},f:[{t:2,r:"display_name",p:[13,113,669]}]}],n:52,r:"data.techweb_researched",p:[12,2,522]}]}]},e.exports=a.extend(r.exports)},{341:341}],452:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,1,25],t:7,e:"ui-notice",f:[{p:[3,3,40],t:7,e:"span",f:["The grinder is currently processing and cannot be used."]}]}],n:50,r:"data.processing",p:[1,1,0]},{p:{button:[{p:[8,5,208],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.operating","data.contents"],s:'(_0==0)&&_1?null:"disabled"'},p:[8,36,239]}],action:"eject"},f:["Eject Contents"]}]},t:7,e:"ui-display",a:{title:"Processing Chamber",button:0},f:[" ",{p:[10,3,364],t:7,e:"ui-section",a:{label:"Grinding"},f:[{p:[11,5,399],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.operating"],s:'_0?"average":"good"'},p:[11,18,412]}]},f:[{t:2,x:{r:["data.operating"],s:'_0?"Busy":"Ready"'},p:[11,59,453]}]}," ",{p:[12,2,500],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.operating","data.contents"],s:'(_0==0)&&_1?null:"disabled"'},p:[12,35,533]}],action:"grind"},f:["Activate"]}]}," ",{p:[14,3,653],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{t:4,f:[{p:[17,9,755],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:["The ",{t:2,r:"name",p:[17,56,802]}]},{p:[17,71,817],t:7,e:"br"}],n:52,r:"adata.contentslist",p:[16,7,717]},{t:4,n:51,f:[{p:[19,9,848],t:7,e:"span",f:["No Contents"]}],r:"adata.contentslist"}],n:50,r:"data.contents",p:[15,5,688]},{t:4,n:51,f:[{p:[22,7,911],t:7,e:"span",f:["No Contents"]}],r:"data.contents"}]}]}," ",{p:{button:[{p:[28,5,1047],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.operating","data.isBeakerLoaded"],s:'(_0==0)&&_1?null:"disabled"'},p:[28,36,1078]}],action:"detach"},f:["Detach"]}]},t:7,e:"ui-display",a:{title:"Container",button:0},f:[" ",{p:[30,3,1202],t:7,e:"ui-section",a:{label:"Reagents"},f:[{t:4,f:[{p:[32,7,1272],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[32,13,1278]},"/",{t:2,r:"data.beakerMaxVolume",p:[32,55,1320]}," Units"]}," ",{p:[33,7,1365],t:7,e:"br"}," ",{t:4,f:[{p:[35,9,1418],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[35,52,1461]}," units of ",{t:2,r:"name",p:[35,87,1496]}]},{p:[35,102,1511],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[34,7,1378]},{t:4,n:51,f:[{p:[37,9,1542],t:7,e:"span",a:{"class":"bad"},f:["Container Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[31,5,1237]},{t:4,n:51,f:[{p:[40,7,1621],t:7,e:"span",a:{"class":"average"},f:["No Container"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],453:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Direction"},f:[{t:4,f:[{p:[3,3,64],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,5,105],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[5,23,123]}],action:"setdir",params:['{"dir": ',{t:2,r:"dir",p:[6,22,195]},', "flipped": ',{t:2,r:"flipped",p:[6,42,215]},"}"]},f:[{p:[6,56,229],t:7,e:"span",a:{"class":["pipes32x32 ",{t:2,r:"dir",p:[6,80,253]},"-",{t:2,r:"icon_state",p:[6,88,261]}],title:[{t:2,r:"dir_name",p:[6,111,284]}]}}]}],n:52,r:"previews",p:[4,4,81]}]}],n:52,r:"data.preview_rows",p:[2,2,33]}]}," ",{t:4,f:[{p:[12,2,406],t:7,e:"ui-display",a:{title:"Color"},f:[{t:4,f:[{p:[14,4,468],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["@key","data.selected_color"],s:'_0==_1?"selected":null'},p:[14,22,486]}],action:"color",params:['{"paint_color": ',{t:2,r:"@key",p:[15,44,583]},"}"]},f:[{t:2,r:"@key",p:[15,55,594]}]}],n:52,r:"data.paint_colors",p:[13,3,436]}]}],n:50,x:{r:["data.category"],s:"_0==0"},p:[11,1,377]},{p:[19,1,654],t:7,e:"ui-display",a:{title:"Utilities"},f:[{p:[20,2,687],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&1?"check-square-o":"square-o"'},p:[20,19,704]}],action:"mode",params:'{"mode": 1}'},f:["Build"]}," ",{p:[22,2,813],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&2?"check-square-o":"square-o"'},p:[22,19,830]}],action:"mode",params:'{"mode": 2}'},f:["Wrench"]}," ",{p:[24,2,940],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&4?"check-square-o":"square-o"'},p:[24,19,957]}],action:"mode",params:'{"mode": 4}'},f:["Destroy"]}," ",{t:4,f:[{p:[27,3,1098],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&8?"check-square-o":"square-o"'},p:[27,20,1115]}],action:"mode",params:'{"mode": 8}'},f:["Paint"]}],n:50,x:{r:["data.category"],s:"_0==0"},p:[26,2,1068]}]}," ",{p:[31,1,1249],t:7,e:"ui-display",a:{title:"Category"},f:[{p:[32,2,1281],t:7,e:"ui-section",f:[{p:[33,3,1297],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.category"],s:'_0==0?"check-square-o":"square-o"'},p:[33,20,1314]}],state:[{t:2,x:{r:["data.category"],s:'_0<=0?"selected":null'},p:[33,83,1377]}],action:"category",params:'{"category": 0}'},f:["Atmospherics"]}," ",{p:[35,3,1496],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.category"],s:'_0==1?"check-square-o":"square-o"'},p:[35,20,1513]}],state:[{t:2,x:{r:["data.category"],s:'_0==1?"selected":null'},p:[35,83,1576]}],action:"category",params:'{"category": 1}'},f:["Disposals"]}," ",{p:[37,3,1692],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.category"],s:'_0==2?"check-square-o":"square-o"'},p:[37,20,1709]}],state:[{t:2,x:{r:["data.category"],s:'_0==2?"selected":null'},p:[37,83,1772]}],action:"category",params:'{"category": 2}'},f:["Transit Tubes"]}]}," ",{t:4,f:[{p:[41,3,1937],t:7,e:"ui-section",a:{label:"Piping Layer"},f:[{p:[42,4,1975],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==1?"selected":null'},p:[42,22,1993]}],action:"piping_layer",params:'{"piping_layer": 1}'},f:["1"]}," ",{p:[44,4,2115],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==2?"selected":null'},p:[44,22,2133]}],action:"piping_layer",params:'{"piping_layer": 2}'},f:["2"]}," ",{p:[46,4,2255],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==3?"selected":null'},p:[46,22,2273]}],action:"piping_layer",params:'{"piping_layer": 3}'},f:["3"]}]}],n:50,x:{r:["data.category"],s:"_0==0"},p:[40,2,1907]}]}," ",{t:4,f:[{p:[52,2,2462],t:7,e:"ui-display",a:{title:[{t:2,r:"cat_name",p:[52,21,2481]}]},f:[{t:4,f:[{p:[54,4,2521],t:7,e:"ui-section",f:[{p:[55,5,2539],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[55,23,2557]}],action:"pipe_type",params:['{"pipe_type": ',{t:2,r:"pipe_index",p:[56,28,2638]},', "category": ',{t:2,r:"cat_name",p:[56,56,2666]},"}"]},f:[{t:2,r:"pipe_name",p:[56,71,2681]}]}]}],n:52,r:"recipes",p:[53,3,2499]}]}],n:52,r:"data.categories",p:[51,1,2434]}]},e.exports=a.extend(r.exports)},{341:341}],454:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Color"},f:[{t:4,f:[{p:[3,3,60],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[3,21,78]}],action:"color",params:['{"paint_color": ',{t:2,r:"color_name",p:[4,28,155]},"}"]},f:[{t:2,r:"color_name",p:[4,45,172]}]}],n:52,r:"data.paint_colors",p:[2,2,29]}]}]},e.exports=a.extend(r.exports)},{341:341}],455:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Direction"},f:[{t:4,f:[{p:[3,3,64],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,5,105],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[5,23,123]}],action:"setdir",params:['{"dir": ',{t:2,r:"dir",p:[6,22,195]},', "flipped": ',{t:2,r:"flipped",p:[6,42,215]},"}"]},f:[{p:[6,56,229],t:7,e:"img",a:{src:["pipe.",{t:2,r:"dir",p:[6,71,244]},".",{t:2,r:"icon_state",p:[6,79,252]},".png"],title:[{t:2,r:"dir_name",p:[6,106,279]}]}}]}],n:52,r:"previews",p:[4,4,81]}]}],n:52,r:"data.preview_rows",p:[2,2,33]}]}]},e.exports=a.extend(r.exports)},{341:341}],456:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,23],t:7,e:"ui-notice",f:[{t:2,r:"data.notice",p:[3,5,40]}]}],n:50,r:"data.notice",p:[1,1,0]},{p:[6,1,82],t:7,e:"ui-display",a:{title:"Satellite Network Control",button:0},f:[{t:4,f:[{p:[8,4,168],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[9,9,209],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[9,31,231]}]}," ",{p:[10,9,253],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"mode",p:[10,30,274]}]}," ",{p:[11,9,298],t:7,e:"div",a:{"class":"content"},f:[{p:[12,11,331],t:7,e:"ui-button",a:{action:"toggle",params:['{"id": "',{t:2,r:"id",p:[12,54,374]},'"}']},f:[{t:2,x:{r:["active"],s:'_0?"Deactivate":"Activate"'},p:[12,64,384]}]}]}]}],n:52,r:"data.satellites",p:[7,2,138]}]}," ",{t:4,f:[{p:[18,1,528],t:7,e:"ui-display",a:{title:"Station Shield Coverage"},f:[{p:[19,3,576],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.meteor_shield_coverage_max",p:[19,24,597]}],value:[{t:2,r:"data.meteor_shield_coverage",p:[19,68,641]}]},f:[{t:2,x:{r:["data.meteor_shield_coverage","data.meteor_shield_coverage_max"],s:"100*_0/_1"},p:[19,101,674]}," %"]}," ",{p:[20,1,758],t:7,e:"ui-display",f:[]}]}],n:50,r:"data.meteor_shield",p:[17,1,500]}]},e.exports=a.extend(r.exports)},{341:341}],457:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,26],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["enabled"],s:'_0?"check-square-o":"square-o"'},p:[2,20,43]}],style:[{t:2,x:{r:["enabled"],s:'_0?"selected":null'},p:[2,72,95]}],action:"toggle_filter",params:['{"id_tag": "',{t:2,r:"id_tag",p:[3,48,176]},'", "val": ',{t:2,r:"gas_id",p:[3,68,196]},"}"]},f:[{t:2,r:"gas_name",p:[3,81,209]}]}],n:52,r:"filter_types",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],458:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" "," "," ",{p:[5,1,200],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.tabs",p:[5,16,215]}]},f:[{p:[6,2,233],t:7,e:"tab",a:{name:"Status"},f:[{p:[7,3,256],t:7,e:"status"}]}," ",{p:[9,2,277],t:7,e:"tab",a:{name:"Templates"},f:[{p:[10,3,303],t:7,e:"templates"}]}," ",{p:[12,2,327],t:7,e:"tab",a:{name:"Modification"},f:[{t:4,f:[{p:[14,3,381],t:7,e:"modification"}],n:50,r:"data.selected",p:[13,3,356]}," ",{t:4,f:[{p:[17,3,437],t:7,e:"span",a:{"class":"bad"},f:["No shuttle selected."]}],n:50,x:{r:["data.selected"],s:"!_0"},p:[16,3,411]}]}]}]},r.exports.components=r.exports.components||{};var i={modification:t(459),templates:t(461),status:t(460)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,459:459,460:460,461:461}],459:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:["Selected: ",{t:2,r:"data.selected.name",p:[1,30,29]}]},f:[{t:4,f:[{p:[3,5,96],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.selected.description",p:[3,37,128]}]}],n:50,r:"data.selected.description",p:[2,3,57]}," ",{t:4,f:[{p:[6,5,224],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"data.selected.admin_notes",p:[6,37,256]}]}],n:50,r:"data.selected.admin_notes",p:[5,3,185]}]}," ",{t:4,f:[{p:[11,3,361],t:7,e:"ui-display",a:{title:["Existing Shuttle: ",{t:2,r:"data.existing_shuttle.name",p:[11,40,398]}]},f:["Status: ",{t:2,r:"data.existing_shuttle.status",p:[12,13,444]}," ",{t:4,f:["(",{t:2,r:"data.existing_shuttle.timeleft",p:[14,8,526]},")"],n:50,r:"data.existing_shuttle.timer",p:[13,5,482]}," ",{p:[16,5,580],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"data.existing_shuttle.id",p:[17,41,649]},'"}']},f:["Jump To"]}]}],n:50,r:"data.existing_shuttle",p:[10,1,328]},{t:4,f:[{p:[24,3,778],t:7,e:"ui-display",a:{title:"Existing Shuttle: None"}}],n:50,x:{r:["data.existing_shuttle"],s:"!_0"},p:[23,1,744]},{p:[27,1,847],t:7,e:"ui-button",a:{action:"preview",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[28,27,902]},'"}']},f:["Preview"]}," ",{p:[31,1,961],t:7,e:"ui-button",a:{action:"load",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[32,27,1013]},'"}'],style:"danger"},f:["Load"]}," ",{p:[37,1,1089],t:7,e:"ui-display",a:{title:"Status"},f:[]}]},e.exports=a.extend(r.exports)},{341:341}],460:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"table",a:{width:"100%"},f:[{t:4,f:[{p:[3,3,49],t:7,e:"tr",f:[{p:[4,5,59],t:7,e:"td",f:[{p:[5,7,71],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"id",p:[5,69,133]},'"}']},f:["JMP"]}]}," ",{p:[9,5,193],t:7,e:"td",f:[{p:[10,7,205],t:7,e:"ui-button",a:{action:"fly",params:['{"id": "',{t:2,r:"id",p:[10,47,245]},'"}'],state:[{t:2,x:{r:["can_fly"],s:'_0?null:"disabled"'},p:[10,64,262]}]},f:["Fly"]}]}," ",{p:[14,5,345],t:7,e:"td",f:[{t:2,r:"name",p:[15,7,357]}," (",{p:[15,17,367],t:7,e:"code",f:[{t:2,r:"id",p:[15,23,373]}]},")"]}," ",{p:[17,5,404],t:7,e:"td",f:[{t:2,r:"status",p:[18,7,416]}]}," ",{p:[20,5,443],t:7,e:"td",f:[{t:4,f:[{t:2,r:"mode",p:[22,9,477]}],n:50,r:"mode",p:[21,7,455]}," ",{t:4,f:["(",{t:2,r:"timeleft",p:[25,10,532]},") ",{p:[26,9,555],t:7,e:"ui-button",a:{action:"fast_travel",params:['{"id": "',{t:2,r:"id",p:[26,57,603]},'"}'],state:[{t:2,x:{r:["can_fast_travel"],s:'_0?null:"disabled"'},p:[26,74,620]}]},f:["Fast Travel"]}],n:50,r:"timer",p:[24,7,508]}]}]}],n:52,r:"data.shuttles",p:[2,1,22]}]}]},e.exports=a.extend(r.exports)},{341:341}],461:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.templates_tabs",p:[1,16,15]}]},f:[{t:4,f:[{p:[3,5,74],t:7,e:"tab",a:{name:[{t:2,r:"port_id",p:[3,16,85]}]},f:[{t:4,f:[{p:[5,9,135],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[5,28,154]}]},f:[{t:4,f:[{p:[7,13,209],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"description",p:[7,45,241]}]}],n:50,r:"description",p:[6,11,176]}," ",{t:4,f:[{p:[10,13,333],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"admin_notes",p:[10,45,365]}]}],n:50,r:"admin_notes",p:[9,11,300]}," ",{p:[13,11,426],t:7,e:"ui-button",a:{action:"select_template",params:['{"shuttle_id": "',{t:2,r:"shuttle_id",p:[14,37,499]},'"}'],state:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"selected":null'},p:[15,20,537]}]},f:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"Selected":"Select"'},p:[17,13,630]}]}]}],n:52,r:"templates",p:[4,7,106]}]}],n:52,r:"data.templates",p:[2,3,44]}]}]},e.exports=a.extend(r.exports)},{341:341}],462:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,186],t:7,e:"ui-section",a:{label:"State"},f:[{p:[7,7,220],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[7,20,233]}]},f:[{t:2,r:"data.occupant.stat",p:[7,49,262]}]}]}," ",{p:[9,5,315],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[10,7,350],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[10,20,363]}],max:[{t:2,r:"data.occupant.maxHealth",p:[10,54,397]}],value:[{t:2,r:"data.occupant.health",p:[10,90,433]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[11,16,475]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[11,68,527]}]}]}," ",{t:4,f:[{p:[14,7,764],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[14,26,783]}]},f:[{p:[15,9,804],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[15,30,825]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[15,66,861]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[15,103,898]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[13,5,598]}," ",{t:4,f:[{p:[19,7,1020],t:7,e:"ui-section",a:{label:"Blood"},f:[{p:[20,9,1056],t:7,e:"ui-section",a:{label:"Volume"},f:[{p:[21,11,1095],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.blood.maxBloodVolume",p:[21,32,1116]}],value:[{t:2,r:"data.occupant.blood.currentBloodVolume",p:[21,79,1163]}],state:[{t:2,x:{r:["data.occupant.blood.currentBloodVolume","data.occupant.blood.dangerBloodVolume"],s:'_0<=_1?"bad":"good"'},p:[21,130,1214]}]},f:[{t:3,x:{r:["data.occupant.blood.currentBloodVolume","data.occupant.blood.dangerBloodVolume"],s:'_0<=_1?"LOW":"OK"'},p:[21,232,1316]}," - ",{t:2,x:{r:["data.occupant.blood.currentBloodVolume"],s:"Math.round(_0)"},p:[21,342,1426]}," cl"]}]}," ",{p:[23,9,1525],t:7,e:"ui-section",a:{label:"Type"},f:[{p:[24,11,1562],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:"data.occupant.blood.bloodType",p:[24,35,1586]}]}]}]}],n:50,r:"data.occupant.blood",p:[18,5,985]}," ",{p:[28,5,1689],t:7,e:"ui-section",a:{label:"Cells"},f:[{p:[29,9,1725],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"bad":"good"'},p:[29,22,1738]}]},f:[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"Damaged":"Healthy"'},p:[29,68,1784]}]}]}," ",{p:[31,5,1867],t:7,e:"ui-section",a:{label:"Brain"},f:[{p:[32,9,1903],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"bad":"good"'},p:[32,22,1916]}]},f:[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"Abnormal":"Healthy"'},p:[32,68,1962]}]}]}," ",{p:[34,5,2046],t:7,e:"ui-section",a:{label:"Bloodstream"},f:[{t:4,f:[{p:[36,11,2133],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,1)"},p:[36,54,2176]}," units of ",{t:2,r:"name",p:[36,89,2211]}]},{p:[36,104,2226],t:7,e:"br" +}],n:52,r:"adata.occupant.reagents",p:[35,9,2088]},{t:4,n:51,f:[{p:[38,11,2261],t:7,e:"span",a:{"class":"good"},f:["Pure"]}],r:"adata.occupant.reagents"}]}],n:50,r:"data.occupied",p:[5,3,159]}]}," ",{p:[43,1,2357],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[44,2,2389],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[45,5,2420],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[45,22,2437]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[45,71,2486]}]}]}," ",{p:[47,3,2551],t:7,e:"ui-section",a:{label:"Inject"},f:[{t:4,f:[{p:[49,7,2612],t:7,e:"ui-button",a:{icon:"flask",state:[{t:2,x:{r:["data.occupied","allowed"],s:'_0&&_1?null:"disabled"'},p:[49,38,2643]}],action:"inject",params:['{"chem": "',{t:2,r:"id",p:[49,122,2727]},'"}']},f:[{t:2,r:"name",p:[49,132,2737]}]},{p:[49,152,2757],t:7,e:"br"}],n:52,r:"data.chems",p:[48,5,2584]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],463:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,25],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[2,22,44]}],labelcolor:[{t:2,r:"htmlcolor",p:[2,44,66]}],candystripe:0,right:0},f:[{p:[3,5,105],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[3,32,132],t:7,e:"span",a:{"class":[{t:2,x:{r:["status"],s:'_0=="Dead"?"bad bold":_0=="Unconscious"?"average bold":"good"'},p:[3,45,145]}]},f:[{t:2,r:"status",p:[3,132,232]}]}]}," ",{p:[4,5,268],t:7,e:"ui-section",a:{label:"Jelly"},f:[{t:2,r:"exoticblood",p:[4,31,294]}]}," ",{p:[5,5,328],t:7,e:"ui-section",a:{label:"Location"},f:[{t:2,r:"area",p:[5,34,357]}]}," ",{p:[7,5,386],t:7,e:"ui-button",a:{state:[{t:2,r:"swap_button_state",p:[8,14,411]}],action:"swap",params:['{"ref": "',{t:2,r:"ref",p:[9,38,472]},'"}']},f:[{t:4,f:["You Are Here"],n:50,x:{r:["occupied"],s:'_0=="owner"'},p:[10,7,491]},{t:4,n:51,f:[{t:4,f:["Occupied"],n:50,x:{r:["occupied"],s:'_0=="stranger"'},p:[13,9,566]},{t:4,n:51,f:["Swap"],x:{r:["occupied"],s:'_0=="stranger"'}}],x:{r:["occupied"],s:'_0=="owner"'}}]}]}],n:52,r:"data.bodies",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],464:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{t:4,f:[{p:[4,23,82],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.drying"],s:'_0?"stop":"tint"'},p:[4,40,99]}],action:"Dry"},f:[{t:2,x:{r:["data.drying"],s:'_0?"Stop drying":"Dry"'},p:[4,88,147]}]}],n:50,r:"data.isdryer",p:[4,3,62]}]},t:7,e:"ui-display",a:{title:"Storage",button:0},f:[" ",{t:4,f:[{p:[7,3,258],t:7,e:"ui-notice",f:[{p:[8,5,275],t:7,e:"span",f:["Unfortunately, this ",{t:2,r:"data.name",p:[8,31,301]}," is empty."]}]}],n:50,x:{r:["data.contents.length"],s:"_0==0"},p:[6,1,221]},{t:4,n:51,f:[{p:[11,1,359],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[12,2,391],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[13,4,425],t:7,e:"section",a:{"class":"cell bold"},f:["Item"]}," ",{p:[16,4,482],t:7,e:"section",a:{"class":"cell bold"},f:["Quantity"]}," ",{p:[19,4,543],t:7,e:"section",a:{"class":"cell bold",align:"center"},f:[{t:4,f:[{t:2,r:"data.verb",p:[20,22,608]}],n:50,r:"data.verb",p:[20,5,591]},{t:4,n:51,f:["Dispense"],r:"data.verb"}]}]}," ",{t:4,f:[{p:[24,3,703],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[25,4,737],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[26,5,765]}]}," ",{p:[28,4,793],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[29,5,835]}]}," ",{p:[31,4,865],t:7,e:"section",a:{"class":"table",alight:"right"},f:[{p:[32,5,909],t:7,e:"section",a:{"class":"cell"}}," ",{p:[33,5,947],t:7,e:"section",a:{"class":"cell"},f:[{p:[34,6,976],t:7,e:"ui-button",a:{grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[34,45,1015]}],params:['{ "name" : ',{t:2,r:"name",p:[34,102,1072]},', "amount" : 1 }']},f:["One"]}]}," ",{p:[38,5,1151],t:7,e:"section",a:{"class":"cell"},f:[{p:[39,6,1180],t:7,e:"ui-button",a:{grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>1)?null:"disabled"'},p:[39,45,1219]}],params:['{ "name" : ',{t:2,r:"name",p:[39,101,1275]}," }"]},f:["Many"]}]}]}]}],n:52,r:"data.contents",p:[23,2,676]}]}],x:{r:["data.contents.length"],s:"_0==0"}}]}]},e.exports=a.extend(r.exports)},{341:341}],465:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{capacityPercentState:function(){var t=this.get("data.capacityPercent");return t>50?"good":t>15?"average":"bad"},inputState:function(){return this.get("data.capacityPercent")>=100?"good":this.get("data.inputting")?"average":"bad"},outputState:function(){return this.get("data.outputting")?"good":this.get("data.charge")>0?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[24,1,663],t:7,e:"ui-display",a:{title:"Storage"},f:[{p:[25,3,695],t:7,e:"ui-section",a:{label:"Stored Energy"},f:[{p:[26,5,735],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.capacityPercent",p:[26,38,768]}],state:[{t:2,r:"capacityPercentState",p:[26,71,801]}]},f:[{t:2,x:{r:["adata.capacityPercent"],s:"Math.fixed(_0)"},p:[26,97,827]},"%"]}]}]}," ",{p:[29,1,908],t:7,e:"ui-display",a:{title:"Input"},f:[{p:[30,3,938],t:7,e:"ui-section",a:{label:"Charge Mode"},f:[{p:[31,5,976],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"refresh":"close"'},p:[31,22,993]}],style:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"selected":null'},p:[31,74,1045]}],action:"tryinput"},f:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"Auto":"Off"'},p:[32,25,1113]}]},"   [",{p:[34,6,1182],t:7,e:"span",a:{"class":[{t:2,r:"inputState",p:[34,19,1195]}]},f:[{t:2,x:{r:["data.capacityPercent","data.inputting"],s:'_0>=100?"Fully Charged":_1?"Charging":"Not Charging"'},p:[34,35,1211]}]},"]"]}," ",{p:[36,3,1335],t:7,e:"ui-section",a:{label:"Target Input"},f:[{p:[37,5,1374],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.inputLevelMax",p:[37,26,1395]}],value:[{t:2,r:"data.inputLevel",p:[37,57,1426]}]},f:[{t:2,r:"adata.inputLevel_text",p:[37,78,1447]}]}]}," ",{p:[39,3,1501],t:7,e:"ui-section",a:{label:"Adjust Input"},f:[{p:[40,5,1540],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[40,44,1579]}],action:"input",params:'{"target": "min"}'}}," ",{p:[41,5,1674],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[41,39,1708]}],action:"input",params:'{"adjust": -10000}'}}," ",{p:[42,5,1804],t:7,e:"ui-button",a:{icon:"pencil",action:"input",params:'{"target": "input"}'},f:["Set"]}," ",{p:[43,5,1894],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[43,38,1927]}],action:"input",params:'{"adjust": 10000}'}}," ",{p:[44,5,2039],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[44,43,2077]}],action:"input",params:'{"target": "max"}'}}]}," ",{p:[46,3,2204],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[47,3,2238],t:7,e:"span",f:[{t:2,r:"adata.inputAvailable",p:[47,9,2244]}]}]}]}," ",{p:[50,1,2308],t:7,e:"ui-display",a:{title:"Output"},f:[{p:[51,3,2339],t:7,e:"ui-section",a:{label:"Output Mode"},f:[{p:[52,5,2377],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"power-off":"close"'},p:[52,22,2394]}],style:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"selected":null'},p:[52,77,2449]}],action:"tryoutput"},f:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"On":"Off"'},p:[53,26,2519]}]},"   [",{p:[55,6,2587],t:7,e:"span",a:{"class":[{t:2,r:"outputState",p:[55,19,2600]}]},f:[{t:2,x:{r:["data.outputting","data.charge"],s:'_0?"Sending":_1>0?"Not Sending":"No Charge"'},p:[55,36,2617]}]},"]"]}," ",{p:[57,3,2724],t:7,e:"ui-section",a:{label:"Target Output"},f:[{p:[58,5,2764],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.outputLevelMax",p:[58,26,2785]}],value:[{t:2,r:"data.outputLevel",p:[58,58,2817]}]},f:[{t:2,r:"adata.outputLevel_text",p:[58,80,2839]}]}]}," ",{p:[60,3,2894],t:7,e:"ui-section",a:{label:"Adjust Output"},f:[{p:[61,5,2934],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[61,44,2973]}],action:"output",params:'{"target": "min"}'}}," ",{p:[62,5,3070],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[62,39,3104]}],action:"output",params:'{"adjust": -10000}'}}," ",{p:[63,5,3202],t:7,e:"ui-button",a:{icon:"pencil",action:"output",params:'{"target": "input"}'},f:["Set"]}," ",{p:[64,5,3293],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[64,38,3326]}],action:"output",params:'{"adjust": 10000}'}}," ",{p:[65,5,3441],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[65,43,3479]}],action:"output",params:'{"target": "max"}'}}]}," ",{p:[67,3,3609],t:7,e:"ui-section",a:{label:"Outputting"},f:[{p:[68,3,3644],t:7,e:"span",f:[{t:2,r:"adata.outputUsed",p:[68,9,3650]}]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],466:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:["\ufeff",{t:4,f:[" ",{p:[2,2,33],t:7,e:"ui-display",a:{title:"Dispersal Tank"},f:[{p:[3,3,73],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[4,4,104],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.active"],s:'_0?"power-off":"close"'},p:[4,21,121]}],style:[{t:2,x:{r:["data.active"],s:'_0?"selected":null'},p:[5,12,174]}],state:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?null:"disabled"'},p:[6,12,223]}],action:"power"},f:[{t:2,x:{r:["data.active"],s:'_0?"On":"Off"'},p:[7,20,286]}]}]}," ",{p:[10,3,354],t:7,e:"ui-section",a:{label:"Smoke Radius Setting"},f:[{p:[11,5,401],t:7,e:"div",a:{"class":"content",style:"float:left"},f:[{p:[12,6,448],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=1?null:"disabled"'},p:[12,36,478]}],style:[{t:2,x:{r:["data.setting"],s:'_0==1?"selected":null'},p:[12,89,531]}],action:"setting",params:'{"amount": 1}'},f:["3"]}," ",{p:[13,6,634],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=2?null:"disabled"'},p:[13,36,664]}],style:[{t:2,x:{r:["data.setting"],s:'_0==2?"selected":null'},p:[13,89,717]}],action:"setting",params:'{"amount": 2}'},f:["6"]}," ",{p:[14,6,820],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=3?null:"disabled"'},p:[14,36,850]}],style:[{t:2,x:{r:["data.setting"],s:'_0==3?"selected":null'},p:[14,89,903]}],action:"setting",params:'{"amount": 3}'},f:["9"]}," ",{p:[15,6,1006],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=4?null:"disabled"'},p:[15,36,1036]}],style:[{t:2,x:{r:["data.setting"],s:'_0==4?"selected":null'},p:[15,89,1089]}],action:"setting",params:'{"amount": 4}'},f:["12"]}," ",{p:[16,6,1193],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=5?null:"disabled"'},p:[16,36,1223]}],style:[{t:2,x:{r:["data.setting"],s:'_0==5?"selected":null'},p:[16,89,1276]}],action:"setting",params:'{"amount": 5}'},f:["15"]}]}]}," ",{p:[19,3,1410],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[21,6,1476],t:7,e:"span",f:[{t:2,x:{r:["adata.TankCurrentVolume"],s:"Math.round(_0)"},p:[21,12,1482]},"/",{t:2,r:"data.TankMaxVolume",p:[21,52,1522]}," Units"]}," ",{p:[22,6,1564],t:7,e:"br"}," ",{p:[23,5,1575],t:7,e:"br"}," ",{t:4,f:[{p:[25,7,1623],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[25,50,1666]}," units of ",{t:2,r:"name",p:[25,85,1701]}]},{p:[25,100,1716],t:7,e:"br"}],n:52,r:"adata.TankContents",p:[24,6,1587]}],n:50,r:"data.isTankLoaded",p:[20,4,1444]},{t:4,n:51,f:[{p:[28,6,1757],t:7,e:"span",a:{"class":"bad"},f:["Tank Empty"]}],r:"data.isTankLoaded"}," ",{p:[30,4,1809],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"Eject":"Close"'},p:[30,21,1826]}],style:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"selected":null'},p:[31,12,1881]}],state:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?null:"disabled"'},p:[32,12,1936]}],action:"purge"},f:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"Purge Contents":"No chemicals detected"'},p:[33,20,1999]}]}]}]}],n:50,x:{r:["data.screen"],s:'_0=="home"'},p:[1,2,1]}]},e.exports=a.extend(r.exports)},{341:341}],467:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Generated Power"},f:[{t:2,x:{r:["adata.generated"],s:"Math.round(_0)"},p:[3,5,73]},"W"]}," ",{p:[5,3,126],t:7,e:"ui-section",a:{label:"Orientation"},f:[{p:[6,5,164],t:7,e:"span",f:[{t:2,x:{r:["adata.angle"],s:"Math.round(_0)"},p:[6,11,170]},"° (",{t:2,r:"data.direction",p:[6,45,204]},")"]}]}," ",{p:[8,3,251],t:7,e:"ui-section",a:{label:"Adjust Angle"},f:[{p:[9,5,290],t:7,e:"ui-button",a:{icon:"step-backward",action:"angle",params:'{"adjust": -15}'},f:["15°"]}," ",{p:[10,5,387],t:7,e:"ui-button",a:{icon:"backward",action:"angle",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[11,5,477],t:7,e:"ui-button",a:{icon:"forward",action:"angle",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[12,5,565],t:7,e:"ui-button",a:{icon:"step-forward",action:"angle",params:'{"adjust": 15}'},f:["15°"]}]}]}," ",{p:[15,1,687],t:7,e:"ui-display",a:{title:"Tracking"},f:[{p:[16,3,720],t:7,e:"ui-section",a:{label:"Tracker Mode"},f:[{p:[17,5,759],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==0?"selected":null'},p:[17,36,790]}],action:"tracking",params:'{"mode": 0}'},f:["Off"]}," ",{p:[19,5,907],t:7,e:"ui-button",a:{icon:"clock-o",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==1?"selected":null'},p:[19,38,940]}],action:"tracking",params:'{"mode": 1}'},f:["Timed"]}," ",{p:[21,5,1059],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.connected_tracker","data.tracking_state"],s:'_0?_1==2?"selected":null:"disabled"'},p:[21,38,1092]}],action:"tracking",params:'{"mode": 2}'},f:["Auto"]}]}," ",{p:[24,3,1262],t:7,e:"ui-section",a:{label:"Tracking Rate"},f:[{p:[25,3,1300],t:7,e:"span",f:[{t:2,x:{r:["adata.tracking_rate"],s:"Math.round(_0)"},p:[25,9,1306]},"°/h (",{t:2,r:"data.rotating_way",p:[25,53,1350]},")"]}]}," ",{p:[27,3,1399],t:7,e:"ui-section",a:{label:"Adjust Rate"},f:[{p:[28,5,1437],t:7,e:"ui-button",a:{icon:"fast-backward",action:"rate",params:'{"adjust": -180}'},f:["180°"]}," ",{p:[29,5,1535],t:7,e:"ui-button",a:{icon:"step-backward",action:"rate",params:'{"adjust": -30}'},f:["30°"]}," ",{p:[30,5,1631],t:7,e:"ui-button",a:{icon:"backward",action:"rate",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[31,5,1720],t:7,e:"ui-button",a:{icon:"forward",action:"rate",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[32,5,1807],t:7,e:"ui-button",a:{icon:"step-forward",action:"rate",params:'{"adjust": 30}'},f:["30°"]}," ",{p:[33,5,1901],t:7,e:"ui-button",a:{icon:"fast-forward",action:"rate",params:'{"adjust": 180}'},f:["180°"]}]}]}," ",{p:{button:[{p:[38,5,2088],t:7,e:"ui-button",a:{icon:"refresh",action:"refresh"},f:["Refresh"]}]},t:7,e:"ui-display",a:{title:"Devices",button:0},f:[" ",{p:[40,2,2169],t:7,e:"ui-section",a:{label:"Solar Tracker"},f:[{p:[41,5,2209],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_tracker"],s:'_0?"good":"bad"'},p:[41,18,2222]}]},f:[{t:2,x:{r:["data.connected_tracker"],s:'_0?"":"Not "'},p:[41,63,2267]},"Found"]}]}," ",{p:[43,2,2338],t:7,e:"ui-section",a:{label:"Solar Panels"},f:[{p:[44,3,2375],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_panels"],s:'_0?"good":"bad"'},p:[44,16,2388]}]},f:[{t:2,x:{r:["adata.connected_panels"],s:"Math.round(_0)"},p:[44,60,2432]}," Panels Connected"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],468:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{t:4,f:[{p:[4,7,87],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[4,38,118]}],action:"eject"},f:["Eject"]}],n:50,r:"data.open",p:[3,5,62]}]},t:7,e:"ui-display",a:{title:"Power",button:0},f:[" ",{p:[7,3,226],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[8,5,258],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[8,22,275]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[9,14,326]}],state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[9,54,366]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[10,22,431]}]}]}," ",{p:[12,3,490],t:7,e:"ui-section",a:{label:"Cell"},f:[{t:4,f:[{p:[14,7,554],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.powerLevel",p:[14,40,587]}]},f:[{t:2,x:{r:["adata.powerLevel"],s:"Math.fixed(_0)"},p:[14,61,608]},"%"]}],n:50,r:"data.hasPowercell",p:[13,5,521]},{t:4,n:51,f:[{p:[16,4,667],t:7,e:"span",a:{"class":"bad"},f:["No Cell"]}],r:"data.hasPowercell"}]}]}," ",{p:[20,1,744],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[21,3,779],t:7,e:"ui-section",a:{label:"Current Temperature"},f:[{p:[22,3,823],t:7,e:"span",f:[{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[22,9,829]},"°C"]}]}," ",{p:[24,2,894],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[25,3,937],t:7,e:"span",f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[25,9,943]},"°C"]}]}," ",{t:4,f:[{p:[28,5,1031],t:7,e:"ui-section",a:{label:"Adjust Target"},f:[{p:[29,7,1073],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[29,46,1112]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[30,7,1218],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[30,41,1252]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[31,7,1357],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:["Set"]}," ",{p:[32,7,1450],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[32,40,1483]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[33,7,1587],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[33,45,1625]}],action:"target",params:'{"adjust": 20}'}}]}],n:50,r:"data.open",p:[27,3,1008]}," ",{p:[36,3,1754],t:7,e:"ui-section",a:{label:"Mode"},f:[{t:4,f:[{p:[38,7,1808],t:7,e:"ui-button",a:{icon:"long-arrow-up",state:[{t:2,x:{r:["data.mode"],s:'_0=="heat"?"selected":null'},p:[38,46,1847]}],action:"mode",params:'{"mode": "heat"}'},f:["Heat"]}," ",{p:[39,7,1956],t:7,e:"ui-button",a:{icon:"long-arrow-down",state:[{t:2,x:{r:["data.mode"],s:'_0=="cool"?"selected":null'},p:[39,48,1997]}],action:"mode",params:'{"mode": "cool"}'},f:["Cool"]}," ",{p:[40,7,2106],t:7,e:"ui-button",a:{icon:"arrows-v",state:[{t:2,x:{r:["data.mode"],s:'_0=="auto"?"selected":null'},p:[40,41,2140]}],action:"mode",params:'{"mode": "auto"}'},f:["Auto"]}],n:50,r:"data.open",p:[37,3,1783]},{t:4,n:51,f:[{p:[42,4,2258],t:7,e:"span",f:[{t:2,x:{r:["text","data.mode"],s:"_0.titleCase(_1)"},p:[42,10,2264]}]}],r:"data.open"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],469:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:{button:[{p:[4,8,97],t:7,e:"ui-button",a:{action:"jump",params:['{"name" : ',{t:2,r:"name",p:[4,51,140]},"}"]},f:["Jump"]}," ",{p:[7,9,195],t:7,e:"ui-button",a:{action:"spawn",params:['{"name" : ',{t:2,r:"name",p:[7,53,239]},"}"]},f:["Spawn"]}]},t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[2,22,46]}],button:0},f:[" ",{p:[11,3,308],t:7,e:"ui-section",a:{label:"Description"},f:[{p:[12,5,346],t:7,e:"span",f:[{t:3,r:"desc",p:[12,11,352]}]}]}," ",{p:[14,3,390],t:7,e:"ui-section",a:{label:"Spawners left"},f:[{p:[15,5,430],t:7,e:"span",f:[{t:2,r:"amount_left",p:[15,11,436]}]}]}]}],n:52,r:"data.spawners",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],470:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,31],t:7,e:"ui-display",a:{title:[{t:2,r:"class",p:[2,22,50]}," Alarms"]},f:[{p:[3,5,74],t:7,e:"ul",f:[{t:4,f:[{p:[5,9,107],t:7,e:"li",f:[{t:2,r:".",p:[5,13,111]}]}],n:52,r:".",p:[4,7,86]},{t:4,n:51,f:[{p:[7,9,147],t:7,e:"li",f:["System Nominal"]}],r:"."}]}]}],n:52,i:"class",r:"data.alarms",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],471:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,42],t:7,e:"ui-notice",f:[{p:[3,5,59],t:7,e:"span",f:["Biological entity detected in contents. Please remove."]}]}],n:50,x:{r:["data.occupied","data.safeties"],s:"_0&&_1"},p:[1,1,0]},{t:4,f:[{p:[7,3,179],t:7,e:"ui-notice",f:[{p:[8,5,196],t:7,e:"span",f:["Contents are being disinfected. Please wait."]}]}],n:50,r:"data.uv_active",p:[6,1,153]},{t:4,n:51,f:[{p:{button:[{t:4,f:[{p:[13,25,369],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[13,42,386]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Unlock":"Lock"'},p:[13,93,437]}]}],n:50,x:{r:["data.open"],s:"!_0"},p:[13,7,351]}," ",{t:4,f:[{p:[14,27,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"sign-out":"sign-in"'},p:[14,44,536]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Close":"Open"'},p:[14,98,590]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[14,7,499]}]},t:7,e:"ui-display",a:{title:"Storage",button:0},f:[" ",{t:4,f:[{p:[17,7,692],t:7,e:"ui-notice",f:[{p:[18,9,713],t:7,e:"span",f:["Unit Locked"]}]}],n:50,r:"data.locked",p:[16,5,665]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.open"],s:"_0"},f:[{p:[21,9,793],t:7,e:"ui-section",a:{label:"Helmet"},f:[{p:[22,11,832],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.helmet"],s:'_0?"square":"square-o"'},p:[22,28,849]}],state:[{t:2,x:{r:["data.helmet"],s:'_0?null:"disabled"'},p:[22,75,896]}],action:"dispense",params:'{"item": "helmet"}'},f:[{t:2,x:{r:["data.helmet"],s:'_0||"Empty"'},p:[23,59,992]}]}]}," ",{p:[25,9,1063],t:7,e:"ui-section",a:{label:"Suit"},f:[{p:[26,11,1100],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.suit"],s:'_0?"square":"square-o"'},p:[26,28,1117]}],state:[{t:2,x:{r:["data.suit"],s:'_0?null:"disabled"'},p:[26,74,1163]}],action:"dispense",params:'{"item": "suit"}'},f:[{t:2,x:{r:["data.suit"],s:'_0||"Empty"'},p:[27,57,1255]}]}]}," ",{p:[29,9,1324],t:7,e:"ui-section",a:{label:"Mask"},f:[{p:[30,11,1361],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mask"],s:'_0?"square":"square-o"'},p:[30,28,1378]}],state:[{t:2,x:{r:["data.mask"],s:'_0?null:"disabled"'},p:[30,74,1424]}],action:"dispense",params:'{"item": "mask"}'},f:[{t:2,x:{r:["data.mask"],s:'_0||"Empty"'},p:[31,57,1516]}]}]}," ",{p:[33,9,1585],t:7,e:"ui-section",a:{label:"Storage"},f:[{p:[34,11,1625],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.storage"],s:'_0?"square":"square-o"'},p:[34,28,1642]}],state:[{t:2,x:{r:["data.storage"],s:'_0?null:"disabled"'},p:[34,77,1691]}],action:"dispense",params:'{"item": "storage"}'},f:[{t:2,x:{r:["data.storage"],s:'_0||"Empty"'},p:[35,60,1789]}]}]}]},{t:4,n:50,x:{r:["data.open"],s:"!(_0)"},f:[" ",{p:[38,7,1873],t:7,e:"ui-button",a:{icon:"recycle",state:[{t:2,x:{r:["data.occupied","data.safeties"],s:'_0&&_1?"disabled":null'},p:[38,40,1906]}],action:"uv"},f:["Disinfect"]}]}],r:"data.locked"}]}],r:"data.uv_active"}]},e.exports=a.extend(r.exports)},{341:341}],472:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,5,18],t:7,e:"ui-section",a:{label:"Dispense"},f:[{p:[3,9,57],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.plasma"],s:'_0?"square":"square-o"'},p:[3,26,74]}],state:[{t:2,x:{r:["data.plasma"],s:'_0?null:"disabled"'},p:[3,74,122]}],action:"plasma"},f:["Plasma (",{t:2,x:{r:["adata.plasma"],s:"Math.round(_0)"},p:[4,37,196]},")"]}," ",{p:[5,9,247],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.oxygen"],s:'_0?"square":"square-o"'},p:[5,26,264]}],state:[{t:2,x:{r:["data.oxygen"],s:'_0?null:"disabled"'},p:[5,74,312]}],action:"oxygen"},f:["Oxygen (",{t:2,x:{r:["adata.oxygen"],s:"Math.round(_0)"},p:[6,37,386]},")"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],473:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{tankPressureState:function(){var t=this.get("data.tankPressure");return t>=200?"good":t>=100?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[14,1,295],t:7,e:"ui-notice",f:[{p:[15,3,310],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.connected"],s:'_0?"is":"is not"'},p:[15,23,330]}," connected to a mask."]}]}," ",{p:[17,1,409],t:7,e:"ui-display",f:[{p:[18,3,425],t:7,e:"ui-section",a:{label:"Tank Pressure"},f:[{p:[19,7,467],t:7,e:"ui-bar",a:{min:"0",max:"1013",value:[{t:2,r:"data.tankPressure",p:[19,41,501]}],state:[{t:2,r:"tankPressureState",p:[20,16,540]}]},f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[20,39,563]}," kPa"]}]}," ",{p:[22,3,631],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[23,5,674],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[23,18,687]}],max:[{t:2,r:"data.maxReleasePressure",p:[23,52,721]}],value:[{t:2,r:"data.releasePressure",p:[24,14,764]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[24,40,790]}," kPa"]}]}," ",{p:[26,3,861],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,906],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,939]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1095],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1126]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1273],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1368],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1398]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],474:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,5,33],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[3,9,75],t:7,e:"span",f:[{t:2,x:{r:["adata.temperature"],s:"Math.fixed(_0,2)"},p:[3,15,81]}," K"]}]}," ",{p:[5,5,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,9,190],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.fixed(_0,2)"},p:[6,15,196]}," kPa"]}]}]}," ",{p:[9,1,276],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[10,5,311],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[11,9,347],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[11,26,364]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[11,70,408]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[12,28,469]}]}]}," ",{p:[14,5,531],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[15,9,580],t:7,e:"ui-button",a:{icon:"fast-backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[15,48,619]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[17,9,733],t:7,e:"ui-button",a:{icon:"backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[17,43,767]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[19,9,880],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:[{t:2,x:{r:["adata.target"],s:"Math.fixed(_0,2)"},p:[19,79,950]}]}," ",{p:[20,9,1003],t:7,e:"ui-button",a:{icon:"forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[20,42,1036]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[22,9,1148],t:7,e:"ui-button",a:{icon:"fast-forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[22,47,1186]}],action:"target",params:'{"adjust": 20}'}}]}]}]},e.exports=a.extend(r.exports)},{341:341}],475:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{powerState:function(t){switch(t){case 1:return"good";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[13,1,173],t:7,e:"ui-notice",f:[{p:[14,2,187],t:7,e:"ui-section",a:{label:"Reconnect"},f:[{p:[15,3,221],t:7,e:"div",a:{style:"float:right"},f:[{p:[16,4,251],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}]}]}]}," ",{p:[20,1,359],t:7,e:"ui-display",a:{title:"Turbine Controller"},f:[{p:[21,2,401],t:7,e:"ui-section",a:{label:"Status"},f:[{t:4,f:[{p:[23,4,456],t:7,e:"span",a:{"class":"bad"},f:["Broken"]}],n:50,r:"data.broken",p:[22,3,432]},{t:4,n:51,f:[{p:[25,4,504],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.online"],s:"_0(_1)"},p:[25,17,517]}]},f:[{t:2,x:{r:["data.online","data.compressor_broke","data.turbine_broke"],s:'_0&&!(_1||_2)?"Online":"Offline"'},p:[25,46,546]}]}],r:"data.broken"}," ",{p:[27,3,656],t:7,e:"div",a:{style:"float:right"},f:[{p:[28,4,686],t:7,e:"ui-button",a:{icon:"power-off",action:"power-on",state:[{t:2,r:"data.broken",p:[28,57,739]}],style:[{t:2,x:{r:["data.online"],s:'_0?"selected":""'},p:[28,81,763]}]},f:["On"]}," ",{p:[29,4,817],t:7,e:"ui-button",a:{icon:"close",action:"power-off",state:[{t:2,r:"data.broken",p:[29,54,867]}],style:[{t:2,x:{r:["data.online"],s:'_0?"":"selected"'},p:[29,78,891]}]},f:["Off"]}]}," ",{t:4,f:[{p:[32,4,989],t:7,e:"br"}," [ ",{p:[33,6,1e3],t:7,e:"span",a:{"class":"bad"},f:["Compressor is inoperable"]}," ]"],n:50,r:"data.compressor_broke",p:[31,3,955]}," ",{t:4,f:[{p:[36,4,1097],t:7,e:"br"}," [ ",{p:[37,6,1108],t:7,e:"span",a:{"class":"bad"},f:["Turbine is inoperable"]}," ]"],n:50,r:"data.turbine_broke",p:[35,3,1066]}]}]}," ",{p:[41,1,1200],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[42,2,1230],t:7,e:"ui-section",a:{label:"Turbine Speed"},f:[{p:[43,3,1268],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.rpm"],s:'_0?"--":_1'},p:[43,9,1274]}," RPM"]}]}," ",{p:[45,2,1337],t:7,e:"ui-section",a:{label:"Internal Temp"},f:[{p:[46,3,1375],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.temp"],s:'_0?"--":_1'},p:[46,9,1381]}," K"]}]}," ",{p:[48,2,1443],t:7,e:"ui-section",a:{label:"Generated Power"},f:[{p:[49,3,1483],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.power"],s:'_0?"--":_1'},p:[49,9,1489]}]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],476:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{},oninit:function(){this.on({hover:function(t){var e=this.get("data.telecrystals");e>=t.context.params.cost&&this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}})}}}(r),r.exports.template={v:3,t:[" ",{p:{button:[{t:4,f:[{p:[23,7,482],t:7,e:"ui-button",a:{icon:"lock",action:"lock"},f:["Lock"]}],n:50,r:"data.lockable",p:[22,5,453]}]},t:7,e:"ui-display",a:{title:"Uplink",button:0},f:[" ",{p:[26,3,568],t:7,e:"ui-section",a:{label:"Telecrystals",right:0},f:[{p:[27,5,613],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.telecrystals"],s:'_0>0?"good":"bad"'},p:[27,18,626]}]},f:[{t:2,r:"data.telecrystals",p:[27,62,670]}," TC"]}]}]}," ",{t:4,f:[{p:[31,3,764],t:7,e:"ui-display",f:[{p:[32,2,779],t:7,e:"ui-button",a:{action:"select",params:['{"category": "',{t:2,r:"name",p:[32,51,828]},'"}']},f:[{t:2,r:"name",p:[32,63,840]}]}," ",{t:4,f:[{p:[34,4,883],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[34,23,902]}],candystripe:0,right:0},f:[{p:[35,3,934],t:7,e:"ui-button",a:{tooltip:[{t:2,r:"name",p:[35,23,954]},": ",{t:2,r:"desc",p:[35,33,964]}],"tooltip-side":"left",state:[{t:2,x:{r:["data.telecrystals","hovered.cost","cost","hovered.item","name"],s:'_0<_2||(_0-_1<_2&&_3!=_4)?"disabled":null'},p:[36,12,1006]}],action:"buy",params:['{"category": "',{t:2,r:"category",p:[37,40,1165]},'", "item": ',{t:2,r:"name",p:[37,63,1188]},', "cost": ',{t:2,r:"cost",p:[37,81,1206]},"}"]},v:{hover:"hover",unhover:"unhover"},f:[{t:2,r:"cost",p:[38,43,1260]}," TC"]}]}],n:52,r:"items",p:[33,2,863]}]}],n:52,r:"data.categories",p:[30,1,735]}]},e.exports=a.extend(r.exports)},{341:341}],477:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{healthState:function(t){var e=this.get("data.vr_avatar.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad"}}}}(r),r.exports.template={ +v:3,t:[" ",{p:[14,1,292],t:7,e:"ui-display",f:[{t:4,f:[{p:[16,3,331],t:7,e:"ui-notice",f:[{p:[17,4,347],t:7,e:"span",f:["Safety restraints disabled."]}]}],n:50,r:"data.emagged",p:[15,2,307]}," ",{t:4,f:[{p:[21,3,442],t:7,e:"ui-display",a:{title:"Virtual Avatar"},f:[{p:[22,4,482],t:7,e:"ui-section",a:{label:"Name"},f:[{t:2,r:"data.vr_avatar.name",p:[23,5,513]}]}," ",{t:4,f:[{p:[26,5,586],t:7,e:"ui-section",a:{label:"Status"},f:[{t:2,r:"data.vr_avatar.status",p:[27,6,620]}]}," ",{p:[29,5,670],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[30,6,704],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.vr_avatar.maxhealth",p:[30,27,725]}],value:[{t:2,r:"adata.vr_avatar.health",p:[30,65,763]}],state:[{t:2,x:{r:["healthState","adata.vr_avatar.health"],s:"_0(_1)"},p:[30,100,798]}]},f:[{t:2,x:{r:["adata.vr_avatar.health"],s:"Math.round(_0)"},p:[30,141,839]},"/",{t:2,r:"adata.vr_avatar.maxhealth",p:[30,180,878]}]}]}],n:50,r:"data.isliving",p:[25,4,559]}]}],n:50,r:"data.vr_avatar",p:[20,2,416]},{t:4,n:51,f:[{p:[35,3,979],t:7,e:"ui-display",a:{title:"Virtual Avatar"},f:["No Virtual Avatar detected"]}],r:"data.vr_avatar"}," ",{p:[39,2,1075],t:7,e:"ui-display",a:{title:"VR Commands"},f:[{p:[40,3,1111],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.toggle_open"],s:'_0?"times":"plus"'},p:[40,20,1128]}],action:"toggle_open"},f:[{t:2,x:{r:["data.toggle_open"],s:'_0?"Close":"Open"'},p:[41,4,1195]}," the VR Sleeper"]}," ",{t:4,f:[{p:[44,4,1297],t:7,e:"ui-button",a:{icon:"signal",action:"vr_connect"},f:["Connect to VR"]}],n:50,r:"data.isoccupant",p:[43,3,1269]}," ",{t:4,f:[{p:[49,4,1420],t:7,e:"ui-button",a:{icon:"ban",action:"delete_avatar"},f:["Delete Virtual Avatar"]}],n:50,r:"data.vr_avatar",p:[48,3,1393]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],478:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{t:4,f:[{p:[3,5,42],t:7,e:"ui-section",a:{label:[{t:2,r:"color",p:[3,24,61]},{t:2,x:{r:["wire"],s:'_0?" ("+_0+")":""'},p:[3,33,70]}],labelcolor:[{t:2,r:"color",p:[3,80,117]}],candystripe:0,right:0},f:[{p:[4,7,154],t:7,e:"ui-button",a:{action:"cut",params:['{"wire":"',{t:2,r:"color",p:[4,48,195]},'"}']},f:[{t:2,x:{r:["cut"],s:'_0?"Mend":"Cut"'},p:[4,61,208]}]}," ",{p:[5,7,252],t:7,e:"ui-button",a:{action:"pulse",params:['{"wire":"',{t:2,r:"color",p:[5,50,295]},'"}']},f:["Pulse"]}," ",{p:[6,7,333],t:7,e:"ui-button",a:{action:"attach",params:['{"wire":"',{t:2,r:"color",p:[6,51,377]},'"}']},f:[{t:2,x:{r:["attached"],s:'_0?"Detach":"Attach"'},p:[6,64,390]}]}]}],n:52,r:"data.wires",p:[2,3,16]}]}," ",{t:4,f:[{p:[11,3,508],t:7,e:"ui-display",f:[{t:4,f:[{p:[13,7,555],t:7,e:"ui-section",f:[{t:2,r:".",p:[13,19,567]}]}],n:52,r:"data.status",p:[12,5,526]}]}],n:50,r:"data.status",p:[10,1,485]}]},e.exports=a.extend(r.exports)},{341:341}],479:[function(t,e,n){(function(e){"use strict";var n=t(341),a=e.interopRequireDefault(n);t(331),t(1),t(327),t(330);var r=t(480),i=e.interopRequireDefault(r),o=t(481),s=t(328),p=t(329),u=e.interopRequireDefault(p);a["default"].DEBUG=/minified/.test(function(){}),Object.assign(Math,t(485)),window.initialize=function(e){window.tgui=window.tgui||new i["default"]({el:"#container",data:function(){var n=JSON.parse(e);return{constants:t(482),text:t(486),config:n.config,data:n.data,adata:n.data}}})};var c=document.getElementById("data"),l=c.textContent,d=c.getAttribute("data-ref");"{}"!==l&&(window.initialize(l),c.remove()),(0,o.act)(d,"tgui:initialize"),(0,s.loadCSS)("font-awesome.min.css");var f=new u["default"]("FontAwesome");f.check("").then(function(){return document.body.classList.add("icons")})["catch"](function(){return document.body.classList.add("no-icons")})}).call(this,t("babel/external-helpers"))},{1:1,327:327,328:328,329:329,330:330,331:331,341:341,480:480,481:481,482:482,485:485,486:486,"babel/external-helpers":"babel/external-helpers"}],480:[function(t,e,n){var a=t(341),r={exports:{}};!function(e){"use strict";var n=t(481),a=t(483);e.exports={components:{"ui-bar":t(342),"ui-button":t(343),"ui-display":t(344),"ui-input":t(345),"ui-linegraph":t(346),"ui-notice":t(347),"ui-section":t(349),"ui-subdisplay":t(350),"ui-tabs":t(351)},events:{enter:t(339).enter,space:t(339).space},transitions:{fade:t(340)},onconfig:function(){var e=this.get("config.interface"),n={ai_airlock:t(355),airalarm:t(356),"airalarm/back":t(357),"airalarm/modes":t(358),"airalarm/scrubbers":t(359),"airalarm/status":t(360),"airalarm/thresholds":t(361),"airalarm/vents":t(362),airlock_electronics:t(363),apc:t(364),atmos_alert:t(365),atmos_control:t(366),atmos_filter:t(367),atmos_mixer:t(368),atmos_pump:t(369),borgopanel:t(370),brig_timer:t(371),bsa:t(372),canister:t(373),cargo:t(374),cargo_express:t(375),cellular_emporium:t(376),centcom_podlauncher:t(377),chem_dispenser:t(378),chem_heater:t(379),chem_master:t(380),chem_synthesizer:t(381),clockwork_slab:t(382),codex_gigas:t(383),computer_fabricator:t(384),crayon:t(385),crew:t(386),cryo:t(387),disposal_unit:t(388),dna_vault:t(389),dogborg_sleeper:t(390),eightball:t(391),emergency_shuttle_console:t(392),engraved_message:t(393),error:t(394),"exofab - Copia":t(395),exonet_node:t(396),firealarm:t(397),gps:t(398),gulag_console:t(399),gulag_item_reclaimer:t(400),holodeck:t(401),implantchair:t(402),intellicard:t(403),keycard_auth:t(404),labor_claim_console:t(405),language_menu:t(406),launchpad_remote:t(407),mech_bay_power_console:t(408),mulebot:t(409),nanite_chamber_control:t(410),nanite_cloud_control:t(411),nanite_program_hub:t(412),nanite_programmer:t(413),nanite_remote:t(414),notificationpanel:t(415),ntnet_relay:t(416),ntos_ai_restorer:t(417),ntos_card:t(418),ntos_configuration:t(419),ntos_file_manager:t(420),ntos_main:t(421),ntos_net_chat:t(422),ntos_net_dos:t(423),ntos_net_downloader:t(424),ntos_net_monitor:t(425),ntos_net_transfer:t(426),ntos_power_monitor:t(427),ntos_revelation:t(428),ntos_station_alert:t(429),ntos_supermatter_monitor:t(430),ntosheader:t(431),nuclear_bomb:t(432),operating_computer:t(433),ore_redemption_machine:t(434),pandemic:t(435),personal_crafting:t(436),portable_pump:t(437),portable_scrubber:t(438),power_monitor:t(439),radio:t(440),rdconsole:t(441),"rdconsole/circuit":t(442),"rdconsole/designview":t(443),"rdconsole/destruct":t(444),"rdconsole/diskopsdesign":t(445),"rdconsole/diskopstech":t(446),"rdconsole/nodeview":t(447),"rdconsole/protolathe":t(448),"rdconsole/rdheader":t(449),"rdconsole/settings":t(450),"rdconsole/techweb":t(451),reagentgrinder:t(452),rpd:t(453),"rpd/colorsel":t(454),"rpd/dirsel":t(455),sat_control:t(456),scrubbing_types:t(457),shuttle_manipulator:t(458),"shuttle_manipulator/modification":t(459),"shuttle_manipulator/status":t(460),"shuttle_manipulator/templates":t(461),sleeper:t(462),slime_swap_body:t(463),smartvend:t(464),smes:t(465),smoke_machine:t(466),solar_control:t(467),space_heater:t(468),spawners_menu:t(469),station_alert:t(470),suit_storage_unit:t(471),tank_dispenser:t(472),tanks:t(473),thermomachine:t(474),turbine_computer:t(475),uplink:t(476),vr_sleeper:t(477),wires:t(478)};e in n?this.components["interface"]=n[e]:this.components["interface"]=n.error},oninit:function(){this.observe("config.style",function(t,e,n){t&&document.body.classList.add(t),e&&document.body.classList.remove(e)})},oncomplete:function(){if(this.get("config.locked")){var t=(0,a.lock)(window.screenLeft,window.screenTop),e=t.x,r=t.y;(0,n.winset)(this.get("config.window"),"pos",e+","+r)}(0,n.winset)("mapwindow.map","focus",!0)}}}(r),r.exports.template={v:3,t:[" "," "," "," ",{p:[56,1,1874],t:7,e:"titlebar",f:[{t:3,r:"config.title",p:[56,11,1884]}]}," ",{p:[57,1,1915],t:7,e:"main",f:[{p:[58,3,1925],t:7,e:"warnings"}," ",{p:[59,3,1940],t:7,e:"interface"}]}," ",{t:4,f:[{p:[62,3,1990],t:7,e:"resize"}],n:50,r:"config.titlebar",p:[61,1,1963]}]},r.exports.components=r.exports.components||{};var i={warnings:t(354),titlebar:t(353),resize:t(348)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{339:339,340:340,341:341,342:342,343:343,344:344,345:345,346:346,347:347,348:348,349:349,350:350,351:351,353:353,354:354,355:355,356:356,357:357,358:358,359:359,360:360,361:361,362:362,363:363,364:364,365:365,366:366,367:367,368:368,369:369,370:370,371:371,372:372,373:373,374:374,375:375,376:376,377:377,378:378,379:379,380:380,381:381,382:382,383:383,384:384,385:385,386:386,387:387,388:388,389:389,390:390,391:391,392:392,393:393,394:394,395:395,396:396,397:397,398:398,399:399,400:400,401:401,402:402,403:403,404:404,405:405,406:406,407:407,408:408,409:409,410:410,411:411,412:412,413:413,414:414,415:415,416:416,417:417,418:418,419:419,420:420,421:421,422:422,423:423,424:424,425:425,426:426,427:427,428:428,429:429,430:430,431:431,432:432,433:433,434:434,435:435,436:436,437:437,438:438,439:439,440:440,441:441,442:442,443:443,444:444,445:445,446:446,447:447,448:448,449:449,450:450,451:451,452:452,453:453,454:454,455:455,456:456,457:457,458:458,459:459,460:460,461:461,462:462,463:463,464:464,465:465,466:466,467:467,468:468,469:469,470:470,471:471,472:472,473:473,474:474,475:475,476:476,477:477,478:478,481:481,483:483}],481:[function(t,e,n){"use strict";function a(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return"byond://"+e+"?"+Object.keys(t).map(function(e){return o(e)+"="+o(t[e])}).join("&")}function r(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};window.location.href=a(Object.assign({src:t,action:e},n))}function i(t,e,n){var r;window.location.href=a((r={},r[t+"."+e]=n,r),"winset")}n.__esModule=!0,n.href=a,n.act=r,n.winset=i;var o=encodeURIComponent},{}],482:[function(t,e,n){"use strict";n.__esModule=!0;n.UI_INTERACTIVE=2,n.UI_UPDATE=1,n.UI_DISABLED=0,n.UI_CLOSE=-1},{}],483:[function(t,e,n){"use strict";function a(t,e){return 0>t?t=0:t+window.innerWidth>window.screen.availWidth&&(t=window.screen.availWidth-window.innerWidth),0>e?e=0:e+window.innerHeight>window.screen.availHeight&&(e=window.screen.availHeight-window.innerHeight),{x:t,y:e}}function r(t){if(t.preventDefault(),this.get("drag")){if(this.get("x")){var e=t.screenX-this.get("x")+window.screenLeft,n=t.screenY-this.get("y")+window.screenTop;if(this.get("config.locked")){var r=a(e,n);e=r.x,n=r.y}(0,s.winset)(this.get("config.window"),"pos",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}function i(t,e){return t=Math.clamp(100,window.screen.width,t),e=Math.clamp(100,window.screen.height,e),{x:t,y:e}}function o(t){if(t.preventDefault(),this.get("resize")){if(this.get("x")){var e=t.screenX-this.get("x")+window.innerWidth,n=t.screenY-this.get("y")+window.innerHeight,a=i(e,n);e=a.x,n=a.y,(0,s.winset)(this.get("config.window"),"size",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}n.__esModule=!0,n.lock=a,n.drag=r,n.sane=i,n.resize=o;var s=t(481)},{481:481}],484:[function(t,e,n){"use strict";function a(t,e){for(var n=t,a=Array.isArray(n),i=0,n=a?n:n[Symbol.iterator]();;){var o;if(a){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;s.textContent.toLowerCase().includes(e)?(s.style.display="",r(s,e)):s.style.display="none"}}function r(t,e){for(var n=t.queryAll("section"),a=t.query("header").textContent.toLowerCase().includes(e),r=n,i=Array.isArray(r),o=0,r=i?r:r[Symbol.iterator]();;){var s;if(i){if(o>=r.length)break;s=r[o++]}else{if(o=r.next(),o.done)break;s=o.value}var p=s;a||p.textContent.toLowerCase().includes(e)?p.style.display="":p.style.display="none"}}n.__esModule=!0,n.filterMulti=a,n.filter=r},{}],485:[function(t,e,n){"use strict";function a(t,e,n){return Math.max(t,Math.min(n,e))}function r(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return+(Math.round(t+"e"+e)+"e-"+e)}n.__esModule=!0,n.clamp=a,n.fixed=r},{}],486:[function(t,e,n){"use strict";function a(t){return t[0].toUpperCase()+t.slice(1).toLowerCase()}function r(t){return t.replace(/\w\S*/g,a)}function i(t,e){for(t=""+t;t.length1){for(var p=Array(o),u=0;o>u;u++)p[u]=arguments[u+3];n.children=p}return{$$typeof:t,type:e,key:void 0===a?null:""+a,ref:null,props:n,_owner:null}}}(),e.asyncIterator=function(t){if("function"==typeof Symbol){if(Symbol.asyncIterator){var e=t[Symbol.asyncIterator];if(null!=e)return e.call(t)}if(Symbol.iterator)return t[Symbol.iterator]()}throw new TypeError("Object is not async iterable")},e.asyncGenerator=function(){function t(t){this.value=t}function e(e){function n(t,e){return new Promise(function(n,r){var s={key:t,arg:e,resolve:n,reject:r,next:null};o?o=o.next=s:(i=o=s,a(t,e))})}function a(n,i){try{var o=e[n](i),s=o.value;s instanceof t?Promise.resolve(s.value).then(function(t){a("next",t)},function(t){a("throw",t)}):r(o.done?"return":"normal",o.value)}catch(p){r("throw",p)}}function r(t,e){switch(t){case"return":i.resolve({value:e,done:!0});break;case"throw":i.reject(e);break;default:i.resolve({value:e,done:!1})}i=i.next,i?a(i.key,i.arg):o=null}var i,o;this._invoke=n,"function"!=typeof e["return"]&&(this["return"]=void 0)}return"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype["throw"]=function(t){return this._invoke("throw",t)},e.prototype["return"]=function(t){return this._invoke("return",t)},{wrap:function(t){return function(){return new e(t.apply(this,arguments))}},await:function(e){return new t(e)}}}(),e.asyncGeneratorDelegate=function(t,e){function n(n,a){return r=!0,a=new Promise(function(e){e(t[n](a))}),{done:!1,value:e(a)}}var a={},r=!1;return"function"==typeof Symbol&&Symbol.iterator&&(a[Symbol.iterator]=function(){return this}),a.next=function(t){return r?(r=!1,t):n("next",t)},"function"==typeof t["throw"]&&(a["throw"]=function(t){if(r)throw r=!1,t;return n("throw",t)}),"function"==typeof t["return"]&&(a["return"]=function(t){return n("return",t)}),a},e.asyncToGenerator=function(t){return function(){var e=t.apply(this,arguments);return new Promise(function(t,n){function a(r,i){try{var o=e[r](i),s=o.value}catch(p){return void n(p)}return o.done?void t(s):Promise.resolve(s).then(function(t){a("next",t)},function(t){a("throw",t)})}return a("next")})}},e.classCallCheck=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},e.createClass=function(){function t(t,e){for(var n=0;n=0||Object.prototype.hasOwnProperty.call(t,a)&&(n[a]=t[a]);return n},e.possibleConstructorReturn=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e},e.selfGlobal=void 0===t?self:t,e.set=function a(t,e,n,r){var i=Object.getOwnPropertyDescriptor(t,e);if(void 0===i){var o=Object.getPrototypeOf(t);null!==o&&a(o,e,n,r)}else if("value"in i&&i.writable)i.value=n;else{var s=i.set;void 0!==s&&s.call(r,n)}return n},e.slicedToArray=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(p){r=!0,i=p}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),e.slicedToArrayLoose=function(t,e){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t)){for(var n,a=[],r=t[Symbol.iterator]();!(n=r.next()).done&&(a.push(n.value),!e||a.length!==e););return a}throw new TypeError("Invalid attempt to destructure non-iterable instance")},e.taggedTemplateLiteral=function(t,e){return Object.freeze(Object.defineProperties(t,{raw:{value:Object.freeze(e)}}))},e.taggedTemplateLiteralLoose=function(t,e){return t.raw=e,t},e.temporalRef=function(t,e,n){if(t===n)throw new ReferenceError(e+" is not defined - temporal dead zone");return t},e.temporalUndefined={},e.toArray=function(t){return Array.isArray(t)?t:Array.from(t)},e.toConsumableArray=function(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e Dispense Buffer to Hypo vials
    +
    + Create SmartDart (max 20µ) +
    + Create Multiple SmartDarts +
    diff --git a/tgui/src/interfaces/crayon.ract b/tgui/src/interfaces/crayon.ract index 8d34e8e82c..42c4df9a50 100644 --- a/tgui/src/interfaces/crayon.ract +++ b/tgui/src/interfaces/crayon.ract @@ -29,7 +29,7 @@ {{/each}} - {{text_buffer}} + {{data.text_buffer}} New Text diff --git a/tgui/src/interfaces/vr_sleeper.ract b/tgui/src/interfaces/vr_sleeper.ract index 32f3ab33b3..91074a9425 100644 --- a/tgui/src/interfaces/vr_sleeper.ract +++ b/tgui/src/interfaces/vr_sleeper.ract @@ -22,12 +22,14 @@ {{data.vr_avatar.name}} - - {{data.vr_avatar.status}} - - - {{Math.round(adata.vr_avatar.health)}}/{{adata.vr_avatar.maxhealth}} - + {{#if data.isliving}} + + {{data.vr_avatar.status}} + + + {{Math.round(adata.vr_avatar.health)}}/{{adata.vr_avatar.maxhealth}} + + {{/if}} {{else}} diff --git a/tools/mapmerge2/dmi.py b/tools/mapmerge2/dmi.py index f0a8182c9f..c12964cead 100644 --- a/tools/mapmerge2/dmi.py +++ b/tools/mapmerge2/dmi.py @@ -45,6 +45,8 @@ class Dmi: @classmethod def from_file(cls, fname): image = Image.open(fname) + if image.mode != 'RGBA': + image = image.convert('RGBA') # no metadata = regular image file if 'Description' not in image.info: @@ -250,4 +252,4 @@ if __name__ == '__main__': Dmi.from_file(os.path.join(dirpath, filename)) count += 1 - print(f"Successfully parsed {count} dmi files") + print(f"Successfully parsed {count} dmi files") \ No newline at end of file diff --git a/tools/mapmerge2/dmm.py b/tools/mapmerge2/dmm.py index 8bb1dca353..15aa04c07f 100644 --- a/tools/mapmerge2/dmm.py +++ b/tools/mapmerge2/dmm.py @@ -343,7 +343,7 @@ def _parse(map_raw_text): in_map_block = False in_coord_block = False in_map_string = False - iter_x = 0 + base_x = 0 adjust_y = True curr_num = "" @@ -487,7 +487,7 @@ def _parse(map_raw_text): curr_x = int(curr_num) if curr_x > maxx: maxx = curr_x - iter_x = 0 + base_x = curr_x curr_num = "" reading_coord = "y" elif reading_coord == "y": @@ -521,21 +521,15 @@ def _parse(map_raw_text): adjust_y = False else: curr_y += 1 - if curr_x > maxx: - maxx = curr_x - if iter_x > 1: - curr_x = 1 - iter_x = 0 - + curr_x = base_x else: curr_key = BASE * curr_key + base52_r[char] curr_key_len += 1 if curr_key_len == key_length: - iter_x += 1 - if iter_x > 1: - curr_x += 1 - grid[curr_x, curr_y, curr_z] = duplicate_keys.get(curr_key, curr_key) + if curr_x > maxx: + maxx = curr_x + curr_x += 1 curr_key = 0 curr_key_len = 0 @@ -551,4 +545,4 @@ def _parse(map_raw_text): data = DMM(key_length, Coordinate(maxx, maxy, maxz)) data.dictionary = dictionary data.grid = grid - return data + return data \ No newline at end of file diff --git a/tools/mapmerge2/update_paths.py b/tools/mapmerge2/update_paths.py index 2c316e941d..deab468ecd 100644 --- a/tools/mapmerge2/update_paths.py +++ b/tools/mapmerge2/update_paths.py @@ -173,4 +173,4 @@ if __name__ == "__main__": parser.add_argument("--directory", "-d", help="path to maps directory, defaults to _maps/") parser.add_argument("--inline", "-i", help="treat update source as update string instead of path", action="store_true") parser.add_argument("--verbose", "-v", help="toggle detailed update information", action="store_true") - main(parser.parse_args()) + main(parser.parse_args()) \ No newline at end of file