diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm index 9b7ca819cc..639d63772c 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm @@ -49,7 +49,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "as" = ( @@ -70,7 +70,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "at" = ( @@ -89,7 +89,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "au" = ( @@ -129,7 +129,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "ay" = ( @@ -149,7 +149,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "az" = ( @@ -170,7 +170,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aA" = ( @@ -190,7 +190,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aB" = ( @@ -209,7 +209,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aC" = ( @@ -225,7 +225,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aD" = ( @@ -242,7 +242,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aE" = ( @@ -261,7 +261,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aF" = ( @@ -282,7 +282,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aG" = ( @@ -301,7 +301,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aH" = ( @@ -321,7 +321,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aI" = ( @@ -341,7 +341,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aJ" = ( @@ -368,7 +368,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aL" = ( @@ -394,7 +394,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aO" = ( @@ -415,7 +415,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aP" = ( @@ -448,7 +448,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aU" = ( @@ -472,7 +472,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aW" = ( @@ -493,7 +493,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aX" = ( @@ -522,7 +522,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aZ" = ( @@ -542,7 +542,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "ba" = ( @@ -559,7 +559,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bb" = ( @@ -588,7 +588,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bd" = ( @@ -631,7 +631,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bg" = ( @@ -732,7 +732,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bt" = ( @@ -758,7 +758,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bx" = ( @@ -775,7 +775,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "by" = ( @@ -792,7 +792,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bz" = ( @@ -817,7 +817,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bB" = ( @@ -825,7 +825,7 @@ icon_state = "bananium"; name = "bananium floor"; sound = 'sound/effects/clownstep1.ogg'; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bC" = ( @@ -846,7 +846,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bD" = ( @@ -872,7 +872,7 @@ icon_state = "bananium"; name = "bananium floor"; sound = 'sound/effects/clownstep1.ogg'; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bH" = ( @@ -881,7 +881,7 @@ icon_state = "bananium"; name = "bananium floor"; sound = 'sound/effects/clownstep1.ogg'; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bI" = ( @@ -899,7 +899,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bK" = ( @@ -918,7 +918,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bL" = ( @@ -942,7 +942,7 @@ icon_state = "bananium"; name = "bananium floor"; sound = 'sound/effects/clownstep1.ogg'; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bP" = ( @@ -970,8 +970,8 @@ /turf/open/floor/carpet, /area/ruin/powered/clownplanet) "bT" = ( -/obj/item/slime_extract/rainbow, /obj/structure/table/glass, +/obj/item/reagent_containers/spray/waterflower/superlube, /turf/open/floor/carpet, /area/ruin/powered/clownplanet) "bU" = ( @@ -989,7 +989,7 @@ icon_state = "bananium"; name = "bananium floor"; sound = 'sound/effects/clownstep1.ogg'; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bY" = ( @@ -999,7 +999,7 @@ icon_state = "bananium"; name = "bananium floor"; sound = 'sound/effects/clownstep1.ogg'; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bZ" = ( @@ -1008,7 +1008,7 @@ icon_state = "bananium"; name = "bananium floor"; sound = 'sound/effects/clownstep1.ogg'; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "ca" = ( @@ -1018,7 +1018,7 @@ icon_state = "bananium"; name = "bananium floor"; sound = 'sound/effects/clownstep1.ogg'; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "cc" = ( @@ -1052,7 +1052,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "dC" = ( @@ -1075,7 +1075,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "dD" = ( @@ -1097,7 +1097,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "dE" = ( @@ -1120,7 +1120,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "dF" = ( @@ -1175,7 +1175,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "dK" = ( @@ -1202,7 +1202,7 @@ icon_state = "bananium"; name = "bananium floor"; sound = 'sound/effects/clownstep1.ogg'; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "dO" = ( @@ -1211,7 +1211,7 @@ icon_state = "bananium"; name = "bananium floor"; sound = 'sound/effects/clownstep1.ogg'; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "eX" = ( @@ -1260,7 +1260,7 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "KX" = ( diff --git a/_maps/RandomZLevels/TheBeach.dmm b/_maps/RandomZLevels/TheBeach.dmm new file mode 100644 index 0000000000..cc9f50d029 --- /dev/null +++ b/_maps/RandomZLevels/TheBeach.dmm @@ -0,0 +1,15537 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/closed/indestructible/sandstone, +/area/awaymission/beach) +"ab" = ( +/turf/open/indestructible/binary{ + density = 1; + desc = "I can't move through this."; + icon = 'icons/misc/beach.dmi'; + icon_state = "water"; + name = "deep ocean water" + }, +/area/awaymission/beach) +"ac" = ( +/turf/open/floor/plating/beach/water, +/area/awaymission/beach) +"ad" = ( +/turf/open/floor/plating/beach/coastline_b{ + dir = 1 + }, +/area/awaymission/beach) +"ae" = ( +/turf/open/floor/plating/beach/coastline_b{ + dir = 8 + }, +/area/awaymission/beach) +"af" = ( +/turf/open/floor/plating/beach/coastline_t{ + dir = 9 + }, +/area/awaymission/beach) +"ag" = ( +/turf/open/floor/plating/beach/coastline_t{ + dir = 1 + }, +/area/awaymission/beach) +"ah" = ( +/turf/open/floor/plating/beach/coastline_t{ + dir = 5 + }, +/area/awaymission/beach) +"ai" = ( +/turf/open/floor/plating/beach/coastline_b{ + dir = 4 + }, +/area/awaymission/beach) +"aj" = ( +/turf/open/floor/plating/beach/coastline_t{ + dir = 8 + }, +/area/awaymission/beach) +"ak" = ( +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"al" = ( +/obj/effect/overlay/palmtree_r{ + desc = "How did you get here?"; + icon_state = "palm2"; + name = "\proper island palm tree" + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"am" = ( +/turf/open/floor/plating/beach/coastline_t{ + dir = 4 + }, +/area/awaymission/beach) +"an" = ( +/obj/effect/overlay/coconut{ + pixel_x = 17; + pixel_y = 7 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"ao" = ( +/turf/open/floor/plating/beach/coastline_t{ + dir = 10 + }, +/area/awaymission/beach) +"ap" = ( +/turf/open/floor/plating/beach/coastline_t, +/area/awaymission/beach) +"aq" = ( +/turf/open/floor/plating/beach/coastline_t{ + dir = 6 + }, +/area/awaymission/beach) +"ar" = ( +/turf/open/floor/plating/beach/coastline_b, +/area/awaymission/beach) +"as" = ( +/obj/structure/flora/rock{ + desc = "A volcanic rock."; + name = "coastal rock" + }, +/obj/structure/flora/ausbushes/stalkybush{ + desc = "It can't be smoked."; + name = "sea weed" + }, +/turf/open/indestructible/binary{ + density = 1; + desc = "I can't move through this."; + icon = 'icons/misc/beach.dmi'; + icon_state = "water"; + name = "deep ocean water" + }, +/area/awaymission/beach) +"at" = ( +/obj/structure/flora/rock{ + desc = "A volcanic rock."; + name = "coastal rock" + }, +/turf/open/indestructible/binary{ + density = 1; + desc = "I can't move through this."; + icon = 'icons/misc/beach.dmi'; + icon_state = "water"; + name = "deep ocean water" + }, +/area/awaymission/beach) +"au" = ( +/obj/structure/closet/crate/wooden{ + desc = "Now this is what island exploration is all about."; + name = "Treasure Chest" + }, +/obj/item/clothing/head/pirate, +/obj/item/clothing/glasses/eyepatch, +/obj/item/clothing/suit/pirate, +/obj/item/melee/sabre{ + desc = "This isn't real however it can trick someone into thinking you have something real.."; + force = 0; + name = "foam pirate's sabre"; + throwforce = 0 + }, +/obj/item/melee/sabre{ + desc = "This isn't real however it can trick someone into thinking you have something real.."; + force = 0; + name = "foam pirate's sabre"; + throwforce = 0 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"av" = ( +/turf/open/floor/plating/beach/water{ + desc = "What's the difference?"; + name = "coastline water" + }, +/area/awaymission/beach) +"aw" = ( +/turf/open/floor/plating/beach/coastline_b{ + dir = 6 + }, +/area/awaymission/beach) +"ax" = ( +/turf/open/floor/plating/beach/coastline_b{ + dir = 10 + }, +/area/awaymission/beach) +"ay" = ( +/turf/open/floor/plating/beach/coastline_t/sandwater_inner{ + dir = 4 + }, +/area/awaymission/beach) +"az" = ( +/turf/open/floor/plating/beach/coastline_t/sandwater_inner{ + dir = 1 + }, +/area/awaymission/beach) +"aA" = ( +/obj/effect/overlay/palmtree_l, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"aB" = ( +/mob/living/simple_animal/crab/kreb, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"aC" = ( +/obj/item/flashlight/flare/torch, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"aD" = ( +/obj/effect/overlay/coconut, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"aE" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"aF" = ( +/obj/structure/bonfire/prelit, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"aG" = ( +/obj/item/clothing/mask/gas/tiki_mask, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"aH" = ( +/obj/item/reagent_containers/food/drinks/soda_cans/space_mountain_wind{ + pixel_x = -17; + pixel_y = 17 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"aI" = ( +/obj/item/melee/skateboard{ + color = "#6666ff"; + desc = "Yes, surf boards have wheels. Stop laughing."; + name = "surf board"; + pixel_x = -15; + pixel_y = 1 + }, +/turf/open/floor/plating/beach/water, +/area/awaymission/beach) +"aJ" = ( +/obj/item/reagent_containers/food/drinks/beer/light{ + pixel_x = -14; + pixel_y = 15 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"aK" = ( +/mob/living/simple_animal/crab, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"aL" = ( +/obj/machinery/gateway{ + dir = 9 + }, +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 9 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"aM" = ( +/obj/machinery/gateway{ + dir = 1 + }, +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"aN" = ( +/obj/machinery/gateway{ + dir = 5 + }, +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 5 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"aO" = ( +/obj/effect/baseturf_helper/beach/sand, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"aP" = ( +/obj/machinery/gateway{ + dir = 8 + }, +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"aQ" = ( +/obj/machinery/gateway/centeraway, +/obj/effect/turf_decal/sand, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"aR" = ( +/obj/machinery/gateway{ + dir = 4 + }, +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"aS" = ( +/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime{ + pixel_x = -12; + pixel_y = 14 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"aT" = ( +/turf/open/floor/plating/beach/coastline_t/sandwater_inner{ + dir = 8 + }, +/area/awaymission/beach) +"aU" = ( +/obj/machinery/gateway{ + dir = 10 + }, +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 10 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"aV" = ( +/obj/machinery/gateway, +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/stripes/asteroid/line, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"aW" = ( +/obj/machinery/gateway{ + dir = 6 + }, +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 6 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"aX" = ( +/turf/closed/wall/mineral/sandstone, +/area/awaymission/beach) +"aY" = ( +/turf/open/floor/plating/beach/coastline_b{ + dir = 5 + }, +/area/awaymission/beach) +"aZ" = ( +/obj/effect/overlay/palmtree_r, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"ba" = ( +/obj/effect/turf_decal/sand, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"bb" = ( +/obj/structure/dresser{ + density = 0; + pixel_y = 18 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"bc" = ( +/obj/structure/mirror{ + pixel_y = 28 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"bd" = ( +/turf/open/floor/wood, +/area/awaymission/beach) +"be" = ( +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_y = 32 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"bf" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 9 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"bg" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"bh" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 5 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"bi" = ( +/obj/machinery/button/door{ + id = "changlinhut2"; + name = "changing room lock"; + normaldoorcontrol = 1; + pixel_x = 24; + specialfunctions = 4 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"bj" = ( +/obj/machinery/button/door{ + id = "changlinhut1"; + name = "changing room lock"; + normaldoorcontrol = 1; + pixel_x = -24; + specialfunctions = 4 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"bk" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/glasses/heat, +/turf/open/floor/wood, +/area/awaymission/beach) +"bl" = ( +/obj/structure/bed, +/obj/machinery/button/door{ + id = "theloveshack1"; + name = "door lock"; + normaldoorcontrol = 1; + pixel_x = 24; + specialfunctions = 4 + }, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/wood, +/area/awaymission/beach) +"bm" = ( +/obj/structure/bed, +/obj/machinery/button/door{ + id = "theloveshack2"; + name = "door lock"; + normaldoorcontrol = 1; + pixel_x = 24; + specialfunctions = 4 + }, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/wood, +/area/awaymission/beach) +"bn" = ( +/obj/structure/bed, +/obj/machinery/button/door{ + id = "theloveshack3"; + name = "door lock"; + normaldoorcontrol = 1; + pixel_x = 24; + specialfunctions = 4 + }, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/wood, +/area/awaymission/beach) +"bo" = ( +/turf/open/floor/plating/beach/coastline_t/sandwater_inner, +/area/awaymission/beach) +"bp" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"bq" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/telecomms/relay/preset/mining, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"br" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"bs" = ( +/obj/machinery/door/airlock/sandstone{ + id_tag = "changlinhut2"; + name = "changing room" + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"bt" = ( +/obj/machinery/door/airlock/sandstone{ + id_tag = "changlinhut1"; + name = "changing room" + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"bu" = ( +/obj/item/reagent_containers/food/drinks/bottle/wine, +/obj/item/reagent_containers/food/drinks/bottle/rum, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/awaymission/beach) +"bv" = ( +/obj/effect/overlay/palmtree_r, +/obj/effect/overlay/coconut, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"bw" = ( +/turf/open/floor/plating/beach/coastline_b{ + dir = 9 + }, +/area/awaymission/beach) +"bx" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 10 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"by" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/stripes/asteroid/line, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"bz" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 6 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"bA" = ( +/obj/structure{ + desc = "Bar and beach south, dorms east."; + icon = 'icons/obj/stationobjs.dmi'; + icon_state = "signpost"; + name = "directions signpost" + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"bB" = ( +/obj/machinery/door/airlock/sandstone{ + id_tag = "theloveshack1"; + name = "Beach Hut" + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"bC" = ( +/obj/machinery/door/airlock/sandstone{ + id_tag = "theloveshack2"; + name = "Beach Hut" + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"bD" = ( +/obj/machinery/door/airlock/sandstone{ + id_tag = "theloveshack3"; + name = "Beach Hut" + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"bE" = ( +/obj/effect/overlay/palmtree_l{ + pixel_y = 25 + }, +/obj/effect/overlay/coconut{ + pixel_x = -7; + pixel_y = 7 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"bF" = ( +/obj/structure/bedsheetbin, +/obj/effect/turf_decal/sand, +/obj/structure/table/wood, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"bG" = ( +/obj/item/clothing/shoes/sandal, +/obj/item/clothing/shoes/sandal, +/obj/item/clothing/shoes/sandal, +/obj/structure/closet/crate, +/obj/effect/turf_decal/sand, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"bH" = ( +/obj/structure/closet/athletic_mixed, +/obj/effect/turf_decal/sand, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"bI" = ( +/obj/machinery/door/airlock/sandstone{ + id_tag = "loveshack"; + name = "Beach Hut" + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"bJ" = ( +/obj/machinery/door/airlock/sandstone{ + id_tag = "theloveshack4"; + name = "Beach Hut" + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"bK" = ( +/obj/machinery/door/airlock/sandstone{ + id_tag = "theloveshack5"; + name = "Beach Hut" + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"bL" = ( +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/effect/turf_decal/sand, +/turf/open/floor/plasteel/white, +/area/awaymission/beach) +"bM" = ( +/obj/structure/mirror{ + pixel_x = 28 + }, +/obj/effect/turf_decal/sand, +/obj/structure/sink{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/beach) +"bN" = ( +/obj/structure/mirror{ + pixel_x = -28 + }, +/obj/effect/turf_decal/sand, +/obj/structure/sink{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/beach) +"bO" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/bottle/champagne, +/turf/open/floor/wood, +/area/awaymission/beach) +"bP" = ( +/obj/item/trash/chips{ + pixel_x = -18; + pixel_y = 7 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"bQ" = ( +/obj/effect/turf_decal/sand, +/turf/open/floor/plasteel/white, +/area/awaymission/beach) +"bR" = ( +/obj/machinery/button/door{ + id = "toilet1"; + name = "restroom lock"; + normaldoorcontrol = 1; + pixel_x = 24; + specialfunctions = 4 + }, +/obj/effect/turf_decal/sand, +/turf/open/floor/plasteel/white, +/area/awaymission/beach) +"bS" = ( +/obj/machinery/button/door{ + id = "toilet2"; + name = "restroom lock"; + normaldoorcontrol = 1; + pixel_x = -24; + specialfunctions = 4 + }, +/obj/effect/turf_decal/sand, +/turf/open/floor/plasteel/white, +/area/awaymission/beach) +"bT" = ( +/obj/structure/bed, +/obj/machinery/button/door{ + id = "loveshack"; + name = "love shack lock"; + normaldoorcontrol = 1; + pixel_x = 24; + specialfunctions = 4 + }, +/obj/item/bedsheet/red, +/turf/open/floor/wood, +/area/awaymission/beach) +"bU" = ( +/obj/structure/bed, +/obj/machinery/button/door{ + id = "theloveshack4"; + name = "door lock"; + normaldoorcontrol = 1; + pixel_x = 24; + specialfunctions = 4 + }, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/wood, +/area/awaymission/beach) +"bV" = ( +/obj/structure/sign/poster/ripped{ + pixel_x = 32 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"bW" = ( +/obj/structure/bed, +/obj/machinery/button/door{ + id = "theloveshack5"; + name = "door lock"; + normaldoorcontrol = 1; + pixel_x = 24; + specialfunctions = 4 + }, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/wood, +/area/awaymission/beach) +"bX" = ( +/obj/machinery/door/airlock/sandstone{ + id_tag = "toilet1"; + name = "restroom stall" + }, +/obj/effect/turf_decal/sand, +/turf/open/floor/plasteel/white, +/area/awaymission/beach) +"bY" = ( +/obj/machinery/door/airlock/sandstone{ + id_tag = "toilet2"; + name = "restroom stall" + }, +/obj/effect/turf_decal/sand, +/turf/open/floor/plasteel/white, +/area/awaymission/beach) +"bZ" = ( +/obj/structure/dresser{ + density = 0 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"ca" = ( +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_y = -32 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"cb" = ( +/obj/structure/sign/poster/contraband/syndicate_recruitment{ + pixel_x = -28 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"cc" = ( +/obj/item/trash/can{ + pixel_x = 14; + pixel_y = 7 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"cd" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/vending/cola/starkist, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"ce" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/vending/snack/random, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"cf" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/vending/cigarette, +/obj/structure/sign/poster/contraband/smoke{ + pixel_y = -32 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"cg" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/vending/cola/space_up, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"ch" = ( +/obj/effect/overlay/palmtree_l, +/obj/effect/overlay/coconut, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"ci" = ( +/obj/structure/closet/gmcloset, +/turf/open/floor/wood, +/area/awaymission/beach) +"cj" = ( +/obj/structure/closet/secure_closet/bar, +/obj/item/storage/box/drinkingglasses, +/obj/item/storage/box/drinkingglasses, +/obj/item/storage/box/drinkingglasses, +/obj/item/storage/box/drinkingglasses, +/obj/item/storage/box/drinkingglasses, +/obj/item/storage/box/drinkingglasses, +/turf/open/floor/wood, +/area/awaymission/beach) +"ck" = ( +/obj/effect/mob_spawn/human/bartender/alive, +/turf/open/floor/wood, +/area/awaymission/beach) +"cl" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/shaker, +/turf/open/floor/wood, +/area/awaymission/beach) +"cm" = ( +/obj/structure/table/wood, +/obj/item/clothing/glasses/sunglasses, +/obj/item/reagent_containers/food/drinks/beer, +/obj/item/reagent_containers/food/drinks/beer, +/turf/open/floor/wood, +/area/awaymission/beach) +"cn" = ( +/obj/machinery/vending/boozeomat/all_access{ + desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one. May not work for bartenders that don't have Nanotrasen bank accounts." + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"co" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks/fullupgrade, +/obj/structure/sign/picture_frame{ + pixel_y = 32 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"cp" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks/beer/fullupgrade, +/turf/open/floor/wood, +/area/awaymission/beach) +"cq" = ( +/obj/structure/table/wood, +/obj/machinery/microwave, +/turf/open/floor/wood, +/area/awaymission/beach) +"cr" = ( +/obj/structure/closet/secure_closet/freezer/kitchen{ + req_access = list(25) + }, +/obj/item/storage/fancy/egg_box, +/obj/item/reagent_containers/food/condiment/milk, +/obj/item/reagent_containers/food/condiment/milk, +/obj/item/reagent_containers/food/condiment/flour, +/obj/item/reagent_containers/food/condiment/flour, +/obj/item/reagent_containers/food/condiment/mayonnaise, +/obj/item/reagent_containers/food/condiment/sugar, +/obj/item/reagent_containers/food/condiment/sugar, +/obj/item/reagent_containers/food/condiment/enzyme, +/turf/open/floor/wood, +/area/awaymission/beach) +"cs" = ( +/obj/machinery/processor, +/turf/open/floor/wood, +/area/awaymission/beach) +"ct" = ( +/obj/effect/turf_decal/stripes/white/corner, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"cu" = ( +/obj/effect/turf_decal/stripes/white/line, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"cv" = ( +/obj/effect/turf_decal/stripes/white/corner{ + dir = 4 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"cw" = ( +/obj/structure/closet/secure_closet/freezer/meat/open, +/obj/item/reagent_containers/food/snacks/meat/slab/goliath, +/obj/item/reagent_containers/food/snacks/meat/slab/xeno, +/obj/item/reagent_containers/food/snacks/meat/slab/spider, +/obj/item/reagent_containers/food/snacks/meat/slab/killertomato, +/obj/item/reagent_containers/food/snacks/meat/slab/bear, +/turf/open/floor/wood, +/area/awaymission/beach) +"cx" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"cy" = ( +/obj/effect/turf_decal/stripes/white/full, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"cz" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"cA" = ( +/obj/structure/mineral_door/wood{ + name = "bar" + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"cB" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/ale, +/turf/open/floor/wood, +/area/awaymission/beach) +"cC" = ( +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/awaymission/beach) +"cD" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/rag{ + pixel_y = 7 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"cE" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb, +/turf/open/floor/wood, +/area/awaymission/beach) +"cF" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime, +/turf/open/floor/wood, +/area/awaymission/beach) +"cG" = ( +/obj/item/toy/beach_ball, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"cH" = ( +/obj/structure/chair/stool, +/obj/effect/turf_decal/sand, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"cI" = ( +/obj/structure/sign/barsign{ + pixel_y = 32 + }, +/obj/effect/turf_decal/sand, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"cJ" = ( +/obj/effect/turf_decal/stripes/white/corner, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"cK" = ( +/obj/structure/table, +/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/reagent_containers/food/drinks/beer, +/obj/item/reagent_containers/food/drinks/beer, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"cL" = ( +/obj/structure/table, +/obj/item/clothing/under/color/rainbow, +/obj/item/clothing/glasses/sunglasses, +/obj/item/clothing/head/collectable/petehat{ + pixel_y = 5 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"cM" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/snacks/chips, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"cN" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/soda_cans/sodawater, +/obj/item/reagent_containers/food/drinks/soda_cans/shamblers, +/obj/item/reagent_containers/food/drinks/soda_cans/pwr_game, +/obj/item/reagent_containers/food/drinks/soda_cans/air, +/obj/item/reagent_containers/food/drinks/soda_cans/canned_laughter, +/obj/item/reagent_containers/food/drinks/soda_cans/tonic, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"cO" = ( +/obj/structure/chair, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"cP" = ( +/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime{ + pixel_x = -12 + }, +/obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb{ + pixel_x = 13 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"cQ" = ( +/obj/item/reagent_containers/food/drinks/soda_cans/starkist{ + pixel_x = -12; + pixel_y = 3 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"cR" = ( +/obj/item/reagent_containers/food/drinks/soda_cans/cola{ + pixel_x = -8; + pixel_y = -4 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"cS" = ( +/obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb{ + pixel_x = -9; + pixel_y = -7 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"cT" = ( +/obj/item/reagent_containers/food/drinks/soda_cans/space_mountain_wind, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"cU" = ( +/obj/item/reagent_containers/food/drinks/soda_cans/cola{ + pixel_x = -8; + pixel_y = -4 + }, +/obj/item/reagent_containers/food/drinks/soda_cans/space_mountain_wind{ + pixel_x = 15 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"cV" = ( +/obj/effect/overlay/coconut{ + pixel_x = -5; + pixel_y = 4 + }, +/turf/open/floor/plating/beach/coastline_t/sandwater_inner, +/area/awaymission/beach) +"cW" = ( +/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime{ + pixel_x = -12 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"cX" = ( +/obj/item/reagent_containers/food/drinks/soda_cans/cola{ + pixel_x = -5 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"cY" = ( +/obj/item/reagent_containers/food/drinks/soda_cans/starkist{ + pixel_x = -6 + }, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"cZ" = ( +/obj/item/clothing/head/collectable/paper{ + desc = "What looks like an ordinary paper hat is actually a rare and valuable collector's edition paper hat. Keep away from fire, Curators, and ocean waves." + }, +/turf/open/floor/plating/beach/water, +/area/awaymission/beach) +"da" = ( +/mob/living/simple_animal/parrot, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"db" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/suit/jacket/letterman_nanotrasen, +/turf/open/floor/wood, +/area/awaymission/beach) +"dc" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/suit/jacket/letterman_syndie, +/turf/open/floor/wood, +/area/awaymission/beach) +"dd" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/suit/jacket/letterman_red, +/turf/open/floor/wood, +/area/awaymission/beach) +"de" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/suit/jacket/letterman, +/turf/open/floor/wood, +/area/awaymission/beach) +"df" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/neck/necklace/dope, +/turf/open/floor/wood, +/area/awaymission/beach) +"dg" = ( +/obj/item/clothing/glasses/heat, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) +"iy" = ( +/obj/item/toy/seashell, +/turf/open/floor/plating/beach/coastline_t, +/area/awaymission/beach) +"MD" = ( +/obj/item/toy/seashell, +/turf/open/floor/plating/beach/sand, +/area/awaymission/beach) + +(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 +"} +(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 +"} +(3,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 +"} +(4,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 +"} +(5,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 +"} +(6,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 +"} +(7,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 +"} +(8,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 +"} +(9,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 +"} +(10,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 +"} +(11,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 +"} +(12,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(13,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 +"} +(14,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 +"} +(15,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +at +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +as +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +at +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +at +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +at +ab +ab +ab +ab +ab +ab +ab +ab +as +ab +ab +ab +ab +ab +ab +ab +at +ab +ab +ab +ab +ab +ab +at +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(16,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(17,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(18,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(19,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(20,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(21,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(22,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(23,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(24,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +as +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(25,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +as +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(26,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(27,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(28,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(29,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +at +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(30,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(31,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(32,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ac +ac +ae +ae +ae +ae +ae +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(33,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ac +aw +af +aj +aj +aj +ao +aY +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(34,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +aw +af +ay +MD +ak +MD +aT +ao +aY +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(35,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +aw +af +ay +MD +ak +ak +ak +ak +aT +ao +aY +ae +ae +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(36,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +aw +af +ay +ak +ak +ak +MD +ak +ak +ak +aT +aj +aj +ao +aY +ae +ae +ae +ae +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(37,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +aw +af +ay +ak +ak +ak +aA +ak +ak +ak +ak +ak +ak +ak +aT +aj +aj +aj +aj +ao +aY +ae +ac +ac +ac +ac +ae +ae +ae +ae +ae +ae +ae +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(38,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ad +af +ay +ak +ak +ak +ak +ak +ak +aA +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aT +aj +ao +aY +ac +ac +ad +af +aj +aj +aj +aj +aj +ao +aY +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(39,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ad +ag +ak +ak +ak +aA +ak +aD +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aT +ao +aY +ae +aw +ag +MD +aZ +ak +ak +ak +aT +ao +aY +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(40,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ad +ag +ak +ak +aA +ak +ak +ak +ak +ak +aD +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +MD +aT +aj +aj +aj +ay +ak +ak +ak +ak +ak +MD +aT +ao +ar +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(41,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ad +ag +ak +ak +ak +ak +aC +ak +ak +ak +aA +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aK +ak +cG +ap +aY +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(42,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ad +ag +ak +ak +ak +aC +aF +aC +ak +ak +ak +ak +ak +ak +ak +aD +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aT +ao +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +at +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(43,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ad +ag +ak +aA +ak +ak +aG +ak +aD +ak +ak +ak +ak +ak +aA +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ap +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(44,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ad +ag +ak +ak +ak +aC +aF +aC +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aA +ak +bo +aq +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(45,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ad +ag +ak +ak +ak +ak +aC +ak +ak +aA +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aD +ak +ap +bw +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(46,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ad +ag +ak +ak +ak +aD +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ch +ak +ak +ak +ak +ak +ak +ak +ak +ak +ap +aY +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(47,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ad +ag +ak +ak +aA +ak +ak +ak +ak +ak +aA +ak +ak +ak +ak +ak +ak +ak +ak +aZ +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aT +ao +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(48,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ad +ag +ak +ak +ak +ak +ak +aA +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aK +ak +ap +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(49,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ad +ag +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ak +ak +ak +ak +iy +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(50,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ad +ag +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ba +ba +aX +aX +aX +aX +cA +aX +ba +ba +ak +ak +ak +ak +ap +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(51,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ad +ag +MD +ak +ak +ak +ak +ak +ak +ak +ak +aZ +bf +bp +bx +ak +ak +aX +aX +aX +aX +ak +ba +cd +aX +ci +bd +bd +bd +cB +cH +ba +ak +ak +cO +ak +ap +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(52,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +at +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ad +ah +az +ak +ak +ak +ak +ak +ak +ak +ak +ak +bg +bq +by +ak +ak +aX +bL +bQ +aX +ak +ba +ce +aX +cj +bd +bd +bd +cB +cH +ba +ak +ak +cP +ak +ap +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(53,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ax +ag +ak +ak +ak +ak +ak +ak +ak +ak +ak +bh +br +bz +ak +aA +aX +bM +bR +bX +ba +ba +ba +aX +ck +bd +bd +bd +cC +cH +ba +ak +ak +cO +ak +ap +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(54,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ad +ah +az +ak +ak +ak +ak +ak +ak +ak +ak +ak +ba +ak +ak +aD +aX +aX +aX +aX +ak +ba +ba +aX +cl +bd +bd +bd +cD +cH +ba +ak +ak +ak +ak +ap +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(55,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ax +ag +ak +ak +ak +ak +aL +aP +aU +ak +ak +ba +ak +ak +ak +ak +ak +ak +ak +ak +ba +ba +aX +cm +bd +bd +bd +cC +cH +ba +ak +ak +cO +ak +ap +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(56,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ad +ag +ak +ak +ak +ak +aM +aQ +aV +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +cf +aX +cn +bd +bd +bd +cE +cH +ba +ak +ak +cQ +ak +ap +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(57,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ad +ag +ak +ak +ak +ak +aN +aR +aW +ak +ak +ak +bA +ba +ba +ak +ak +ak +ak +ak +ba +ba +aX +co +bd +bd +bd +cF +cH +ba +ak +ak +cO +ak +ap +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(58,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ad +ag +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ba +ba +aX +aX +aX +aX +ak +ba +ba +aX +cp +bd +bd +bd +cC +cH +ba +ak +ak +cR +ak +ap +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +at +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(59,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ad +ag +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ba +ba +aX +bN +bS +bY +ba +ba +ba +aX +cq +bd +bd +bd +cC +cH +ba +ak +ak +cO +ak +ap +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(60,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ad +ag +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ba +ba +aX +bL +bQ +aX +ak +ba +ce +aX +bd +bd +bd +bd +cC +cH +ba +ak +aA +cS +ak +ap +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(61,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ad +ag +ak +ak +ak +ak +ak +ak +aX +aX +aX +aX +ak +ba +ba +aX +aX +aX +aX +ak +ba +cg +aX +cr +cs +cw +bd +aX +cI +ba +ak +ak +cO +ak +ap +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(62,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ad +ag +ak +ak +ak +ak +ak +ak +aX +bb +bd +aX +ak +ba +ba +ak +ak +ak +ak +ak +ba +ba +aX +aX +aX +aX +aX +aX +ba +ba +ak +ak +cT +ak +ap +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(63,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ad +ah +az +ak +ak +ak +ak +ak +aX +bc +bi +bs +ba +ba +ba +bF +ak +ak +ak +ak +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ak +ak +ak +bo +aq +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(64,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ax +ag +ak +ak +ak +ak +ak +aX +aX +aX +aX +ak +ba +ba +bG +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ap +bw +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(65,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ad +ag +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ba +ba +bH +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +bo +aq +ar +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +as +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(66,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ad +ag +aE +ak +ak +aA +ak +ak +ak +ak +ak +ak +ba +ba +bG +ak +ak +aZ +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +cK +cM +ap +bw +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(67,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ad +ag +ak +aH +dg +ak +aD +ak +ak +ak +ak +ak +ba +ba +bH +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +cL +cN +ap +aY +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +at +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(68,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ad +ah +az +ak +ak +ak +ak +ak +ak +ak +ak +ak +ba +ba +bG +ak +ak +ak +ak +ak +ak +aD +ak +ak +ak +ak +cG +ak +ak +ak +ak +aT +ao +ar +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(69,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ax +ag +aE +ak +ak +ak +aX +aX +aX +aX +ak +ba +ba +bH +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aZ +ak +ak +ap +ar +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(70,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ad +ag +ak +aJ +aE +ak +aX +bb +bj +bt +ba +ba +ba +bG +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aD +ak +ap +aY +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(71,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ad +ah +am +az +ak +aS +aX +bc +bd +aX +ak +ba +ba +bH +ak +ak +ak +aA +ak +ak +ak +aA +ak +ak +aA +ak +ak +aK +ak +ak +ak +aT +ao +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(72,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ac +ai +ax +ah +am +az +aX +aX +aX +aX +ak +ba +ba +bG +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +cO +ak +ap +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(73,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ai +ax +ag +ak +ak +ak +ak +ak +ba +ba +bH +ak +ak +ak +ak +ak +ak +ak +ak +ct +cx +cx +cx +cx +cJ +ak +ak +cU +ak +ap +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(74,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ad +ag +aA +ak +ak +ak +ak +ba +ba +bG +ak +ak +ak +ak +ak +MD +ak +ak +cu +ak +ak +ak +ak +cu +ak +ak +cO +ak +ap +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(75,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ad +ag +ak +ak +ak +ak +ak +ba +ba +bH +ak +ak +ak +ak +ak +bv +ak +ak +cu +ak +ak +ak +ak +cu +ak +ak +ak +bo +aq +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(76,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ad +ag +ak +ak +ak +ak +ak +ba +ba +ak +ak +ak +ak +ak +ak +ak +ak +ak +cu +ak +ak +ak +ak +cu +ak +aZ +bo +aq +bw +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(77,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ac +ac +aI +ac +ad +ag +ak +ak +ak +ak +ak +ba +ba +ak +ak +ak +ak +ak +ak +ak +ak +ak +cu +ak +ak +ak +ak +cu +ak +ak +ap +bw +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(78,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +at +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ad +ag +aX +aX +aX +aX +aX +ba +ba +aX +aX +aX +aX +aX +ak +ak +ak +ak +cu +ak +ak +ak +ak +cu +ak +aK +ap +aY +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(79,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ad +ag +aX +bb +de +bu +aX +ba +ba +aX +bO +db +bZ +aX +ak +ak +ak +ak +cu +cy +cy +cy +cy +cy +ak +ak +aT +ao +ar +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +as +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(80,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +aw +ag +aX +bd +bd +bd +bB +ba +ba +bI +bd +bd +bd +aX +ak +ak +ak +ak +cu +ak +ak +ak +ak +cu +ak +ak +cV +aq +ar +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(81,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ac +ac +ae +aw +af +ay +aX +be +bl +bd +aX +ba +ba +aX +bd +bT +ca +aX +ak +aZ +ak +ak +cu +ak +ak +ak +ak +cu +ak +ak +ap +bw +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(82,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ac +aw +af +aj +ay +ak +aX +aX +aX +aX +aX +ba +ba +aX +aX +aX +aX +aX +ak +ak +aD +ak +cu +ak +ak +ak +ak +cu +ak +ak +ap +aY +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(83,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ad +af +ay +aA +ak +ak +ak +ak +ak +ak +ak +ba +ba +ak +ak +ak +ak +ak +ak +ak +ak +ak +cu +ak +ak +ak +ak +cu +ak +ak +aT +ao +aY +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(84,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +aw +ag +ak +aK +ak +ak +ak +ak +ak +ak +ak +ba +ba +ak +ak +ak +ak +ak +ak +ak +ak +ak +cu +ak +ak +ak +ak +cu +ak +ak +ak +aT +ao +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(85,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +aw +af +ay +ak +ak +ak +ak +aX +aX +aX +aX +aX +ba +ba +aX +aX +aX +aX +aX +ak +ak +ak +ak +cv +cz +cz +cz +cz +cz +ak +ak +cO +ak +ap +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(86,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +af +ay +ak +ak +ak +ak +ak +aX +bb +df +bu +aX +ba +ba +aX +bu +dc +bZ +aX +ak +ak +ak +ak +aZ +ak +ak +ak +ak +ak +ak +ak +cW +ak +ap +ar +ac +ac +ac +cZ +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(87,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +aw +ag +MD +ak +ak +ak +ak +ak +aX +bd +bd +bd +bC +ba +ba +bJ +bd +bd +bd +aX +ak +ak +ak +ak +aD +ak +ak +ak +ak +ak +ak +ak +cO +ak +ap +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(88,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ad +af +ay +ak +MD +ak +ak +ak +ak +aX +be +bm +bd +aX +ba +ba +aX +bd +bU +ca +aX +ak +ak +ak +ak +ak +ak +ak +ak +aZ +ak +ak +ak +cX +ak +ap +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(89,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ad +ag +ak +ak +ak +ak +ak +ak +ak +aX +aX +aX +aX +aX +ba +ba +aX +aX +aX +aX +aX +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +cO +ak +iy +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(90,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ad +ag +aA +aB +ak +ak +ak +ak +ak +aA +ak +ak +ak +ak +ba +ba +ak +ak +ak +cb +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +cY +ak +ap +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(91,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ad +ag +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +bv +ak +ba +ba +ak +bP +bV +cc +ak +ak +ak +ak +ak +aA +ak +ak +ak +ak +ak +ak +ak +aK +MD +ap +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(92,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ad +ah +az +ak +ak +ak +ak +aO +ak +aX +aX +aX +aX +aX +ba +ba +aX +aX +aX +aX +aX +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ap +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(93,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ax +ag +MD +ak +ak +ak +ak +ak +aX +bb +dd +bu +aX +ba +ba +aX +bu +bk +bZ +aX +ak +ak +ak +ak +ak +ak +aK +ak +ak +ak +ak +ak +MD +bo +aq +ar +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(94,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ad +ah +az +ak +ak +ak +ak +ak +aX +bd +bd +bd +bD +ba +ba +bK +bd +bd +bd +aX +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +aA +aD +bo +aq +bw +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(95,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ax +ah +az +ak +ak +ak +ak +aX +be +bn +bd +aX +ba +ba +aX +bd +bW +ca +aX +ak +ak +aA +ak +ak +ak +ak +cG +ak +ak +ak +bo +aq +bw +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(96,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ax +ah +az +aK +ak +ak +aX +aX +aX +aX +aX +ba +ba +aX +aX +aX +aX +aX +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +bo +aq +bw +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(97,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ac +ax +ag +aA +ak +ak +ak +ak +ak +ak +ak +ak +bE +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +bo +aq +bw +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(98,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ac +ad +ah +az +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +bo +am +am +am +am +am +am +am +aq +bw +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(99,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ac +ac +ax +ah +az +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +bo +am +aq +bw +ai +ai +ai +ai +ai +ai +ai +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(100,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ax +ah +az +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +bo +aq +bw +ai +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(101,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ax +ag +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ap +bw +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(102,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ad +ah +az +ak +ak +ak +ak +bo +am +am +az +bo +aq +ar +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(103,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ax +ah +az +bo +am +am +aq +bw +ax +ah +aq +bw +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(104,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ax +ah +aq +bw +ai +ai +ac +ac +ai +ai +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(105,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +as +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ai +ai +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(106,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +at +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(107,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(108,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +at +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(109,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(110,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(111,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(112,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(113,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(114,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(115,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(116,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(117,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +as +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(118,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(119,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(120,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +av +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(121,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +as +ab +ab +ab +ab +ab +ab +at +ab +ab +as +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +at +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +as +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +at +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +as +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(122,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 +"} +(123,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 +"} +(124,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 +"} +(125,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 +"} +(126,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 +"} +(127,1,1) = {" +aa +aa +ac +ae +ae +ae +ae +ae +ac +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 +"} +(128,1,1) = {" +aa +aa +ad +af +aj +aj +aj +ao +ar +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 +"} +(129,1,1) = {" +aa +aa +ad +ag +ak +ak +da +ap +ar +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 +"} +(130,1,1) = {" +aa +aa +ad +ag +au +an +ak +ap +ar +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 +"} +(131,1,1) = {" +aa +aa +ad +ag +al +ak +MD +ap +ar +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 +"} +(132,1,1) = {" +aa +aa +ad +ah +am +am +am +aq +ar +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 +"} +(133,1,1) = {" +aa +aa +ac +ai +ai +ai +ai +ai +ac +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +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 +"} +(134,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 +"} +(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 +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} diff --git a/_maps/RandomZLevels/beach.dmm b/_maps/RandomZLevels/beach.dmm deleted file mode 100644 index 7aab25e400..0000000000 --- a/_maps/RandomZLevels/beach.dmm +++ /dev/null @@ -1,65960 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/open/space, -/area/space) -"ab" = ( -/turf/closed/indestructible{ - desc = "Very dense sand, very difficult to pass."; - icon = 'icons/misc/beach.dmi'; - icon_state = "sand"; - name = "dense sand"; - opacity = 0 - }, -/area/space) -"ac" = ( -/turf/open/floor/plating/beach/sand, -/area/space) -"ad" = ( -/obj/effect/overlay/coconut, -/turf/open/floor/plating/beach/sand, -/area/space) -"ae" = ( -/obj/effect/overlay/palmtree_r, -/obj/effect/overlay/coconut, -/turf/open/floor/plating/beach/sand, -/area/space) -"af" = ( -/obj/effect/overlay/palmtree_l, -/obj/effect/overlay/coconut, -/turf/open/floor/plating/beach/sand, -/area/space) -"ag" = ( -/obj/effect/overlay/palmtree_l, -/turf/open/floor/plating/beach/sand, -/area/space) -"ah" = ( -/obj/effect/overlay/palmtree_l, -/turf/closed/indestructible{ - desc = "Very dense sand, very difficult to pass."; - icon = 'icons/misc/beach.dmi'; - icon_state = "sand"; - name = "dense sand"; - opacity = 0 - }, -/area/space) -"ai" = ( -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"aj" = ( -/turf/closed/wall/mineral/sandstone, -/area/awaymission/beach) -"ak" = ( -/obj/effect/overlay/palmtree_l, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"al" = ( -/obj/structure/toilet{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/white, -/area/awaymission/beach) -"am" = ( -/turf/open/floor/plasteel/white, -/area/awaymission/beach) -"an" = ( -/obj/structure/sink{ - pixel_y = 28 - }, -/turf/open/floor/plasteel/white, -/area/awaymission/beach) -"ao" = ( -/obj/structure/sink{ - pixel_y = 28 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/white, -/area/awaymission/beach) -"ap" = ( -/obj/structure/mirror{ - pixel_x = 28 - }, -/obj/effect/turf_decal/sand, -/turf/open/floor/plasteel/white, -/area/awaymission/beach) -"aq" = ( -/obj/structure/mirror{ - pixel_x = -28 - }, -/obj/effect/turf_decal/sand, -/turf/open/floor/plasteel/white, -/area/awaymission/beach) -"ar" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/white, -/area/awaymission/beach) -"as" = ( -/obj/structure/toilet{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/awaymission/beach) -"at" = ( -/obj/effect/overlay/palmtree_r, -/obj/effect/overlay/coconut, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"au" = ( -/obj/structure/toilet{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/awaymission/beach) -"av" = ( -/obj/machinery/shower{ - icon_state = "shower"; - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/white, -/area/awaymission/beach) -"aw" = ( -/obj/effect/turf_decal/sand, -/turf/open/floor/plasteel/white, -/area/awaymission/beach) -"ax" = ( -/obj/machinery/shower{ - icon_state = "shower"; - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/awaymission/beach) -"ay" = ( -/obj/structure/table, -/obj/item/storage/box/drinkingglasses, -/obj/item/storage/box/drinkingglasses, -/obj/item/reagent_containers/food/drinks/shaker, -/obj/item/storage/box/beakers, -/turf/open/floor/wood, -/area/awaymission/beach) -"az" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/turf/open/floor/wood, -/area/awaymission/beach) -"aA" = ( -/obj/machinery/vending/boozeomat{ - set_obj_flags = "EMAGGED" - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"aB" = ( -/obj/structure/table, -/obj/item/reagent_containers/rag, -/turf/open/floor/wood, -/area/awaymission/beach) -"aC" = ( -/obj/effect/mob_spawn/human/cook{ - head = null; - id_access = "Bartender"; - id_job = "Bartender"; - suit = /obj/item/clothing/suit/armor/vest; - uniform = /obj/item/clothing/under/rank/bartender; - death = 0; - desc = "Looks secure."; - flavour_text = "You are a bartender for the beach!"; - icon = 'icons/obj/machines/sleeper.dmi'; - icon_state = "sleeper"; - mob_name = "Jerry Thomas"; - name = "bartenders cryosleeper"; - roundstart = 1 - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"aD" = ( -/turf/open/floor/wood, -/area/awaymission/beach) -"aE" = ( -/obj/structure/table, -/obj/machinery/microwave, -/turf/open/floor/wood, -/area/awaymission/beach) -"aF" = ( -/obj/structure/closet/crate/bin, -/obj/effect/turf_decal/sand, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"aG" = ( -/obj/effect/turf_decal/sand, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"aH" = ( -/obj/machinery/door/airlock/sandstone, -/obj/effect/turf_decal/sand, -/turf/open/floor/plasteel/white, -/area/awaymission/beach) -"aI" = ( -/obj/structure/table, -/turf/open/floor/wood, -/area/awaymission/beach) -"aJ" = ( -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/sand, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"aK" = ( -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/awaymission/beach) -"aL" = ( -/obj/machinery/processor, -/turf/open/floor/wood, -/area/awaymission/beach) -"aM" = ( -/obj/machinery/vending/cola, -/obj/effect/turf_decal/sand, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"aN" = ( -/obj/structure/chair/stool, -/obj/effect/turf_decal/sand, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"aO" = ( -/obj/structure/closet/secure_closet/freezer/meat, -/turf/open/floor/wood, -/area/awaymission/beach) -"aP" = ( -/obj/machinery/vending/snack, -/obj/effect/turf_decal/sand, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"aQ" = ( -/obj/effect/overlay/palmtree_r, -/turf/open/floor/plating/beach/sand, -/area/space) -"aS" = ( -/obj/machinery/door/airlock/sandstone, -/turf/open/floor/wood, -/area/awaymission/beach) -"aT" = ( -/obj/structure/closet/secure_closet/freezer/kitchen, -/turf/open/floor/wood, -/area/awaymission/beach) -"aU" = ( -/obj/effect/overlay/palmtree_l, -/obj/effect/overlay/coconut, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"aV" = ( -/obj/machinery/gateway{ - dir = 9 - }, -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 9 - }, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"aW" = ( -/obj/machinery/gateway{ - dir = 1 - }, -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"aX" = ( -/obj/machinery/gateway{ - dir = 5 - }, -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 5 - }, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"aY" = ( -/obj/structure/sign/barsign, -/turf/closed/wall/mineral/sandstone, -/area/awaymission/beach) -"aZ" = ( -/obj/effect/overlay/palmtree_r, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"ba" = ( -/obj/machinery/gateway{ - dir = 8 - }, -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 8 - }, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"bb" = ( -/obj/machinery/gateway/centeraway, -/obj/effect/turf_decal/sand, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"bc" = ( -/obj/machinery/gateway{ - dir = 4 - }, -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 4 - }, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"bd" = ( -/obj/machinery/gateway{ - dir = 10 - }, -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 10 - }, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"be" = ( -/obj/machinery/gateway, -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"bf" = ( -/obj/machinery/gateway{ - dir = 6 - }, -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 6 - }, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"bg" = ( -/obj/structure/closet/athletic_mixed, -/obj/effect/turf_decal/sand, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"bh" = ( -/obj/item/clothing/shoes/sandal, -/obj/item/clothing/shoes/sandal, -/obj/item/clothing/shoes/sandal, -/obj/structure/closet/crate, -/obj/effect/turf_decal/sand, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"bi" = ( -/obj/effect/overlay/palmtree_l, -/obj/effect/overlay/coconut, -/turf/closed/indestructible{ - desc = "Very dense sand, very difficult to pass."; - icon = 'icons/misc/beach.dmi'; - icon_state = "sand"; - name = "dense sand"; - opacity = 0 - }, -/area/space) -"bj" = ( -/obj/item/toy/beach_ball, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"bk" = ( -/mob/living/simple_animal/crab, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"bl" = ( -/obj/effect/overlay/coconut, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"bm" = ( -/mob/living/simple_animal/crab/Coffee, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"bn" = ( -/obj/structure/chair, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"bo" = ( -/turf/open/floor/plating/beach/coastline_t, -/area/space) -"bp" = ( -/turf/open/floor/plating/beach/coastline_t{ - density = 1 - }, -/area/space) -"bq" = ( -/turf/open/floor/plating/beach/coastline_t, -/area/awaymission/beach) -"br" = ( -/turf/open/floor/plating/beach/coastline_b, -/area/space) -"bs" = ( -/turf/open/floor/plating/beach/coastline_b{ - density = 1 - }, -/area/space) -"bt" = ( -/turf/open/floor/plating/beach/coastline_b, -/area/awaymission/beach) -"bu" = ( -/turf/closed/indestructible{ - desc = "Very dense water, very difficult to pass."; - icon = 'icons/misc/beach.dmi'; - icon_state = "water"; - name = "dense water"; - opacity = 0 - }, -/area/space) -"bv" = ( -/turf/open/floor/plating/beach/water, -/area/space) -"bw" = ( -/turf/open/floor/plating/beach/water, -/area/awaymission/beach) -"bx" = ( -/turf/open/floor/plating/beach/water{ - density = 1; - opacity = 1 - }, -/area/awaymission/beach) - -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(68,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 -"} -(69,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 -"} -(70,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 -"} -(71,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 -"} -(72,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 -"} -(73,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 -"} -(74,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 -"} -(75,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 -"} -(76,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 -"} -(77,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 -"} -(78,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 -"} -(79,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 -"} -(80,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 -"} -(81,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 -"} -(82,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 -"} -(83,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 -"} -(84,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 -"} -(85,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 -"} -(86,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 -"} -(87,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 -ab -ac -ac -ac -ac -ac -ac -ab -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -bi -ab -ab -ab -ab -ab -ab -bo -br -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(88,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 -ab -ac -ac -ac -ac -ac -ac -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aQ -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bo -br -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(89,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 -ab -ac -ac -ac -ac -ac -ac -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bo -br -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(90,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 -ab -ac -ac -ac -ac -ac -ac -ab -ac -ac -ac -ac -ac -ad -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bo -br -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(91,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 -ab -ac -ac -ac -ac -ac -ac -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bo -br -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(92,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 -ab -ac -ac -ac -ac -ac -ac -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ad -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bo -br -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(93,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 -ab -ac -ac -ac -ac -ac -ac -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bo -br -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(94,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 -ab -ac -ac -ac -ac -ac -ac -ab -ac -ac -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bo -br -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(95,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 -ab -ac -ac -ac -ac -ac -ac -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aQ -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bo -br -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(96,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 -ab -ac -ac -ac -ac -ac -ac -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aQ -ac -ac -ac -ac -ac -ac -bo -br -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -bp -bs -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -ai -ak -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ak -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ak -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -ab -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ak -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -ai -ai -ai -ai -ai -ai -aU -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -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 -ac -ac -ac -ac -ae -ac -ab -ac -ab -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -ai -ai -ai -ai -ai -ai -aV -ba -bd -aG -aG -aG -ai -ai -ai -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ac -ac -ac -ac -ac -ac -ab -ag -ab -ai -ai -ai -ai -ai -ai -ai -ai -ai -aW -bb -be -aG -aG -aG -aZ -ai -ai -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -ai -ai -ai -ai -ai -ai -aX -bc -bf -aG -aG -aG -ai -ai -ai -bk -ai -bj -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -aG -aG -ai -ai -ai -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -aG -aG -ai -ai -ai -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -aG -aG -ai -ai -ai -ai -ak -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -aG -aG -ai -ai -ai -ai -bl -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ac -ac -ac -ac -af -ac -ab -ac -ab -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -aU -ai -ai -aG -aG -ai -ai -ai -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -ai -ai -ai -ak -ai -ai -ai -ai -ai -ai -aG -aG -ai -ai -ai -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ak -ai -ai -aG -aG -aG -aG -ai -ai -ai -ai -aG -aG -ai -ai -ai -ai -ai -bk -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -aj -aj -aj -aj -aG -aG -aG -ai -ai -ai -aG -aG -ai -ai -ai -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -aj -ay -aD -aK -aN -aG -aG -ai -ai -ai -aG -aG -ai -ai -ai -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -aj -az -aD -aK -aN -aG -aG -ai -ai -ai -aG -aG -ai -ai -ai -ai -ai -bn -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -aa -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 -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -aj -aA -aD -aK -aN -aG -aG -ai -ai -ai -aG -aG -ai -ai -ai -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -aa -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 -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -aj -aB -aD -aK -aN -aG -aG -aG -aG -aG -aG -aG -ai -ai -ai -ai -ai -bn -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -aa -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 -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -aj -aC -aD -aK -aN -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -aG -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -aa -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 -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -aj -aD -aD -aK -aN -aG -aG -aG -aG -aG -aG -aG -ai -ai -ai -ai -ai -bn -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(125,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 -ab -ac -ac -ac -ac -ac -ac -ah -ac -ab -ai -ai -ai -aj -aD -aD -aj -aj -aS -aj -aG -ai -ai -aG -aG -ai -ai -ai -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(126,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 -ab -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -aj -aD -aD -aD -aD -aD -aY -aG -ai -ai -aG -aG -ai -ai -ai -ai -ai -bn -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -aj -aE -aI -aL -aO -aT -aj -aG -ai -ai -aG -aG -ai -ai -ai -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(128,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 -ab -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -aj -aj -aj -aj -aj -aj -aj -aG -ai -ai -aG -aG -ai -ai -ai -ai -ai -bn -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(129,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 -ab -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -ai -aF -aJ -aM -aP -aG -aG -aG -ai -ai -aG -aG -ai -ai -ai -ai -ak -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(130,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 -ab -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -ai -aG -aG -aG -aG -aG -ai -ai -ai -ai -aG -aG -ai -ai -ai -ai -ai -bn -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -ai -ai -aG -aG -ai -ai -ai -ai -ai -ai -aG -aG -ai -ai -ai -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -ai -ai -aG -aG -ai -ai -ai -ai -ai -ai -aG -aG -ai -ai -ai -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -at -ai -aG -aG -ai -ai -ai -ai -bg -aG -aG -aG -ai -ai -ai -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -ai -ai -aG -aG -ai -ai -ai -ai -bh -aG -aG -aG -ak -ai -ai -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -ai -ai -aG -aG -ai -ai -ai -ai -bg -aG -ai -ai -ai -ai -ai -ai -bm -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ac -ac -ad -ac -ac -ac -ab -ac -ab -ai -aj -aj -aj -aj -aG -aG -ai -ai -ai -ai -bh -aG -ai -ai -ai -ai -ai -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -aj -al -au -aj -aG -aG -ai -ai -ai -ai -bg -aG -ai -ai -bj -ai -ai -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -aj -am -am -aj -aG -aG -ai -ai -ai -ai -bh -aG -ai -ai -ai -ai -ai -aZ -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -aj -an -av -aj -aG -aG -ai -ai -ai -ai -bg -aG -ai -ai -ai -ai -ai -ai -bl -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ac -ac -ac -ac -ac -ag -ab -ac -ab -ai -aj -ao -aw -aj -aG -aG -ai -ai -ai -ai -bh -aG -ai -ak -ai -ai -ai -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -aj -ap -aw -aH -aG -aG -ai -ai -ai -ai -bg -aG -ai -ai -ai -ai -ai -ai -ai -bn -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -aj -aj -aj -aj -aG -aG -ai -ai -ai -ai -bh -aG -ai -ai -ai -ai -ai -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -aa -aa -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 -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -aj -aq -aw -aH -aG -aG -ai -ai -ai -ai -bg -aG -ai -ai -ai -ai -ai -ai -ai -bn -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -aj -an -aw -aj -aG -aG -ai -ai -aZ -ai -bh -aG -ai -ai -ai -ai -ai -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -aj -an -ax -aj -aG -aG -ai -ai -ai -ai -bg -aG -ai -ai -ai -ai -ai -ai -aZ -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -aj -ar -am -aj -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -bq -bt -bx -bx -bx -bx -bx -bx -bx -bx -bx -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -aj -as -as -aj -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -aa -ab -ac -ac -ac -ac -ac -ac -ab -ad -ab -ai -aj -aj -aj -aj -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(149,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 -ab -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -aU -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(150,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 -ab -ac -ac -ac -ac -ac -ag -ab -ac -ab -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -aZ -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(151,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 -ab -ac -ac -ac -ac -ac -ac -ab -ac -ab -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -bq -bt -bw -bw -bw -bw -bw -bw -bw -bw -bw -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(152,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 -ab -ac -ac -ac -ac -ac -ac -ab -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -bi -ab -ab -ab -ab -ab -ab -bp -bs -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(153,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 -ab -ac -ac -ac -ac -ac -ac -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aQ -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bo -br -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(154,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 -ab -ac -ac -ac -ac -ac -ac -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bo -br -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(155,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 -ab -ac -ac -ac -ac -ac -ac -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bo -br -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(156,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 -ab -ac -ac -ac -ac -ac -ac -ab -ac -ac -ac -ac -ac -ag -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bo -br -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(157,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 -ab -ac -ac -ac -ac -ac -ac -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ad -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bo -br -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(158,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 -ab -ac -ac -ac -ac -ac -ac -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bo -br -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(159,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 -ab -ac -ac -ac -ac -ac -ac -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ag -ac -ac -ac -ac -ac -ac -ac -ac -ac -bo -br -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(160,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 -ab -ac -ac -ac -ac -ac -ac -ab -ac -ac -ag -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bo -br -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(161,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 -ab -ac -ac -ac -ac -ac -ac -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bo -br -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bv -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(162,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -bo -br -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(163,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 -"} -(164,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 -"} -(165,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 -"} -(166,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 -"} -(167,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 -"} -(168,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 -"} -(169,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 -"} -(170,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 -"} -(171,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 -"} -(172,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 -"} -(173,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 -"} -(174,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 -"} -(175,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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} diff --git a/_maps/RandomZLevels/beach2.dmm b/_maps/RandomZLevels/beach2.dmm deleted file mode 100644 index 56e93a760c..0000000000 --- a/_maps/RandomZLevels/beach2.dmm +++ /dev/null @@ -1,65925 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/open/space, -/area/space) -"ab" = ( -/turf/closed/indestructible/rock, -/area/awaymission/beach) -"ac" = ( -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"ad" = ( -/obj/machinery/gateway{ - dir = 9 - }, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"ae" = ( -/obj/machinery/gateway{ - dir = 1 - }, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"af" = ( -/obj/machinery/gateway{ - dir = 5 - }, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"ag" = ( -/obj/machinery/gateway{ - dir = 8 - }, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"ah" = ( -/obj/machinery/gateway/centeraway, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"ai" = ( -/obj/machinery/gateway{ - dir = 4 - }, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"aj" = ( -/obj/machinery/gateway{ - density = 0; - dir = 10 - }, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"ak" = ( -/obj/machinery/gateway, -/obj/effect/turf_decal/sand, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"al" = ( -/obj/machinery/gateway{ - density = 0; - dir = 6 - }, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"am" = ( -/obj/effect/overlay/palmtree_l, -/obj/effect/overlay/coconut, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"an" = ( -/obj/effect/overlay/palmtree_r, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"ao" = ( -/obj/machinery/telecomms/relay/preset/mining, -/obj/effect/turf_decal/sand, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"ap" = ( -/obj/effect/turf_decal/sand, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"aq" = ( -/turf/closed/wall/mineral/sandstone, -/area/awaymission/beach) -"ar" = ( -/obj/effect/overlay/palmtree_l, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"as" = ( -/obj/structure/dresser{ - density = 0; - pixel_y = 18 - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"at" = ( -/turf/open/floor/wood, -/area/awaymission/beach) -"au" = ( -/obj/machinery/computer/security/telescreen/entertainment{ - pixel_y = 32 - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"av" = ( -/obj/structure/toilet{ - pixel_y = 8 - }, -/obj/effect/turf_decal/sand, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"aw" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/turf/open/floor/wood, -/area/awaymission/beach) -"ax" = ( -/obj/item/bedsheet/rainbow, -/obj/structure/bed, -/obj/machinery/button/door{ - id = "loveshack"; - name = "love shack lock"; - normaldoorcontrol = 1; - pixel_x = 24; - specialfunctions = 4 - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"ay" = ( -/obj/effect/overlay/palmtree_r, -/obj/effect/overlay/coconut, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"az" = ( -/obj/structure/mineral_door/wood{ - name = "toilet" - }, -/obj/effect/turf_decal/sand, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"aA" = ( -/obj/item/reagent_containers/food/drinks/bottle/wine, -/obj/item/reagent_containers/food/drinks/bottle/rum, -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/awaymission/beach) -"aB" = ( -/obj/effect/overlay/coconut, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"aC" = ( -/obj/structure/signpost, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"aD" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "loveshack"; - name = "Beach Hut" - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"aE" = ( -/obj/structure/mirror{ - pixel_y = 28 - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"aF" = ( -/obj/machinery/button/door{ - id = "changing1"; - name = "changing room lock"; - normaldoorcontrol = 1; - pixel_x = 24; - specialfunctions = 4 - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"aG" = ( -/obj/machinery/button/door{ - id = "changing2"; - name = "changing room lock"; - normaldoorcontrol = 1; - pixel_x = 24; - specialfunctions = 4 - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"aH" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "changing1"; - name = "changing room" - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"aI" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "changing2"; - name = "changing room" - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"aJ" = ( -/obj/structure/bedsheetbin{ - pixel_y = -6 - }, -/obj/effect/turf_decal/sand, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"aK" = ( -/obj/item/clothing/shoes/sandal, -/obj/item/clothing/shoes/sandal, -/obj/item/clothing/shoes/sandal, -/obj/structure/closet/crate, -/obj/effect/turf_decal/sand, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"aL" = ( -/obj/structure/closet/athletic_mixed, -/obj/effect/turf_decal/sand, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"aM" = ( -/obj/structure/closet/gmcloset, -/turf/open/floor/wood, -/area/awaymission/beach) -"aN" = ( -/obj/structure/closet/secure_closet/bar, -/turf/open/floor/wood, -/area/awaymission/beach) -"aO" = ( -/obj/structure/table/wood, -/obj/item/book/manual/wiki/barman_recipes, -/turf/open/floor/wood, -/area/awaymission/beach) -"aP" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/shaker, -/turf/open/floor/wood, -/area/awaymission/beach) -"aQ" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/beer, -/turf/open/floor/wood, -/area/awaymission/beach) -"aR" = ( -/obj/structure/table/wood, -/obj/item/clothing/glasses/sunglasses, -/obj/item/reagent_containers/food/drinks/beer, -/turf/open/floor/wood, -/area/awaymission/beach) -"aS" = ( -/obj/effect/mob_spawn/human/bartender/alive, -/turf/open/floor/wood, -/area/awaymission/beach) -"aT" = ( -/obj/machinery/vending/boozeomat, -/turf/open/floor/wood, -/area/awaymission/beach) -"aU" = ( -/obj/machinery/vending/cigarette, -/turf/open/floor/wood, -/area/awaymission/beach) -"aV" = ( -/obj/machinery/vending/cola, -/turf/open/floor/wood, -/area/awaymission/beach) -"aW" = ( -/obj/machinery/vending/snack, -/turf/open/floor/wood, -/area/awaymission/beach) -"aX" = ( -/obj/structure/mineral_door/wood{ - name = "bar" - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"aY" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/ale, -/turf/open/floor/wood, -/area/awaymission/beach) -"aZ" = ( -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/awaymission/beach) -"ba" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb, -/turf/open/floor/wood, -/area/awaymission/beach) -"bb" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime, -/turf/open/floor/wood, -/area/awaymission/beach) -"bc" = ( -/obj/item/toy/beach_ball, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"bd" = ( -/obj/structure/table, -/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/reagent_containers/food/drinks/beer, -/obj/item/reagent_containers/food/drinks/beer, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"be" = ( -/obj/structure/table, -/obj/item/clothing/under/color/rainbow, -/obj/item/clothing/glasses/sunglasses, -/obj/item/clothing/head/collectable/petehat{ - pixel_y = 5 - }, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"bf" = ( -/obj/structure/chair/stool, -/obj/effect/turf_decal/sand, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"bg" = ( -/obj/structure/sign/barsign{ - pixel_y = 32 - }, -/obj/effect/turf_decal/sand, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"bh" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/snacks/chips, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"bi" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/drinks/soda_cans/cola, -/obj/item/reagent_containers/food/drinks/soda_cans/cola, -/obj/item/reagent_containers/food/drinks/soda_cans/cola, -/obj/item/reagent_containers/food/drinks/soda_cans/cola, -/obj/item/reagent_containers/food/drinks/soda_cans/cola, -/obj/item/reagent_containers/food/drinks/soda_cans/cola, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"bj" = ( -/mob/living/simple_animal/crab, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"bk" = ( -/obj/structure/chair, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"bl" = ( -/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"bm" = ( -/obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"bn" = ( -/obj/item/reagent_containers/food/drinks/soda_cans/starkist, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"bo" = ( -/obj/item/reagent_containers/food/drinks/soda_cans/cola, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"bp" = ( -/obj/item/reagent_containers/food/drinks/soda_cans/space_mountain_wind, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"bq" = ( -/obj/item/clothing/head/collectable/paper, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) -"br" = ( -/turf/open/floor/plating/beach/coastline_t, -/area/awaymission/beach) -"bs" = ( -/turf/open/floor/plating/beach/coastline_b, -/area/awaymission/beach) -"bt" = ( -/turf/open/floor/plating/beach/water, -/area/awaymission/beach) -"bu" = ( -/obj/effect/baseturf_helper/beach/sand, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) - -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(68,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 -"} -(69,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 -"} -(70,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 -"} -(71,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 -"} -(72,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 -"} -(73,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 -"} -(74,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 -"} -(75,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 -"} -(76,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 -"} -(77,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 -"} -(78,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 -"} -(79,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 -"} -(80,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 -"} -(81,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 -"} -(82,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 -"} -(83,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 -"} -(84,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 -"} -(85,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 -"} -(86,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 -"} -(87,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 -"} -(88,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 -"} -(89,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 -"} -(90,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 -"} -(91,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 -"} -(92,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 -"} -(93,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 -"} -(94,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -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 -"} -(95,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -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 -"} -(96,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -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 -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -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 -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -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 -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -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 -"} -(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 -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -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 -"} -(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 -aa -aa -aa -aa -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 -ab -ab -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 -"} -(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 -aa -aa -aa -aa -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 -ab -ab -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 -"} -(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 -aa -aa -aa -aa -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 -ab -ab -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 -"} -(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 -aa -aa -aa -aa -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 -ab -ab -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -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 -"} -(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 -aa -aa -aa -aa -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 -ab -ab -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 -"} -(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 -aa -aa -aa -aa -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 -ab -ab -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -ac -ac -ac -ac -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(111,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 -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 -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bj -ac -bc -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -aB -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ar -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ar -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aB -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -am -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bj -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap -ac -ac -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ap -ap -aJ -aq -aq -aq -aX -aq -ap -ap -ac -ac -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -an -ac -ac -ac -ac -ac -ac -aq -aq -aq -aq -ap -ap -aK -aq -aM -at -at -aY -bf -ap -ac -ac -bk -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aq -as -at -aq -ap -ap -aL -aq -aN -at -at -aY -bf -ap -ac -ac -bl -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ar -aq -aE -aF -aH -ap -ap -aK -aq -aO -at -at -aZ -bf -ap -ac -ac -bk -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(125,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ao -ac -ac -ac -ac -ac -aB -aq -aq -aq -aq -ap -ap -aL -aq -aP -at -at -aZ -bf -ap -ac -ac -bm -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(126,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ad -ag -aj -ap -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ap -ap -aK -aq -aQ -at -at -aZ -bf -ap -ac -ac -bk -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(127,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ae -ah -ak -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap -aL -aq -aR -at -at -ba -bf -ap -ac -ac -bn -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(128,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -af -ai -al -ac -ac -ac -ac -aC -ap -ac -ac -ac -ac -ac -ap -ap -aK -aq -aS -at -at -bb -bf -ap -ac -ac -bk -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(129,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ap -ac -aq -aq -aq -aq -ap -ap -aL -aq -aT -at -at -aZ -bf -ap -ac -ac -bo -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(130,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ap -ac -aq -as -at -aq -ap -ap -aK -aq -aU -at -at -aZ -bf -ap -ac -ac -bk -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ap -ac -aq -aE -aG -aI -ap -ap -aL -aq -aV -at -at -aZ -bf -ap -ac -ar -bm -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(132,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ap -ac -aq -aq -aq -aq -ap -ap -aK -aq -aW -at -at -aq -bg -ap -ac -ac -bk -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(133,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ap -ac -ac -ac -ac -ac -ap -ap -aL -aq -aq -aq -aq -aq -ap -ap -ac -ac -bp -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(134,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -am -ac -ac -ac -ac -ac -ap -ac -ac -ac -ac -ac -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap -ac -ac -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ap -ac -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ap -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ar -ac -ac -ac -ac -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ap -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bj -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ap -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ap -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bc -ac -ac -ac -ac -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ap -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -ac -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -an -ac -ac -ap -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aB -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ap -ac -ac -ac -ac -ar -ac -ac -ac -ac -ac -ac -ar -ac -ac -ac -ac -ac -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -aq -aq -aq -ac -ap -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bk -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -aq -av -az -ap -ap -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bo -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -aq -aq -aq -ac -ap -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bk -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ap -ac -ac -ac -ac -ac -ac -ay -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bp -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ap -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(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 -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ap -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(149,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -aq -aq -aq -aq -aq -ap -ac -ac -ar -ac -ac -ac -ac -ac -ac -ac -an -ac -ac -ac -ac -ac -bj -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(150,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -aq -as -aw -aA -aq -ap -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aB -ac -ac -ac -ac -ac -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(151,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -aq -at -at -at -aD -ap -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aB -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(152,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -aq -au -ax -at -aq -ap -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(153,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -aq -aq -aq -aq -aq -ap -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -ac -ac -ac -ac -ac -ac -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(154,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 -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 -ac -ac -ac -ac -ac -ac -aB -ac -bd -bh -ac -ac -ac -bq -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(155,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 -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 -ac -ac -ac -ac -ac -ac -ac -ac -be -bi -ac -ac -ac -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(156,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 -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 -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bk -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(157,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 -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 -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bl -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(158,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ar -ac -ac -ac -ac -ac -ac -ar -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bk -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(159,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 -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 -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -ac -ac -ac -bo -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(160,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 -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 -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bk -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(161,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 -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 -ac -ac -ac -ac -ac -ac -ac -ac -ac -bc -ac -ac -ac -bn -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(162,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ay -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ar -ac -ac -ac -ac -ac -ac -ac -bj -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(163,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 -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 -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(164,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 -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 -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(165,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ar -aB -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(166,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 -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 -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(167,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ay -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(168,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -bu -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -br -bs -bt -bt -bt -bt -bt -bt -bt -bt -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 -"} -(169,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -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 -"} -(170,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -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 -"} -(171,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -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 -"} -(172,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -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 -"} -(173,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -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 -"} -(174,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -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 -"} -(175,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -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 -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -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 -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -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 -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -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 -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -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 -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index cf1b2c6835..53b12ca0bb 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -616,6 +616,9 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-24" + }, /turf/open/floor/plasteel, /area/security/prison) "abB" = ( @@ -57136,9 +57139,7 @@ /turf/open/floor/plating, /area/maintenance/port) "hwu" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-24" - }, +/obj/machinery/vr_sleeper, /turf/open/floor/plasteel, /area/security/prison) "hEm" = ( @@ -57158,6 +57159,13 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/science/circuit) +"ihn" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/vr_sleeper, +/turf/open/floor/plasteel, +/area/security/prison) "iiW" = ( /turf/open/floor/wood, /area/maintenance/bar) @@ -85235,7 +85243,7 @@ aav aaL aaQ aaY -aav +ihn abE acg acJ diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index e500c85640..d9d46066bf 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -16541,16 +16541,10 @@ /area/security/prison) "aId" = ( /obj/machinery/seed_extractor, -/obj/structure/cable/white{ - icon_state = "4-8" - }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/security/prison) "aIe" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -16568,9 +16562,6 @@ /obj/structure/cable/white{ icon_state = "2-4" }, -/obj/structure/cable/white{ - icon_state = "2-8" - }, /obj/structure/cable/white{ icon_state = "1-2" }, @@ -18952,25 +18943,11 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel, /area/security/prison) -"aMd" = ( -/obj/structure/table, -/obj/item/storage/crayons, -/obj/item/storage/crayons, -/obj/structure/sign/warning/electricshock{ - pixel_y = 32 - }, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, -/area/security/prison) "aMe" = ( -/obj/structure/table, -/obj/machinery/computer/libraryconsole/bookmanagement, /obj/structure/cable/white{ icon_state = "1-4" }, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/security/prison) "aMf" = ( /obj/structure/easel, @@ -126743,6 +126720,10 @@ dir = 1 }, /area/science/circuit) +"gUV" = ( +/obj/item/twohanded/required/kirbyplants/random, +/turf/open/floor/plasteel, +/area/security/prison) "gVS" = ( /obj/item/clothing/head/kitty, /obj/item/clothing/under/maid, @@ -126780,6 +126761,9 @@ dir = 10 }, /area/science/circuit) +"hlc" = ( +/turf/open/floor/plasteel, +/area/security/prison) "hrP" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -127397,6 +127381,17 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) +"mvf" = ( +/obj/structure/table, +/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/security/prison) "mvm" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ @@ -127418,6 +127413,16 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/circuit/green, /area/science/research/abandoned) +"mEy" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/cobweb, +/obj/item/storage/crayons, +/obj/item/storage/crayons, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison) "mIi" = ( /obj/item/electropack/shockcollar, /obj/item/assembly/signaler, @@ -127607,6 +127612,13 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) +"oNW" = ( +/obj/machinery/vr_sleeper, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison) "oOb" = ( /obj/structure/window/reinforced{ dir = 8 @@ -127710,6 +127722,18 @@ }, /turf/open/floor/plating, /area/science/research/abandoned) +"pEq" = ( +/obj/structure/sign/warning/electricshock{ + pixel_y = 32 + }, +/obj/machinery/vr_sleeper, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/security/prison) "pHf" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -127852,6 +127876,10 @@ }, /turf/open/floor/plasteel, /area/science/circuit) +"tmZ" = ( +/obj/machinery/light/small, +/turf/open/floor/plasteel, +/area/security/prison) "twt" = ( /obj/machinery/vr_sleeper, /obj/effect/turf_decal/tile/neutral{ @@ -179430,10 +179458,10 @@ aaa aaa aaa aaa -aaa -ajr -aad -aad +aeH +aFm +aIc +aFm aFm aFm aFm @@ -179687,10 +179715,10 @@ aaa aaa aaa aaa -aaa -ajr -aaa -aad +aeH +aFm +mEy +bbt aFm aMc aNx @@ -179944,10 +179972,10 @@ aaa aaa aaa aaa -aaa -aad -aaa -aad +aeH +aFm +oNW +tmZ aFm aKV aNy @@ -180202,11 +180230,11 @@ aaa ajr ajr aad -aad -aaa -aad aFm -aMd +pEq +hlc +gUV +hlc aNz aPh aQZ @@ -180459,10 +180487,10 @@ aaa ajr aad aad -aad -aad -aad aFn +mvf +aJA +aJA aMe aNA aPi @@ -180717,7 +180745,7 @@ ajr aad aFm aFm -aIc +aFm aFm aFm aMf diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 522d9801ca..f72a787214 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -213,18 +213,12 @@ "aaG" = ( /obj/machinery/hydroponics/constructable, /obj/item/seeds/ambrosia, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /turf/open/floor/plasteel, /area/security/prison) "aaH" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, /obj/structure/cable/yellow{ icon_state = "2-4" }, @@ -394,30 +388,16 @@ /obj/item/canvas/twentythreeXtwentythree, /turf/open/floor/plasteel, /area/security/prison) -"abk" = ( -/obj/structure/table, -/obj/item/folder, -/obj/item/paper/guides/jobs/hydroponics, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/item/pen, -/obj/item/storage/crayons, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel, -/area/security/prison) "abl" = ( /obj/structure/table, /obj/machinery/computer/libraryconsole/bookmanagement, /turf/open/floor/plasteel, /area/security/prison) "abm" = ( -/obj/machinery/computer/arcade, /obj/machinery/computer/security/telescreen/entertainment{ pixel_y = 32 }, +/obj/machinery/vr_sleeper, /turf/open/floor/plasteel, /area/security/prison) "abn" = ( @@ -83303,6 +83283,13 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/cryopod) +"ghT" = ( +/obj/machinery/computer/arcade{ + icon_state = "arcade"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/prison) "gnZ" = ( /obj/item/radio/intercom{ pixel_y = -30 @@ -83417,6 +83404,15 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"hYs" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/security/prison) "ioI" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -83528,6 +83524,10 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"jVj" = ( +/obj/machinery/vr_sleeper, +/turf/open/floor/plasteel, +/area/security/prison) "kfu" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white, @@ -83819,6 +83819,17 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"odR" = ( +/obj/structure/table, +/obj/item/folder, +/obj/item/paper/guides/jobs/hydroponics, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/item/pen, +/obj/item/storage/crayons, +/turf/open/floor/plasteel, +/area/security/prison) "ohj" = ( /obj/item/integrated_electronics/analyzer, /obj/item/integrated_electronics/debugger, @@ -83924,6 +83935,13 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) +"pzu" = ( +/obj/structure/chair/stool, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison) "pCV" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -84241,6 +84259,16 @@ /obj/machinery/vending/assist, /turf/open/floor/plasteel, /area/science/mixing) +"uEa" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/public/glass{ + id_tag = "permahydro"; + name = "Recreation Module" + }, +/turf/open/floor/plasteel, +/area/security/prison) "uGW" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -106416,10 +106444,10 @@ aaa aaa aaf aaa -aaa -aaa -aaf -aaa +aax +aax +aaF +aax aax abj aaR @@ -106673,12 +106701,12 @@ aaa aaa aaf aaf -aaf -aaf -aaf -aaf aay -abk +odR +hYs +abC +uEa +hYs abC abC acr @@ -106930,13 +106958,13 @@ aaa aaa aaf aaa -aaa -aaf -aaa -aaa aax abl -abD +pzu +ghT +aax +jVj +aaR aaR aaI acF @@ -107189,7 +107217,7 @@ aaa aaa aax aax -aaF +aax aax aax abm diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 9ae92b26d4..d70bc0187b 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -1181,19 +1181,6 @@ }, /turf/open/floor/plasteel/dark, /area/security/prison) -"aeI" = ( -/obj/machinery/seed_extractor, -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/security/prison) "aeJ" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 @@ -1508,24 +1495,13 @@ /turf/open/floor/plasteel/dark, /area/security/prison) "afr" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, /obj/machinery/light/small, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/security/prison) -"afs" = ( -/obj/structure/table, -/obj/structure/bedsheetbin, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, /turf/open/floor/plasteel/cafeteria, /area/security/prison) "aft" = ( @@ -52882,6 +52858,19 @@ icon_state = "platingdmg3" }, /area/maintenance/department/security/brig) +"cJd" = ( +/obj/machinery/seed_extractor, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) "cJo" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -53223,6 +53212,21 @@ }, /turf/open/floor/plasteel/dark, /area/chapel/office) +"dqi" = ( +/obj/structure/table, +/obj/structure/bedsheetbin, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/window/reinforced, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison) "dqw" = ( /obj/machinery/door/airlock/maintenance{ req_access_txt = "0"; @@ -55028,6 +55032,15 @@ /obj/item/clothing/glasses/regular, /turf/open/floor/plating, /area/maintenance/department/science) +"hyl" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison) "hzc" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -58617,6 +58630,12 @@ }, /turf/open/floor/plasteel/dark, /area/science/explab) +"pED" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) "pEL" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 @@ -60956,6 +60975,12 @@ }, /turf/open/floor/plating, /area/maintenance/department/science) +"vtz" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) "vtT" = ( /turf/open/floor/plating, /area/maintenance/solars/port) @@ -62168,6 +62193,19 @@ }, /turf/open/floor/plating, /area/maintenance/department/engine) +"yff" = ( +/obj/machinery/vr_sleeper{ + icon_state = "sleeper"; + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison) "yfO" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/yellow, @@ -62184,6 +62222,15 @@ }, /turf/open/floor/plating, /area/maintenance/department/cargo) +"yhs" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison) "yjy" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/light{ @@ -81546,8 +81593,8 @@ aaa aaa adR aaa -abI -aaa +aem +aem aem aem aem @@ -81804,8 +81851,8 @@ aaa adR aaa aem -aem -aem +aeo +aeC aeT afn agy @@ -82060,9 +82107,9 @@ aaa aaa adR abI -aem -aeo -aeC +aen +aep +aeD aeU aeU afC @@ -82317,9 +82364,9 @@ aaa aaa adR aaa -aen -aep -aeD +aem +aeq +aeE aeU afo afD @@ -82574,9 +82621,9 @@ aaa aaa adR abI -aem -aeq -aeE +aen +aer +aeF aeU afp afE @@ -82831,9 +82878,9 @@ aaa aaa adR aaa -aen -aer -aeF +aem +aes +aeG aeV afq afF @@ -83088,10 +83135,10 @@ aaa aaa adR abI -aem -aes -aeG -aeU +aen +aet +aeH +vtz afo afG aeU @@ -83345,10 +83392,10 @@ aaa aaa adR aaa -aen -aet -aeH -aeH +aem +aeu +cJd +pED aeH afH aeH @@ -83603,8 +83650,8 @@ aaa adR abI aem -aeu -aeI +agy +agy lGp aeU aae @@ -83860,9 +83907,9 @@ aaa adR aaa aem -aem -aem aeW +yhs +hyl afr agy agc @@ -84116,11 +84163,11 @@ aaa aaa adR aaa -abI -aaa aem aeX -afs +dqi +yff +yff agy agd agp @@ -84372,8 +84419,6 @@ aaa aaa aaa aaa -aed -adR abI aem aem @@ -84385,6 +84430,8 @@ aem aem aem aem +aem +aem ahL ahL ahL @@ -84630,9 +84677,9 @@ aaa aaa aaa aaa -aaa -aaa -aaa +aed +adR +abI aaa aaa aaa diff --git a/_maps/map_files/debug/multiz.dmm b/_maps/map_files/debug/multiz.dmm new file mode 100644 index 0000000000..085a64bf97 --- /dev/null +++ b/_maps/map_files/debug/multiz.dmm @@ -0,0 +1,10403 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/open/space/basic, +/area/space) +"ab" = ( +/obj/structure/lattice, +/turf/open/space, +/area/space) +"ac" = ( +/turf/open/space, +/area/space/nearstation) +"ad" = ( +/turf/closed/wall/r_wall, +/area/maintenance/department/bridge) +"ae" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space, +/area/space/nearstation) +"af" = ( +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"ag" = ( +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"ah" = ( +/turf/closed/wall/r_wall, +/area/engine/atmos) +"ai" = ( +/obj/machinery/power/rtg/advanced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"aj" = ( +/turf/closed/wall/r_wall, +/area/engine/engineering) +"ak" = ( +/turf/closed/wall/r_wall, +/area/engine/gravity_generator) +"al" = ( +/obj/machinery/airalarm{ + frequency = 1439; + locked = 0; + pixel_y = 23 + }, +/obj/structure/closet/secure_closet/atmospherics, +/turf/open/floor/plating, +/area/engine/atmos) +"am" = ( +/obj/machinery/atmospherics/components/unary/tank/air, +/turf/open/floor/plating, +/area/engine/atmos) +"an" = ( +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/space/nearstation) +"ao" = ( +/obj/machinery/power/rtg/advanced, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"ap" = ( +/obj/machinery/airalarm{ + frequency = 1439; + locked = 0; + pixel_y = 23 + }, +/obj/structure/closet/secure_closet/engineering_electrical, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aq" = ( +/obj/machinery/computer/monitor, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ar" = ( +/obj/structure/closet/secure_closet/engineering_welding, +/turf/open/floor/plasteel, +/area/engine/engineering) +"as" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/space, +/area/space/nearstation) +"at" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/power/terminal{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"au" = ( +/turf/open/openspace, +/area/space) +"av" = ( +/obj/structure/stairs{ + dir = 1 + }, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"aw" = ( +/turf/open/floor/plating, +/area/engine/atmos) +"ax" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/engine/atmos) +"ay" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plating, +/area/engine/atmos) +"az" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/floor/plating, +/area/engine/atmos) +"aA" = ( +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/obj/machinery/airalarm{ + frequency = 1439; + locked = 0; + pixel_y = 23 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"aB" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/space, +/area/space/nearstation) +"aC" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/space, +/area/space/nearstation) +"aD" = ( +/obj/machinery/door/airlock/external/glass, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aE" = ( +/obj/structure/fans/tiny, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aF" = ( +/obj/machinery/door/airlock/external/glass, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aG" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aH" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aI" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/gravity_generator) +"aJ" = ( +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/engine/gravity_generator) +"aK" = ( +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/engine/gravity_generator) +"aL" = ( +/turf/open/floor/plasteel{ + dir = 4 + }, +/area/engine/gravity_generator) +"aM" = ( +/obj/machinery/suit_storage_unit/ce, +/turf/open/floor/plating, +/area/engine/atmos) +"aN" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/obj/effect/turf_decal/bot{ + dir = 2 + }, +/turf/open/floor/plasteel{ + dir = 2 + }, +/area/engine/atmos) +"aO" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + on = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"aP" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/atmos) +"aQ" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"aR" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aS" = ( +/obj/structure/table, +/obj/item/flashlight{ + pixel_y = 5 + }, +/obj/item/airlock_painter, +/turf/open/floor/plating, +/area/engine/engineering) +"aT" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"aU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"aV" = ( +/obj/machinery/power/rtg/advanced, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"aW" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aX" = ( +/obj/machinery/power/apc{ + dir = 8; + pixel_x = -25 + }, +/obj/machinery/light, +/obj/structure/table, +/obj/item/analyzer, +/obj/item/wrench, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/engine/atmos) +"aY" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"aZ" = ( +/obj/structure/tank_dispenser{ + pixel_x = -1 + }, +/turf/open/floor/plating, +/area/engine/atmos) +"ba" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plating, +/area/engine/atmos) +"bb" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister, +/obj/effect/turf_decal/bot{ + dir = 2 + }, +/turf/open/floor/plasteel{ + dir = 2 + }, +/area/engine/atmos) +"bc" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + on = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bd" = ( +/obj/structure/table, +/obj/item/weldingtool/experimental, +/obj/machinery/power/apc{ + dir = 8; + pixel_x = -25 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/engine/engineering) +"be" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/engine/atmos) +"bf" = ( +/obj/structure/closet/secure_closet/engineering_chief, +/turf/open/floor/plating, +/area/engine/engineering) +"bg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/power/apc{ + dir = 8; + name = "Gravity Generator APC"; + pixel_x = -25 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"bh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"bi" = ( +/obj/machinery/gravity_generator/main/station, +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/engine/gravity_generator) +"bj" = ( +/obj/machinery/door/airlock, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bk" = ( +/obj/machinery/door/airlock, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"bl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/floor/plating, +/area/engine/atmos) +"bm" = ( +/obj/machinery/atmospherics/components/binary/valve/on{ + icon_state = "mvalve_map-2"; + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/atmos) +"bn" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/machinery/light, +/turf/open/floor/plating, +/area/engine/atmos) +"bo" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/structure/table, +/obj/item/screwdriver/power, +/obj/item/crowbar/power, +/turf/open/floor/plating, +/area/engine/engineering) +"bp" = ( +/obj/machinery/light, +/obj/item/storage/box/lights/mixed, +/obj/item/lightreplacer, +/turf/open/floor/plating, +/area/engine/engineering) +"bq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"br" = ( +/obj/structure/closet/radiation, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"bs" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/engine/gravity_generator) +"bt" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bu" = ( +/turf/closed/wall/r_wall, +/area/bridge) +"bv" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/bridge) +"bw" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"bx" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"by" = ( +/turf/closed/wall/r_wall, +/area/hallway/secondary/entry) +"bz" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"bA" = ( +/turf/closed/wall/r_wall, +/area/hallway/primary/central) +"bB" = ( +/obj/machinery/power/apc{ + dir = 8; + pixel_x = -25 + }, +/obj/machinery/airalarm{ + frequency = 1439; + locked = 0; + pixel_y = 23 + }, +/obj/structure/closet/jcloset, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bC" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bD" = ( +/obj/machinery/airalarm{ + frequency = 1439; + locked = 0; + pixel_y = 23 + }, +/obj/machinery/power/apc{ + dir = 8; + pixel_x = -25 + }, +/obj/structure/closet/secure_closet/captains, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/bridge) +"bE" = ( +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bF" = ( +/obj/structure/closet/secure_closet/CMO, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bG" = ( +/obj/structure/table, +/obj/item/ammo_box/c10mm, +/obj/item/gun/ballistic/automatic/pistol, +/turf/open/floor/plasteel, +/area/bridge) +"bH" = ( +/obj/structure/table, +/obj/item/rcd_ammo/large, +/obj/item/rcd_ammo/large, +/obj/item/rcd_ammo/large, +/obj/item/construction/rcd, +/turf/open/floor/plasteel, +/area/bridge) +"bI" = ( +/obj/structure/table, +/turf/open/floor/plasteel, +/area/bridge) +"bJ" = ( +/obj/structure/table, +/obj/item/card/id/captains_spare, +/turf/open/floor/plasteel, +/area/bridge) +"bK" = ( +/obj/structure/table, +/obj/item/storage/backpack/holding, +/turf/open/floor/plasteel, +/area/bridge) +"bL" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bM" = ( +/obj/structure/closet/secure_closet/hop, +/turf/open/floor/plasteel{ + dir = 4 + }, +/area/bridge) +"bN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bO" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/bridge) +"bP" = ( +/obj/machinery/vending/cigarette, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bQ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/bridge) +"bR" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/bridge) +"bS" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/bridge) +"bT" = ( +/obj/machinery/computer/arcade, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bU" = ( +/obj/machinery/airalarm{ + frequency = 1439; + locked = 0; + pixel_y = 23 + }, +/obj/machinery/power/apc{ + dir = 8; + pixel_x = -25 + }, +/obj/structure/closet/firecloset/full, +/obj/structure/cable, +/turf/open/floor/plasteel{ + dir = 9 + }, +/area/hallway/secondary/entry) +"bV" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/hallway/secondary/entry) +"bW" = ( +/obj/structure/closet/secure_closet/hos, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/hallway/secondary/entry) +"bX" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/hallway/secondary/entry) +"bY" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"bZ" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/primary/central) +"ca" = ( +/obj/machinery/door/airlock, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/bridge) +"cb" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cc" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cd" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"ce" = ( +/obj/machinery/door/airlock/glass, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"cf" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/hallway/secondary/entry) +"cg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"ch" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"ci" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel{ + dir = 4 + }, +/area/hallway/primary/central) +"cj" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/hallway/primary/central) +"ck" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/hallway/primary/central) +"cl" = ( +/obj/structure/cable, +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/hallway/secondary/entry) +"cm" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/hallway/primary/central) +"cn" = ( +/obj/machinery/door/airlock, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"co" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cp" = ( +/obj/machinery/light, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel{ + dir = 10 + }, +/area/bridge) +"cq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/hallway/primary/central) +"cr" = ( +/obj/machinery/light, +/turf/open/floor/plasteel{ + dir = 6 + }, +/area/bridge) +"cs" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/hallway/primary/central) +"ct" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cu" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cv" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/bridge) +"cw" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cy" = ( +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/hallway/secondary/entry) +"cz" = ( +/obj/machinery/door/airlock/glass, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/construction) +"cA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cB" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/construction) +"cC" = ( +/obj/machinery/door/airlock/glass, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"cD" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel, +/area/construction) +"cE" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/construction) +"cF" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/construction) +"cG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/hallway/secondary/entry) +"cH" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/hallway/secondary/entry) +"cI" = ( +/obj/structure/table, +/obj/item/storage/fancy/donut_box, +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/hallway/secondary/entry) +"cJ" = ( +/obj/structure/table, +/obj/item/storage/fancy/donut_box, +/turf/open/floor/plasteel{ + dir = 10 + }, +/area/hallway/secondary/entry) +"cK" = ( +/obj/structure/table, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/rods/fifty, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"cL" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"cM" = ( +/obj/structure/table, +/obj/item/storage/firstaid/regular, +/obj/item/storage/firstaid/regular, +/obj/item/healthanalyzer, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"cN" = ( +/turf/closed/wall/r_wall, +/area/construction) +"cO" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/construction) +"cP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/construction) +"cQ" = ( +/obj/machinery/door/airlock/glass, +/turf/open/floor/plasteel, +/area/construction) +"cR" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/construction) +"cS" = ( +/turf/closed/wall/r_wall, +/area/storage/primary) +"cT" = ( +/obj/machinery/airalarm{ + frequency = 1439; + locked = 0; + pixel_y = 23 + }, +/obj/machinery/power/apc{ + dir = 8; + pixel_x = -25 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"cU" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/storage/primary) +"cV" = ( +/obj/machinery/door/airlock/glass, +/turf/open/floor/plasteel, +/area/storage/primary) +"cW" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"cX" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"cY" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/construction) +"cZ" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/ladder, +/turf/open/floor/plasteel, +/area/construction) +"da" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"db" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"dc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"dd" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/construction) +"de" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"df" = ( +/obj/machinery/power/apc/auto_name/north, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/construction) +"dg" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/construction) +"dh" = ( +/obj/machinery/power/deck_relay, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/construction) +"di" = ( +/obj/machinery/power/apc/auto_name/north, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"dj" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"dk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"dl" = ( +/turf/open/floor/plating, +/area/storage/primary) +"dm" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/construction) +"dn" = ( +/obj/machinery/power/deck_relay, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"do" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/construction) +"dp" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plating, +/area/storage/primary) +"dq" = ( +/obj/machinery/power/apc/auto_name/north, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/engine/storage) +"dr" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/engine/storage) +"ds" = ( +/obj/machinery/power/deck_relay, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/engine/storage) +"dx" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plating, +/area/storage/primary) +"dy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/construction) +"dz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/construction) +"dA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"dB" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/storage/primary) +"dC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"dD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"dE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"dF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"dG" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"dH" = ( +/obj/effect/landmark/start, +/turf/open/floor/plasteel, +/area/storage/primary) +"dI" = ( +/obj/effect/landmark/latejoin, +/turf/open/floor/plasteel, +/area/storage/primary) +"dJ" = ( +/turf/open/floor/plasteel, +/area/storage/primary) +"dL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/construction) +"dM" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/construction) +"dN" = ( +/obj/structure/table, +/turf/open/floor/plasteel, +/area/storage/primary) +"dO" = ( +/obj/structure/table, +/obj/machinery/light, +/obj/item/twohanded/fireaxe, +/obj/item/extinguisher, +/turf/open/floor/plasteel, +/area/storage/primary) +"dP" = ( +/obj/structure/table, +/obj/item/lightreplacer, +/turf/open/floor/plasteel, +/area/storage/primary) +"dQ" = ( +/obj/structure/table, +/obj/item/storage/box/lights/mixed, +/obj/item/storage/box/lights/tubes, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/storage/primary) +"dR" = ( +/obj/structure/table, +/obj/item/flashlight{ + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"dS" = ( +/turf/open/floor/plasteel, +/area/engine/storage) +"dV" = ( +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"dW" = ( +/turf/open/floor/plasteel, +/area/engine/engineering) +"dX" = ( +/turf/open/floor/plasteel{ + dir = 2 + }, +/area/hallway/secondary/service) +"dY" = ( +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"eb" = ( +/turf/open/floor/plasteel, +/area/bridge) +"ec" = ( +/turf/open/floor/plasteel{ + dir = 4 + }, +/area/bridge) +"ed" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"ee" = ( +/turf/open/floor/plasteel{ + dir = 9 + }, +/area/hallway/secondary/service) +"ej" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"em" = ( +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/hallway/secondary/service) +"en" = ( +/turf/open/floor/plasteel{ + dir = 10 + }, +/area/hallway/secondary/service) +"eo" = ( +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"es" = ( +/obj/effect/turf_decal/stripes/asteroid/corner, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"eu" = ( +/obj/effect/turf_decal/stripes/asteroid/line, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"ey" = ( +/obj/structure/ladder, +/obj/effect/turf_decal/stripes/asteroid/corner{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"ez" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/hallway/secondary/service) +"eC" = ( +/turf/open/openspace, +/area/maintenance/department/bridge) +"eD" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"eE" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"eF" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"eH" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"eI" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"eJ" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"eL" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"eM" = ( +/obj/effect/turf_decal/stripes/asteroid/corner{ + dir = 4 + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"eN" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"eO" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"eV" = ( +/obj/structure/ladder, +/turf/open/floor/plasteel, +/area/engine/storage) +"fa" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"fo" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/obj/machinery/door/airlock/external/glass, +/obj/structure/fans/tiny, +/turf/open/floor/plasteel, +/area/engine/storage) +"gK" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + icon_state = "connector_map-2"; + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister/toxins, +/turf/open/floor/plating, +/area/construction) +"gW" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"hi" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + icon_state = "inje_map-2"; + dir = 4 + }, +/turf/open/floor/plating, +/area/construction) +"hm" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/construction) +"ho" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/turf/open/floor/plating, +/area/engine/storage) +"ij" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/suit_storage_unit/ce, +/turf/open/floor/plasteel, +/area/construction) +"ip" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/space) +"iu" = ( +/turf/open/openspace, +/area/hallway/secondary/service) +"iK" = ( +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/hallway/secondary/service) +"jb" = ( +/obj/machinery/atmospherics/pipe/simple/multiz, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"jA" = ( +/obj/effect/turf_decal/stripes/white/line{ + icon_state = "warningline_white"; + dir = 8 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/storage) +"jT" = ( +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plating, +/area/construction) +"jV" = ( +/obj/effect/turf_decal/stripes/white/line{ + icon_state = "warningline_white"; + dir = 6 + }, +/turf/open/floor/plating, +/area/engine/storage) +"kg" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"lu" = ( +/obj/effect/turf_decal/stripes/asteroid/corner{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"mZ" = ( +/turf/open/floor/plasteel{ + dir = 4 + }, +/area/hallway/secondary/service) +"nx" = ( +/turf/open/openspace, +/area/space/nearstation) +"nz" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"od" = ( +/obj/effect/turf_decal/stripes/white/line, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/storage) +"oh" = ( +/obj/machinery/door/airlock/external/glass, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"on" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"oA" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"oJ" = ( +/obj/effect/turf_decal/stripes/asteroid/line, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"qo" = ( +/turf/open/openspace, +/area/engine/storage) +"qR" = ( +/obj/effect/turf_decal/stripes/white/line{ + icon_state = "warningline_white"; + dir = 9 + }, +/turf/open/floor/plating, +/area/engine/storage) +"rd" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/openspace, +/area/engine/storage) +"sh" = ( +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/hallway/secondary/service) +"sm" = ( +/obj/structure/stairs, +/turf/open/floor/plating, +/area/construction) +"sE" = ( +/obj/effect/turf_decal/stripes/white/line{ + icon_state = "warningline_white"; + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/storage) +"td" = ( +/obj/effect/turf_decal/stripes/white/line{ + icon_state = "warningline_white"; + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/storage) +"vt" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"vF" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/table, +/obj/item/rcd_ammo/large, +/obj/item/rcd_ammo/large, +/obj/item/rcd_ammo/large, +/obj/item/construction/rcd/combat/admin, +/turf/open/floor/plasteel, +/area/construction) +"xr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/table, +/obj/item/pipe_dispenser, +/turf/open/floor/plasteel, +/area/construction) +"xB" = ( +/obj/effect/turf_decal/stripes/white/line{ + icon_state = "warningline_white"; + dir = 1 + }, +/turf/open/floor/plating, +/area/engine/storage) +"xI" = ( +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"zC" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/construction) +"zZ" = ( +/obj/structure/disposalpipe/trunk{ + icon_state = "pipe-t"; + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plating, +/area/construction) +"AG" = ( +/turf/closed/wall/r_wall, +/area/engine/storage) +"AI" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/table, +/obj/item/tank/jetpack/oxygen/captain, +/obj/item/storage/belt/utility/chief/full, +/obj/item/clothing/gloves/color/yellow{ + pixel_y = 10 + }, +/turf/open/floor/plasteel, +/area/construction) +"Bk" = ( +/obj/structure/grille, +/turf/open/openspace, +/area/space/nearstation) +"Bm" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"CK" = ( +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/bin, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"Dm" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"DG" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/storage) +"DK" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/storage) +"Eb" = ( +/obj/effect/turf_decal/stripes/white/line, +/turf/open/floor/plating, +/area/engine/storage) +"EF" = ( +/obj/machinery/atmospherics/components/binary/valve, +/turf/open/floor/plating, +/area/construction) +"EH" = ( +/obj/effect/turf_decal/stripes/white/line{ + icon_state = "warningline_white"; + dir = 1 + }, +/obj/effect/turf_decal/stripes/white/line{ + icon_state = "warningline_white"; + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/storage) +"Fd" = ( +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"FL" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/green/hidden{ + icon_state = "pipe11-2"; + dir = 4 + }, +/turf/open/floor/plating, +/area/construction) +"FY" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/construction) +"Hk" = ( +/obj/machinery/atmospherics/pipe/simple/multiz, +/turf/open/floor/plating, +/area/construction) +"IC" = ( +/obj/machinery/atmospherics/components/binary/valve, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"IN" = ( +/obj/effect/turf_decal/stripes/asteroid/line, +/turf/open/floor/plasteel, +/area/engine/storage) +"Jt" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"JH" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/storage) +"Kd" = ( +/obj/machinery/door/airlock/external/glass, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"Kw" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"KM" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"LE" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"LW" = ( +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"ME" = ( +/obj/machinery/light, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"Ob" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/openspace, +/area/space/nearstation) +"Og" = ( +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plating, +/area/engine/storage) +"Pu" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/storage) +"Pz" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/storage) +"Qo" = ( +/obj/structure/disposalpipe/trunk/multiz/down{ + icon_state = "pipe-down"; + dir = 1 + }, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"Qw" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"St" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/table, +/turf/open/floor/plasteel, +/area/construction) +"Tf" = ( +/turf/open/floor/plating, +/area/construction) +"TH" = ( +/turf/open/floor/plating, +/area/engine/storage) +"TY" = ( +/turf/closed/wall/r_wall, +/area/hallway/secondary/service) +"Um" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"UH" = ( +/obj/machinery/atmospherics/pipe/simple/multiz, +/turf/open/floor/plating, +/area/engine/storage) +"Vn" = ( +/obj/effect/turf_decal/stripes/asteroid/line, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"VB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/meter, +/turf/open/floor/plating, +/area/construction) +"WN" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"XN" = ( +/turf/open/floor/plating, +/area/hallway/secondary/service) +"Zc" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"ZH" = ( +/obj/structure/disposalpipe/trunk/multiz, +/turf/open/floor/plating, +/area/construction) +"ZQ" = ( +/obj/effect/turf_decal/stripes/white/line{ + icon_state = "warningline_white"; + dir = 5 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/storage) + +(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 +"} +(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 +"} +(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 +"} +(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 +"} +(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 +"} +(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 +"} +(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 +"} +(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 +"} +(9,1,1) = {" +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 +aa +aa +aa +aa +aa +aa +aa +aa +"} +(10,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(11,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +bY +bY +bY +bY +bY +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(12,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +af +af +af +af +af +af +af +bz +af +af +af +af +af +bz +af +af +af +af +af +bz +af +af +af +af +af +af +af +bz +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(13,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ah +ah +ah +ah +ah +ah +ah +bA +bZ +bZ +bZ +bZ +bZ +bA +cN +cN +cN +cN +cN +cN +cN +cN +cN +cN +cN +cN +cN +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(14,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ah +al +aw +aM +aZ +aX +bA +bB +bE +bE +bE +bE +bE +bE +cN +cD +dm +dy +dy +dy +dy +dy +dy +dy +dy +dm +dM +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(15,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +Dm +ah +am +ax +aw +ba +be +bj +bt +bN +bN +bN +bC +bN +bN +cP +cE +Tf +Tf +ZH +FY +zZ +Tf +Tf +cR +cR +cR +dL +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(16,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ah +am +ay +aN +bb +bl +ah +bx +bL +bL +bL +cg +bL +bL +cz +cF +Tf +Tf +Tf +Tf +Tf +Tf +Tf +cR +Tf +cR +dL +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(17,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ah +am +ay +aO +bc +bm +ah +bE +bE +bE +bE +ch +bE +bE +cQ +cY +Tf +cN +df +Tf +Tf +Tf +Tf +cR +hi +cR +dL +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(18,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ah +am +az +aP +aP +bn +ah +bF +bE +co +bE +ch +bE +bE +cN +cY +Tf +Tf +dg +Tf +Tf +Tf +Tf +cR +FL +cR +dL +cN +ME +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(19,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +ad +ah +ah +ah +ah +ah +ah +bu +bu +bv +bu +bu +ci +bL +bL +cB +cO +dd +dd +dh +Tf +Tf +Tf +Tf +Tf +gK +Tf +dL +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(20,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ae +ag +ag +ag +ag +ag +ag +ag +bu +bD +bO +cp +cv +cj +bE +bE +cR +cY +Tf +cN +jT +Tf +Tf +Tf +Tf +Tf +Tf +Tf +dL +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(21,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ae +ag +ai +an +ai +an +ai +ag +bv +bG +bQ +eb +bv +ck +bN +bN +zC +hm +EF +VB +Hk +Tf +Tf +Tf +Tf +Tf +sm +Tf +dL +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(22,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ae +ag +ao +as +aB +as +aV +ag +bv +bI +bQ +eb +bu +cm +bE +bE +cN +cY +Tf +Tf +Tf +Tf +Tf +Tf +Tf +Tf +Tf +Tf +ij +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(23,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ae +ag +ag +ag +aC +ag +ag +ag +bv +bJ +bR +bS +ca +cq +bE +bE +cQ +cY +Tf +Tf +Tf +Tf +Tf +Tf +Tf +Tf +Tf +Tf +St +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(24,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ae +ac +ac +ag +aC +ag +ac +ac +bv +bK +eb +eb +bu +cm +bE +bE +cQ +cY +Tf +Tf +Tf +Tf +Tf +Tf +Tf +Tf +Tf +Tf +xr +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(25,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ae +ac +ac +aj +aD +aj +ac +ac +bv +bH +eb +eb +bv +cm +bE +bE +cN +cZ +do +dz +dz +dz +dz +dz +dz +dz +dz +AI +vF +cN +ME +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(26,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ae +ac +ac +aj +aE +aj +ac +ac +bu +bM +ec +cr +bu +cm +bE +bE +cS +cS +cS +dJ +dJ +dJ +dJ +dJ +dJ +dJ +dJ +cS +cS +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(27,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +ad +aj +aj +aF +aj +aj +aj +bu +bu +bv +bu +bu +cs +bE +bE +cS +cT +on +dA +dl +dl +dl +dl +dl +dl +dl +dp +dl +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(28,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +aj +ap +aG +aS +bd +bo +bw +bN +bN +ct +bN +cu +bN +bN +cU +cW +dJ +dB +dl +dl +dl +dl +dl +dl +dl +dl +dl +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(29,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +aj +aq +aH +aR +aW +aW +bk +bL +bL +bL +cb +cw +bE +bE +cS +cX +dJ +dB +dl +dD +dc +dc +dA +dl +dD +dc +dc +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(30,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +aj +ar +dW +aG +bf +bp +aj +bP +bE +bE +cc +cA +bE +bE +cS +cX +dJ +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dN +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(31,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +Dm +ak +ak +ak +aT +ak +ak +bs +bL +bE +bE +cc +cA +bE +bE +cS +da +dJ +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dO +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(32,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +aA +aQ +aU +bg +bq +ak +bL +bE +bE +cd +cx +bL +bL +cC +db +dJ +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dN +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(33,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +at +bh +bh +bh +br +ak +bL +bE +bE +cc +cA +bE +bE +cV +dJ +dJ +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dN +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(34,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +aI +aI +dV +aI +aI +ak +bT +bE +co +cc +cA +bE +bE +cV +dJ +dJ +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dP +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(35,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +dV +dV +dV +dV +dV +by +by +by +by +ce +cG +by +by +by +de +dJ +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dQ +cS +ME +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(36,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +dV +aJ +aK +aL +dV +by +bU +cl +cl +cf +cH +cI +cJ +by +dJ +dJ +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dR +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(37,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +Dm +ak +dV +aK +dV +bi +dV +by +bV +eo +eo +eo +eo +eo +cK +by +dJ +dJ +dB +dl +dF +dk +dk +dC +dl +dF +dk +dk +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(38,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +dV +aL +aK +aJ +dV +by +bW +eo +eo +eo +eo +eo +cL +by +dJ +dJ +dB +dl +dl +dl +dl +dl +dl +dl +dl +dl +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(39,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +dV +dV +aY +dV +dV +by +bX +eo +eo +cy +eo +eo +cM +by +dk +Bm +dC +dl +dl +dl +dl +dl +dl +dl +dx +dl +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(40,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +ak +ak +ak +ak +ak +by +by +cn +by +oh +by +cn +by +by +cS +cS +cS +cS +cS +cS +cS +cS +cS +cS +cS +cS +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(41,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +oA +af +af +af +af +oA +af +af +af +by +LW +by +af +af +af +oA +af +af +af +af +oA +af +af +af +af +oA +af +af +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(42,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +by +Kd +by +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(43,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(44,1,1) = {" +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 +aa +aa +aa +aa +aa +aa +aa +aa +"} +(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 +"} +(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 +"} +(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 +"} +(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 +"} +(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 +"} +(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 +"} +(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 +"} +(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 +"} + +(1,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(2,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(3,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(4,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(5,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(6,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(7,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(8,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(9,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(10,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(11,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +bY +bY +bY +bY +bY +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(12,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +af +af +af +af +af +af +af +bz +af +af +af +af +af +bz +af +af +af +af +bz +af +af +af +af +bz +af +af +af +af +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(13,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +TY +TY +TY +TY +TY +TY +TY +XN +XN +XN +XN +XN +TY +TY +TY +TY +TY +TY +TY +TY +TY +TY +TY +TY +TY +TY +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(14,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +Dm +TY +XN +XN +eE +XN +dY +dY +WN +dY +dY +dY +dY +dY +WN +dY +es +eI +eI +kg +eI +eI +eI +eI +kg +eI +eI +eM +TY +ME +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(15,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +XN +XN +XN +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +eu +CK +gW +Qo +XN +XN +XN +XN +eF +eF +eF +eL +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(16,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +XN +XN +dX +dX +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +eu +XN +XN +XN +XN +XN +XN +XN +eF +iu +eF +eL +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(17,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +XN +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +eu +XN +TY +di +XN +XN +XN +XN +eF +iu +eF +eL +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(18,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +dY +dY +dY +dY +dY +dY +dY +eN +dY +dY +dY +dY +dY +eu +XN +XN +dj +XN +XN +XN +XN +eF +eF +eF +eL +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(19,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +ad +TY +eF +ed +ed +eF +TY +TY +TY +eF +TY +TY +mZ +dY +dY +dY +eu +XN +XN +dn +XN +XN +XN +XN +XN +XN +XN +Kw +TY +ME +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(20,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +Ob +nx +nx +nx +nx +nx +nx +nx +TY +dY +dY +WN +TY +em +dY +dY +dY +eu +XN +TY +Fd +XN +XN +XN +XN +XN +XN +XN +eL +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(21,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +Bk +nx +nx +nx +nx +nx +nx +nx +eF +dY +dY +dY +eF +sh +dY +dY +dY +eu +XN +XN +jb +LE +IC +jb +XN +XN +iu +XN +eL +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(22,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +Bk +nx +nx +nx +nx +nx +nx +nx +eO +dY +dY +dY +dY +sh +dY +dY +dY +eu +XN +XN +XN +Zc +XN +XN +XN +XN +XN +XN +eL +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(23,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +Bk +nx +nx +nx +nx +nx +nx +nx +eO +dY +dY +dY +dY +sh +dY +dY +dY +eu +XN +XN +XN +XN +XN +XN +XN +XN +av +XN +eL +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(24,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +Bk +nx +nx +nx +nx +nx +nx +nx +eO +dY +dY +dY +dY +sh +dY +dY +dY +eu +XN +XN +XN +XN +XN +XN +XN +XN +XN +XN +Kw +TY +ME +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(25,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +Bk +nx +nx +nx +nx +nx +nx +nx +eF +dY +dY +dY +eF +sh +dY +dY +eN +ey +eJ +eJ +eJ +eJ +eJ +eJ +eJ +eJ +eJ +eH +lu +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(26,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +Bk +nx +nx +nx +nx +nx +nx +nx +TY +dY +dY +eN +TY +sh +dY +dY +TY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +TY +TY +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(27,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +ad +TY +eF +eD +eD +eF +TY +TY +TY +eF +TY +TY +sh +dY +dY +WN +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +WN +dY +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(28,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +dY +dY +dY +dY +dY +dY +dY +WN +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(29,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +TY +ME +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(30,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +eN +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +eF +eF +eF +eF +eF +eF +eF +eF +eF +TY +KM +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(31,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +TY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(32,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +Dm +TY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(33,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +dY +dY +dY +dY +TY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(34,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +dY +dY +dY +dY +TY +dY +dY +eN +dY +dY +dY +dY +eN +dY +dY +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(35,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +dY +dY +dY +dY +TY +TY +TY +TY +dY +TY +TY +TY +TY +dY +dY +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(36,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +sh +iK +mZ +xI +TY +ee +iK +ez +iK +iK +iK +en +TY +dY +dY +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(37,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +iK +dY +iK +dY +TY +sh +dY +dY +dY +dY +dY +dY +TY +dY +dY +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(38,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +Dm +TY +dY +mZ +iK +sh +dY +TY +sh +dY +dY +dY +dY +dY +dY +TY +dY +dY +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(39,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +dY +eN +dY +dY +TY +sh +dY +dY +iK +dY +dY +dY +TY +dY +eN +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(40,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +TY +TY +TY +TY +TY +TY +TY +XN +XN +XN +XN +XN +TY +TY +TY +TY +TY +TY +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(41,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +oA +af +af +af +af +oA +af +af +af +af +af +af +oA +af +af +af +oA +af +oJ +eC +eC +eC +eC +eC +eC +eC +eC +eC +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(42,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(43,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(44,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(45,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(46,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(47,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(48,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(49,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(50,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(51,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(52,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} + +(1,1,3) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(2,1,3) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(3,1,3) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(4,1,3) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(5,1,3) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(6,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(7,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(8,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(9,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(10,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(11,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(12,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +rd +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(13,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(14,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(15,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +jV +td +td +td +td +td +td +jA +jA +ZQ +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(16,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +xB +DG +TH +TH +TH +TH +TH +DK +qo +od +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(17,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +xB +AG +dq +TH +TH +TH +TH +DK +qo +od +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(18,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +xB +TH +dr +TH +TH +TH +TH +DK +DK +od +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(19,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +AG +AG +AG +AG +AG +AG +AG +AG +vt +Um +Um +Um +Um +Um +Um +Um +Um +xB +TH +ds +TH +TH +TH +TH +TH +Pz +Eb +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(20,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +nx +nx +nx +nx +nx +nx +nx +ip +Jt +dS +dS +dS +dS +dS +dS +dS +dS +xB +AG +Og +TH +TH +TH +TH +TH +TH +Eb +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(21,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +nx +nx +nx +nx +nx +nx +nx +ip +Jt +dS +dS +dS +dS +dS +dS +dS +dS +xB +Pz +TH +TH +TH +UH +JH +ho +TH +Eb +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(22,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +nx +nx +nx +nx +nx +nx +nx +ip +Jt +dS +dS +dS +dS +dS +dS +dS +dS +xB +TH +TH +TH +TH +TH +Pu +TH +TH +Eb +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(23,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +nx +nx +nx +nx +nx +nx +nx +ip +Jt +dS +dS +dS +dS +dS +dS +dS +dS +xB +TH +TH +TH +TH +TH +TH +TH +qo +Eb +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(24,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +nx +nx +nx +nx +nx +nx +nx +ip +Jt +dS +dS +dS +dS +dS +dS +dS +dS +EH +sE +sE +sE +sE +sE +sE +sE +sE +qR +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(25,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +nx +nx +nx +nx +nx +nx +nx +ip +Jt +dS +dS +dS +dS +dS +dS +nz +eV +dS +IN +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(26,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +nx +nx +nx +nx +nx +nx +dG +fo +dS +dS +dS +dS +dS +dS +dS +AG +dS +dS +IN +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(27,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +AG +AG +AG +AG +AG +AG +AG +AG +fa +Qw +Qw +Qw +Qw +Qw +Qw +ej +Qw +Qw +Vn +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(28,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(29,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(30,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(31,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(32,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(33,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(34,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(35,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(36,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(37,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(38,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(39,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(40,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(41,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(42,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(43,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(44,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(45,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(46,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(47,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(48,1,3) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(49,1,3) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(50,1,3) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(51,1,3) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(52,1,3) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} diff --git a/_maps/multiz_debug.dm b/_maps/multiz_debug.dm new file mode 100644 index 0000000000..0521fef59d --- /dev/null +++ b/_maps/multiz_debug.dm @@ -0,0 +1 @@ +#define FORCE_MAP "_maps/multiz_debug.json" \ No newline at end of file diff --git a/_maps/multiz_debug.json b/_maps/multiz_debug.json new file mode 100644 index 0000000000..7e39981e23 --- /dev/null +++ b/_maps/multiz_debug.json @@ -0,0 +1,6 @@ +{ + "map_name": "MultiZ Debug", + "map_path": "map_files/debug", + "map_file": "multiz.dmm", + "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Down": -1}] + } diff --git a/_maps/shuttles/infiltrator_basic.dmm b/_maps/shuttles/infiltrator_basic.dmm index 263d692764..f7ec35c667 100644 --- a/_maps/shuttles/infiltrator_basic.dmm +++ b/_maps/shuttles/infiltrator_basic.dmm @@ -2,15 +2,21 @@ "aa" = ( /turf/template_noop, /area/template_noop) -"ac" = ( -/obj/machinery/porta_turret/syndicate{ +"ab" = ( +/obj/machinery/porta_turret/syndicate/shuttle{ dir = 9 }, -/turf/closed/wall/mineral/plastitanium, +/turf/closed/wall/r_wall/syndicate, +/area/shuttle/syndicate/bridge) +"ac" = ( +/turf/closed/wall/r_wall/syndicate, /area/shuttle/syndicate/bridge) "ad" = ( -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/syndicate/bridge) +/obj/machinery/porta_turret/syndicate/shuttle{ + dir = 10 + }, +/turf/closed/wall/r_wall/syndicate, +/area/shuttle/syndicate/hallway) "ae" = ( /obj/structure/window/plastitanium, /obj/machinery/door/poddoor/shutters{ @@ -21,11 +27,8 @@ /turf/open/floor/plating, /area/shuttle/syndicate/bridge) "af" = ( -/obj/machinery/porta_turret/syndicate{ - dir = 5 - }, -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/syndicate/bridge) +/turf/closed/wall/r_wall/syndicate, +/area/shuttle/syndicate/hallway) "ag" = ( /obj/machinery/computer/med_data/syndie, /obj/effect/turf_decal/bot_white, @@ -144,7 +147,7 @@ /area/shuttle/syndicate/bridge) "au" = ( /obj/machinery/status_display/evac, -/turf/closed/wall/mineral/plastitanium, +/turf/closed/wall/r_wall/syndicate, /area/shuttle/syndicate/bridge) "av" = ( /obj/machinery/door/airlock/hatch{ @@ -164,14 +167,14 @@ /turf/open/floor/plasteel/dark, /area/shuttle/syndicate/bridge) "aw" = ( -/obj/machinery/porta_turret/syndicate{ - dir = 10 +/obj/machinery/porta_turret/syndicate/shuttle{ + dir = 9 }, -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/syndicate/hallway) +/turf/closed/wall/r_wall/syndicate, +/area/shuttle/syndicate/eva) "ax" = ( -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/syndicate/hallway) +/turf/closed/wall/r_wall/syndicate, +/area/shuttle/syndicate/eva) "ay" = ( /obj/structure/table/reinforced, /obj/item/stack/cable_coil/white, @@ -222,11 +225,8 @@ /turf/open/floor/plasteel/dark, /area/shuttle/syndicate/hallway) "aB" = ( -/obj/machinery/porta_turret/syndicate{ - dir = 6 - }, -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/syndicate/hallway) +/turf/closed/wall/r_wall/syndicate, +/area/shuttle/syndicate/airlock) "aC" = ( /obj/structure/chair/comfy/shuttle{ dir = 4; @@ -265,14 +265,17 @@ /turf/open/floor/plasteel/dark, /area/shuttle/syndicate/hallway) "aF" = ( -/obj/machinery/porta_turret/syndicate{ +/obj/machinery/porta_turret/syndicate/shuttle{ + dir = 5 + }, +/turf/closed/wall/r_wall/syndicate, +/area/shuttle/syndicate/armory) +"aG" = ( +/obj/machinery/porta_turret/syndicate/shuttle{ dir = 9 }, -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/syndicate/eva) -"aG" = ( -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/syndicate/eva) +/turf/closed/wall/r_wall/syndicate, +/area/shuttle/syndicate/medical) "aH" = ( /obj/structure/chair/comfy/shuttle{ dir = 4; @@ -314,14 +317,11 @@ /turf/open/floor/plasteel/dark, /area/shuttle/syndicate/hallway) "aJ" = ( -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/syndicate/airlock) +/turf/closed/wall/r_wall/syndicate, +/area/shuttle/syndicate/medical) "aK" = ( -/obj/machinery/porta_turret/syndicate{ - dir = 5 - }, -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/syndicate/armory) +/turf/closed/wall/r_wall/syndicate/nodiagonal, +/area/shuttle/syndicate/medical) "aL" = ( /obj/machinery/suit_storage_unit/syndicate, /obj/effect/turf_decal/stripes/line{ @@ -508,7 +508,7 @@ /obj/structure/sign/warning/vacuum/external{ layer = 4 }, -/turf/closed/wall/mineral/plastitanium, +/turf/closed/wall/r_wall/syndicate, /area/shuttle/syndicate/airlock) "be" = ( /obj/machinery/suit_storage_unit/syndicate, @@ -517,11 +517,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/eva) -"bf" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/plasteel/dark, -/area/shuttle/syndicate/eva) "bg" = ( /obj/structure/grille, /obj/structure/window/plastitanium, @@ -543,31 +538,28 @@ /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/airlock) "bj" = ( -/obj/machinery/porta_turret/syndicate{ - dir = 9 - }, -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/syndicate/medical) +/turf/closed/wall/r_wall/syndicate/nodiagonal, +/area/shuttle/syndicate/armory) "bk" = ( -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/syndicate/medical) -"bl" = ( /obj/machinery/status_display/ai, -/turf/closed/wall/mineral/plastitanium, +/turf/closed/wall/r_wall/syndicate, /area/shuttle/syndicate/medical) "bm" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/shuttle/syndicate/medical) +/turf/closed/wall/r_wall/syndicate, +/area/shuttle/syndicate/armory) "bn" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, +/obj/machinery/status_display/evac, +/turf/closed/wall/r_wall/syndicate, /area/shuttle/syndicate/armory) "bo" = ( -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/syndicate/armory) -"bp" = ( -/obj/machinery/status_display/evac, -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/syndicate/armory) +/obj/machinery/nuclearbomb/syndicate{ + anchored = 1 + }, +/obj/machinery/door/window{ + dir = 1 + }, +/turf/open/floor/circuit/red, +/area/shuttle/syndicate/hallway) "bq" = ( /obj/machinery/sleeper/syndie{ dir = 4 @@ -1043,14 +1035,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/shuttle/syndicate/hallway) -"cm" = ( -/obj/machinery/nuclearbomb/syndicate, -/obj/machinery/door/window{ - dir = 1; - name = "Theatre Stage" - }, -/turf/open/floor/circuit/red, -/area/shuttle/syndicate/hallway) "cn" = ( /obj/machinery/light{ dir = 4 @@ -1169,18 +1153,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating/airless, /area/shuttle/syndicate/medical) -"cC" = ( -/obj/machinery/porta_turret/syndicate{ - dir = 6 - }, -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/syndicate/medical) -"cD" = ( -/obj/machinery/porta_turret/syndicate{ - dir = 10 - }, -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/syndicate/armory) "cE" = ( /obj/structure/shuttle/engine/propulsion/left, /obj/effect/turf_decal/stripes/line, @@ -1196,6 +1168,35 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating/airless, /area/shuttle/syndicate/armory) +"dp" = ( +/obj/machinery/porta_turret/syndicate/shuttle{ + dir = 10 + }, +/turf/closed/wall/r_wall/syndicate, +/area/shuttle/syndicate/armory) +"pd" = ( +/obj/machinery/porta_turret/syndicate/shuttle{ + dir = 5 + }, +/turf/closed/wall/r_wall/syndicate, +/area/shuttle/syndicate/bridge) +"vv" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/plasteel/dark, +/area/shuttle/syndicate/eva) +"In" = ( +/obj/machinery/porta_turret/syndicate/shuttle{ + dir = 6 + }, +/turf/closed/wall/r_wall/syndicate, +/area/shuttle/syndicate/hallway) +"MJ" = ( +/obj/machinery/porta_turret/syndicate/shuttle{ + dir = 6 + }, +/turf/closed/wall/r_wall/syndicate, +/area/shuttle/syndicate/medical) (1,1,1) = {" aa @@ -1211,16 +1212,16 @@ aa aa aa aa -bj -bk -bk -bk -bk -bk -bk -bk -bk -bk +aG +aJ +aJ +aJ +aJ +aJ +aJ +aJ +aJ +aJ "} (2,1,1) = {" aa @@ -1230,13 +1231,13 @@ aa aa aa aa -aF -aG -aG -aG -aG -aG -bk +aw +ax +ax +ax +ax +ax +aJ bq bC bq @@ -1255,13 +1256,13 @@ aa aa aa aa -aG +ax aL aR aR aR be -bk +aJ br bD bH @@ -1280,13 +1281,13 @@ aa aa aa aa -aG +ax aM aM aM aM aM -bl +bk bs bD bI @@ -1298,51 +1299,51 @@ cu cB "} (5,1,1) = {" +ab +ac +ac +ac ac -ad -ad -ad -ad aa aa -aG +ax aM aM aM aM aM -bk +aJ bt bD bJ bT cb -bm -bk -bk -cC +aK +aJ +aJ +MJ "} (6,1,1) = {" -ad +ac ag an at +ac ad -aw aa -aG +ax aN aS aU aZ -bf -bk +vv +aJ bu bD bJ bT cc -bk +aJ aa aa aa @@ -1352,24 +1353,24 @@ ae ah ao at -ad +ac +af +af +ax +ax ax ax -aG -aG -aG -aG ba bg -bm +aK bv bv bK bv -bk -bk -ax -ax +aJ +aJ +af +af aa "} (8,1,1) = {" @@ -1417,7 +1418,7 @@ aD bL bU az -cm +bo cr cw aa @@ -1427,7 +1428,7 @@ ae ak ap at -ad +ac aA aE aI @@ -1452,75 +1453,75 @@ ae al ar at -ad -ax -ax -ax -ax -aJ -aJ +ac +af +af +af +af +aB +aB bb bh -bn +bj bw bw bM bw -bo -bo -ax -ax +bm +bm +af +af aa "} (12,1,1) = {" -ad +ac am as at -ad -aB +ac +In aa -aJ +aB aO aO aX bc aO -bo +bm bx bG bN bV ce -bo +bm aa aa aa "} (13,1,1) = {" -af -ad -ad -ad -ad +pd +ac +ac +ac +ac aa aa -aJ +aB aP aP aP aP aP -bo +bm by bG bN bV cf -bn -bo -bo -cD +bj +bm +bm +dp "} (14,1,1) = {" aa @@ -1530,13 +1531,13 @@ aa aa aa aa -aJ +aB aP aP aP aP aP -bp +bn bz bG bO @@ -1555,13 +1556,13 @@ aa aa aa aa -aJ +aB aQ aT aT aT bi -bo +bm bA bG bP @@ -1580,13 +1581,13 @@ aa aa aa aa -aK -aJ -aJ +aF +aB +aB aY bd -aJ -bo +aB +bm bB bG bQ @@ -1611,14 +1612,14 @@ aa aa aa aa -aK -bo -bo -bo -bo -bo -bo -bo -bo -bo +aF +bm +bm +bm +bm +bm +bm +bm +bm +bm "} diff --git a/code/__DEFINES/MC.dm b/code/__DEFINES/MC.dm index 97ce6ef6fd..fe48edd266 100644 --- a/code/__DEFINES/MC.dm +++ b/code/__DEFINES/MC.dm @@ -2,12 +2,12 @@ #define MC_SPLIT_TICK_INIT(phase_count) var/original_tick_limit = Master.current_ticklimit; var/split_tick_phases = ##phase_count #define MC_SPLIT_TICK \ - if(split_tick_phases > 1){\ - Master.current_ticklimit = ((original_tick_limit - TICK_USAGE) / split_tick_phases) + TICK_USAGE;\ - --split_tick_phases;\ - } else {\ - Master.current_ticklimit = original_tick_limit;\ - } + if(split_tick_phases > 1){\ + Master.current_ticklimit = ((original_tick_limit - TICK_USAGE) / split_tick_phases) + TICK_USAGE;\ + --split_tick_phases;\ + } else {\ + Master.current_ticklimit = original_tick_limit;\ + } // Used to smooth out costs to try and avoid oscillation. #define MC_AVERAGE_FAST(average, current) (0.7 * (average) + 0.3 * (current)) @@ -65,14 +65,14 @@ #define SUBSYSTEM_DEF(X) GLOBAL_REAL(SS##X, /datum/controller/subsystem/##X);\ /datum/controller/subsystem/##X/New(){\ - NEW_SS_GLOBAL(SS##X);\ - PreInit();\ + NEW_SS_GLOBAL(SS##X);\ + PreInit();\ }\ /datum/controller/subsystem/##X #define PROCESSING_SUBSYSTEM_DEF(X) GLOBAL_REAL(SS##X, /datum/controller/subsystem/processing/##X);\ /datum/controller/subsystem/processing/##X/New(){\ - NEW_SS_GLOBAL(SS##X);\ - PreInit();\ + NEW_SS_GLOBAL(SS##X);\ + PreInit();\ }\ /datum/controller/subsystem/processing/##X diff --git a/code/__DEFINES/_globals.dm b/code/__DEFINES/_globals.dm index e5f5929a95..cc3e385f9f 100644 --- a/code/__DEFINES/_globals.dm +++ b/code/__DEFINES/_globals.dm @@ -3,8 +3,8 @@ //Creates a global initializer with a given InitValue expression, do not use #define GLOBAL_MANAGED(X, InitValue)\ /datum/controller/global_vars/proc/InitGlobal##X(){\ - ##X = ##InitValue;\ - gvars_datum_init_order += #X;\ + ##X = ##InitValue;\ + gvars_datum_init_order += #X;\ } //Creates an empty global initializer, do not use #define GLOBAL_UNMANAGED(X) /datum/controller/global_vars/proc/InitGlobal##X() { return; } @@ -13,8 +13,8 @@ #ifndef TESTING #define GLOBAL_PROTECT(X)\ /datum/controller/global_vars/InitGlobal##X(){\ - ..();\ - gvars_datum_protected_varlist[#X] = TRUE;\ + ..();\ + gvars_datum_protected_varlist[#X] = TRUE;\ } #else #define GLOBAL_PROTECT(X) @@ -41,6 +41,12 @@ //Create a list global that is initialized as an empty list #define GLOBAL_LIST_EMPTY(X) GLOBAL_LIST_INIT(X, list()) +// Create a typed list global with an initializer expression +#define GLOBAL_LIST_INIT_TYPED(X, Typepath, InitValue) GLOBAL_RAW(/list##Typepath/X); GLOBAL_MANAGED(X, InitValue) + +// Create a typed list global that is initialized as an empty list +#define GLOBAL_LIST_EMPTY_TYPED(X, Typepath) GLOBAL_LIST_INIT_TYPED(X, Typepath, list()) + //Create a typed global with an initializer expression #define GLOBAL_DATUM_INIT(X, Typepath, InitValue) GLOBAL_RAW(Typepath/##X); GLOBAL_MANAGED(X, InitValue) diff --git a/code/__DEFINES/_protect.dm b/code/__DEFINES/_protect.dm index 2bfb984153..fd27d2fbe9 100644 --- a/code/__DEFINES/_protect.dm +++ b/code/__DEFINES/_protect.dm @@ -1,10 +1,10 @@ #define GENERAL_PROTECT_DATUM(Path)\ ##Path/can_vv_get(var_name){\ - return FALSE;\ + return FALSE;\ }\ ##Path/vv_edit_var(var_name, var_value){\ - return FALSE;\ + return FALSE;\ }\ ##Path/CanProcCall(procname){\ - return FALSE;\ + return FALSE;\ } \ No newline at end of file diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 928837979c..41b5deb302 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -143,8 +143,24 @@ #define ATMOS_PASS_NO 0 #define ATMOS_PASS_PROC -1 //ask CanAtmosPass() #define ATMOS_PASS_DENSITY -2 //just check density -#define CANATMOSPASS(A, O) ( A.CanAtmosPass == ATMOS_PASS_PROC ? A.CanAtmosPass(O) : ( A.CanAtmosPass == ATMOS_PASS_DENSITY ? !A.density : A.CanAtmosPass ) ) +#define CANATMOSPASS(A, O) ( A.CanAtmosPass == ATMOS_PASS_PROC ? A.CanAtmosPass(O) : ( A.CanAtmosPass == ATMOS_PASS_DENSITY ? !A.density : A.CanAtmosPass ) ) +#define CANVERTICALATMOSPASS(A, O) ( A.CanAtmosPassVertical == ATMOS_PASS_PROC ? A.CanAtmosPass(O, TRUE) : ( A.CanAtmosPassVertical == ATMOS_PASS_DENSITY ? !A.density : A.CanAtmosPassVertical ) ) + +//OPEN TURF ATMOS +#define OPENTURF_DEFAULT_ATMOS "o2=22;n2=82;TEMP=293.15" //the default air mix that open turfs spawn +#define TCOMMS_ATMOS "n2=100;TEMP=80" //-193,15°C telecommunications. also used for xenobiology slime killrooms +#define AIRLESS_ATMOS "TEMP=2.7" //space +#define FROZEN_ATMOS "o2=22;n2=82;TEMP=180" //-93.15°C snow and ice turfs +#define BURNMIX_ATMOS "o2=2500;plasma=5000;TEMP=370" //used in the holodeck burn test program + +//ATMOSPHERICS DEPARTMENT GAS TANK TURFS +#define ATMOS_TANK_N2O "n2o=6000;TEMP=293.15" +#define ATMOS_TANK_CO2 "co2=50000;TEMP=293.15" +#define ATMOS_TANK_PLASMA "plasma=70000;TEMP=293.15" +#define ATMOS_TANK_O2 "o2=100000;TEMP=293.15" +#define ATMOS_TANK_N2 "n2=100000;TEMP=293.15" +#define ATMOS_TANK_AIRMIX "o2=2644;n2=10580;TEMP=293.15" //LAVALAND #define LAVALAND_EQUIPMENT_EFFECT_PRESSURE 50 //what pressure you have to be under to increase the effect of equipment meant for lavaland #define LAVALAND_DEFAULT_ATMOS "o2=14;n2=23;TEMP=300" @@ -249,6 +265,13 @@ out_var += cached_gases[total_moles_id];\ } +#ifdef TESTING +GLOBAL_LIST_INIT(atmos_adjacent_savings, list(0,0)) +#define CALCULATE_ADJACENT_TURFS(T) if (SSadjacent_air.queue[T]) { GLOB.atmos_adjacent_savings[1] += 1 } else { GLOB.atmos_adjacent_savings[2] += 1; SSadjacent_air.queue[T] = 1 } +#else +#define CALCULATE_ADJACENT_TURFS(T) SSadjacent_air.queue[T] = 1 +#endif + //Unomos - So for whatever reason, garbage collection actually drastically decreases the cost of atmos later in the round. Turning this into a define yields massively improved performance. #define GAS_GARBAGE_COLLECT(GASGASGAS)\ var/list/CACHE_GAS = GASGASGAS;\ diff --git a/code/__DEFINES/cargo.dm b/code/__DEFINES/cargo.dm index 242889e3f8..0d07ef353a 100644 --- a/code/__DEFINES/cargo.dm +++ b/code/__DEFINES/cargo.dm @@ -17,17 +17,17 @@ #define POD_DESC 3 #define POD_STYLES list(\ - list("supplypod", "supply pod", "A Nanotrasen supply drop pod."),\ - list("bluespacepod", "bluespace supply pod" , "A Nanotrasen Bluespace supply pod. Teleports back to CentCom after delivery."),\ - list("centcompod", "\improper Centcom supply pod", "A Nanotrasen supply pod, this one has been marked with Central Command's designations. Teleports back to Centcom after delivery."),\ - list("syndiepod", "blood-red supply pod", "A dark, intimidating supply pod, covered in the blood-red markings of the Syndicate. It's probably best to stand back from this."),\ - list("squadpod", "\improper MK. II supply pod", "A Nanotrasen supply pod. This one has been marked the markings of some sort of elite strike team."),\ - list("cultpod", "bloody supply pod", "A Nanotrasen supply pod covered in scratch-marks, blood, and strange runes."),\ - list("missilepod", "cruise missile", "A big ass missile that didn't seem to fully detonate. It was likely launched from some far-off deep space missile silo. There appears to be an auxillery payload hatch on the side, though manually opening it is likely impossible."),\ - list("smissilepod", "\improper Syndicate cruise missile", "A big ass, blood-red missile that didn't seem to fully detonate. It was likely launched from some deep space Syndicate missile silo. There appears to be an auxillery payload hatch on the side, though manually opening it is likely impossible."),\ - list("boxpod", "\improper Aussec supply crate", "An incredibly sturdy supply crate, designed to withstand orbital re-entry. Has 'Aussec Armory - 2532' engraved on the side."),\ - list("honkpod", "\improper HONK pod", "A brightly-colored supply pod. It likely originated from the Clown Federation."),\ - list("fruitpod", "\improper Orange", "An angry orange."),\ - list("", "\improper S.T.E.A.L.T.H. pod MKVII", "A supply pod that, under normal circumstances, is completely invisible to conventional methods of detection. How are you even seeing this?"),\ - list("gondolapod", "gondola", "The silent walker. This one seems to be part of a delivery agency.")\ + list("supplypod", "supply pod", "A Nanotrasen supply drop pod."),\ + list("bluespacepod", "bluespace supply pod" , "A Nanotrasen Bluespace supply pod. Teleports back to CentCom after delivery."),\ + list("centcompod", "\improper Centcom supply pod", "A Nanotrasen supply pod, this one has been marked with Central Command's designations. Teleports back to Centcom after delivery."),\ + list("syndiepod", "blood-red supply pod", "A dark, intimidating supply pod, covered in the blood-red markings of the Syndicate. It's probably best to stand back from this."),\ + list("squadpod", "\improper MK. II supply pod", "A Nanotrasen supply pod. This one has been marked the markings of some sort of elite strike team."),\ + list("cultpod", "bloody supply pod", "A Nanotrasen supply pod covered in scratch-marks, blood, and strange runes."),\ + list("missilepod", "cruise missile", "A big ass missile that didn't seem to fully detonate. It was likely launched from some far-off deep space missile silo. There appears to be an auxillery payload hatch on the side, though manually opening it is likely impossible."),\ + list("smissilepod", "\improper Syndicate cruise missile", "A big ass, blood-red missile that didn't seem to fully detonate. It was likely launched from some deep space Syndicate missile silo. There appears to be an auxillery payload hatch on the side, though manually opening it is likely impossible."),\ + list("boxpod", "\improper Aussec supply crate", "An incredibly sturdy supply crate, designed to withstand orbital re-entry. Has 'Aussec Armory - 2532' engraved on the side."),\ + list("honkpod", "\improper HONK pod", "A brightly-colored supply pod. It likely originated from the Clown Federation."),\ + list("fruitpod", "\improper Orange", "An angry orange."),\ + list("", "\improper S.T.E.A.L.T.H. pod MKVII", "A supply pod that, under normal circumstances, is completely invisible to conventional methods of detection. How are you even seeing this?"),\ + list("gondolapod", "gondola", "The silent walker. This one seems to be part of a delivery agency.")\ ) \ No newline at end of file diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 3a680d1c90..b79f1c2e59 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -70,13 +70,18 @@ #define COMSIG_ATOM_CANREACH "atom_can_reach" //from internal loop in atom/movable/proc/CanReach(): (list/next) #define COMPONENT_BLOCK_REACH 1 #define COMSIG_ATOM_SCREWDRIVER_ACT "atom_screwdriver_act" //from base of atom/screwdriver_act(): (mob/living/user, obj/item/I) -#define COMSIG_ATOM_INTERCEPT_TELEPORT "intercept_teleport" //called when teleporting into a protected turf: (channel, turf/origin) +#define COMSIG_ATOM_INTERCEPT_TELEPORT "intercept_teleport" //called when teleporting into a protected turf: (channel, turf/origin, turf/destination) #define COMPONENT_BLOCK_TELEPORT 1 +#define COMSIG_ATOM_HEARER_IN_VIEW "atom_hearer_in_view" //called when an atom with HEAR_1 is added to the hearers on /proc/get_hearers_in_view(): (list/processing_list, list/hearers) ///////////////// #define COMSIG_ATOM_ATTACK_GHOST "atom_attack_ghost" //from base of atom/attack_ghost(): (mob/dead/observer/ghost) #define COMSIG_ATOM_ATTACK_HAND "atom_attack_hand" //from base of atom/attack_hand(): (mob/user) #define COMSIG_ATOM_ATTACK_PAW "atom_attack_paw" //from base of atom/attack_paw(): (mob/user) #define COMPONENT_NO_ATTACK_HAND 1 //works on all 3. +//This signal return value bitflags can be found in __DEFINES/misc.dm +#define COMSIG_ATOM_INTERCEPT_Z_FALL "movable_intercept_z_impact" //called for each movable in a turf contents on /turf/zImpact(): (atom/movable/A, levels) + + ///////////////// #define COMSIG_ENTER_AREA "enter_area" //from base of area/Entered(): (/area) @@ -98,6 +103,7 @@ // /turf signals #define COMSIG_TURF_CHANGE "turf_change" //from base of turf/ChangeTurf(): (path, list/new_baseturfs, flags, list/transferring_comps) #define COMSIG_TURF_HAS_GRAVITY "turf_has_gravity" //from base of atom/has_gravity(): (atom/asker, list/forced_gravities) +#define COMSIG_TURF_MULTIZ_NEW "turf_multiz_new" //from base of turf/New(): (turf/source, direction) // /atom/movable signals #define COMSIG_MOVABLE_MOVED "movable_moved" //from base of atom/movable/Moved(): (/atom, dir) @@ -115,15 +121,26 @@ #define COMPONENT_CANCEL_THROW 1 #define COMSIG_MOVABLE_POST_THROW "movable_post_throw" //from base of atom/movable/throw_at(): (datum/thrownthing, spin) #define COMSIG_MOVABLE_Z_CHANGED "movable_ztransit" //from base of atom/movable/onTransitZ(): (old_z, new_z) +#define COMSIG_MOVABLE_SECLUDED_LOCATION "movable_secluded" //called when the movable is placed in an unaccessible area, used for stationloving: () #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 HEARING_MESSAGE 1 + #define HEARING_SPEAKER 2 +// #define HEARING_LANGUAGE 3 + #define HEARING_RAW_MESSAGE 4 + /* #define HEARING_RADIO_FREQ 5 + #define HEARING_SPANS 6 + #define HEARING_MESSAGE_MODE 7 */ #define COMSIG_MOVABLE_DISPOSING "movable_disposing" //called when the movable is added to a disposal holder object for disposal movement: (obj/structure/disposalholder/holder, obj/machinery/disposal/source) +#define COMSIG_MOVABLE_TELEPORTED "movable_teleported" //from base of do_teleport(): (channel, turf/origin, turf/destination) // /mind signals #define COMSIG_MIND_TRANSFER "mind_transfer" //from base of mind/transfer_to(): (new_character, old_character) // /mob signals +#define COMSIG_MOB_EXAMINATE "mob_examinate" //from base of /mob/verb/examinate(): (atom/A) + #define COMPONENT_ALLOW_EXAMINE 1 #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 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(): (mob/user, magic, holy, tinfoil, chargecost, self, protection_sources) @@ -148,11 +165,14 @@ #define SPEECH_FORCED 7 */ // /mob/living signals +#define COMSIG_LIVING_FULLY_HEAL "living_fully_healed" //from base of /mob/living/fully_heal(): (admin_revive) +#define COMSIG_LIVING_REGENERATE_LIMBS "living_regenerate_limbs" //from base of /mob/living/regenerate_limbs(): (noheal, excluded_limbs) #define COMSIG_LIVING_RESIST "living_resist" //from base of mob/living/resist() (/mob/living) #define COMSIG_LIVING_IGNITED "living_ignite" //from base of mob/living/IgniteMob() (/mob/living) #define COMSIG_LIVING_EXTINGUISHED "living_extinguished" //from base of mob/living/ExtinguishMob() (/mob/living) #define COMSIG_LIVING_ELECTROCUTE_ACT "living_electrocute_act" //from base of mob/living/electrocute_act(): (shock_damage) #define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock" //sent by stuff like stunbatons and tasers: () +#define COMSIG_LIVING_GUN_PROCESS_FIRE "living_gun_process_fire" //from base of /obj/item/gun/proc/process_fire(): (atom/target, params, zone_override) // /mob/living/carbon signals #define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" //from base of mob/living/carbon/soundbang_act(): (list(intensity)) diff --git a/code/__DEFINES/donator_groupings.dm b/code/__DEFINES/donator_groupings.dm index 4b210609f2..855b9927f5 100644 --- a/code/__DEFINES/donator_groupings.dm +++ b/code/__DEFINES/donator_groupings.dm @@ -1,10 +1,10 @@ -#define DONATOR_GROUP_TIER_1_CONFIG_PATH /datum/config_entry/keyed_list/donator_group/tier_1_donators -#define DONATOR_GROUP_TIER_2_CONFIG_PATH /datum/config_entry/keyed_list/donator_group/tier_2_donators -#define DONATOR_GROUP_TIER_3_CONFIG_PATH /datum/config_entry/keyed_list/donator_group/tier_3_donators +#define DONATOR_GROUP_TIER_1_CONFIG_PATH /datum/config_entry/multi_keyed_flag/donator_group/tier_1_donators +#define DONATOR_GROUP_TIER_2_CONFIG_PATH /datum/config_entry/multi_keyed_flag/donator_group/tier_2_donators +#define DONATOR_GROUP_TIER_3_CONFIG_PATH /datum/config_entry/multi_keyed_flag/donator_group/tier_3_donators -#define DONATOR_GROUP_TIER_1_CONFIG_SUBPATH keyed_list/donator_group/tier_1_donators -#define DONATOR_GROUP_TIER_2_CONFIG_SUBPATH keyed_list/donator_group/tier_2_donators -#define DONATOR_GROUP_TIER_3_CONFIG_SUBPATH keyed_list/donator_group/tier_3_donators +#define DONATOR_GROUP_TIER_1_CONFIG_SUBPATH multi_keyed_flag/donator_group/tier_1_donators +#define DONATOR_GROUP_TIER_2_CONFIG_SUBPATH multi_keyed_flag/donator_group/tier_2_donators +#define DONATOR_GROUP_TIER_3_CONFIG_SUBPATH multi_keyed_flag/donator_group/tier_3_donators #define TIER_1_DONATORS CONFIG_GET(DONATOR_GROUP_TIER_1_CONFIG_SUBPATH) #define TIER_2_DONATORS CONFIG_GET(DONATOR_GROUP_TIER_2_CONFIG_SUBPATH) diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index 632e4adef9..f5ea8d835f 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -4,9 +4,9 @@ #define WEIGHT_CLASS_TINY 1 //Usually items smaller then a human hand, ex: Playing Cards, Lighter, Scalpel, Coins/Money #define WEIGHT_CLASS_SMALL 2 //Pockets can hold small and tiny items, ex: Flashlight, Multitool, Grenades, GPS Device #define WEIGHT_CLASS_NORMAL 3 //Standard backpacks can carry tiny, small & normal items, ex: Fire extinguisher, Stunbaton, Gas Mask, Metal Sheets -#define WEIGHT_CLASS_BULKY 4 //Items that can be weilded or equipped but not stored in an inventory, ex: Defibrillator, Backpack, Space Suits -#define WEIGHT_CLASS_HUGE 5 //Usually represents objects that require two hands to operate, ex: Shotgun, Two Handed Melee Weapons -#define WEIGHT_CLASS_GIGANTIC 6 //Essentially means it cannot be picked up or placed in an inventory, ex: Mech Parts, Safe +#define WEIGHT_CLASS_BULKY 4 //Items that can be weilded or equipped but not stored in a normal bag, ex: Defibrillator, Backpack, Space Suits +#define WEIGHT_CLASS_HUGE 5 //Usually represents objects that require two hands to operate, ex: Shotgun, Two Handed Melee Weapons - Can not fit in Boh +#define WEIGHT_CLASS_GIGANTIC 6 //Essentially means it cannot be picked up or placed in an inventory, ex: Mech Parts, Safe - Can not fit in Boh //Inventory depth: limits how many nested storage items you can access directly. //1: stuff in mob, 2: stuff in backpack, 3: stuff in box in backpack, etc diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 70010eeffc..6f433374e7 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -9,6 +9,16 @@ //Turfs //#define isturf(A) (istype(A, /turf)) This is actually a byond built-in. Added here for completeness sake. +GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( + /turf/open/space, + /turf/open/chasm, + /turf/open/lava, + /turf/open/water, + /turf/open/openspace + ))) + +#define isgroundlessturf(A) (is_type_in_typecache(A, GLOB.turfs_without_ground)) + #define isopenturf(A) (istype(A, /turf/open)) #define isindestructiblefloor(A) (istype(A, /turf/open/indestructible)) @@ -56,6 +66,7 @@ #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)) +#define isdullahan(A) (is_species(A, /datum/species/dullahan)) // Citadel specific species #define isipcperson(A) (is_species(A, /datum/species/ipc)) @@ -199,6 +210,8 @@ GLOBAL_LIST_INIT(heavyfootmob, typecacheof(list( #define isitem(A) (istype(A, /obj/item)) +#define isidcard(I) (istype(I, /obj/item/card/id)) + #define isstructure(A) (istype(A, /obj/structure)) #define ismachinery(A) (istype(A, /obj/machinery)) diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 5e903997e4..e0a22667ac 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -9,6 +9,7 @@ #define FLOOR_PLANE -2 #define GAME_PLANE -1 #define BLACKNESS_PLANE 0 //To keep from conflicts with SEE_BLACKNESS internals + #define SPACE_LAYER 1.8 //#define TURF_LAYER 2 //For easy recordkeeping; this is a byond define #define MID_TURF_LAYER 2.02 @@ -83,25 +84,28 @@ #define ABOVE_LIGHTING_PLANE 16 #define ABOVE_LIGHTING_LAYER 16 -#define BYOND_LIGHTING_PLANE 17 -#define BYOND_LIGHTING_LAYER 17 +#define FLOOR_OPENSPACE_PLANE 17 +#define OPENSPACE_LAYER 17 -#define CAMERA_STATIC_PLANE 18 -#define CAMERA_STATIC_LAYER 18 +#define BYOND_LIGHTING_PLANE 18 +#define BYOND_LIGHTING_LAYER 18 + +#define CAMERA_STATIC_PLANE 19 +#define CAMERA_STATIC_LAYER 19 //HUD layer defines -#define FULLSCREEN_PLANE 19 -#define FLASH_LAYER 19 -#define FULLSCREEN_LAYER 19.1 -#define UI_DAMAGE_LAYER 19.2 -#define BLIND_LAYER 19.3 -#define CRIT_LAYER 19.4 -#define CURSE_LAYER 19.5 +#define FULLSCREEN_PLANE 20 +#define FLASH_LAYER 20 +#define FULLSCREEN_LAYER 20.1 +#define UI_DAMAGE_LAYER 20.2 +#define BLIND_LAYER 20.3 +#define CRIT_LAYER 20.4 +#define CURSE_LAYER 20.5 -#define HUD_PLANE 20 -#define HUD_LAYER 20 -#define ABOVE_HUD_PLANE 21 -#define ABOVE_HUD_LAYER 21 +#define HUD_PLANE 21 +#define HUD_LAYER 21 +#define ABOVE_HUD_PLANE 22 +#define ABOVE_HUD_LAYER 22 -#define SPLASHSCREEN_LAYER 22 -#define SPLASHSCREEN_PLANE 22 +#define SPLASHSCREEN_LAYER 23 +#define SPLASHSCREEN_PLANE 23 diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index d0d6269c1e..db13c21c44 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -30,7 +30,8 @@ #define LIMBGROWER (1<<6) //Uses synthetic flesh #define SMELTER (1<<7) //uses various minerals #define AUTOYLATHE (1<<8) // CITADEL ADD -#define NANITE_COMPILER (1<<9) //Prints nanite disks +#define NANITE_COMPILER (1<<9) //Prints nanite disks +#define AUTOBOTTLER (1<<10) //Uses booze, for printing //Note: More then one of these can be added to a design but imprinter and lathe designs are incompatable. //Modular computer/NTNet defines @@ -99,3 +100,8 @@ #define NUKE_OFF_UNLOCKED 1 #define NUKE_ON_TIMING 2 #define NUKE_ON_EXPLODING 3 + + +//these flags are used to tell the DNA modifier if a plant gene cannot be extracted or modified. +#define PLANT_GENE_REMOVABLE (1<<0) +#define PLANT_GENE_EXTRACTABLE (1<<1) \ No newline at end of file diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm index 3c0921fa01..1b42217fe1 100644 --- a/code/__DEFINES/maps.dm +++ b/code/__DEFINES/maps.dm @@ -37,6 +37,7 @@ require only minor tweaks. #define ZTRAIT_AWAY "Away Mission" #define ZTRAIT_SPACE_RUINS "Space Ruins" #define ZTRAIT_LAVA_RUINS "Lava Ruins" +#define ZTRAIT_ISOLATED_RUINS "Isolated Ruins" //Placing ruins on z levels with this trait will use turf reservation instead of usual placement. // prevents certain turfs from being stripped by a singularity #define ZTRAIT_PLANET "Planet" @@ -52,12 +53,12 @@ require only minor tweaks. // enum - how space transitions should affect this level #define ZTRAIT_LINKAGE "Linkage" - // UNAFFECTED if absent - no space transitions - #define UNAFFECTED null - // SELFLOOPING - space transitions always self-loop - #define SELFLOOPING "Self" - // CROSSLINKED - mixed in with the cross-linked space pool - #define CROSSLINKED "Cross" + // UNAFFECTED if absent - no space transitions + #define UNAFFECTED null + // SELFLOOPING - space transitions always self-loop + #define SELFLOOPING "Self" + // CROSSLINKED - mixed in with the cross-linked space pool + #define CROSSLINKED "Cross" // default trait definitions, used by SSmapping #define ZTRAITS_CENTCOM list(ZTRAIT_CENTCOM = TRUE) @@ -72,7 +73,7 @@ require only minor tweaks. // must correspond to _basemap.dm for things to work correctly #define DEFAULT_MAP_TRAITS list(\ - DECLARE_LEVEL("CentCom", ZTRAITS_CENTCOM),\ + DECLARE_LEVEL("CentCom", ZTRAITS_CENTCOM),\ ) // Camera lock flags @@ -89,10 +90,10 @@ require only minor tweaks. #define PLACEMENT_TRIES 100 //How many times we try to fit the ruin somewhere until giving up (really should just swap to some packing algo) #define PLACE_DEFAULT "random" -#define PLACE_SAME_Z "same" -#define PLACE_SPACE_RUIN "space" -#define PLACE_LAVA_RUIN "lavaland" - - +#define PLACE_SAME_Z "same" //On same z level as original ruin +#define PLACE_SPACE_RUIN "space" //On space ruin z level(s) +#define PLACE_LAVA_RUIN "lavaland" //On lavaland ruin z levels(s) +#define PLACE_BELOW "below" //On z levl below - centered on same tile +#define PLACE_ISOLATED "isolated" //On isolated ruin z level //Map type stuff. -#define MAP_TYPE_STATION "station" +#define MAP_TYPE_STATION "station" \ No newline at end of file diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 4b76f41c61..29ff0a8fae 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -203,11 +203,12 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache) #define LOCKED_SENSORS 2 //Wet floor type flags. Stronger ones should be higher in number. -#define TURF_DRY 0 -#define TURF_WET_WATER 1 -#define TURF_WET_PERMAFROST 2 -#define TURF_WET_ICE 4 -#define TURF_WET_LUBE 8 +#define TURF_DRY (0) +#define TURF_WET_WATER (1<<0) +#define TURF_WET_PERMAFROST (1<<1) +#define TURF_WET_ICE (1<<2) +#define TURF_WET_LUBE (1<<3) +#define TURF_WET_SUPERLUBE (1<<4) #define IS_WET_OPEN_TURF(O) O.GetComponent(/datum/component/wet_floor) @@ -281,9 +282,11 @@ GLOBAL_LIST_INIT(pda_styles, list(MONO, VT, ORBITRON, SHARE)) #define PDA_SKIN_ALT "Holographic" #define PDA_SKIN_RUGGED "Rugged" #define PDA_SKIN_MODERN "Modern" +#define PDA_SKIN_MINIMAL "Minimal" GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_SKIN_ALT = 'icons/obj/pda_alt.dmi', - PDA_SKIN_RUGGED = 'icons/obj/pda_rugged.dmi', PDA_SKIN_MODERN = 'icons/obj/pda_modern.dmi')) + PDA_SKIN_RUGGED = 'icons/obj/pda_rugged.dmi', PDA_SKIN_MODERN = 'icons/obj/pda_modern.dmi', + PDA_SKIN_MINIMAL = 'icons/obj/pda_minimal.dmi')) ///////////////////////////////////// // atom.appearence_flags shortcuts // @@ -506,10 +509,22 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S #define AREASELECT_CORNERA "corner A" #define AREASELECT_CORNERB "corner B" +#define VARSET_FROM_LIST(L, V) if(L && L[#V]) V = L[#V] +#define VARSET_FROM_LIST_IF(L, V, C...) if(L && L[#V] && (C)) V = L[#V] +#define VARSET_TO_LIST(L, V) if(L) L[#V] = V +#define VARSET_TO_LIST_IF(L, V, C...) if(L && (C)) L[#V] = V + #define PREF_SAVELOAD_COOLDOWN 5 #define VOMIT_TOXIC 1 #define VOMIT_PURPLE 2 +// possible bitflag return values of intercept_zImpact(atom/movable/AM, levels = 1) calls +#define FALL_INTERCEPTED (1<<0) //Stops the movable from falling further and crashing on the ground +#define FALL_NO_MESSAGE (1<<1) //Used to suppress the "[A] falls through [old_turf]" messages where it'd make little sense at all, like going downstairs. +#define FALL_STOP_INTERCEPTING (1<<2) //Used in situations where halting the whole "intercept" loop would be better, like supermatter dusting (and thus deleting) the atom. + //Misc text define. Does 4 spaces. Used as a makeshift tabulator. #define FOURSPACES "    " + +#define CRYOMOBS 'icons/obj/cryo_mobs.dmi' diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 5bd0ee5b3b..8d2913629a 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -201,6 +201,8 @@ #define SLIDE (1<<1) #define GALOSHES_DONT_HELP (1<<2) #define SLIDE_ICE (1<<3) +#define SLIP_WHEN_CRAWLING (1<<4) //clown planet ruin +#define SLIP_WHEN_JOGGING (1<<5) //slips prevented by walking are also dodged if the mob is not sprinting or fatigued... unless this flag is on. #define MAX_CHICKENS 50 diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index 1885dd2621..d3e724aefb 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -11,6 +11,7 @@ #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. +#define BLOCK_Z_FALL (1<<10) // If you add new ones, be sure to add them to /obj/Initialize as well for complete mapping support diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index 0992b2e586..7a284ff1a0 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -75,3 +75,10 @@ #define JP_LOW 1 #define JP_MEDIUM 2 #define JP_HIGH 3 + +//Chaos levels for dynamic voting +#define CHAOS_NONE "None (Extended)" +#define CHAOS_LOW "Low" +#define CHAOS_MED "Medium" +#define CHAOS_HIGH "High" +#define CHAOS_MAX "Maximum" diff --git a/code/__DEFINES/procpath.dm b/code/__DEFINES/procpath.dm new file mode 100644 index 0000000000..1180058358 --- /dev/null +++ b/code/__DEFINES/procpath.dm @@ -0,0 +1,24 @@ +/// Represents a proc or verb path. +/// +/// Despite having no DM-defined static type, proc paths have some variables, +/// listed below. These are not modifiable, but for a given procpath P, +/// `new P(null, "Name", "Desc")` can be used to create a new procpath with the +/// same code but new `name` and `desc` values. The other variables cannot be +/// changed in this way. +/// +/// This type exists only to act as an annotation, providing reasonable static +/// typing for procpaths. Previously, types like `/atom/verb` were used, with +/// the `name` and `desc` vars of `/atom` thus being accessible. Proc and verb +/// paths will fail `istype` and `ispath` checks against `/procpath`. +/procpath + // Although these variables are effectively const, if they are marked const + // below, their accesses are optimized away. + + /// A text string of the verb's name. + var/name as text + /// The verb's help text or description. + var/desc as text + /// The category or tab the verb will appear in. + var/category as text + /// Only clients/mobs with `see_invisibility` higher can use the verb. + var/invisibility as num diff --git a/code/__DEFINES/spaceman_dmm.dm b/code/__DEFINES/spaceman_dmm.dm new file mode 100644 index 0000000000..e590a30ff9 --- /dev/null +++ b/code/__DEFINES/spaceman_dmm.dm @@ -0,0 +1,13 @@ +// Interfaces for the SpacemanDMM linter, define'd to nothing when the linter +// is not in use. + +// The SPACEMAN_DMM define is set by the linter and other tooling when it runs. +#ifdef SPACEMAN_DMM + #define RETURN_TYPE(X) set SpacemanDMM_return_type = X + #define SHOULD_CALL_PARENT(X) set SpacemanDMM_should_call_parent = X + #define UNLINT(X) SpacemanDMM_unlint(X) +#else + #define RETURN_TYPE(X) + #define SHOULD_CALL_PARENT(X) + #define UNLINT(X) X +#endif diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index ff19976cff..0f1a36d663 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -7,6 +7,8 @@ #define STATUS_EFFECT_REPLACE 2 //if it allows only one, but new instances replace +#define STATUS_EFFECT_REFRESH 3 // if it only allows one, and new instances just instead refresh the timer + /////////// // BUFFS // /////////// @@ -74,6 +76,8 @@ #define STATUS_EFFECT_ICHORIAL_STAIN /datum/status_effect/ichorial_stain //Prevents a servant from being revived by vitality matrices for one minute. +#define STATUS_EFFECT_SPASMS /datum/status_effect/spasms //causes random muscle spasms + #define STATUS_EFFECT_BREASTS_ENLARGEMENT /datum/status_effect/chem/breast_enlarger //Applied slowdown due to the ominous bulk. #define STATUS_EFFECT_PENIS_ENLARGEMENT /datum/status_effect/chem/penis_enlarger //More applied slowdown, just like the above. diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 2fd929a07d..c194e578c9 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -26,10 +26,6 @@ #define TIMER_ID_NULL -1 -//For servers that can't do with any additional lag, set this to none in flightpacks.dm in subsystem/processing. -#define FLIGHTSUIT_PROCESSING_NONE 0 -#define FLIGHTSUIT_PROCESSING_FULL 1 - #define INITIALIZATION_INSSATOMS 0 //New should not call Initialize #define INITIALIZATION_INNEW_MAPLOAD 2 //New should call Initialize(TRUE) #define INITIALIZATION_INNEW_REGULAR 1 //New should call Initialize(FALSE) @@ -40,11 +36,11 @@ //type and all subtypes should always call Initialize in New() #define INITIALIZE_IMMEDIATE(X) ##X/New(loc, ...){\ - ..();\ - if(!(flags_1 & INITIALIZED_1)) {\ - args[1] = TRUE;\ - SSatoms.InitAtom(src, args);\ - }\ + ..();\ + if(!(flags_1 & INITIALIZED_1)) {\ + args[1] = TRUE;\ + SSatoms.InitAtom(src, args);\ + }\ } // Subsystem init_order, from highest priority to lowest priority @@ -112,10 +108,10 @@ #define FIRE_PRIORITY_DEFAULT 50 #define FIRE_PRIORITY_PARALLAX 65 #define FIRE_PRIORITY_NPC 80 -#define FIRE_PRIORITY_FLIGHTPACKS 80 #define FIRE_PRIORITY_MOBS 100 #define FIRE_PRIORITY_TGUI 110 #define FIRE_PRIORITY_TICKER 200 +#define FIRE_PRIORITY_ATMOS_ADJACENCY 300 #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/traits.dm b/code/__DEFINES/traits.dm index 1f37556d1d..60212385f8 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -109,6 +109,7 @@ #define TRAIT_NOHARDCRIT "nohardcrit" #define TRAIT_NOSOFTCRIT "nosoftcrit" #define TRAIT_MINDSHIELD "mindshield" +#define TRAIT_SIXTHSENSE "sixthsense" #define TRAIT_DISSECTED "dissected" #define TRAIT_FEARLESS "fearless" #define TRAIT_UNSTABLE "unstable" @@ -117,6 +118,7 @@ #define TRAIT_PARALYSIS_L_LEG "para-l-leg" #define TRAIT_PARALYSIS_R_LEG "para-r-leg" #define TRAIT_UNINTELLIGIBLE_SPEECH "unintelligible-speech" +#define TRAIT_SOOTHED_THROAT "soothed-throat" #define TRAIT_LAW_ENFORCEMENT_METABOLISM "law-enforcement-metabolism" #define TRAIT_STRONG_GRABBER "strong_grabber" #define TRAIT_CALCIUM_HEALER "calcium_healer" @@ -179,6 +181,7 @@ #define CULT_TRAIT "cult" #define CURSED_ITEM_TRAIT "cursed-item" // The item is magically cursed #define ABSTRACT_ITEM_TRAIT "abstract-item" +#define STATUS_EFFECT_TRAIT "status-effect" #define ROUNDSTART_TRAIT "roundstart" //cannot be removed without admin intervention // unique trait sources, still defines @@ -192,7 +195,6 @@ #define STASIS_MUTE "stasis" #define GENETICS_SPELL "genetics_spell" #define EYES_COVERED "eyes_covered" -#define CULT_TRAIT "cult" #define CLOWN_NUKE_TRAIT "clown-nuke" #define STICKY_MOUSTACHE_TRAIT "sticky-moustache" #define CHAINSAW_FRENZY_TRAIT "chainsaw-frenzy" @@ -213,4 +215,5 @@ #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 +#define ABDUCTOR_ANTAGONIST "abductor-antagonist" +#define MADE_UNCLONEABLE "made-uncloneable" \ No newline at end of file diff --git a/code/__DEFINES/turf_flags.dm b/code/__DEFINES/turf_flags.dm index 5ceb6f2e2e..8604a92c01 100644 --- a/code/__DEFINES/turf_flags.dm +++ b/code/__DEFINES/turf_flags.dm @@ -3,3 +3,4 @@ #define CHANGETURF_FORCEOP 4 #define CHANGETURF_SKIP 8 // A flag for PlaceOnTop to just instance the new turf instead of calling ChangeTurf. Used for uninitialized turfs NOTHING ELSE #define CHANGETURF_INHERIT_AIR 16 // Inherit air from previous turf. Implies CHANGETURF_IGNORE_AIR +#define CHANGETURF_RECALC_ADJACENT 32 //Immediately recalc adjacent atmos turfs instead of queuing. \ No newline at end of file diff --git a/code/__DEFINES/typeids.dm b/code/__DEFINES/typeids.dm index ae5df258b4..8bfe6216e2 100644 --- a/code/__DEFINES/typeids.dm +++ b/code/__DEFINES/typeids.dm @@ -2,7 +2,7 @@ #define TYPEID_NULL "0" #define TYPEID_NORMAL_LIST "f" //helper macros -#define GET_TYPEID(ref) ( ( (lentext(ref) <= 10) ? "TYPEID_NULL" : copytext(ref, 4, lentext(ref)-6) ) ) +#define GET_TYPEID(ref) ( ( (length(ref) <= 10) ? "TYPEID_NULL" : copytext(ref, 4, length(ref)-6) ) ) #define IS_NORMAL_LIST(L) (GET_TYPEID("\ref[L]") == TYPEID_NORMAL_LIST) diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index 917615d095..3b8b3765ef 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -124,6 +124,7 @@ //returns a new list with only atoms that are in typecache L /proc/typecache_filter_list(list/atoms, list/typecache) + RETURN_TYPE(/list) . = list() for(var/thing in atoms) var/atom/A = thing @@ -131,6 +132,7 @@ . += A /proc/typecache_filter_list_reverse(list/atoms, list/typecache) + RETURN_TYPE(/list) . = list() for(var/thing in atoms) var/atom/A = thing @@ -257,6 +259,7 @@ //Pick a random element from the list and remove it from the list. /proc/pick_n_take(list/L) + RETURN_TYPE(L[_].type) if(L.len) var/picked = rand(1,L.len) . = L[picked] @@ -570,4 +573,10 @@ if(key in L1) L1[key] += other_value else - L1[key] = other_value \ No newline at end of file + L1[key] = other_value + +/proc/assoc_list_strip_value(list/input) + var/list/ret = list() + for(var/key in input) + ret += key + return ret \ No newline at end of file diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index c19a7a64b0..c259831f94 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -7,7 +7,7 @@ #define WRITE_LOG(log, text) rustg_log_write(log, text) //print a warning message to world.log -#define WARNING(MSG) warning("[MSG] in [__FILE__] at line [__LINE__] src: [src] usr: [usr].") +#define WARNING(MSG) warning("[MSG] in [__FILE__] at line [__LINE__] src: [UNLINT(src)] usr: [usr].") /proc/warning(msg) msg = "## WARNING: [msg]" log_world(msg) diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm index 37f36a7e0d..c0501b4e41 100644 --- a/code/__HELPERS/cmp.dm +++ b/code/__HELPERS/cmp.dm @@ -84,3 +84,9 @@ GLOBAL_VAR_INIT(cmp_field, "name") /proc/cmp_job_display_asc(datum/job/A, datum/job/B) return A.display_order - B.display_order + +/proc/cmp_numbered_displays_name_asc(datum/numbered_display/A, datum/numbered_display/B) + return sorttext(A.sample_object.name, B.sample_object.name) + +/proc/cmp_numbered_displays_name_dsc(datum/numbered_display/A, datum/numbered_display/B) + return sorttext(B.sample_object.name, A.sample_object.name) \ No newline at end of file diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 19d0755085..d76fc7731a 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -1,9 +1,9 @@ //supposedly the fastest way to do this according to https://gist.github.com/Giacom/be635398926bb463b42a #define RANGE_TURFS(RADIUS, CENTER) \ - block( \ - locate(max(CENTER.x-(RADIUS),1), max(CENTER.y-(RADIUS),1), CENTER.z), \ - locate(min(CENTER.x+(RADIUS),world.maxx), min(CENTER.y+(RADIUS),world.maxy), CENTER.z) \ - ) + block( \ + locate(max(CENTER.x-(RADIUS),1), max(CENTER.y-(RADIUS),1), CENTER.z), \ + locate(min(CENTER.x+(RADIUS),world.maxx), min(CENTER.y+(RADIUS),world.maxy), CENTER.z) \ + ) #define Z_TURFS(ZLEVEL) block(locate(1,1,ZLEVEL), locate(world.maxx, world.maxy, ZLEVEL)) #define CULT_POLL_WAIT 2400 @@ -264,6 +264,7 @@ var/atom/A = processing_list[1] if(A.flags_1 & HEAR_1) . += A + SEND_SIGNAL(A, COMSIG_ATOM_HEARER_IN_VIEW, processing_list, .) processing_list.Cut(1, 2) processing_list += A.contents @@ -446,7 +447,7 @@ var/list/candidates = list() for(var/mob/dead/observer/G in GLOB.player_list) - if(G.can_reenter_round) + if(G.reenter_round_timeout < world.realtime) candidates += G return pollCandidates(Question, jobbanType, gametypeCheck, be_special_flag, poll_time, ignore_category, flashwindow, candidates) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 8e7938a312..0d6345dae2 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -522,12 +522,14 @@ GLOBAL_LIST_EMPTY(species_list) else prefs = new - var/adminoverride = 0 + var/override = FALSE if(M.client && M.client.holder && (prefs.chat_toggles & CHAT_DEAD)) - adminoverride = 1 - if(isnewplayer(M) && !adminoverride) + override = TRUE + if(HAS_TRAIT(M, TRAIT_SIXTHSENSE)) + override = TRUE + if(isnewplayer(M) && !override) continue - if(M.stat != DEAD && !adminoverride) + if(M.stat != DEAD && !override) continue if(speaker_key && speaker_key in prefs.ignoring) continue diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 8e59106d98..2c92816264 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -313,8 +313,14 @@ parts += "[FOURSPACES]Threat level: [mode.threat_level]" parts += "[FOURSPACES]Threat left: [mode.threat]" parts += "[FOURSPACES]Executed rules:" + for(var/str in mode.threat_log) + parts += "[FOURSPACES][FOURSPACES][str]" + for(var/entry in mode.threat_tallies) + parts += "[FOURSPACES][FOURSPACES][entry] added [mode.threat_tallies[entry]]" + /* for(var/datum/dynamic_ruleset/rule in mode.executed_rules) - parts += "[FOURSPACES][FOURSPACES][rule.ruletype] - [rule.name]: -[rule.cost] threat" + parts += "[FOURSPACES][FOURSPACES][rule.ruletype] - [rule.name]: -[rule.cost + rule.scaled_times * rule.scaling_cost] threat" + */ return parts.Join("
") /client/proc/roundend_report_file() @@ -534,10 +540,12 @@ return parts.Join() -/proc/printobjectives(datum/mind/ply) +/proc/printobjectives(list/objectives) + if(!objectives || !objectives.len) + return var/list/objective_parts = list() var/count = 1 - for(var/datum/objective/objective in ply.objectives) + for(var/datum/objective/objective in objectives) if(objective.check_completion()) objective_parts += "Objective #[count]: [objective.explanation_text] Success!" else diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 6908a5057f..8494bbb7a9 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -304,9 +304,9 @@ //is in the other string at the same spot (assuming it is not a replace char). //This is used for fingerprints var/newtext = text - if(lentext(text) != lentext(compare)) + if(length(text) != length(compare)) return 0 - for(var/i = 1, i < lentext(text), i++) + for(var/i = 1, i < length(text), i++) var/a = copytext(text,i,i+1) var/b = copytext(compare,i,i+1) //if it isn't both the same letter, or if they are both the replacement character @@ -326,7 +326,7 @@ if(!text || !character) return 0 var/count = 0 - for(var/i = 1, i <= lentext(text), i++) + for(var/i = 1, i <= length(text), i++) var/a = copytext(text,i,i+1) if(a == character) count++ @@ -607,8 +607,8 @@ GLOBAL_LIST_INIT(binary, list("0","1")) continue var/buffer = "" var/early_culling = TRUE - for(var/pos = 1, pos <= lentext(string), pos++) - var/let = copytext(string, pos, (pos + 1) % lentext(string)) + for(var/pos = 1, pos <= length(string), pos++) + var/let = copytext(string, pos, (pos + 1) % length(string)) if(early_culling && !findtext(let,GLOB.is_alphanumeric)) continue early_culling = FALSE @@ -616,9 +616,9 @@ GLOBAL_LIST_INIT(binary, list("0","1")) if(!findtext(buffer,GLOB.is_alphanumeric)) continue var/punctbuffer = "" - var/cutoff = lentext(buffer) - for(var/pos = lentext(buffer), pos >= 0, pos--) - var/let = copytext(buffer, pos, (pos + 1) % lentext(buffer)) + var/cutoff = length(buffer) + for(var/pos = length(buffer), pos >= 0, pos--) + var/let = copytext(buffer, pos, (pos + 1) % length(buffer)) if(findtext(let,GLOB.is_alphanumeric)) break if(findtext(let,GLOB.is_punctuation)) @@ -628,8 +628,8 @@ GLOBAL_LIST_INIT(binary, list("0","1")) var/exclaim = FALSE var/question = FALSE var/periods = 0 - for(var/pos = lentext(punctbuffer), pos >= 0, pos--) - var/punct = copytext(punctbuffer, pos, (pos + 1) % lentext(punctbuffer)) + for(var/pos = length(punctbuffer), pos >= 0, pos--) + var/punct = copytext(punctbuffer, pos, (pos + 1) % length(punctbuffer)) if(!exclaim && findtext(punct,"!")) exclaim = TRUE if(!question && findtext(punct,"?")) @@ -651,7 +651,7 @@ GLOBAL_LIST_INIT(binary, list("0","1")) buffer = copytext(buffer, 1, cutoff) + punctbuffer if(!findtext(buffer,GLOB.is_alphanumeric)) continue - if(!buffer || lentext(buffer) > 280 || lentext(buffer) <= cullshort || buffer in accepted) + if(!buffer || length(buffer) > 280 || length(buffer) <= cullshort || buffer in accepted) continue accepted += buffer diff --git a/code/__HELPERS/text_vr.dm b/code/__HELPERS/text_vr.dm index 64e13ef65b..9be806fc54 100644 --- a/code/__HELPERS/text_vr.dm +++ b/code/__HELPERS/text_vr.dm @@ -9,8 +9,8 @@ return t proc/TextPreview(var/string,var/len=40) - if(lentext(string) <= len) - if(!lentext(string)) + if(length(string) <= len) + if(!length(string)) return "\[...\]" else return string diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 27b70d28c5..9abe42ea8e 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -759,7 +759,7 @@ GLOBAL_LIST_INIT(can_embed_types, typecacheof(list( /obj/item/pipe))) /proc/can_embed(obj/item/W) - if(W.is_sharp()) + if(W.get_sharpness()) return 1 if(is_pointed(W)) return 1 diff --git a/code/__HELPERS/unused.dm b/code/__HELPERS/unused.dm index fce25720b7..6d41856fd1 100644 --- a/code/__HELPERS/unused.dm +++ b/code/__HELPERS/unused.dm @@ -11,7 +11,7 @@ var/dest_y /datum/projectile_data/New(var/src_x, var/src_y, var/time, var/distance, \ - var/power_x, var/power_y, var/dest_x, var/dest_y) + var/power_x, var/power_y, var/dest_x, var/dest_y) src.src_x = src_x src.src_y = src_y src.time = time diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index e49d458ceb..91f5105553 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -193,7 +193,7 @@ GLOBAL_LIST_INIT(bitfields, list( "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, diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index a2135b93b2..0ac8a61183 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -7,15 +7,15 @@ GLOBAL_LIST_EMPTY(facial_hair_styles_list) //stores /datum/sprite_accessory/faci GLOBAL_LIST_EMPTY(facial_hair_styles_male_list) //stores only hair names GLOBAL_LIST_EMPTY(facial_hair_styles_female_list) //stores only hair names //Underwear -GLOBAL_LIST_EMPTY(underwear_list) //stores /datum/sprite_accessory/underwear/bottom indexed by name +GLOBAL_LIST_EMPTY_TYPED(underwear_list, /datum/sprite_accessory/underwear/bottom) //stores bottoms indexed by name GLOBAL_LIST_EMPTY(underwear_m) //stores only underwear name GLOBAL_LIST_EMPTY(underwear_f) //stores only underwear name //Undershirts -GLOBAL_LIST_EMPTY(undershirt_list) //stores /datum/sprite_accessory/underwear/top indexed by name +GLOBAL_LIST_EMPTY_TYPED(undershirt_list, /datum/sprite_accessory/underwear/top) //stores tops indexed by name GLOBAL_LIST_EMPTY(undershirt_m) //stores only undershirt name GLOBAL_LIST_EMPTY(undershirt_f) //stores only undershirt name //Socks -GLOBAL_LIST_EMPTY(socks_list) //stores /datum/sprite_accessory/underwear/socks indexed by name +GLOBAL_LIST_EMPTY_TYPED(socks_list, /datum/sprite_accessory/underwear/socks) //stores socks indexed by name //Lizard Bits (all datum lists indexed by name) GLOBAL_LIST_EMPTY(body_markings_list) GLOBAL_LIST_EMPTY(tails_list_lizard) diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm index 0cb61949a0..6b8d91acf9 100644 --- a/code/_globalvars/lists/mapping.dm +++ b/code/_globalvars/lists/mapping.dm @@ -1,6 +1,16 @@ GLOBAL_LIST_INIT(cardinals, list(NORTH, SOUTH, EAST, WEST)) -GLOBAL_LIST_INIT(alldirs, list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)) +GLOBAL_LIST_INIT(cardinals_multiz, list(NORTH, SOUTH, EAST, WEST, UP, DOWN)) GLOBAL_LIST_INIT(diagonals, list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)) +GLOBAL_LIST_INIT(corners_multiz, list(UP|NORTHEAST, UP|NORTHWEST, UP|SOUTHEAST, UP|SOUTHWEST, DOWN|NORTHEAST, DOWN|NORTHWEST, DOWN|SOUTHEAST, DOWN|SOUTHWEST)) +GLOBAL_LIST_INIT(diagonals_multiz, list( + NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST, + UP|NORTH, UP|SOUTH, UP|EAST, UP|WEST, UP|NORTHEAST, UP|NORTHWEST, UP|SOUTHEAST, UP|SOUTHWEST, + DOWN|NORTH, DOWN|SOUTH, DOWN|EAST, DOWN|WEST, DOWN|NORTHEAST, DOWN|NORTHWEST, DOWN|SOUTHEAST, DOWN|SOUTHWEST)) +GLOBAL_LIST_INIT(alldirs_multiz, list( + NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST, + UP, UP|NORTH, UP|SOUTH, UP|EAST, UP|WEST, UP|NORTHEAST, UP|NORTHWEST, UP|SOUTHEAST, UP|SOUTHWEST, + DOWN, DOWN|NORTH, DOWN|SOUTH, DOWN|EAST, DOWN|WEST, DOWN|NORTHEAST, DOWN|NORTHWEST, DOWN|SOUTHEAST, DOWN|SOUTHWEST)) +GLOBAL_LIST_INIT(alldirs, list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)) GLOBAL_LIST_EMPTY(landmarks_list) //list of all landmarks created GLOBAL_LIST_EMPTY(start_landmarks_list) //list of all spawn points created @@ -35,6 +45,6 @@ GLOBAL_LIST_EMPTY(vr_spawnpoints) //used by jump-to-area etc. Updated by area/updateName() GLOBAL_LIST_EMPTY(sortedAreas) /// An association from typepath to area instance. Only includes areas with `unique` set. -GLOBAL_LIST_EMPTY(areas_by_type) +GLOBAL_LIST_EMPTY_TYPED(areas_by_type, /area) GLOBAL_LIST_EMPTY(all_abstract_markers) diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index 8b5657a6f6..1707c3a536 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -1,6 +1,8 @@ GLOBAL_LIST_EMPTY(clients) //all clients GLOBAL_LIST_EMPTY(admins) //all clients whom are admins GLOBAL_PROTECT(admins) +GLOBAL_LIST_EMPTY(mentors) //all clients whom are mentors +GLOBAL_PROTECT(mentors) GLOBAL_LIST_EMPTY(deadmins) //all ckeys who have used the de-admin verb. GLOBAL_LIST_EMPTY(directory) //all ckeys with associated client diff --git a/code/_globalvars/lists/poll_ignore.dm b/code/_globalvars/lists/poll_ignore.dm index 626bba9fc3..e30ce1d1ed 100644 --- a/code/_globalvars/lists/poll_ignore.dm +++ b/code/_globalvars/lists/poll_ignore.dm @@ -13,6 +13,10 @@ #define POLL_IGNORE_GOLEM "golem" #define POLL_IGNORE_SWARMER "swarmer" #define POLL_IGNORE_DRONE "drone" +#define POLL_IGNORE_IMAGINARYFRIEND "imaginary_friend" +#define POLL_IGNORE_SPLITPERSONALITY "split_personality" +#define POLL_IGNORE_DEMON "demon" +#define POLL_IGNORE_WIZARD "wizard" #define POLL_IGNORE_CLONE "clone" GLOBAL_LIST_INIT(poll_ignore_desc, list( @@ -29,6 +33,10 @@ GLOBAL_LIST_INIT(poll_ignore_desc, list( POLL_IGNORE_GOLEM = "Golems", POLL_IGNORE_SWARMER = "Swarmer shells", POLL_IGNORE_DRONE = "Drone shells", + POLL_IGNORE_IMAGINARYFRIEND = "Imaginary Friend", + POLL_IGNORE_SPLITPERSONALITY = "Split Personality", + POLL_IGNORE_DEMON = "Demons", + POLL_IGNORE_WIZARD = "Wizards", POLL_IGNORE_CLONE = "Defective/SDGF clones" )) GLOBAL_LIST_INIT(poll_ignore, init_poll_ignore()) diff --git a/code/_js/menus.dm b/code/_js/menus.dm index 9b2fc40e68..da56850b07 100644 --- a/code/_js/menus.dm +++ b/code/_js/menus.dm @@ -1,37 +1,37 @@ #define js_dropdowns {" function dropdowns() { - var divs = document.getElementsByTagName('div'); - var headers = new Array(); - var links = new Array(); - for(var i=0;i=0) { - elem.className = elem.className.replace('visible','hidden'); - this.className = this.className.replace('open','closed'); - this.innerHTML = this.innerHTML.replace('-','+'); - } - else { - elem.className = elem.className.replace('hidden','visible'); - this.className = this.className.replace('closed','open'); - this.innerHTML = this.innerHTML.replace('+','-'); - } - return false; - } - })(links\[i\]); - } - } + var divs = document.getElementsByTagName('div'); + var headers = new Array(); + var links = new Array(); + for(var i=0;i=0) { + elem.className = elem.className.replace('visible','hidden'); + this.className = this.className.replace('open','closed'); + this.innerHTML = this.innerHTML.replace('-','+'); + } + else { + elem.className = elem.className.replace('hidden','visible'); + this.className = this.className.replace('closed','open'); + this.innerHTML = this.innerHTML.replace('+','-'); + } + return false; + } + })(links\[i\]); + } + } } "} \ No newline at end of file diff --git a/code/_onclick/adjacent.dm b/code/_onclick/adjacent.dm index ddff0b6bd3..9485ea3374 100644 --- a/code/_onclick/adjacent.dm +++ b/code/_onclick/adjacent.dm @@ -68,9 +68,10 @@ /atom/movable/Adjacent(var/atom/neighbor) if(neighbor == loc) return TRUE - if(!isturf(loc)) + var/turf/T = loc + if(!istype(T)) return FALSE - if(loc.Adjacent(neighbor,target = neighbor, mover = src)) + if(T.Adjacent(neighbor, neighbor, src)) return TRUE return FALSE diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 58eabbdbcf..e9f50d9212 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -321,8 +321,7 @@ return /atom/proc/ShiftClick(mob/user) SEND_SIGNAL(src, COMSIG_CLICK_SHIFT, user) - if(user.client && user.client.eye == user || user.client.eye == user.loc) - user.examinate(src) + user.examinate(src) return /* diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index cc183dd6d3..391e86f390 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -213,6 +213,12 @@ or something covering your eyes." desc = "Whoa man, you're tripping balls! Careful you don't get addicted... if you aren't already." icon_state = "high" +/obj/screen/alert/hypnosis + name = "Hypnosis" + desc = "Something's hypnotizing you, but you're not really sure about what." + icon_state = "hypnosis" + var/phrase + /obj/screen/alert/drunk //Not implemented name = "Drunk" desc = "All that alcohol you've been drinking is impairing your speech, motor skills, and mental cognition. Make sure to act like it." diff --git a/code/_onclick/hud/plane_master.dm b/code/_onclick/hud/plane_master.dm index 8ee837a202..b2bc05924c 100644 --- a/code/_onclick/hud/plane_master.dm +++ b/code/_onclick/hud/plane_master.dm @@ -16,6 +16,28 @@ //Trust me, you need one. Period. If you don't think you do, you're doing something extremely wrong. /obj/screen/plane_master/proc/backdrop(mob/mymob) +/obj/screen/plane_master/openspace + name = "open space plane master" + plane = FLOOR_OPENSPACE_PLANE + appearance_flags = PLANE_MASTER + blend_mode = BLEND_MULTIPLY + alpha = 255 + +/obj/screen/plane_master/openspace/backdrop(mob/mymob) + filters = list() + filters += filter(type = "drop_shadow", color = "#04080FAA", size = -10) + filters += filter(type = "drop_shadow", color = "#04080FAA", size = -15) + filters += filter(type = "drop_shadow", color = "#04080FAA", size = -20) + +/obj/screen/plane_master/proc/outline(_size, _color) + filters += filter(type = "outline", size = _size, color = _color) + +/obj/screen/plane_master/proc/shadow(_size, _offset = 0, _x = 0, _y = 0, _color = "#04080FAA") + filters += filter(type = "drop_shadow", x = _x, y = _y, color = _color, size = _size, offset = _offset) + +/obj/screen/plane_master/proc/clear_filters() + filters = list() + /obj/screen/plane_master/floor name = "floor plane master" plane = FLOOR_PLANE diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index f796f75407..5f128ff76d 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -25,7 +25,7 @@ return ..() /obj/screen/examine(mob/user) - return + return list() /obj/screen/orbit() return diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 472766a59e..3a45e9bf60 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -47,7 +47,7 @@ if(do_mob(user, src, butchering.speed) && Adjacent(I)) butchering.Butcher(user, src) return 1 - else if(I.is_sharp() && !butchering) //give sharp objects butchering functionality, for consistency + else if(I.get_sharpness() && !butchering) //give sharp objects butchering functionality, for consistency I.AddComponent(/datum/component/butchering, 80 * I.toolspeed) attackby(I, user, params) //call the attackby again to refresh and do the butchering check again return diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index 12b1ca2784..ecd34b7840 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -106,9 +106,8 @@ /obj/item/tk_grab/examine(user) if (focus) - focus.examine(user) - else - ..() + return focus.examine(user) + return ..() /obj/item/tk_grab/attack_self(mob/user) if(!focus) diff --git a/code/controllers/configuration/config_entry.dm b/code/controllers/configuration/config_entry.dm index 4406655375..be9f7e116b 100644 --- a/code/controllers/configuration/config_entry.dm +++ b/code/controllers/configuration/config_entry.dm @@ -211,3 +211,27 @@ /datum/config_entry/keyed_list/vv_edit_var(var_name, var_value) return var_name != "splitter" && ..() + +//snowflake for donator things being on one line smh +/datum/config_entry/multi_keyed_flag + vv_VAS = FALSE + abstract_type = /datum/config_entry/multi_keyed_flag + config_entry_value = list() + var/delimiter = "|" + +/datum/config_entry/multi_keyed_flag/vv_edit_var(var_name, var_value) + if(var_name == NAMEOF(src, delimiter)) + return FALSE + return ..() + +/datum/config_entry/multi_keyed_flag/ValidateAndSet(str_val) + if(!VASProcCallGuard(str_val)) + return FALSE + str_val = trim(str_val) + var/list/keys = splittext(str_val, delimiter) + for(var/i in keys) + config_entry_value[process_key(i)] = TRUE + return length(keys)? TRUE : FALSE + +/datum/config_entry/multi_keyed_flag/proc/process_key(key) + return trim(key) diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm index ea2919f342..a5d27819b8 100644 --- a/code/controllers/configuration/configuration.dm +++ b/code/controllers/configuration/configuration.dm @@ -34,7 +34,7 @@ if(_directory) directory = _directory if(entries) - CRASH("[THIS_PROC_TYPE_WEIRD] called more than once!") + CRASH("/datum/controller/configuration/Load() called more than once!") InitEntries() LoadModes() if(fexists("[directory]/config.txt") && LoadEntries("config.txt") <= 1) diff --git a/code/controllers/configuration/entries/donator.dm b/code/controllers/configuration/entries/donator.dm index b74d5f5839..bb7b5a54c3 100644 --- a/code/controllers/configuration/entries/donator.dm +++ b/code/controllers/configuration/entries/donator.dm @@ -1,22 +1,23 @@ -/datum/config_entry/keyed_list/donator_group - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_FLAG - abstract_type = /datum/config_entry/keyed_list/donator_group +/datum/config_entry/multi_keyed_flag/donator_group + abstract_type = /datum/config_entry/multi_keyed_flag/donator_group //If we're in the middle of a config load, only do the regeneration afterwards to prevent this from wasting a massive amount of CPU for list regenerations. -/datum/config_entry/keyed_list/donator_group/ValidateAndSet(str_val, during_load) +/datum/config_entry/multi_keyed_flag/donator_group/ValidateAndSet(str_val, during_load) . = ..() - if(. && during_load) + if(. && !during_load) regenerate_donator_grouping_list() -/datum/config_entry/keyed_list/donator_group/OnPostload() +/datum/config_entry/multi_keyed_flag/donator_group/process_key(key) + return ckey(key) + +/datum/config_entry/multi_keyed_flag/donator_group/OnPostload() . = ..() regenerate_donator_grouping_list() //This is kinda weird in that the config entries are defined here but all the handling/calculations are in __HELPERS/donator_groupings.dm -/datum/config_entry/keyed_list/donator_group/tier_1_donators +/datum/config_entry/multi_keyed_flag/donator_group/tier_1_donators -/datum/config_entry/keyed_list/donator_group/tier_2_donators +/datum/config_entry/multi_keyed_flag/donator_group/tier_2_donators -/datum/config_entry/keyed_list/donator_group/tier_3_donators +/datum/config_entry/multi_keyed_flag/donator_group/tier_3_donators diff --git a/code/controllers/configuration/entries/dynamic.dm b/code/controllers/configuration/entries/dynamic.dm new file mode 100644 index 0000000000..7f3e16d57e --- /dev/null +++ b/code/controllers/configuration/entries/dynamic.dm @@ -0,0 +1,90 @@ +/datum/config_entry/flag/dynamic_voting + +/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/number/dynamic_midround_delay_min + config_entry_value = 15 + min_val = 1 + +/datum/config_entry/number/dynamic_midround_delay_max + config_entry_value = 35 + min_val = 1 + +/datum/config_entry/number/dynamic_latejoin_delay_min + config_entry_value = 5 + min_val = 1 + +/datum/config_entry/number/dynamic_latejoin_delay_max + config_entry_value = 25 + min_val = 1 + +/datum/config_entry/number/dynamic_first_midround_delay_min + config_entry_value = 20 + min_val = 1 + +/datum/config_entry/number/dynamic_first_midround_delay_max + config_entry_value = 40 + min_val = 1 + +/datum/config_entry/number/dynamic_first_latejoin_delay_min + config_entry_value = 10 + min_val = 1 + +/datum/config_entry/number/dynamic_first_latejoin_delay_max + config_entry_value = 30 + 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 + +/datum/config_entry/number_list/dynamic_second_rule_requirements + +/datum/config_entry/number_list/dynamic_third_rule_requirements + +/datum/config_entry/number/dynamic_second_rule_high_pop_requirement + config_entry_value = 50 + +/datum/config_entry/number/dynamic_third_rule_high_pop_requirement + config_entry_value = 70 + +/datum/config_entry/number_list/dynamic_hijack_requirements + +/datum/config_entry/number/dynamic_hijack_high_population_requirement + config_entry_value = 25 + +/datum/config_entry/number/dynamic_hijack_cost + config_entry_value = 5 + +/datum/config_entry/number/dynamic_glorious_death_cost + config_entry_value = 5 + +/datum/config_entry/number/dynamic_assassinate_cost + config_entry_value = 2 + +/datum/config_entry/number/dynamic_warops_requirement + config_entry_value = 60 + min_val = 0 + +/datum/config_entry/number/dynamic_warops_cost + config_entry_value = 10 + min_val = 0 diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 36b57a4b7c..fdddbda344 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -139,6 +139,14 @@ min_val = 0 max_val = 1 +/datum/config_entry/number/suicide_reenter_round_timer + config_entry_value = 30 + min_val = 0 + +/datum/config_entry/number/roundstart_suicide_time_limit + config_entry_value = 30 + min_val = 0 + /datum/config_entry/number/shuttle_refuel_delay config_entry_value = 12000 min_val = 0 @@ -371,43 +379,3 @@ /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/number/dynamic_midround_delay_min - config_entry_value = 15 - min_val = 1 - -/datum/config_entry/number/dynamic_midround_delay_max - config_entry_value = 35 - min_val = 1 - -/datum/config_entry/number/dynamic_latejoin_delay_min - config_entry_value = 5 - min_val = 1 - -/datum/config_entry/number/dynamic_latejoin_delay_max - config_entry_value = 25 - 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 aab71fd015..a412ad2f48 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -141,6 +141,11 @@ /datum/config_entry/flag/load_legacy_ranks_only //Loads admin ranks only from legacy admin_ranks.txt, while enabled ranks are mirrored to the database protection = CONFIG_ENTRY_LOCKED +/datum/config_entry/flag/mentors_mobname_only + +/datum/config_entry/flag/mentor_legacy_system //Defines whether the server uses the legacy mentor system with mentors.txt or the SQL system + protection = CONFIG_ENTRY_LOCKED + /datum/config_entry/string/hostedby /datum/config_entry/flag/norespawn diff --git a/code/controllers/subsystem/adjacent_air.dm b/code/controllers/subsystem/adjacent_air.dm new file mode 100644 index 0000000000..8395eda708 --- /dev/null +++ b/code/controllers/subsystem/adjacent_air.dm @@ -0,0 +1,35 @@ +SUBSYSTEM_DEF(adjacent_air) + name = "Atmos Adjacency" + flags = SS_BACKGROUND + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + wait = 10 + priority = FIRE_PRIORITY_ATMOS_ADJACENCY + var/list/queue = list() + +/datum/controller/subsystem/adjacent_air/stat_entry() +#ifdef TESTING + ..("P:[length(queue)], S:[GLOB.atmos_adjacent_savings[1]], T:[GLOB.atmos_adjacent_savings[2]]") +#else + ..("P:[length(queue)]") +#endif + +/datum/controller/subsystem/adjacent_air/Initialize() + while(length(queue)) + fire(mc_check = FALSE) + return ..() + +/datum/controller/subsystem/adjacent_air/fire(resumed = FALSE, mc_check = TRUE) + + var/list/queue = src.queue + + while (length(queue)) + var/turf/currT = queue[1] + queue.Cut(1,2) + + currT.ImmediateCalculateAdjacentTurfs() + + if(mc_check) + if(MC_TICK_CHECK) + break + else + CHECK_TICK \ No newline at end of file diff --git a/code/controllers/subsystem/chat.dm b/code/controllers/subsystem/chat.dm index 37e53e8990..8d4de0c091 100644 --- a/code/controllers/subsystem/chat.dm +++ b/code/controllers/subsystem/chat.dm @@ -1,6 +1,6 @@ SUBSYSTEM_DEF(chat) name = "Chat" - flags = SS_TICKER|SS_NO_INIT + flags = SS_TICKER wait = 1 priority = FIRE_PRIORITY_CHAT init_order = INIT_ORDER_CHAT @@ -29,6 +29,7 @@ SUBSYSTEM_DEF(chat) target = GLOB.clients //Some macros remain in the string even after parsing and fuck up the eventual output + var/original_message = message message = replacetext(message, "\improper", "") message = replacetext(message, "\proper", "") if(handle_whitespace) @@ -45,6 +46,12 @@ SUBSYSTEM_DEF(chat) for(var/I in target) var/client/C = CLIENT_FROM_VAR(I) //Grab us a client if possible + if(!C) + return + + //Send it to the old style output window. + SEND_TEXT(C, original_message) + if(!C?.chatOutput || C.chatOutput.broken) //A player who hasn't updated his skin file. continue @@ -57,6 +64,12 @@ SUBSYSTEM_DEF(chat) else var/client/C = CLIENT_FROM_VAR(target) //Grab us a client if possible + if(!C) + return + + //Send it to the old style output window. + SEND_TEXT(C, original_message) + if(!C?.chatOutput || C.chatOutput.broken) //A player who hasn't updated his skin file. return diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index efa6b8b59d..af7ae825f4 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -658,6 +658,46 @@ SUBSYSTEM_DEF(job) message_admins(msg) CRASH(msg) +/datum/controller/subsystem/job/proc/equip_loadout(mob/dead/new_player/N, mob/living/M, equipbackpackstuff) + var/mob/the_mob = N + if(!the_mob) + the_mob = M // cause this doesn't get assigned if player is a latejoiner + if(the_mob.client && the_mob.client.prefs && (the_mob.client.prefs.chosen_gear && the_mob.client.prefs.chosen_gear.len)) + if(!ishuman(M))//no silicons allowed + return + for(var/i in the_mob.client.prefs.chosen_gear) + var/datum/gear/G = i + G = GLOB.loadout_items[slot_to_string(initial(G.category))][initial(G.name)] + if(!G) + continue + var/permitted = TRUE + if(G.restricted_roles && G.restricted_roles.len && !(M.mind.assigned_role in G.restricted_roles)) + permitted = FALSE + if(G.donoritem && !G.donator_ckey_check(the_mob.client.ckey)) + permitted = FALSE + if(!equipbackpackstuff && G.category == SLOT_IN_BACKPACK)//snowflake check since plopping stuff in the backpack doesnt work for pre-job equip loadout stuffs + permitted = FALSE + if(equipbackpackstuff && G.category != SLOT_IN_BACKPACK)//ditto + permitted = FALSE + if(!permitted) + continue + var/obj/item/I = new G.path + if(!M.equip_to_slot_if_possible(I, G.category, disable_warning = TRUE, bypass_equip_delay_self = TRUE)) // If the job's dresscode compliant, try to put it in its slot, first + if(iscarbon(M)) + var/mob/living/carbon/C = M + var/obj/item/storage/backpack/B = C.back + if(!B || !SEND_SIGNAL(B, COMSIG_TRY_STORAGE_INSERT, I, null, TRUE, TRUE)) // Otherwise, try to put it in the backpack, for carbons. + I.forceMove(get_turf(C)) + else if(!M.equip_to_slot_if_possible(I, SLOT_IN_BACKPACK, disable_warning = TRUE, bypass_equip_delay_self = TRUE)) // Otherwise, try to put it in the backpack + I.forceMove(get_turf(M)) // If everything fails, just put it on the floor under the mob. + +/datum/controller/subsystem/job/proc/FreeRole(rank) + if(!rank) + return + var/datum/job/job = GetJob(rank) + if(!job) + return FALSE + job.current_positions = max(0, job.current_positions - 1) /////////////////////////////////// //Keeps track of all living heads// diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index dec6cf8466..29762338fb 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -14,6 +14,7 @@ SUBSYSTEM_DEF(mapping) var/list/ruins_templates = list() var/list/space_ruins_templates = list() var/list/lava_ruins_templates = list() + var/datum/space_level/isolated_ruins_z //Created on demand during ruin loading. var/list/shuttle_templates = list() var/list/shelter_templates = list() @@ -25,6 +26,7 @@ SUBSYSTEM_DEF(mapping) var/list/datum/turf_reservations //list of turf reservations var/list/used_turfs = list() //list of turf = datum/turf_reservation + var/list/reservation_ready = list() var/clearing_reserved_turfs = FALSE // Z-manager stuff @@ -95,7 +97,7 @@ SUBSYSTEM_DEF(mapping) // Set up Z-level transitions. setup_map_transitions() generate_station_area_list() - initialize_reserved_level() + initialize_reserved_level(transit.z_value) return ..() /* Nuke threats, for making the blue tiles on the station go RED @@ -442,7 +444,7 @@ GLOBAL_LIST_EMPTY(the_station_areas) GLOB.the_gateway.wait = world.time /datum/controller/subsystem/mapping/proc/RequestBlockReservation(width, height, z, type = /datum/turf_reservation, turf_type_override, border_type_override) - UNTIL(initialized && !clearing_reserved_turfs) + UNTIL((!z || reservation_ready["[z]"]) && !clearing_reserved_turfs) var/datum/turf_reservation/reserve = new type if(turf_type_override) reserve.turf_type = turf_type_override @@ -454,8 +456,9 @@ GLOBAL_LIST_EMPTY(the_station_areas) 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)) + var/datum/space_level/newReserved = add_new_zlevel("Transit/Reserved [num_of_res_levels]", list(ZTRAIT_RESERVED = TRUE)) + initialize_reserved_level(newReserved.z_value) + if(reserve.Reserve(width, height, newReserved.z_value)) return reserve else if(!level_trait(z, ZTRAIT_RESERVED)) @@ -467,19 +470,22 @@ GLOBAL_LIST_EMPTY(the_station_areas) QDEL_NULL(reserve) //This is not for wiping reserved levels, use wipe_reservations() for that. -/datum/controller/subsystem/mapping/proc/initialize_reserved_level() +/datum/controller/subsystem/mapping/proc/initialize_reserved_level(z) UNTIL(!clearing_reserved_turfs) //regardless, lets add a check just in case. clearing_reserved_turfs = TRUE //This operation will likely clear any existing reservations, so lets make sure nothing tries to make one while we're doing it. - for(var/i in levels_by_trait(ZTRAIT_RESERVED)) - var/turf/A = get_turf(locate(SHUTTLE_TRANSIT_BORDER,SHUTTLE_TRANSIT_BORDER,i)) - var/turf/B = get_turf(locate(world.maxx - SHUTTLE_TRANSIT_BORDER,world.maxy - SHUTTLE_TRANSIT_BORDER,i)) - var/block = block(A, B) - for(var/t in block) - // No need to empty() these, because it's world init and they're - // already /turf/open/space/basic. - var/turf/T = t - T.flags_1 |= UNUSED_RESERVATION_TURF_1 - unused_turfs["[i]"] = block + if(!level_trait(z,ZTRAIT_RESERVED)) + clearing_reserved_turfs = FALSE + CRASH("Invalid z level prepared for reservations.") + var/turf/A = get_turf(locate(SHUTTLE_TRANSIT_BORDER,SHUTTLE_TRANSIT_BORDER,z)) + var/turf/B = get_turf(locate(world.maxx - SHUTTLE_TRANSIT_BORDER,world.maxy - SHUTTLE_TRANSIT_BORDER,z)) + var/block = block(A, B) + for(var/t in block) + // No need to empty() these, because it's world init and they're + // already /turf/open/space/basic. + var/turf/T = t + T.flags_1 |= UNUSED_RESERVATION_TURF_1 + unused_turfs["[z]"] = block + reservation_ready["[z]"] = TRUE clearing_reserved_turfs = FALSE /datum/controller/subsystem/mapping/proc/reserve_turfs(list/turfs) @@ -513,3 +519,9 @@ GLOBAL_LIST_EMPTY(the_station_areas) for(var/B in areas) var/area/A = B A.reg_in_areas_in_z() + +/datum/controller/subsystem/mapping/proc/get_isolated_ruin_z() + if(!isolated_ruins_z) + isolated_ruins_z = add_new_zlevel("Isolated Ruins/Reserved", list(ZTRAIT_RESERVED = TRUE, ZTRAIT_ISOLATED_RUINS = TRUE)) + initialize_reserved_level(isolated_ruins_z.z_value) + return isolated_ruins_z.z_value \ No newline at end of file diff --git a/code/controllers/subsystem/pai.dm b/code/controllers/subsystem/pai.dm index 2e2f7edd99..18667053d4 100644 --- a/code/controllers/subsystem/pai.dm +++ b/code/controllers/subsystem/pai.dm @@ -69,6 +69,10 @@ SUBSYSTEM_DEF(pai) candidate.comments = copytext(sanitize(candidate.comments),1,MAX_MESSAGE_LEN) if("submit") + if(isobserver(usr)) + var/mob/dead/observer/O = usr + if(!O.can_reenter_round()) + return FALSE if(candidate) candidate.ready = 1 for(var/obj/item/paicard/p in pai_card_list) @@ -148,6 +152,8 @@ SUBSYSTEM_DEF(pai) continue if(!(ROLE_PAI in G.client.prefs.be_special)) continue + if(!G.can_reenter_round()) // this should use notify_ghosts() instead one day. + return FALSE to_chat(G, "[user] is requesting a pAI personality! Use the pAI button to submit yourself as one.") addtimer(CALLBACK(src, .proc/spam_again), spam_delay) var/list/available = list() diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm index 1b7cade71f..c3db8552c6 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -12,6 +12,7 @@ SUBSYSTEM_DEF(persistence) var/list/obj/structure/chisel_message/chisel_messages = list() var/list/saved_messages = list() var/list/saved_modes = list(1,2,3) + var/list/saved_threat_levels = list(1,1,1) var/list/saved_maps var/list/saved_trophies = list() var/list/spawned_objects = list() @@ -27,6 +28,7 @@ SUBSYSTEM_DEF(persistence) LoadChiselMessages() LoadTrophies() LoadRecentModes() + LoadRecentThreats() LoadRecentMaps() LoadPhotoPersistence() if(CONFIG_GET(flag/use_antag_rep)) @@ -166,6 +168,15 @@ SUBSYSTEM_DEF(persistence) return saved_modes = json["data"] +/datum/controller/subsystem/persistence/proc/LoadRecentThreats() + var/json_file = file("data/RecentThreatLevels.json") + if(!fexists(json_file)) + return + var/list/json = json_decode(file2text(json_file)) + if(!json) + return + saved_threat_levels = json["data"] + /datum/controller/subsystem/persistence/proc/LoadRecentMaps() var/json_file = file("data/RecentMaps.json") if(!fexists(json_file)) @@ -216,6 +227,7 @@ SUBSYSTEM_DEF(persistence) CollectSecretSatchels() CollectTrophies() CollectRoundtype() + CollectThreatLevel() RecordMaps() SavePhotoPersistence() //THIS IS PERSISTENCE, NOT THE LOGGING PORTION. if(CONFIG_GET(flag/use_antag_rep)) @@ -372,6 +384,18 @@ SUBSYSTEM_DEF(persistence) fdel(json_file) WRITE_FILE(json_file, json_encode(file_data)) +/datum/controller/subsystem/persistence/proc/CollectThreatLevel() + if(istype(SSticker.mode, /datum/game_mode/dynamic)) + var/datum/game_mode/dynamic/mode = SSticker.mode + saved_threat_levels[3] = saved_threat_levels[2] + saved_threat_levels[2] = saved_threat_levels [1] + saved_threat_levels[1] = mode.threat_level + var/json_file = file("data/RecentThreatLevels.json") + var/list/file_data = list() + file_data["data"] = saved_threat_levels + fdel(json_file) + WRITE_FILE(json_file, json_encode(file_data)) + /datum/controller/subsystem/persistence/proc/RecordMaps() saved_maps = saved_maps?.len ? list("[SSmapping.config.map_name]") | saved_maps : list("[SSmapping.config.map_name]") var/json_file = file("data/RecentMaps.json") diff --git a/code/controllers/subsystem/research.dm b/code/controllers/subsystem/research.dm index 05c76619d9..ab27658efd 100644 --- a/code/controllers/subsystem/research.dm +++ b/code/controllers/subsystem/research.dm @@ -4,24 +4,32 @@ SUBSYSTEM_DEF(research) priority = FIRE_PRIORITY_RESEARCH wait = 10 init_order = INIT_ORDER_RESEARCH + //TECHWEB STATIC + var/list/techweb_nodes = list() //associative id = node datum + var/list/techweb_designs = list() //associative id = node datum + var/list/datum/techweb/techwebs = list() + var/datum/techweb/science/science_tech + var/datum/techweb/admin/admin_tech + var/datum/techweb_node/error_node/error_node //These two are what you get if a node/design is deleted and somehow still stored in a console. + var/datum/design/error_design/error_design + + //ERROR LOGGING var/list/invalid_design_ids = list() //associative id = number of times var/list/invalid_node_ids = list() //associative id = number of times var/list/invalid_node_boost = list() //associative id = error message + var/list/obj/machinery/rnd/server/servers = list() - var/datum/techweb/science/science_tech - var/datum/techweb/admin/admin_tech - var/list/techweb_nodes = list() //associative id = node datum - var/list/techweb_categories = list() //category name = list(node.id = node) - var/list/techweb_designs = list() //associative id = node datum - var/list/techweb_nodes_starting = list() //associative id = node datum + + var/list/techweb_nodes_starting = list() //associative id = TRUE + var/list/techweb_categories = list() //category name = list(node.id = TRUE) var/list/techweb_boost_items = list() //associative double-layer path = list(id = list(point_type = point_discount)) - var/list/techweb_nodes_hidden = list() //Nodes that should be hidden by default. + var/list/techweb_nodes_hidden = list() //Node ids that should be hidden by default. var/list/techweb_point_items = list( //path = list(point type = value) /obj/item/assembly/signaler/anomaly = list(TECHWEB_POINT_TYPE_GENERIC = 2500), /obj/item/assembly/signaler/anomaly = list(TECHWEB_POINT_TYPE_GENERIC = 5000), // Cit three more anomalys anomalys /obj/item/assembly/signaler/anomaly = list(TECHWEB_POINT_TYPE_GENERIC = 7500), /obj/item/assembly/signaler/anomaly = list(TECHWEB_POINT_TYPE_GENERIC = 10000), - // - Slime Extracts! - + // - Slime Extracts! - /obj/item/slime_extract/grey = list(TECHWEB_POINT_TYPE_GENERIC = 500), // Adds in slime core deconing /obj/item/slime_extract/metal = list(TECHWEB_POINT_TYPE_GENERIC = 750), /obj/item/slime_extract/purple = list(TECHWEB_POINT_TYPE_GENERIC = 750), @@ -294,6 +302,8 @@ SUBSYSTEM_DEF(research) science_tech = new /datum/techweb/science admin_tech = new /datum/techweb/admin autosort_categories() + error_design = new + error_node = new return ..() /datum/controller/subsystem/research/fire() @@ -330,6 +340,191 @@ SUBSYSTEM_DEF(research) for(var/i in techweb_nodes) var/datum/techweb_node/I = techweb_nodes[i] if(techweb_categories[I.category]) - techweb_categories[I.category][I.id] = I + techweb_categories[I.category][I.id] = TRUE else - techweb_categories[I.category] = list(I.id = I) + techweb_categories[I.category] = list(I.id = TRUE) + +/datum/controller/subsystem/research/proc/techweb_node_by_id(id) + return techweb_nodes[id] || error_node + +/datum/controller/subsystem/research/proc/techweb_design_by_id(id) + return techweb_designs[id] || error_design + +/datum/controller/subsystem/research/proc/on_design_deletion(datum/design/D) + for(var/i in techweb_nodes) + var/datum/techweb_node/TN = techwebs[i] + TN.on_design_deletion(TN) + for(var/i in techwebs) + var/datum/techweb/T = i + T.recalculate_nodes(TRUE) + +/datum/controller/subsystem/research/proc/on_node_deletion(datum/techweb_node/TN) + for(var/i in techweb_nodes) + var/datum/techweb_node/TN2 = techwebs[i] + TN2.on_node_deletion(TN) + for(var/i in techwebs) + var/datum/techweb/T = i + T.recalculate_nodes(TRUE) + +/datum/controller/subsystem/research/proc/initialize_all_techweb_nodes(clearall = FALSE) + if(islist(techweb_nodes) && clearall) + QDEL_LIST(techweb_nodes) + if(islist(techweb_nodes_starting && clearall)) + techweb_nodes_starting.Cut() + var/list/returned = list() + for(var/path in subtypesof(/datum/techweb_node)) + var/datum/techweb_node/TN = path + if(isnull(initial(TN.id))) + continue + TN = new path + if(returned[initial(TN.id)]) + stack_trace("WARNING: Techweb node ID clash with ID [initial(TN.id)] detected! Path: [path]") + errored_datums[TN] = initial(TN.id) + continue + returned[initial(TN.id)] = TN + if(TN.starting_node) + techweb_nodes_starting[TN.id] = TRUE + for(var/id in techweb_nodes) + var/datum/techweb_node/TN = techweb_nodes[id] + TN.Initialize() + techweb_nodes = returned + if (!verify_techweb_nodes()) //Verify all nodes have ids and such. + stack_trace("Invalid techweb nodes detected") + calculate_techweb_nodes() + calculate_techweb_boost_list() + if (!verify_techweb_nodes()) //Verify nodes and designs have been crosslinked properly. + CRASH("Invalid techweb nodes detected") + +/datum/controller/subsystem/research/proc/initialize_all_techweb_designs(clearall = FALSE) + if(islist(techweb_designs) && clearall) + QDEL_LIST(techweb_designs) + var/list/returned = list() + for(var/path in subtypesof(/datum/design)) + var/datum/design/DN = path + if(isnull(initial(DN.id))) + stack_trace("WARNING: Design with null ID detected. Build path: [initial(DN.build_path)]") + continue + else if(initial(DN.id) == DESIGN_ID_IGNORE) + continue + DN = new path + if(returned[initial(DN.id)]) + stack_trace("WARNING: Design ID clash with ID [initial(DN.id)] detected! Path: [path]") + errored_datums[DN] = initial(DN.id) + continue + returned[initial(DN.id)] = DN + techweb_designs = returned + verify_techweb_designs() + +/datum/controller/subsystem/research/proc/verify_techweb_nodes() + . = TRUE + for(var/n in techweb_nodes) + var/datum/techweb_node/N = techweb_nodes[n] + if(!istype(N)) + WARNING("Invalid research node with ID [n] detected and removed.") + techweb_nodes -= n + research_node_id_error(n) + . = FALSE + for(var/p in N.prereq_ids) + var/datum/techweb_node/P = techweb_nodes[p] + if(!istype(P)) + WARNING("Invalid research prerequisite node with ID [p] detected in node [N.display_name]\[[N.id]\] removed.") + N.prereq_ids -= p + research_node_id_error(p) + . = FALSE + for(var/d in N.design_ids) + var/datum/design/D = techweb_designs[d] + if(!istype(D)) + WARNING("Invalid research design with ID [d] detected in node [N.display_name]\[[N.id]\] removed.") + N.design_ids -= d + design_id_error(d) + . = FALSE + for(var/u in N.unlock_ids) + var/datum/techweb_node/U = techweb_nodes[u] + if(!istype(U)) + WARNING("Invalid research unlock node with ID [u] detected in node [N.display_name]\[[N.id]\] removed.") + N.unlock_ids -= u + research_node_id_error(u) + . = FALSE + for(var/p in N.boost_item_paths) + if(!ispath(p)) + N.boost_item_paths -= p + WARNING("[p] is not a valid path.") + node_boost_error(N.id, "[p] is not a valid path.") + . = FALSE + var/list/points = N.boost_item_paths[p] + if(islist(points)) + for(var/i in points) + if(!isnum(points[i])) + WARNING("[points[i]] is not a valid number.") + node_boost_error(N.id, "[points[i]] is not a valid number.") + . = FALSE + else if(!point_types[i]) + WARNING("[i] is not a valid point type.") + node_boost_error(N.id, "[i] is not a valid point type.") + . = FALSE + else if(!isnull(points)) + N.boost_item_paths -= p + node_boost_error(N.id, "No valid list.") + WARNING("No valid list.") + . = FALSE + CHECK_TICK + +/datum/controller/subsystem/research/proc/verify_techweb_designs() + for(var/d in techweb_designs) + var/datum/design/D = techweb_designs[d] + if(!istype(D)) + stack_trace("WARNING: Invalid research design with ID [d] detected and removed.") + techweb_designs -= d + CHECK_TICK + +/datum/controller/subsystem/research/proc/research_node_id_error(id) + if(invalid_node_ids[id]) + invalid_node_ids[id]++ + else + invalid_node_ids[id] = 1 + +/datum/controller/subsystem/research/proc/design_id_error(id) + if(invalid_design_ids[id]) + invalid_design_ids[id]++ + else + invalid_design_ids[id] = 1 + +/datum/controller/subsystem/research/proc/calculate_techweb_nodes() + for(var/design_id in techweb_designs) + var/datum/design/D = techweb_designs[design_id] + D.unlocked_by.Cut() + for(var/node_id in techweb_nodes) + var/datum/techweb_node/node = techweb_nodes[node_id] + node.unlock_ids = list() + for(var/i in node.design_ids) + var/datum/design/D = techweb_designs[i] + node.design_ids[i] = TRUE + D.unlocked_by += node.id + if(node.hidden) + techweb_nodes_hidden[node.id] = TRUE + CHECK_TICK + generate_techweb_unlock_linking() + +/datum/controller/subsystem/research/proc/generate_techweb_unlock_linking() + for(var/node_id in techweb_nodes) //Clear all unlock links to avoid duplication. + var/datum/techweb_node/node = techweb_nodes[node_id] + node.unlock_ids = list() + for(var/node_id in techweb_nodes) + var/datum/techweb_node/node = techweb_nodes[node_id] + for(var/prereq_id in node.prereq_ids) + var/datum/techweb_node/prereq_node = techweb_node_by_id(prereq_id) + prereq_node.unlock_ids[node.id] = node + +/datum/controller/subsystem/research/proc/calculate_techweb_boost_list(clearall = FALSE) + if(clearall) + techweb_boost_items = list() + for(var/node_id in techweb_nodes) + var/datum/techweb_node/node = techweb_nodes[node_id] + for(var/path in node.boost_item_paths) + if(!ispath(path)) + continue + if(length(techweb_boost_items[path])) + techweb_boost_items[path][node.id] = node.boost_item_paths[path] + else + techweb_boost_items[path] = list(node.id = node.boost_item_paths[path]) + CHECK_TICK diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index 51a2761f74..fe40b3f01f 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -638,3 +638,11 @@ SUBSYSTEM_DEF(shuttle) C.update_hidden_docking_ports(remove_images, add_images) QDEL_LIST(remove_images) + +/datum/controller/subsystem/shuttle/proc/autoEnd() //CIT CHANGE - allows shift to end after 2 hours have passed. + if((world.realtime - SSshuttle.realtimeofstart) > auto_call && EMERGENCY_IDLE_OR_RECALLED) //2 hours + SSshuttle.emergency.request(silent = TRUE) + priority_announce("The shift has come to an end and the shuttle called. [seclevel2num(get_security_level()) == SEC_LEVEL_RED ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [emergency.timeLeft(600)] minutes.", null, "shuttlecalled", "Priority") + log_game("Round time limit reached. Shuttle has been auto-called.") + message_admins("Round time limit reached. Shuttle called.") + emergencyNoRecall = TRUE diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm index 4b91944ec8..48da15f67e 100644 --- a/code/controllers/subsystem/throwing.dm +++ b/code/controllers/subsystem/throwing.dm @@ -147,6 +147,11 @@ SUBSYSTEM_DEF(throwing) if (callback) callback.Invoke() + if(!thrownthing.zfalling) // I don't think you can zfall while thrown but hey, just in case. + var/turf/T = get_turf(thrownthing) + if(T && thrownthing.has_gravity(T)) + T.zFall(thrownthing) + qdel(src) /datum/thrownthing/proc/hit_atom(atom/A) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 2ab06f4d59..6f619fef0b 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -479,7 +479,8 @@ SUBSYSTEM_DEF(ticker) if(SSticker.timeLeft < 900) SSticker.timeLeft = 900 SSticker.modevoted = TRUE - SSvote.initiate_vote("roundtype","server",TRUE) + var/dynamic = CONFIG_GET(flag/dynamic_voting) + SSvote.initiate_vote(dynamic ? "dynamic" : "roundtype","server",TRUE) /datum/controller/subsystem/ticker/Recover() current_state = SSticker.current_state diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm index ee1f5b8c3d..33798d74f7 100644 --- a/code/controllers/subsystem/traumas.dm +++ b/code/controllers/subsystem/traumas.dm @@ -40,7 +40,7 @@ SUBSYSTEM_DEF(traumas) "cats" = strings(PHOBIA_FILE, "cats"), "syndicate"= strings(PHOBIA_FILE, "syndicate"), "eye" = strings(PHOBIA_FILE, "eye") - ) + ) phobia_mobs = list("spiders" = typecacheof(list(/mob/living/simple_animal/hostile/poison/giant_spider)), "security" = typecacheof(list(/mob/living/simple_animal/bot/secbot, /mob/living/simple_animal/bot/ed209)), @@ -166,7 +166,7 @@ SUBSYSTEM_DEF(traumas) "syndicate" = typecacheof(list(/obj/item/stack/tile/mineral/plastitanium, /obj/machinery/computer/shuttle/syndicate, /obj/machinery/computer/shuttle/syndicate/recall, /obj/machinery/computer/shuttle/syndicate/drop_pod, /obj/machinery/computer/camera_advanced/shuttle_docker/syndicate, /obj/machinery/recharge_station, /obj/machinery/porta_turret/syndicate, /obj/structure/closet/syndicate, /obj/machinery/suit_storage_unit/syndicate, /obj/item/clothing/under/syndicate, /obj/item/folder/syndicate, /obj/item/documents/syndicate, /obj/item/clothing/glasses/phantomthief/syndicate, /obj/item/antag_spawner/nuke_ops, /obj/item/storage/box/syndicate, - /obj/structure/fluff/empty_sleeper/syndicate, /obj/item/implant/radio/syndicate, /obj/item/clothing/head/helmet/space/syndicate, /obj/machinery/nuclearbomb/syndicate, /obj/item/grenade/syndieminibomb, /obj/item/storage/backpack/duffelbag/syndie, /obj/item/gun/ballistic/automatic/pistol, /obj/item/gun/ballistic/revolver/syndie, + /obj/structure/fluff/empty_sleeper/syndicate, /obj/item/implant/radio/syndicate, /obj/item/clothing/head/helmet/space/syndicate, /obj/machinery/nuclearbomb/syndicate, /obj/item/grenade/syndieminibomb, /obj/item/storage/backpack/duffelbag/syndie, /obj/item/gun/ballistic/automatic/pistol, /obj/item/gun/ballistic/revolver, /obj/item/gun/ballistic/automatic/shotgun/bulldog, /obj/item/gun/ballistic/automatic/c20r, /obj/item/gun/ballistic/automatic/m90, /obj/item/gun/ballistic/automatic/l6_saw, /obj/item/storage/belt/grenade/full, /obj/item/gun/ballistic/automatic/sniper_rifle/syndicate, /obj/item/gun/energy/kinetic_accelerator/crossbow, /obj/item/melee/transforming/energy/sword/saber, /obj/item/twohanded/dualsaber, /obj/item/melee/powerfist, /obj/item/storage/box/syndie_kit, /obj/item/grenade/spawnergrenade/manhacks, /obj/item/grenade/chem_grenade/bioterrorfoam, /obj/item/reagent_containers/spray/chemsprayer/bioterror, /obj/item/ammo_box/magazine/m10mm, /obj/item/ammo_box/magazine/pistolm9mm, /obj/item/ammo_box/a357, /obj/item/ammo_box/magazine/m12g, /obj/item/ammo_box/magazine/mm195x129, /obj/item/antag_spawner/nuke_ops, /obj/mecha/combat/gygax/dark, /obj/mecha/combat/marauder/mauler, /obj/item/soap/syndie, /obj/item/gun/syringe/syndicate, /obj/item/cartridge/virus/syndicate, diff --git a/code/controllers/subsystem/vis_overlays.dm b/code/controllers/subsystem/vis_overlays.dm index 107d65a558..0635709074 100644 --- a/code/controllers/subsystem/vis_overlays.dm +++ b/code/controllers/subsystem/vis_overlays.dm @@ -29,8 +29,8 @@ SUBSYSTEM_DEF(vis_overlays) return //the "thing" var can be anything with vis_contents which includes images -/datum/controller/subsystem/vis_overlays/proc/add_vis_overlay(atom/movable/thing, icon, iconstate, layer, plane, dir, alpha=255) - . = "[icon]|[iconstate]|[layer]|[plane]|[dir]|[alpha]" +/datum/controller/subsystem/vis_overlays/proc/add_vis_overlay(atom/movable/thing, icon, iconstate, layer, plane, dir, alpha = 255, add_appearance_flags = NONE) + . = "[icon]|[iconstate]|[layer]|[plane]|[dir]|[alpha]|[add_appearance_flags]" var/obj/effect/overlay/vis/overlay = vis_overlay_cache[.] if(!overlay) overlay = new @@ -40,6 +40,7 @@ SUBSYSTEM_DEF(vis_overlays) overlay.plane = plane overlay.dir = dir overlay.alpha = alpha + overlay.appearance_flags |= add_appearance_flags vis_overlay_cache[.] = overlay else overlay.unused = 0 @@ -64,10 +65,12 @@ SUBSYSTEM_DEF(vis_overlays) UnregisterSignal(thing, COMSIG_ATOM_DIR_CHANGE) /datum/controller/subsystem/vis_overlays/proc/rotate_vis_overlay(atom/thing, old_dir, new_dir) + if(old_dir == new_dir) + return var/rotation = dir2angle(old_dir) - dir2angle(new_dir) var/list/overlays_to_remove = list() for(var/i in thing.managed_vis_overlays) var/obj/effect/overlay/vis/overlay = i - add_vis_overlay(thing, overlay.icon, overlay.icon_state, overlay.layer, overlay.plane, turn(overlay.dir, rotation)) + add_vis_overlay(thing, overlay.icon, overlay.icon_state, overlay.layer, overlay.plane, turn(overlay.dir, rotation), overlay.alpha, overlay.appearance_flags) overlays_to_remove += overlay remove_vis_overlay(thing, overlays_to_remove) diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index e29382377f..dee10e4998 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -87,7 +87,7 @@ SUBSYSTEM_DEF(vote) /datum/controller/subsystem/vote/proc/announce_result() var/list/winners = get_result() var/text - var/was_roundtype_vote = mode == "roundtype" + var/was_roundtype_vote = mode == "roundtype" || mode == "dynamic" if(winners.len > 0) if(question) text += "[question]" @@ -124,6 +124,9 @@ SUBSYSTEM_DEF(vote) message_admins(admintext) return . +#define PEACE "calm" +#define CHAOS "chaotic" + /datum/controller/subsystem/vote/proc/result() . = announce_result() var/restart = 0 @@ -146,6 +149,36 @@ SUBSYSTEM_DEF(vote) restart = 1 else GLOB.master_mode = . + if("dynamic") + if(SSticker.current_state > GAME_STATE_PREGAME)//Don't change the mode if the round already started. + return message_admins("A vote has tried to change the gamemode, but the game has already started. Aborting.") + GLOB.master_mode = "dynamic" + if("extended" in choices) + if(. == "extended") + GLOB.dynamic_forced_extended = TRUE // we still do the rest of the stuff + choices[PEACE] += choices["extended"] + var/mean = 0 + var/voters = 0 + for(var/client/c in GLOB.clients) + var/vote = c.prefs.preferred_chaos + if(vote) + voters += 1 + switch(vote) + if(CHAOS_NONE) + mean -= 0.1 + if(CHAOS_LOW) + mean -= 0.05 + if(CHAOS_HIGH) + mean += 0.05 + if(CHAOS_MAX) + mean += 0.1 + mean/=voters + if(voted.len != 0) + mean += (choices[PEACE]*-1+choices[CHAOS])/voted.len + GLOB.dynamic_curve_centre = mean*20 + GLOB.dynamic_curve_width = CLAMP(2-abs(mean*5),0.5,4) + to_chat(world,"Dynamic curve centre set to [GLOB.dynamic_curve_centre] and width set to [GLOB.dynamic_curve_width].") + log_admin("Dynamic curve centre set to [GLOB.dynamic_curve_centre] and width set to [GLOB.dynamic_curve_width]") if("map") var/datum/map_config/VM = config.maplist[.] message_admins("The map has been voted for and will change to: [VM.map_name]") @@ -223,6 +256,12 @@ SUBSYSTEM_DEF(vote) choices |= M if("roundtype") //CIT CHANGE - adds the roundstart secret/extended vote choices.Add("secret", "extended") + if("dynamic") + var/saved_threats = SSpersistence.saved_threat_levels + if((saved_threats[1]+saved_threats[2]+saved_threats[3])>150) + choices.Add("extended",PEACE,CHAOS) + else + choices.Add(PEACE,CHAOS) if("custom") question = stripped_input(usr,"What is the vote for?") if(!question) @@ -379,4 +418,7 @@ SUBSYSTEM_DEF(vote) else if(owner.ckey) var/datum/player_details/P = GLOB.player_details[owner.ckey] if(P) - P.player_actions -= src \ No newline at end of file + P.player_actions -= src + +#undef PEACE +#undef CHAOS diff --git a/code/controllers/subsystem/weather.dm b/code/controllers/subsystem/weather.dm index 2391b4c839..5e44f2e4c3 100644 --- a/code/controllers/subsystem/weather.dm +++ b/code/controllers/subsystem/weather.dm @@ -74,10 +74,10 @@ SUBSYSTEM_DEF(weather) next_hit_by_zlevel["[z]"] = null /datum/controller/subsystem/weather/proc/get_weather(z, area/active_area) - var/datum/weather/A - for(var/V in processing) - var/datum/weather/W = V - if((z in W.impacted_z_levels) && W.area_type == active_area.type) - A = W - break - return A + var/datum/weather/A + for(var/V in processing) + var/datum/weather/W = V + if((z in W.impacted_z_levels) && W.area_type == active_area.type) + A = W + break + return A diff --git a/code/datums/action.dm b/code/datums/action.dm index fd33ef79b5..77aa729eb1 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -245,6 +245,14 @@ /datum/action/item_action/toggle_helmet_light name = "Toggle Helmet Light" +/datum/action/item_action/toggle_welding_screen + name = "Toggle Welding Screen" + +/datum/action/item_action/toggle_welding_screen/Trigger() + var/obj/item/clothing/head/hardhat/weldhat/H = target + if(istype(H)) + H.toggle_welding_screen(owner) + /datum/action/item_action/toggle_headphones name = "Toggle Headphones" desc = "UNTZ UNTZ UNTZ" diff --git a/code/datums/armor.dm b/code/datums/armor.dm index cbf4b76c60..85915395f8 100644 --- a/code/datums/armor.dm +++ b/code/datums/armor.dm @@ -1,70 +1,70 @@ #define ARMORID "armor-[melee]-[bullet]-[laser]-[energy]-[bomb]-[bio]-[rad]-[fire]-[acid]-[magic]" /proc/getArmor(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0) - . = locate(ARMORID) - if (!.) - . = new /datum/armor(melee, bullet, laser, energy, bomb, bio, rad, fire, acid, magic) + . = locate(ARMORID) + if (!.) + . = new /datum/armor(melee, bullet, laser, energy, bomb, bio, rad, fire, acid, magic) /datum/armor - datum_flags = DF_USE_TAG - var/melee - var/bullet - var/laser - var/energy - var/bomb - var/bio - var/rad - var/fire - var/acid - var/magic + datum_flags = DF_USE_TAG + var/melee + var/bullet + var/laser + var/energy + var/bomb + var/bio + var/rad + var/fire + var/acid + var/magic /datum/armor/New(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0) - src.melee = melee - src.bullet = bullet - src.laser = laser - src.energy = energy - src.bomb = bomb - src.bio = bio - src.rad = rad - src.fire = fire - src.acid = acid - src.magic = magic - tag = ARMORID + src.melee = melee + src.bullet = bullet + src.laser = laser + src.energy = energy + src.bomb = bomb + src.bio = bio + src.rad = rad + src.fire = fire + src.acid = acid + src.magic = magic + tag = ARMORID /datum/armor/proc/modifyRating(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0) - return getArmor(src.melee+melee, src.bullet+bullet, src.laser+laser, src.energy+energy, src.bomb+bomb, src.bio+bio, src.rad+rad, src.fire+fire, src.acid+acid, src.magic+magic) + return getArmor(src.melee+melee, src.bullet+bullet, src.laser+laser, src.energy+energy, src.bomb+bomb, src.bio+bio, src.rad+rad, src.fire+fire, src.acid+acid, src.magic+magic) /datum/armor/proc/modifyAllRatings(modifier = 0) - return getArmor(melee+modifier, bullet+modifier, laser+modifier, energy+modifier, bomb+modifier, bio+modifier, rad+modifier, fire+modifier, acid+modifier, magic+modifier) + return getArmor(melee+modifier, bullet+modifier, laser+modifier, energy+modifier, bomb+modifier, bio+modifier, rad+modifier, fire+modifier, acid+modifier, magic+modifier) /datum/armor/proc/setRating(melee, bullet, laser, energy, bomb, bio, rad, fire, acid, magic) - return getArmor((isnull(melee) ? src.melee : melee),\ - (isnull(bullet) ? src.bullet : bullet),\ - (isnull(laser) ? src.laser : laser),\ - (isnull(energy) ? src.energy : energy),\ - (isnull(bomb) ? src.bomb : bomb),\ - (isnull(bio) ? src.bio : bio),\ - (isnull(rad) ? src.rad : rad),\ - (isnull(fire) ? src.fire : fire),\ - (isnull(acid) ? src.acid : acid),\ - (isnull(magic) ? src.magic : magic)) + return getArmor((isnull(melee) ? src.melee : melee),\ + (isnull(bullet) ? src.bullet : bullet),\ + (isnull(laser) ? src.laser : laser),\ + (isnull(energy) ? src.energy : energy),\ + (isnull(bomb) ? src.bomb : bomb),\ + (isnull(bio) ? src.bio : bio),\ + (isnull(rad) ? src.rad : rad),\ + (isnull(fire) ? src.fire : fire),\ + (isnull(acid) ? src.acid : acid),\ + (isnull(magic) ? src.magic : magic)) /datum/armor/proc/getRating(rating) - return vars[rating] + return vars[rating] /datum/armor/proc/getList() - return list("melee" = melee, "bullet" = bullet, "laser" = laser, "energy" = energy, "bomb" = bomb, "bio" = bio, "rad" = rad, "fire" = fire, "acid" = acid, "magic" = magic) + return list("melee" = melee, "bullet" = bullet, "laser" = laser, "energy" = energy, "bomb" = bomb, "bio" = bio, "rad" = rad, "fire" = fire, "acid" = acid, "magic" = magic) /datum/armor/proc/attachArmor(datum/armor/AA) - return getArmor(melee+AA.melee, bullet+AA.bullet, laser+AA.laser, energy+AA.energy, bomb+AA.bomb, bio+AA.bio, rad+AA.rad, fire+AA.fire, acid+AA.acid, magic+AA.magic) + return getArmor(melee+AA.melee, bullet+AA.bullet, laser+AA.laser, energy+AA.energy, bomb+AA.bomb, bio+AA.bio, rad+AA.rad, fire+AA.fire, acid+AA.acid, magic+AA.magic) /datum/armor/proc/detachArmor(datum/armor/AA) - return getArmor(melee-AA.melee, bullet-AA.bullet, laser-AA.laser, energy-AA.energy, bomb-AA.bomb, bio-AA.bio, rad-AA.rad, fire-AA.fire, acid-AA.acid, magic-AA.magic) + return getArmor(melee-AA.melee, bullet-AA.bullet, laser-AA.laser, energy-AA.energy, bomb-AA.bomb, bio-AA.bio, rad-AA.rad, fire-AA.fire, acid-AA.acid, magic-AA.magic) /datum/armor/vv_edit_var(var_name, var_value) - if (var_name == NAMEOF(src, tag)) - return FALSE - . = ..() - tag = ARMORID // update tag in case armor values were edited + if (var_name == NAMEOF(src, tag)) + return FALSE + . = ..() + tag = ARMORID // update tag in case armor values were edited #undef ARMORID diff --git a/code/datums/brain_damage/brain_trauma.dm b/code/datums/brain_damage/brain_trauma.dm index 56a3f3969b..1aa1341c9c 100644 --- a/code/datums/brain_damage/brain_trauma.dm +++ b/code/datums/brain_damage/brain_trauma.dm @@ -1,10 +1,12 @@ //Brain Traumas are the new actual brain damage. Brain damage itself acts as a way to acquire traumas: every time brain damage is dealt, there's a chance of receiving a trauma. //This chance gets higher the higher the mob's brainloss is. Removing traumas is a separate thing from removing brain damage: you can get restored to full brain operativity, -//but keep the quirks, until repaired by mannitol (for mild/special ones) or brain surgery (for severe ones). +// but keep the quirks, until repaired by neurine, surgery, lobotomy or magic; depending on the resilience +// of the trauma. + /datum/brain_trauma var/name = "Brain Trauma" var/desc = "A trauma caused by brain damage, which causes issues to the patient." - var/scan_desc = "a generic brain trauma" //description when detected by a health scanner + var/scan_desc = "generic brain trauma" //description when detected by a health scanner var/mob/living/carbon/owner //the poor bastard var/obj/item/organ/brain/brain //the poor bastard's brain var/gain_text = "You feel traumatized." @@ -12,15 +14,21 @@ var/can_gain = TRUE var/random_gain = TRUE //can this be gained through random traumas? var/resilience = TRAUMA_RESILIENCE_BASIC //how hard is this to cure? + var/clonable = TRUE // will this transfer if the brain is cloned? /datum/brain_trauma/Destroy() - brain.traumas -= src + if(brain && brain.traumas) + brain.traumas -= src if(owner) on_lose() brain = null owner = null return ..() +/datum/brain_trauma/proc/on_clone() + if(clonable) + return new type + //Called on life ticks /datum/brain_trauma/proc/on_life() return @@ -33,17 +41,24 @@ /datum/brain_trauma/proc/on_gain() to_chat(owner, gain_text) RegisterSignal(owner, COMSIG_MOB_SAY, .proc/handle_speech) + RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/handle_hearing) //Called when removed from a mob /datum/brain_trauma/proc/on_lose(silent) if(!silent) to_chat(owner, lose_text) UnregisterSignal(owner, COMSIG_MOB_SAY) + UnregisterSignal(owner, COMSIG_MOVABLE_HEAR) //Called when hearing a spoken message -/datum/brain_trauma/proc/on_hear(message, speaker, message_language, raw_message, radio_freq) - return message +/datum/brain_trauma/proc/handle_hearing(datum/source, list/hearing_args) + UnregisterSignal(owner, COMSIG_MOVABLE_HEAR) //Called when speaking /datum/brain_trauma/proc/handle_speech(datum/source, list/speech_args) UnregisterSignal(owner, COMSIG_MOB_SAY) + + +//Called when hugging. expand into generally interacting, where future coders could switch the intent? +/datum/brain_trauma/proc/on_hug(mob/living/hugger, mob/living/hugged) + return diff --git a/code/datums/brain_damage/hypnosis.dm b/code/datums/brain_damage/hypnosis.dm index 8909d1b85f..f937c19658 100644 --- a/code/datums/brain_damage/hypnosis.dm +++ b/code/datums/brain_damage/hypnosis.dm @@ -5,6 +5,7 @@ gain_text = "" lose_text = "" resilience = TRAUMA_RESILIENCE_SURGERY + var/hypnotic_phrase = "" var/regex/target_phrase @@ -44,18 +45,17 @@ "You feel a part of your mind repeating this over and over. You need to follow these words.",\ "Something about this sounds... right, for some reason. You feel like you should follow these words.",\ "These words keep echoing in your mind. You find yourself completely fascinated by them.")]") - if(!HAS_TRAIT(owner, "hypnotherapy")) - to_chat(owner, "You've been hypnotized by this sentence. You must follow these words. If it isn't a clear order, you can freely interpret how to do so,\ + to_chat(owner, "You've been hypnotized by this sentence. You must follow these words. If it isn't a clear order, you can freely interpret how to do so,\ as long as you act like the words are your highest priority.") - else - to_chat(owner, "You've been hypnotized by this sentence. You feel an incredible desire to follow these words, but are able to resist it somewhat. If it isn't a clear order, you can freely interpret how to do so,\ - however this does not take precedence over your other objectives.") + var/obj/screen/alert/hypnosis/hypno_alert = owner.throw_alert("hypnosis", /obj/screen/alert/hypnosis) + hypno_alert.desc = "\"[hypnotic_phrase]\"... your mind seems to be fixated on this concept." ..() /datum/brain_trauma/hypnosis/on_lose() message_admins("[ADMIN_LOOKUPFLW(owner)] is no longer hypnotized with the phrase '[hypnotic_phrase]'.") log_game("[key_name(owner)] is no longer hypnotized with the phrase '[hypnotic_phrase]'.") - to_chat(owner, "You suddenly snap out of your fixation. The phrase '[hypnotic_phrase]' no longer feels important to you.") + to_chat(owner, "You suddenly snap out of your hypnosis. The phrase '[hypnotic_phrase]' no longer feels important to you.") + owner.clear_alert("hypnosis") ..() /datum/brain_trauma/hypnosis/on_life() @@ -67,6 +67,5 @@ if(2) new /datum/hallucination/chat(owner, TRUE, FALSE, "[hypnotic_phrase]") -/datum/brain_trauma/hypnosis/on_hear(message, speaker, message_language, raw_message, radio_freq) - message = target_phrase.Replace(message, "$1") - return message +/datum/brain_trauma/hypnosis/handle_hearing(datum/source, list/hearing_args) + hearing_args[HEARING_MESSAGE] = target_phrase.Replace(hearing_args[HEARING_MESSAGE], "$1") diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm index 5bbc5de4a5..8337a8e4d5 100644 --- a/code/datums/brain_damage/imaginary_friend.dm +++ b/code/datums/brain_damage/imaginary_friend.dm @@ -8,6 +8,10 @@ var/friend_initialized = FALSE /datum/brain_trauma/special/imaginary_friend/on_gain() + var/mob/living/M = owner + if(M.stat == DEAD || !M.client) + qdel(src) + return ..() make_friend() get_ghost() @@ -43,7 +47,7 @@ /datum/brain_trauma/special/imaginary_friend/proc/get_ghost() set waitfor = FALSE - var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s imaginary friend?", ROLE_PAI, null, null, 75, friend) + var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s imaginary friend?", ROLE_PAI, null, null, 75, friend, POLL_IGNORE_IMAGINARYFRIEND) if(LAZYLEN(candidates)) var/mob/dead/observer/C = pick(candidates) C.transfer_ckey(friend, FALSE) @@ -74,26 +78,34 @@ /mob/camera/imaginary_friend/Login() ..() - to_chat(src, "You are the imaginary friend of [owner]!") - to_chat(src, "You are absolutely loyal to your friend, no matter what.") - to_chat(src, "You cannot directly influence the world around you, but you can see what [owner] cannot.") + greet() Show() +/mob/camera/imaginary_friend/proc/greet() + to_chat(src, "You are the imaginary friend of [owner]!") + to_chat(src, "You are absolutely loyal to your friend, no matter what.") + to_chat(src, "You cannot directly influence the world around you, but you can see what [owner] cannot.") + /mob/camera/imaginary_friend/Initialize(mapload, _trauma) . = ..() - var/gender = pick(MALE, FEMALE) - real_name = random_unique_name(gender) - name = real_name + trauma = _trauma owner = trauma.owner copy_known_languages_from(owner, TRUE) - human_image = get_flat_human_icon(null, pick(SSjob.occupations)) + + setup_friend() join = new join.Grant(src) hide = new hide.Grant(src) +/mob/camera/imaginary_friend/proc/setup_friend() + var/gender = pick(MALE, FEMALE) + real_name = random_unique_name(gender) + name = real_name + human_image = get_flat_human_icon(null, pick(SSjob.occupations)) + /mob/camera/imaginary_friend/proc/Show() if(!client) //nobody home return @@ -132,7 +144,7 @@ if(client.prefs.muted & MUTE_IC) to_chat(src, "You cannot send IC messages (muted).") return - if (src.client.handle_spam_prevention(message,MUTE_IC)) + if (!(ignore_spam || forced) && src.client.handle_spam_prevention(message,MUTE_IC)) return friend_talk(message) @@ -218,4 +230,42 @@ var/mob/camera/imaginary_friend/I = owner I.hidden = !I.hidden I.Show() - update_status() \ No newline at end of file + update_status() + +//down here is the trapped mind +//like imaginary friend but a lot less imagination and more like mind prison// + +/datum/brain_trauma/special/imaginary_friend/trapped_owner + name = "Trapped Victim" + desc = "Patient appears to be targeted by an invisible entity." + gain_text = "" + lose_text = "" + random_gain = FALSE + +/datum/brain_trauma/special/imaginary_friend/trapped_owner/make_friend() + friend = new /mob/camera/imaginary_friend/trapped(get_turf(owner), src) + +/datum/brain_trauma/special/imaginary_friend/trapped_owner/reroll_friend() //no rerolling- it's just the last owner's hell + if(friend.client) //reconnected + return + friend_initialized = FALSE + QDEL_NULL(friend) + qdel(src) + +/datum/brain_trauma/special/imaginary_friend/trapped_owner/get_ghost() //no randoms + return + +/mob/camera/imaginary_friend/trapped + name = "figment of imagination?" + real_name = "figment of imagination?" + desc = "The previous host of this body." + +/mob/camera/imaginary_friend/trapped/greet() + to_chat(src, "You have managed to hold on as a figment of the new host's imagination!") + to_chat(src, "All hope is lost for you, but at least you may interact with your host. You do not have to be loyal to them.") + to_chat(src, "You cannot directly influence the world around you, but you can see what the host cannot.") + +/mob/camera/imaginary_friend/trapped/setup_friend() + real_name = "[owner.real_name]?" + name = real_name + human_image = icon('icons/mob/lavaland/lavaland_monsters.dmi', icon_state = "curseblob") diff --git a/code/datums/brain_damage/mild.dm b/code/datums/brain_damage/mild.dm index c049a7db33..012f771a29 100644 --- a/code/datums/brain_damage/mild.dm +++ b/code/datums/brain_damage/mild.dm @@ -64,21 +64,21 @@ name = "Speech Impediment" desc = "Patient is unable to form coherent sentences." scan_desc = "communication disorder" - gain_text = "" //mutation will handle the text - lose_text = "" + gain_text = "You can't seem to form any coherent thoughts!" + lose_text = "Your mind feels more clear." /datum/brain_trauma/mild/speech_impediment/on_gain() ADD_TRAIT(owner, TRAIT_UNINTELLIGIBLE_SPEECH, TRAUMA_TRAIT) - . = ..() + ..() /datum/brain_trauma/mild/speech_impediment/on_lose() REMOVE_TRAIT(owner, TRAIT_UNINTELLIGIBLE_SPEECH, TRAUMA_TRAIT) - . = ..() + ..() /datum/brain_trauma/mild/concussion name = "Concussion" desc = "Patient's brain is concussed." - scan_desc = "a concussion" + scan_desc = "concussion" gain_text = "Your head hurts!" lose_text = "The pressure inside your head starts fading." @@ -157,54 +157,108 @@ gain_text = "Your muscles feel oddly faint." lose_text = "You feel in control of your muscles again." -/datum/brain_trauma/mild/muscle_spasms/on_life() - if(prob(7)) - switch(rand(1,5)) - if(1) - if(owner.canmove && !isspaceturf(owner.loc)) - to_chat(owner, "Your leg spasms!") - step(owner, pick(GLOB.cardinals)) - if(2) - if(owner.incapacitated()) - return - var/obj/item/I = owner.get_active_held_item() - if(I) - to_chat(owner, "Your fingers spasm!") - owner.log_message("used [I] due to a Muscle Spasm", LOG_ATTACK) - I.attack_self(owner) - if(3) - var/prev_intent = owner.a_intent - owner.a_intent = INTENT_HARM - - var/range = 1 - if(istype(owner.get_active_held_item(), /obj/item/gun)) //get targets to shoot at - range = 7 - - var/list/mob/living/targets = list() - for(var/mob/M in oview(owner, range)) - if(isliving(M)) - targets += M - if(LAZYLEN(targets)) - to_chat(owner, "Your arm spasms!") - owner.log_message(" attacked someone due to a Muscle Spasm") //the following attack will log itself - owner.ClickOn(pick(targets)) - owner.a_intent = prev_intent - if(4) - var/prev_intent = owner.a_intent - owner.a_intent = INTENT_HARM - to_chat(owner, "Your arm spasms!") - owner.log_message("attacked [owner.p_them()]self to a Muscle Spasm", LOG_ATTACK) - owner.ClickOn(owner) - owner.a_intent = prev_intent - if(5) - if(owner.incapacitated()) - return - var/obj/item/I = owner.get_active_held_item() - var/list/turf/targets = list() - for(var/turf/T in oview(owner, 3)) - targets += T - if(LAZYLEN(targets) && I) - to_chat(owner, "Your arm spasms!") - owner.log_message("threw [I] due to a Muscle Spasm", LOG_ATTACK) - owner.throw_item(pick(targets)) +/datum/brain_trauma/mild/muscle_spasms/on_gain() + owner.apply_status_effect(STATUS_EFFECT_SPASMS) ..() + +/datum/brain_trauma/mild/muscle_spasms/on_lose() + owner.remove_status_effect(STATUS_EFFECT_SPASMS) + ..() + +/datum/brain_trauma/mild/nervous_cough + name = "Nervous Cough" + desc = "Patient feels a constant need to cough." + scan_desc = "nervous cough" + gain_text = "Your throat itches incessantly..." + lose_text = "Your throat stops itching." + +/datum/brain_trauma/mild/nervous_cough/on_life() + if(prob(12) && !HAS_TRAIT(owner, TRAIT_SOOTHED_THROAT)) + if(prob(5)) + to_chat(owner, "[pick("You have a coughing fit!", "You can't stop coughing!")]") + owner.Stun(20) + owner.emote("cough") + addtimer(CALLBACK(owner, /mob/.proc/emote, "cough"), 6) + addtimer(CALLBACK(owner, /mob/.proc/emote, "cough"), 12) + owner.emote("cough") + ..() + +/datum/brain_trauma/mild/expressive_aphasia + name = "Expressive Aphasia" + desc = "Patient is affected by partial loss of speech leading to a reduced vocabulary." + scan_desc = "inability to form complex sentences" + gain_text = "You lose your grasp on complex words." + lose_text = "You feel your vocabulary returning to normal again." + + var/static/list/common_words = world.file2list("strings/1000_most_common.txt") + +/datum/brain_trauma/mild/expressive_aphasia/handle_speech(datum/source, list/speech_args) + var/message = speech_args[SPEECH_MESSAGE] + if(message) + var/list/message_split = splittext(message, " ") + var/list/new_message = list() + + for(var/word in message_split) + var/suffix = copytext(word,-1) + + // Check if we have a suffix and break it out of the word + if(suffix in list("." , "," , ";" , "!" , ":" , "?")) + word = copytext(word,1,-1) + else + suffix = "" + + word = html_decode(word) + + if(lowertext(word) in common_words) + new_message += word + suffix + else + if(prob(30) && message_split.len > 2) + new_message += pick("uh","erm") + break + else + var/list/charlist = string2charlist(word) // Stupid shit code + shuffle_inplace(charlist) + charlist.len = round(charlist.len * 0.5,1) + new_message += html_encode(jointext(charlist,"")) + suffix + + message = jointext(new_message, " ") + + speech_args[SPEECH_MESSAGE] = trim(message) + +/datum/brain_trauma/mild/mind_echo + name = "Mind Echo" + desc = "Patient's language neurons do not terminate properly, causing previous speech patterns to occasionally resurface spontaneously." + scan_desc = "looping neural pattern" + gain_text = "You feel a faint echo of your thoughts..." + lose_text = "The faint echo fades away." + var/list/hear_dejavu = list() + var/list/speak_dejavu = list() + +/datum/brain_trauma/mild/mind_echo/handle_hearing(datum/source, list/hearing_args) + if(owner == hearing_args[HEARING_SPEAKER]) + return + if(hear_dejavu.len >= 5) + if(prob(25)) + var/deja_vu = pick_n_take(hear_dejavu) + var/static/regex/quoted_spoken_message = regex("\".+\"", "gi") + hearing_args[HEARING_MESSAGE] = quoted_spoken_message.Replace(hearing_args[HEARING_MESSAGE], "\"[deja_vu]\"") //Quotes included to avoid cases where someone says part of their name + return + if(hear_dejavu.len >= 15) + if(prob(50)) + popleft(hear_dejavu) //Remove the oldest + hear_dejavu += hearing_args[HEARING_RAW_MESSAGE] + else + hear_dejavu += hearing_args[HEARING_RAW_MESSAGE] + +/datum/brain_trauma/mild/mind_echo/handle_speech(datum/source, list/speech_args) + if(speak_dejavu.len >= 5) + if(prob(25)) + var/deja_vu = pick_n_take(speak_dejavu) + speech_args[SPEECH_MESSAGE] = deja_vu + return + if(speak_dejavu.len >= 15) + if(prob(50)) + popleft(speak_dejavu) //Remove the oldest + speak_dejavu += speech_args[SPEECH_MESSAGE] + else + speak_dejavu += speech_args[SPEECH_MESSAGE] \ No newline at end of file diff --git a/code/datums/brain_damage/phobia.dm b/code/datums/brain_damage/phobia.dm index f802555c7e..034f2baaaf 100644 --- a/code/datums/brain_damage/phobia.dm +++ b/code/datums/brain_damage/phobia.dm @@ -2,8 +2,8 @@ name = "Phobia" desc = "Patient is unreasonably afraid of something." scan_desc = "phobia" - gain_text = "" - lose_text = "" + gain_text = "You start finding default values very unnerving..." + lose_text = "You no longer feel afraid of default values." var/phobia_type var/next_check = 0 var/next_scare = 0 @@ -14,8 +14,10 @@ var/list/trigger_turfs var/list/trigger_species -/datum/brain_trauma/mild/phobia/New(specific_type) - phobia_type = specific_type +/datum/brain_trauma/mild/phobia/New(new_phobia_type) + if(new_phobia_type) + phobia_type = new_phobia_type + if(!phobia_type) phobia_type = pick(SStraumas.phobia_types) @@ -29,6 +31,11 @@ trigger_species = SStraumas.phobia_species[phobia_type] ..() + +/datum/brain_trauma/mild/phobia/on_clone() + if(clonable) + return new type(phobia_type) + /datum/brain_trauma/mild/phobia/on_life() ..() if(HAS_TRAIT(owner, TRAIT_FEARLESS)) @@ -44,6 +51,12 @@ if(is_type_in_typecache(O, trigger_objs)) freak_out(O) return + for(var/mob/living/carbon/human/HU in seen_atoms) //check equipment for trigger items + for(var/X in HU.get_all_slots() | HU.held_items) + var/obj/I = X + if(!QDELETED(I) && is_type_in_typecache(I, trigger_objs)) + freak_out(I) + return if(LAZYLEN(trigger_turfs)) for(var/turf/T in seen_atoms) @@ -51,45 +64,41 @@ freak_out(T) return - if(LAZYLEN(trigger_mobs) || LAZYLEN(trigger_objs)) + seen_atoms -= owner //make sure they aren't afraid of themselves. + if(LAZYLEN(trigger_mobs) || LAZYLEN(trigger_species)) for(var/mob/M in seen_atoms) if(is_type_in_typecache(M, trigger_mobs)) freak_out(M) return - else if(ishuman(M)) //check their equipment for trigger items + else if(ishuman(M)) //check their species var/mob/living/carbon/human/H = M if(LAZYLEN(trigger_species) && H.dna && H.dna.species && is_type_in_typecache(H.dna.species, trigger_species)) freak_out(H) + return - for(var/X in H.get_all_slots() | H.held_items) - var/obj/I = X - if(!QDELETED(I) && is_type_in_typecache(I, trigger_objs)) - freak_out(I) - return - -/datum/brain_trauma/mild/phobia/on_hear(message, speaker, message_language, raw_message, radio_freq) +/datum/brain_trauma/mild/phobia/handle_hearing(datum/source, list/hearing_args) if(!owner.can_hear() || world.time < next_scare) //words can't trigger you if you can't hear them *taps head* - return message + return if(HAS_TRAIT(owner, TRAIT_FEARLESS)) - return message + return for(var/word in trigger_words) - var/reg = regex("(\\b|\\A)[REGEX_QUOTE(word)]'?s*(\\b|\\Z)", "i") + var/regex/reg = regex("(\\b|\\A)[REGEX_QUOTE(word)]'?s*(\\b|\\Z)", "i") - if(findtext(raw_message, reg)) + if(findtext(hearing_args[HEARING_RAW_MESSAGE], reg)) addtimer(CALLBACK(src, .proc/freak_out, null, word), 10) //to react AFTER the chat message + hearing_args[HEARING_MESSAGE] = reg.Replace(hearing_args[HEARING_MESSAGE], "$1") break - return message /datum/brain_trauma/mild/phobia/handle_speech(datum/source, list/speech_args) if(HAS_TRAIT(owner, TRAIT_FEARLESS)) return for(var/word in trigger_words) - var/reg = regex("(\\b|\\A)[REGEX_QUOTE(word)]'?s*(\\b|\\Z)", "i") + var/regex/reg = regex("(\\b|\\A)[REGEX_QUOTE(word)]'?s*(\\b|\\Z)", "i") if(findtext(speech_args[SPEECH_MESSAGE], reg)) - to_chat(owner, "You can't bring yourself to say the word \"[word]\"!") + to_chat(owner, "You can't bring yourself to say the word \"[word]\"!") speech_args[SPEECH_MESSAGE] = "" /datum/brain_trauma/mild/phobia/proc/freak_out(atom/reason, trigger_word) @@ -125,6 +134,76 @@ owner.Jitter(10) owner.stuttering += 10 +// Defined phobia types for badminry, not included in the RNG trauma pool to avoid diluting. + +/datum/brain_trauma/mild/phobia/spiders + phobia_type = "spiders" + random_gain = FALSE + +/datum/brain_trauma/mild/phobia/space + phobia_type = "space" + random_gain = FALSE + /datum/brain_trauma/mild/phobia/security phobia_type = "security" random_gain = FALSE + +/datum/brain_trauma/mild/phobia/clowns + phobia_type = "clowns" + random_gain = FALSE + +/datum/brain_trauma/mild/phobia/greytide + phobia_type = "greytide" + random_gain = FALSE + +/datum/brain_trauma/mild/phobia/lizards + phobia_type = "lizards" + random_gain = FALSE + +/datum/brain_trauma/mild/phobia/skeletons + phobia_type = "skeletons" + random_gain = FALSE + +/datum/brain_trauma/mild/phobia/snakes + phobia_type = "snakes" + random_gain = FALSE + +/datum/brain_trauma/mild/phobia/robots + phobia_type = "robots" + random_gain = FALSE + +/datum/brain_trauma/mild/phobia/doctors + phobia_type = "doctors" + random_gain = FALSE + +/datum/brain_trauma/mild/phobia/authority + phobia_type = "authority" + random_gain = FALSE + +/datum/brain_trauma/mild/phobia/supernatural + phobia_type = "the supernatural" + random_gain = FALSE + +/datum/brain_trauma/mild/phobia/aliens + phobia_type = "aliens" + random_gain = FALSE + +/datum/brain_trauma/mild/phobia/strangers + phobia_type = "strangers" + random_gain = FALSE + +/datum/brain_trauma/mild/phobia/birds + phobia_type = "birds" + random_gain = FALSE + +/datum/brain_trauma/mild/phobia/falling + phobia_type = "falling" + random_gain = FALSE + +/datum/brain_trauma/mild/phobia/anime + phobia_type = "anime" + random_gain = FALSE + +/datum/brain_trauma/mild/phobia/conspiracies + phobia_type = "conspiracies" + random_gain = FALSE diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index 890e9cf903..0e08c4cd15 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -119,7 +119,7 @@ owner.update_disabled_bodyparts() /datum/brain_trauma/severe/paralysis/paraplegic - //can_gain = FALSE maybe breaks. + random_gain = FALSE paralysis_type = "legs" resilience = TRAUMA_RESILIENCE_ABSOLUTE @@ -149,7 +149,7 @@ /datum/brain_trauma/severe/monophobia name = "Monophobia" desc = "Patient feels sick and distressed when not around other people, leading to potentially lethal levels of stress." - scan_desc = "severe monophobia" + scan_desc = "monophobia" gain_text = "" lose_text = "You feel like you could be safe on your own." var/stress = 0 @@ -168,7 +168,7 @@ if(stress > 10 && (prob(5))) stress_reaction() else - stress -= 4 + stress = max(stress - 4, 0) /datum/brain_trauma/severe/monophobia/proc/check_alone() if(HAS_TRAIT(owner, TRAIT_BLIND)) diff --git a/code/datums/brain_damage/special.dm b/code/datums/brain_damage/special.dm index d9e6f00643..b52c7d391c 100644 --- a/code/datums/brain_damage/special.dm +++ b/code/datums/brain_damage/special.dm @@ -22,6 +22,14 @@ else speak("neutral", prob(25)) +/datum/brain_trauma/special/godwoken/on_gain() + ADD_TRAIT(owner, TRAIT_HOLY, TRAUMA_TRAIT) + ..() + +/datum/brain_trauma/special/godwoken/on_lose() + REMOVE_TRAIT(owner, TRAIT_HOLY, TRAUMA_TRAIT) + ..() + /datum/brain_trauma/special/godwoken/proc/speak(type, include_owner = FALSE) var/message switch(type) @@ -36,7 +44,7 @@ else message = pick_list_replacements(BRAIN_DAMAGE_FILE, "god_neutral") - playsound(get_turf(owner), 'sound/magic/clockwork/invoke_general.ogg', 200, 1, 5) + playsound(get_turf(owner), 'sound/magic/clockwork/invoke_general.ogg', 200, TRUE, 5) voice_of_god(message, owner, list("colossus","yell"), 2.5, include_owner, FALSE) /datum/brain_trauma/special/bluespace_prophet @@ -134,7 +142,101 @@ /datum/brain_trauma/special/psychotic_brawling/bath_salts name = "Chemical Violent Psychosis" - random_gain = FALSE + clonable = FALSE + +/datum/brain_trauma/special/tenacity + name = "Tenacity" + desc = "Patient is psychologically unaffected by pain and injuries, and can remain standing far longer than a normal person." + scan_desc = "traumatic neuropathy" + gain_text = "You suddenly stop feeling pain." + lose_text = "You realize you can feel pain again." + +/datum/brain_trauma/special/tenacity/on_gain() + ADD_TRAIT(owner, TRAIT_NOSOFTCRIT, TRAUMA_TRAIT) + ADD_TRAIT(owner, TRAIT_NOHARDCRIT, TRAUMA_TRAIT) + ..() + +/datum/brain_trauma/special/tenacity/on_lose() + REMOVE_TRAIT(owner, TRAIT_NOSOFTCRIT, TRAUMA_TRAIT) + REMOVE_TRAIT(owner, TRAIT_NOHARDCRIT, TRAUMA_TRAIT) + ..() + +/datum/brain_trauma/special/death_whispers + name = "Functional Cerebral Necrosis" + desc = "Patient's brain is stuck in a functional near-death state, causing occasional moments of lucid hallucinations, which are often interpreted as the voices of the dead." + scan_desc = "chronic functional necrosis" + gain_text = "You feel dead inside." + lose_text = "You feel alive again." + var/active = FALSE + +/datum/brain_trauma/special/death_whispers/on_life() + ..() + if(!active && prob(2)) + whispering() + +/datum/brain_trauma/special/death_whispers/on_lose() + if(active) + cease_whispering() + ..() + +/datum/brain_trauma/special/death_whispers/proc/whispering() + ADD_TRAIT(owner, TRAIT_SIXTHSENSE, TRAUMA_TRAIT) + active = TRUE + addtimer(CALLBACK(src, .proc/cease_whispering), rand(50, 300)) + +/datum/brain_trauma/special/death_whispers/proc/cease_whispering() + REMOVE_TRAIT(owner, TRAIT_SIXTHSENSE, TRAUMA_TRAIT) + active = FALSE + +/datum/brain_trauma/special/existential_crisis + name = "Existential Crisis" + desc = "Patient's hold on reality becomes faint, causing occasional bouts of non-existence." + scan_desc = "existential crisis" + gain_text = "You feel less real." + lose_text = "You feel more substantial again." + var/obj/effect/abstract/sync_holder/veil/veil + var/next_crisis = 0 + +/datum/brain_trauma/special/existential_crisis/on_life() + ..() + if(!veil && world.time > next_crisis && prob(3)) + if(isturf(owner.loc)) + fade_out() + +/datum/brain_trauma/special/existential_crisis/on_lose() + if(veil) + fade_in() + ..() + +/datum/brain_trauma/special/existential_crisis/proc/fade_out() + if(veil) + return + var/duration = rand(50, 450) + veil = new(owner.drop_location()) + to_chat(owner, "[pick("You stop thinking for a moment. Therefore you are not.",\ + "To be or not to be...",\ + "Why exist?",\ + "You stop keeping it real.",\ + "Your grip on existence slips.",\ + "Do you even exist?",\ + "You simply fade away.")]") + owner.forceMove(veil) + SEND_SIGNAL(owner, COMSIG_MOVABLE_SECLUDED_LOCATION) + for(var/thing in owner) + var/atom/movable/AM = thing + SEND_SIGNAL(AM, COMSIG_MOVABLE_SECLUDED_LOCATION) + next_crisis = world.time + 600 + addtimer(CALLBACK(src, .proc/fade_in), duration) + +/datum/brain_trauma/special/existential_crisis/proc/fade_in() + QDEL_NULL(veil) + to_chat(owner, "You fade back into reality.") + next_crisis = world.time + 600 + +//base sync holder is in desynchronizer.dm +/obj/effect/abstract/sync_holder/veil + name = "non-existence" + desc = "Existence is just a state of mind." /datum/brain_trauma/special/beepsky name = "Criminal" @@ -142,6 +244,7 @@ scan_desc = "criminal mind" gain_text = "Justice is coming for you." lose_text = "You were absolved for your crimes." + clonable = FALSE random_gain = FALSE var/obj/effect/hallucination/simple/securitron/beepsky @@ -201,4 +304,4 @@ /obj/effect/hallucination/simple/securitron/Destroy() STOP_PROCESSING(SSfastprocess,src) - return ..() \ No newline at end of file + return ..() diff --git a/code/datums/brain_damage/split_personality.dm b/code/datums/brain_damage/split_personality.dm index 1a26ea7a14..dfe63ce141 100644 --- a/code/datums/brain_damage/split_personality.dm +++ b/code/datums/brain_damage/split_personality.dm @@ -13,6 +13,10 @@ var/mob/living/split_personality/owner_backseat /datum/brain_trauma/severe/split_personality/on_gain() + var/mob/living/M = owner + if(M.stat == DEAD) //No use assigning people to a corpse + qdel(src) + return ..() make_backseats() get_ghost() @@ -23,7 +27,7 @@ /datum/brain_trauma/severe/split_personality/proc/get_ghost() set waitfor = FALSE - var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s split personality?", ROLE_PAI, null, null, 75, stranger_backseat) + var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s split personality?", ROLE_PAI, null, null, 75, stranger_backseat, POLL_IGNORE_SPLITPERSONALITY) if(LAZYLEN(candidates)) var/mob/dead/observer/C = pick(candidates) C.transfer_ckey(stranger_backseat, FALSE) @@ -191,13 +195,13 @@ /datum/brain_trauma/severe/split_personality/brainwashing/on_life() return //no random switching -/datum/brain_trauma/severe/split_personality/brainwashing/on_hear(message, speaker, message_language, raw_message, radio_freq) - if(HAS_TRAIT(owner, TRAIT_DEAF) || owner == speaker) - return message +/datum/brain_trauma/severe/split_personality/brainwashing/handle_hearing(datum/source, list/hearing_args) + if(HAS_TRAIT(owner, TRAIT_DEAF) || owner == hearing_args[HEARING_SPEAKER]) + return + var/message = hearing_args[HEARING_MESSAGE] if(findtext(message, codeword)) - message = replacetext(message, codeword, "[codeword]") + hearing_args[HEARING_MESSAGE] = replacetext(message, codeword, "[codeword]") addtimer(CALLBACK(src, /datum/brain_trauma/severe/split_personality.proc/switch_personalities), 10) - return message /datum/brain_trauma/severe/split_personality/brainwashing/handle_speech(datum/source, list/speech_args) if(findtext(speech_args[SPEECH_MESSAGE], codeword)) diff --git a/code/datums/browser.dm b/code/datums/browser.dm index 4c501a3e7f..60434d2766 100644 --- a/code/datums/browser.dm +++ b/code/datums/browser.dm @@ -194,7 +194,7 @@ .=..() opentime = 0 -/datum/browser/modal/open() +/datum/browser/modal/open(use_onclose = 1) set waitfor = 0 opentime = world.time diff --git a/code/datums/components/armor_plate.dm b/code/datums/components/armor_plate.dm index 53c8c280a9..975b52dcb9 100644 --- a/code/datums/components/armor_plate.dm +++ b/code/datums/components/armor_plate.dm @@ -29,21 +29,21 @@ var/obj/item/typecast = upgrade_item upgrade_name = initial(typecast.name) -/datum/component/armor_plate/proc/examine(datum/source, mob/user) +/datum/component/armor_plate/proc/examine(datum/source, mob/user, list/examine_list) //upgrade_item could also be typecast here instead if(ismecha(parent)) if(amount) if(amount < maxamount) - to_chat(user, "Its armor is enhanced with [amount] [upgrade_name].") + examine_list += "Its armor is enhanced with [amount] [upgrade_name]." else - to_chat(user, "It's wearing a fearsome carapace entirely composed of [upgrade_name] - its pilot must be an experienced monster hunter.") + examine_list += "It's wearing a fearsome carapace entirely composed of [upgrade_name] - its pilot must be an experienced monster hunter." else - to_chat(user, "It has attachment points for strapping monster hide on for added protection.") + examine_list += "It has attachment points for strapping monster hide on for added protection." else if(amount) - to_chat(user, "It has been strengthened with [amount]/[maxamount] [upgrade_name].") + examine_list += "It has been strengthened with [amount]/[maxamount] [upgrade_name]." else - to_chat(user, "It can be strengthened with up to [maxamount] [upgrade_name].") + examine_list += "It can be strengthened with up to [maxamount] [upgrade_name]." /datum/component/armor_plate/proc/applyplate(datum/source, obj/item/I, mob/user, params) if(!istype(I,upgrade_item)) diff --git a/code/datums/components/construction.dm b/code/datums/components/construction.dm index 3b64d68486..01df44752c 100644 --- a/code/datums/components/construction.dm +++ b/code/datums/components/construction.dm @@ -19,9 +19,9 @@ RegisterSignal(parent, COMSIG_PARENT_ATTACKBY,.proc/action) update_parent(index) -/datum/component/construction/proc/examine(datum/source, mob/user) +/datum/component/construction/proc/examine(datum/source, mob/user, list/examine_list) if(desc) - to_chat(user, desc) + examine_list += desc /datum/component/construction/proc/on_step() if(index > steps.len) diff --git a/code/datums/components/decal.dm b/code/datums/components/decal.dm index bdc1d3a2f6..641dbdb1cf 100644 --- a/code/datums/components/decal.dm +++ b/code/datums/components/decal.dm @@ -71,5 +71,5 @@ if(strength >= cleanable) qdel(src) -/datum/component/decal/proc/examine(datum/source, mob/user) - to_chat(user, description) \ No newline at end of file +/datum/component/decal/proc/examine(datum/source, mob/user, list/examine_list) + examine_list += description \ No newline at end of file diff --git a/code/datums/components/jousting.dm b/code/datums/components/jousting.dm index d1d0d6d504..08f3c1d643 100644 --- a/code/datums/components/jousting.dm +++ b/code/datums/components/jousting.dm @@ -45,7 +45,7 @@ var/knockdown_chance = (target_buckled? mounted_knockdown_chance_per_tile : unmounted_knockdown_chance_per_tile) * current var/knockdown_time = (target_buckled? mounted_knockdown_time : unmounted_knockdown_time) var/damage = (target_buckled? mounted_damage_boost_per_tile : unmounted_damage_boost_per_tile) * current - var/sharp = I.is_sharp() + var/sharp = I.get_sharpness() var/msg if(damage) msg += "[user] [sharp? "impales" : "slams into"] [target] [sharp? "on" : "with"] their [parent]" diff --git a/code/datums/components/lockon_aiming.dm b/code/datums/components/lockon_aiming.dm index 38b707ac19..bbdbb7dc66 100644 --- a/code/datums/components/lockon_aiming.dm +++ b/code/datums/components/lockon_aiming.dm @@ -4,7 +4,7 @@ /datum/component/lockon_aiming dupe_mode = COMPONENT_DUPE_ALLOWED - var/lock_icon = 'icons/mob/blob.dmi' + var/lock_icon = 'icons/mob/cameramob.dmi' var/lock_icon_state = "marker" var/mutable_appearance/lock_appearance var/list/image/lock_images diff --git a/code/datums/components/magnetic_catch.dm b/code/datums/components/magnetic_catch.dm index fb68b89ebf..c7e59e0ead 100644 --- a/code/datums/components/magnetic_catch.dm +++ b/code/datums/components/magnetic_catch.dm @@ -15,8 +15,8 @@ for(var/i in parent) RegisterSignal(i, COMSIG_MOVABLE_PRE_THROW, .proc/throw_react) -/datum/component/magnetic_catch/proc/examine(datum/source, mob/user) - to_chat(user, "It has been installed with inertia dampening to prevent coffee spills.") +/datum/component/magnetic_catch/proc/examine(datum/source, mob/user, list/examine_list) + examine_list += "It has been installed with inertia dampening to prevent coffee spills." /datum/component/magnetic_catch/proc/crossed_react(datum/source, atom/movable/thing) RegisterSignal(thing, COMSIG_MOVABLE_PRE_THROW, .proc/throw_react, TRUE) diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm index 48fa758db1..25094518b8 100644 --- a/code/datums/components/material_container.dm +++ b/code/datums/components/material_container.dm @@ -49,13 +49,13 @@ var/mat_path = possible_mats[id] materials[id] = new mat_path() -/datum/component/material_container/proc/OnExamine(datum/source, mob/user) +/datum/component/material_container/proc/OnExamine(datum/source, mob/user, list/examine_list) if(show_on_examine) for(var/I in materials) var/datum/material/M = materials[I] var/amt = amount(M.id) if(amt) - to_chat(user, "It has [amt] units of [lowertext(M.name)] stored.") + examine_list += "It has [amt] units of [lowertext(M.name)] stored." /datum/component/material_container/proc/OnAttackBy(datum/source, obj/item/I, mob/living/user) var/list/tc = allowed_typecache diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index 8c6013aeab..b46919a6c6 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -8,7 +8,7 @@ var/mood_level = 5 //To track what stage of moodies they're on var/sanity_level = 5 //To track what stage of sanity they're on var/mood_modifier = 1 //Modifier to allow certain mobs to be less affected by moodlets - var/datum/mood_event/list/mood_events = list() + var/list/datum/mood_event/mood_events = list() var/insanity_effect = 0 //is the owner being punished for low mood? If so, how much? var/obj/screen/mood/screen_obj @@ -125,6 +125,9 @@ screen_obj.icon_state = "mood[mood_level]" /datum/component/mood/process() //Called on SSmood process + if(QDELETED(parent)) // workaround to an obnoxious sneaky periodical runtime. + qdel(src) + return var/mob/living/owner = parent switch(mood_level) @@ -249,7 +252,7 @@ RegisterSignal(screen_obj, COMSIG_CLICK, .proc/hud_click) /datum/component/mood/proc/unmodify_hud(datum/source) - if(!screen_obj) + if(!screen_obj || !parent) return var/mob/living/owner = parent var/datum/hud/hud = owner.hud_used diff --git a/code/datums/components/nanites.dm b/code/datums/components/nanites.dm index 3f7f794435..362961a24f 100644 --- a/code/datums/components/nanites.dm +++ b/code/datums/components/nanites.dm @@ -53,7 +53,6 @@ RegisterSignal(parent, COMSIG_MOB_ALLOWED, .proc/check_access) RegisterSignal(parent, COMSIG_LIVING_ELECTROCUTE_ACT, .proc/on_shock) RegisterSignal(parent, COMSIG_LIVING_MINOR_SHOCK, .proc/on_minor_shock) - RegisterSignal(parent, COMSIG_MOVABLE_HEAR, .proc/on_hear) RegisterSignal(parent, COMSIG_SPECIES_GAIN, .proc/check_viable_biotype) RegisterSignal(parent, COMSIG_NANITE_SIGNAL, .proc/receive_signal) @@ -191,11 +190,6 @@ var/datum/nanite_program/NP = X NP.on_death(gibbed) -/datum/component/nanites/proc/on_hear(datum/source, message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) - for(var/X in programs) - var/datum/nanite_program/NP = X - NP.on_hear(message, speaker, message_language, raw_message, radio_freq, spans, message_mode) - /datum/component/nanites/proc/receive_signal(datum/source, code, source = "an unidentified source") for(var/X in programs) var/datum/nanite_program/NP = X diff --git a/code/datums/components/radioactive.dm b/code/datums/components/radioactive.dm index bf47793f81..9dac20d94f 100644 --- a/code/datums/components/radioactive.dm +++ b/code/datums/components/radioactive.dm @@ -18,7 +18,7 @@ hl3_release_date = _half_life can_contaminate = _can_contaminate - if(istype(parent, /atom)) + if(istype(parent, /atom)) RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/rad_examine) if(istype(parent, /obj/item)) RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/rad_attack) @@ -58,7 +58,7 @@ else strength = max(strength, arguments[1]) -/datum/component/radioactive/proc/rad_examine(datum/source, mob/user, atom/thing) +/datum/component/radioactive/proc/rad_examine(datum/source, mob/user, list/examine_list) var/atom/master = parent var/list/out = list() if(get_dist(master, user) <= 1) @@ -72,7 +72,7 @@ out += "[out ? " and it " : "[master] "]hurts to look at." else out += "." - to_chat(user, out.Join()) + examine_list += out.Join() /datum/component/radioactive/proc/rad_attack(datum/source, atom/movable/target, mob/living/user) radiation_pulse(parent, strength/20) diff --git a/code/datums/components/riding.dm b/code/datums/components/riding.dm index dcdbd5ca4b..c05b07a693 100644 --- a/code/datums/components/riding.dm +++ b/code/datums/components/riding.dm @@ -310,10 +310,10 @@ if(!user.put_in_hands(inhand, TRUE)) qdel(inhand) // it isn't going to be added to offhands anyway break - LAZYADD(equipped, src) + LAZYADD(equipped, inhand) var/amount_equipped = LAZYLEN(equipped) if(amount_equipped) - LAZYADD(offhands[L], amount_equipped) + LAZYADD(offhands[L], equipped) if(amount_equipped >= amount_required) return TRUE unequip_buckle_inhands(L) diff --git a/code/datums/components/rotation.dm b/code/datums/components/rotation.dm index a044ca301e..81ff2d517d 100644 --- a/code/datums/components/rotation.dm +++ b/code/datums/components/rotation.dm @@ -98,9 +98,9 @@ remove_verbs() . = ..() -/datum/component/simple_rotation/proc/ExamineMessage(datum/source, mob/user) +/datum/component/simple_rotation/proc/ExamineMessage(datum/source, mob/user, list/examine_list) if(rotation_flags & ROTATION_ALTCLICK) - to_chat(user, "Alt-click to rotate it clockwise.") + examine_list += "Alt-click to rotate it clockwise." /datum/component/simple_rotation/proc/HandRot(datum/source, mob/user, rotation = default_rotation_direction) if(!can_be_rotated.Invoke(user, rotation) || !can_user_rotate.Invoke(user, rotation)) diff --git a/code/datums/components/stationloving.dm b/code/datums/components/stationloving.dm index bbcb0d88a6..91928656e1 100644 --- a/code/datums/components/stationloving.dm +++ b/code/datums/components/stationloving.dm @@ -8,6 +8,7 @@ if(!ismovableatom(parent)) return COMPONENT_INCOMPATIBLE RegisterSignal(parent, list(COMSIG_MOVABLE_Z_CHANGED), .proc/check_in_bounds) + RegisterSignal(parent, list(COMSIG_MOVABLE_SECLUDED_LOCATION), .proc/relocate) RegisterSignal(parent, list(COMSIG_PARENT_PREQDELETED), .proc/check_deletion) RegisterSignal(parent, list(COMSIG_ITEM_IMBUE_SOUL), .proc/check_soul_imbue) src.inform_admins = inform_admins @@ -32,6 +33,7 @@ var/atom/movable/AM = parent AM.forceMove(targetturf) + to_chat(get(parent, /mob), "You can't help but feel that you just lost something back there...") // move the disc, so ghosts remain orbiting it even if it's "destroyed" return targetturf @@ -40,7 +42,6 @@ return else var/turf/currentturf = get_turf(src) - to_chat(get(parent, /mob), "You can't help but feel that you just lost something back there...") var/turf/targetturf = relocate() log_game("[parent] has been moved out of bounds in [loc_name(currentturf)]. Moving it to [loc_name(targetturf)].") if(inform_admins) diff --git a/code/datums/components/storage/concrete/special.dm b/code/datums/components/storage/concrete/special.dm index 556e9e9fc9..9f2c435642 100644 --- a/code/datums/components/storage/concrete/special.dm +++ b/code/datums/components/storage/concrete/special.dm @@ -1,5 +1,5 @@ -/datum/component/storage/concrete/secret_satchel/can_be_inserted(I,msg,user) +/datum/component/storage/concrete/secret_satchel/can_be_inserted(obj/item/I, stop_messages = FALSE, mob/M) if(SSpersistence.spawned_objects[I]) - to_chat(user, "[I] is unstable after its journey through space and time, it wouldn't survive another trip.") + to_chat(M, "[I] is unstable after its journey through space and time, it wouldn't survive another trip.") return FALSE return ..() diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index a92ae9e629..dd189137a5 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -309,6 +309,7 @@ else var/datum/numbered_display/ND = .[I.type] ND.number++ + . = sortTim(., /proc/cmp_numbered_displays_name_asc, associative = TRUE) //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) diff --git a/code/datums/components/thermite.dm b/code/datums/components/thermite.dm index 45243014dd..916b3ed3b2 100644 --- a/code/datums/components/thermite.dm +++ b/code/datums/components/thermite.dm @@ -15,7 +15,7 @@ /turf/closed/indestructible, /turf/open/indestructible) ) - + var/static/list/resistlist = typecacheof( /turf/closed/wall/r_wall ) @@ -77,5 +77,5 @@ thermite_melt() /datum/component/thermite/proc/attackby_react(datum/source, obj/item/thing, mob/user, params) - if(thing.is_hot()) + if(thing.get_temperature()) thermite_melt(user) \ No newline at end of file diff --git a/code/datums/components/waddling.dm b/code/datums/components/waddling.dm index a1f538e4dd..f09a92c91c 100644 --- a/code/datums/components/waddling.dm +++ b/code/datums/components/waddling.dm @@ -1,15 +1,15 @@ /datum/component/waddling - dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS /datum/component/waddling/Initialize() - if(!isliving(parent)) - return COMPONENT_INCOMPATIBLE - RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED), .proc/Waddle) + if(!isliving(parent)) + return COMPONENT_INCOMPATIBLE + RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED), .proc/Waddle) /datum/component/waddling/proc/Waddle() - var/mob/living/L = parent - if(L.incapacitated() || L.lying) - return - animate(L, pixel_z = 4, time = 0) - animate(pixel_z = 0, transform = turn(matrix(), pick(-12, 0, 12)), time=2) - animate(pixel_z = 0, transform = matrix(), time = 0) + var/mob/living/L = parent + if(L.incapacitated() || L.lying) + return + animate(L, pixel_z = 4, time = 0) + animate(pixel_z = 0, transform = turn(matrix(), pick(-12, 0, 12)), time=2) + animate(pixel_z = 0, transform = matrix(), time = 0) diff --git a/code/datums/components/wet_floor.dm b/code/datums/components/wet_floor.dm index 84b0320375..38b17993d8 100644 --- a/code/datums/components/wet_floor.dm +++ b/code/datums/components/wet_floor.dm @@ -88,6 +88,9 @@ if(TURF_WET_PERMAFROST) intensity = 120 lube_flags = SLIDE_ICE | GALOSHES_DONT_HELP + if(TURF_WET_SUPERLUBE) + intensity = 120 + lube_flags = SLIDE | GALOSHES_DONT_HELP | SLIP_WHEN_CRAWLING else qdel(parent.GetComponent(/datum/component/slippery)) return @@ -159,7 +162,7 @@ //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) + var/static/list/allowed_types = list(TURF_WET_WATER, TURF_WET_LUBE, TURF_WET_ICE, TURF_WET_PERMAFROST, TURF_WET_SUPERLUBE) if(duration_minimum <= 0 || !type) return FALSE if(type in allowed_types) diff --git a/code/datums/dash_weapon.dm b/code/datums/dash_weapon.dm index a870ecae66..8eda936bb7 100644 --- a/code/datums/dash_weapon.dm +++ b/code/datums/dash_weapon.dm @@ -34,11 +34,10 @@ var/turf/T = get_turf(target) if(target in view(user.client.view, user)) var/obj/spot1 = new phaseout(get_turf(user), user.dir) - user.forceMove(T) - playsound(T, dash_sound, 25, 1) - var/obj/spot2 = new phasein(get_turf(user), user.dir) - spot1.Beam(spot2,beam_effect,time=20) - current_charges-- + if(do_teleport(user, T, null, TRUE, null, null, dash_sound, dash_sound, TRUE, TELEPORT_CHANNEL_FREE, TRUE)) + var/obj/spot2 = new phasein(get_turf(user), user.dir) + spot1.Beam(spot2,beam_effect,time=20) + current_charges-- holder.update_action_buttons_icon() addtimer(CALLBACK(src, .proc/charge), charge_rate) diff --git a/code/datums/datum.dm b/code/datums/datum.dm index cdb195dd82..8737cd8feb 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -4,7 +4,7 @@ var/list/datum_components //for /datum/components var/list/status_traits var/list/comp_lookup //it used to be for looking up components which had registered a signal but now anything can register - var/list/signal_procs + var/list/list/datum/callback/signal_procs var/signal_enabled = FALSE var/datum_flags = NONE var/datum/weakref/weak_reference diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index cfbd8be32c..e44134f01f 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -875,14 +875,14 @@ return // text2num conveniently returns a null on invalid values O.armor = O.armor.setRating(melee = text2num(result["values"]["melee"]),\ - bullet = text2num(result["values"]["bullet"]),\ - laser = text2num(result["values"]["laser"]),\ - energy = text2num(result["values"]["energy"]),\ - bomb = text2num(result["values"]["bomb"]),\ - bio = text2num(result["values"]["bio"]),\ - rad = text2num(result["values"]["rad"]),\ - fire = text2num(result["values"]["fire"]),\ - acid = text2num(result["values"]["acid"])) + bullet = text2num(result["values"]["bullet"]),\ + laser = text2num(result["values"]["laser"]),\ + energy = text2num(result["values"]["energy"]),\ + bomb = text2num(result["values"]["bomb"]),\ + bio = text2num(result["values"]["bio"]),\ + rad = text2num(result["values"]["rad"]),\ + fire = text2num(result["values"]["fire"]),\ + acid = text2num(result["values"]["acid"])) log_admin("[key_name(usr)] modified the armor on [O] ([O.type]) to melee: [O.armor.melee], bullet: [O.armor.bullet], laser: [O.armor.laser], energy: [O.armor.energy], bomb: [O.armor.bomb], bio: [O.armor.bio], rad: [O.armor.rad], fire: [O.armor.fire], acid: [O.armor.acid]") message_admins("[key_name_admin(usr)] modified the armor on [O] ([O.type]) to melee: [O.armor.melee], bullet: [O.armor.bullet], laser: [O.armor.laser], energy: [O.armor.energy], bomb: [O.armor.bomb], bio: [O.armor.bio], rad: [O.armor.rad], fire: [O.armor.fire], acid: [O.armor.acid]") else diff --git a/code/datums/embedding_behavior.dm b/code/datums/embedding_behavior.dm index f631b9b1c4..a261ea48c6 100644 --- a/code/datums/embedding_behavior.dm +++ b/code/datums/embedding_behavior.dm @@ -1,53 +1,53 @@ #define EMBEDID "embed-[embed_chance]-[embedded_fall_chance]-[embedded_pain_chance]-[embedded_pain_multiplier]-[embedded_fall_pain_multiplier]-[embedded_impact_pain_multiplier]-[embedded_unsafe_removal_pain_multiplier]-[embedded_unsafe_removal_time]" /proc/getEmbeddingBehavior(embed_chance = EMBED_CHANCE, - embedded_fall_chance = EMBEDDED_ITEM_FALLOUT, - embedded_pain_chance = EMBEDDED_PAIN_CHANCE, - embedded_pain_multiplier = EMBEDDED_PAIN_MULTIPLIER, - embedded_fall_pain_multiplier = EMBEDDED_FALL_PAIN_MULTIPLIER, - embedded_impact_pain_multiplier = EMBEDDED_IMPACT_PAIN_MULTIPLIER, - embedded_unsafe_removal_pain_multiplier = EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER, - embedded_unsafe_removal_time = EMBEDDED_UNSAFE_REMOVAL_TIME) - . = locate(EMBEDID) - if (!.) - . = new /datum/embedding_behavior(embed_chance, embedded_fall_chance, embedded_pain_chance, embedded_pain_multiplier, embedded_fall_pain_multiplier, embedded_impact_pain_multiplier, embedded_unsafe_removal_pain_multiplier, embedded_unsafe_removal_time) + embedded_fall_chance = EMBEDDED_ITEM_FALLOUT, + embedded_pain_chance = EMBEDDED_PAIN_CHANCE, + embedded_pain_multiplier = EMBEDDED_PAIN_MULTIPLIER, + embedded_fall_pain_multiplier = EMBEDDED_FALL_PAIN_MULTIPLIER, + embedded_impact_pain_multiplier = EMBEDDED_IMPACT_PAIN_MULTIPLIER, + embedded_unsafe_removal_pain_multiplier = EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER, + embedded_unsafe_removal_time = EMBEDDED_UNSAFE_REMOVAL_TIME) + . = locate(EMBEDID) + if (!.) + . = new /datum/embedding_behavior(embed_chance, embedded_fall_chance, embedded_pain_chance, embedded_pain_multiplier, embedded_fall_pain_multiplier, embedded_impact_pain_multiplier, embedded_unsafe_removal_pain_multiplier, embedded_unsafe_removal_time) /datum/embedding_behavior - var/embed_chance - var/embedded_fall_chance - var/embedded_pain_chance - var/embedded_pain_multiplier //The coefficient of multiplication for the damage this item does while embedded (this*w_class) - var/embedded_fall_pain_multiplier //The coefficient of multiplication for the damage this item does when falling out of a limb (this*w_class) - var/embedded_impact_pain_multiplier //The coefficient of multiplication for the damage this item does when first embedded (this*w_class) - var/embedded_unsafe_removal_pain_multiplier //The coefficient of multiplication for the damage removing this without surgery causes (this*w_class) - var/embedded_unsafe_removal_time //A time in ticks, multiplied by the w_class. + var/embed_chance + var/embedded_fall_chance + var/embedded_pain_chance + var/embedded_pain_multiplier //The coefficient of multiplication for the damage this item does while embedded (this*w_class) + var/embedded_fall_pain_multiplier //The coefficient of multiplication for the damage this item does when falling out of a limb (this*w_class) + var/embedded_impact_pain_multiplier //The coefficient of multiplication for the damage this item does when first embedded (this*w_class) + var/embedded_unsafe_removal_pain_multiplier //The coefficient of multiplication for the damage removing this without surgery causes (this*w_class) + var/embedded_unsafe_removal_time //A time in ticks, multiplied by the w_class. /datum/embedding_behavior/New(embed_chance = EMBED_CHANCE, - embedded_fall_chance = EMBEDDED_ITEM_FALLOUT, - embedded_pain_chance = EMBEDDED_PAIN_CHANCE, - embedded_pain_multiplier = EMBEDDED_PAIN_MULTIPLIER, - embedded_fall_pain_multiplier = EMBEDDED_FALL_PAIN_MULTIPLIER, - embedded_impact_pain_multiplier = EMBEDDED_IMPACT_PAIN_MULTIPLIER, - embedded_unsafe_removal_pain_multiplier = EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER, - embedded_unsafe_removal_time = EMBEDDED_UNSAFE_REMOVAL_TIME) - src.embed_chance = embed_chance - src.embedded_fall_chance = embedded_fall_chance - src.embedded_pain_chance = embedded_pain_chance - src.embedded_pain_multiplier = embedded_pain_multiplier - src.embedded_fall_pain_multiplier = embedded_fall_pain_multiplier - src.embedded_impact_pain_multiplier = embedded_impact_pain_multiplier - src.embedded_unsafe_removal_pain_multiplier = embedded_unsafe_removal_pain_multiplier - src.embedded_unsafe_removal_time = embedded_unsafe_removal_time - tag = EMBEDID + embedded_fall_chance = EMBEDDED_ITEM_FALLOUT, + embedded_pain_chance = EMBEDDED_PAIN_CHANCE, + embedded_pain_multiplier = EMBEDDED_PAIN_MULTIPLIER, + embedded_fall_pain_multiplier = EMBEDDED_FALL_PAIN_MULTIPLIER, + embedded_impact_pain_multiplier = EMBEDDED_IMPACT_PAIN_MULTIPLIER, + embedded_unsafe_removal_pain_multiplier = EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER, + embedded_unsafe_removal_time = EMBEDDED_UNSAFE_REMOVAL_TIME) + src.embed_chance = embed_chance + src.embedded_fall_chance = embedded_fall_chance + src.embedded_pain_chance = embedded_pain_chance + src.embedded_pain_multiplier = embedded_pain_multiplier + src.embedded_fall_pain_multiplier = embedded_fall_pain_multiplier + src.embedded_impact_pain_multiplier = embedded_impact_pain_multiplier + src.embedded_unsafe_removal_pain_multiplier = embedded_unsafe_removal_pain_multiplier + src.embedded_unsafe_removal_time = embedded_unsafe_removal_time + tag = EMBEDID /datum/embedding_behavior/proc/setRating(embed_chance, embedded_fall_chance, embedded_pain_chance, embedded_pain_multiplier, embedded_fall_pain_multiplier, embedded_impact_pain_multiplier, embedded_unsafe_removal_pain_multiplier, embedded_unsafe_removal_time) - return getEmbeddingBehavior((isnull(embed_chance) ? src.embed_chance : embed_chance),\ - (isnull(embedded_fall_chance) ? src.embedded_fall_chance : embedded_fall_chance),\ - (isnull(embedded_pain_chance) ? src.embedded_pain_chance : embedded_pain_chance),\ - (isnull(embedded_pain_multiplier) ? src.embedded_pain_multiplier : embedded_pain_multiplier),\ - (isnull(embedded_fall_pain_multiplier) ? src.embedded_fall_pain_multiplier : embedded_fall_pain_multiplier),\ - (isnull(embedded_impact_pain_multiplier) ? src.embedded_impact_pain_multiplier : embedded_impact_pain_multiplier),\ - (isnull(embedded_unsafe_removal_pain_multiplier) ? src.embedded_unsafe_removal_pain_multiplier : embedded_unsafe_removal_pain_multiplier),\ - (isnull(embedded_unsafe_removal_time) ? src.embedded_unsafe_removal_time : embedded_unsafe_removal_time)) + return getEmbeddingBehavior((isnull(embed_chance) ? src.embed_chance : embed_chance),\ + (isnull(embedded_fall_chance) ? src.embedded_fall_chance : embedded_fall_chance),\ + (isnull(embedded_pain_chance) ? src.embedded_pain_chance : embedded_pain_chance),\ + (isnull(embedded_pain_multiplier) ? src.embedded_pain_multiplier : embedded_pain_multiplier),\ + (isnull(embedded_fall_pain_multiplier) ? src.embedded_fall_pain_multiplier : embedded_fall_pain_multiplier),\ + (isnull(embedded_impact_pain_multiplier) ? src.embedded_impact_pain_multiplier : embedded_impact_pain_multiplier),\ + (isnull(embedded_unsafe_removal_pain_multiplier) ? src.embedded_unsafe_removal_pain_multiplier : embedded_unsafe_removal_pain_multiplier),\ + (isnull(embedded_unsafe_removal_time) ? src.embedded_unsafe_removal_time : embedded_unsafe_removal_time)) #undef EMBEDID diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 4d1986cccf..74f22b5ac0 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -79,6 +79,7 @@ tele_play_specials(teleatom, destturf, effectout, asoundout) if(ismegafauna(teleatom)) message_admins("[teleatom] [ADMIN_FLW(teleatom)] has teleported from [ADMIN_VERBOSEJMP(curturf)] to [ADMIN_VERBOSEJMP(destturf)].") + SEND_SIGNAL(teleatom, COMSIG_MOVABLE_TELEPORTED, channel, curturf, destturf) if(ismob(teleatom)) var/mob/M = teleatom diff --git a/code/datums/martial.dm b/code/datums/martial.dm index d119759efc..26a709590c 100644 --- a/code/datums/martial.dm +++ b/code/datums/martial.dm @@ -11,6 +11,7 @@ var/restraining = 0 //used in cqc's disarm_act to check if the disarmed is being restrained and so whether they should be put in a chokehold or not var/help_verb var/no_guns = FALSE + var/pacifism_check = TRUE //are the martial arts combos/attacks unable to be used by pacifist. var/allow_temp_override = TRUE //if this martial art can be overridden by temporary martial arts /datum/martial_art/proc/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm index 7399528e1c..b98bc4f951 100644 --- a/code/datums/martial/boxing.dm +++ b/code/datums/martial/boxing.dm @@ -1,6 +1,7 @@ /datum/martial_art/boxing name = "Boxing" id = MARTIALART_BOXING + pacifism_check = FALSE //Let's pretend pacifists can boxe the heck out of other people, it only deals stamina damage right now. /datum/martial_art/boxing/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) to_chat(A, "Can't disarm while boxing!") @@ -16,14 +17,15 @@ var/atk_verb = pick("left hook","right hook","straight punch") - var/damage = rand(5, 8) + A.dna.species.punchdamagelow - if(!damage) + var/damage = rand(10, 13) + var/extra_damage = rand(A.dna.species.punchdamagelow, A.dna.species.punchdamagehigh) + if(extra_damage == A.dna.species.punchdamagelow) playsound(D.loc, A.dna.species.miss_sound, 25, 1, -1) D.visible_message("[A] has attempted to [atk_verb] [D]!", \ "[A] has attempted to [atk_verb] [D]!", null, COMBAT_MESSAGE_RANGE) log_combat(A, D, "attempted to hit", atk_verb) - return 0 - + return TRUE + damage += extra_damage var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected)) var/armor_block = D.run_armor_check(affecting, "melee") diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index c7644997ee..73173a4a9a 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -124,6 +124,8 @@ add_to_streak("G",D) if(check_streak(A,D)) return TRUE + if(A == D) // no self grab. + return FALSE if(A.grab_state >= GRAB_AGGRESSIVE) D.grabbedby(A, 1) else diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm index 6379d481ca..4e8dacaef9 100644 --- a/code/datums/martial/krav_maga.dm +++ b/code/datums/martial/krav_maga.dm @@ -19,6 +19,9 @@ owner.visible_message("[owner] assumes a neutral stance.", "Your next attack is cleared.") H.mind.martial_art.streak = "" else + if(HAS_TRAIT(H, TRAIT_PACIFISM)) + to_chat(H, "You don't want to harm other people!") + return owner.visible_message("[owner] assumes the Neck Chop stance!", "Your next attack will be a Neck Chop.") H.mind.martial_art.streak = "neck_chop" @@ -36,6 +39,9 @@ owner.visible_message("[owner] assumes a neutral stance.", "Your next attack is cleared.") H.mind.martial_art.streak = "" else + if(HAS_TRAIT(H, TRAIT_PACIFISM)) + to_chat(H, "You don't want to harm other people!") + return owner.visible_message("[owner] assumes the Leg Sweep stance!", "Your next attack will be a Leg Sweep.") H.mind.martial_art.streak = "leg_sweep" @@ -53,6 +59,9 @@ owner.visible_message("[owner] assumes a neutral stance.", "Your next attack is cleared.") H.mind.martial_art.streak = "" else + if(HAS_TRAIT(H, TRAIT_PACIFISM)) + to_chat(H, "You don't want to harm other people!") + return owner.visible_message("[owner] assumes the Lung Punch stance!", "Your next attack will be a Lung Punch.") H.mind.martial_art.streak = "quick_choke"//internal name for lung punch @@ -145,8 +154,6 @@ return 1 /datum/martial_art/krav_maga/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) - if(check_streak(A,D)) - return 1 var/obj/item/I = null if(prob(60)) I = D.get_active_held_item() diff --git a/code/datums/martial/psychotic_brawl.dm b/code/datums/martial/psychotic_brawl.dm index 34301516dc..45d73353f9 100644 --- a/code/datums/martial/psychotic_brawl.dm +++ b/code/datums/martial/psychotic_brawl.dm @@ -1,6 +1,7 @@ /datum/martial_art/psychotic_brawling name = "Psychotic Brawling" id = MARTIALART_PSYCHOBRAWL + pacifism_check = FALSE //Quite uncontrollable and unpredictable, people will still end up harming others with it. /datum/martial_art/psychotic_brawling/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) return psycho_attack(A,D) diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index 801e8c8c7a..f89374dc2a 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -105,6 +105,8 @@ add_to_streak("G",D) if(check_streak(A,D)) return 1 + if(A == D) //no self grab stun + return FALSE if(A.grab_state >= GRAB_AGGRESSIVE) D.grabbedby(A, 1) else diff --git a/code/datums/martial/wrestling.dm b/code/datums/martial/wrestling.dm index e07fa27ef5..c967779d03 100644 --- a/code/datums/martial/wrestling.dm +++ b/code/datums/martial/wrestling.dm @@ -49,6 +49,9 @@ if(owner.incapacitated()) to_chat(owner, "You can't WRESTLE while you're OUT FOR THE COUNT.") return + if(HAS_TRAIT(owner, TRAIT_PACIFISM)) + to_chat(owner, "You are too HIPPIE to WRESTLE other living beings!") + return owner.visible_message("[owner] prepares to BODY SLAM!", "Your next attack will be a BODY SLAM.") var/mob/living/carbon/human/H = owner H.mind.martial_art.streak = "slam" @@ -61,6 +64,9 @@ if(owner.incapacitated()) to_chat(owner, "You can't WRESTLE while you're OUT FOR THE COUNT.") return + if(HAS_TRAIT(owner, TRAIT_PACIFISM)) + to_chat(owner, "You are too HIPPIE to WRESTLE other living beings!") + return owner.visible_message("[owner] prepares to THROW!", "Your next attack will be a THROW.") var/mob/living/carbon/human/H = owner H.mind.martial_art.streak = "throw" @@ -73,6 +79,9 @@ if(owner.incapacitated()) to_chat(owner, "You can't WRESTLE while you're OUT FOR THE COUNT.") return + if(HAS_TRAIT(owner, TRAIT_PACIFISM)) + to_chat(owner, "You are too HIPPIE to WRESTLE other living beings!") + return owner.visible_message("[owner] prepares to KICK!", "Your next attack will be a KICK.") var/mob/living/carbon/human/H = owner H.mind.martial_art.streak = "kick" @@ -85,6 +94,9 @@ if(owner.incapacitated()) to_chat(owner, "You can't WRESTLE while you're OUT FOR THE COUNT.") return + if(HAS_TRAIT(owner, TRAIT_PACIFISM)) + to_chat(owner, "You are too HIPPIE to WRESTLE other living beings!") + return owner.visible_message("[owner] prepares to STRIKE!", "Your next attack will be a STRIKE.") var/mob/living/carbon/human/H = owner H.mind.martial_art.streak = "strike" @@ -97,6 +109,9 @@ if(owner.incapacitated()) to_chat(owner, "You can't WRESTLE while you're OUT FOR THE COUNT.") return + if(HAS_TRAIT(owner, TRAIT_PACIFISM)) + to_chat(owner, "You are too HIPPIE to WRESTLE other living beings!") + return owner.visible_message("[owner] prepares to LEG DROP!", "Your next attack will be a LEG DROP.") var/mob/living/carbon/human/H = owner H.mind.martial_art.streak = "drop" @@ -192,7 +207,7 @@ if (T && isturf(T)) if (!D.stat) D.emote("scream") - D.throw_at(T, 10, 4, A, TRUE, TRUE, callback = CALLBACK(D, /mob/living/carbon/human/.Knockdown, 20)) + D.throw_at(T, 10, 4, A, TRUE, TRUE, callback = CALLBACK(D, /mob/living/carbon/human.proc/Knockdown, 20)) log_combat(A, D, "has thrown with wrestling") return 0 @@ -433,8 +448,8 @@ /datum/martial_art/wrestling/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) if(check_streak(A,D)) return 1 - if(A.pulling == D) - return 1 + if(A.pulling == D || A == D) // don't stun grab yoursel + return FALSE A.start_pulling(D) D.visible_message("[A] gets [D] in a cinch!", \ "[A] gets [D] in a cinch!") diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 68efe93254..5cf03e2684 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -41,8 +41,6 @@ var/special_role var/list/restricted_roles = list() - var/list/datum/objective/objectives = list() - var/list/spell_list = list() // Wizard mode & "Give Spell" badmin button. var/linglink @@ -360,13 +358,15 @@ output += memory + var/list/all_objectives = list() for(var/datum/antagonist/A in antag_datums) output += A.antag_memory + all_objectives |= A.objectives - if(objectives.len) + if(all_objectives.len) output += "Objectives:" var/obj_count = 1 - for(var/datum/objective/objective in objectives) + for(var/datum/objective/objective in all_objectives) output += "
Objective #[obj_count++]: [objective.explanation_text]" var/list/datum/mind/other_owners = objective.get_owners() - src if(other_owners.len) @@ -377,7 +377,7 @@ if(window) recipient << browse(output,"window=memory") - else if(objectives.len || memory) + else if(all_objectives.len || memory) to_chat(recipient, "[output]") /datum/mind/Topic(href, href_list) @@ -408,34 +408,24 @@ memory = new_memo else if (href_list["obj_edit"] || href_list["obj_add"]) - var/datum/objective/objective - var/objective_pos + var/objective_pos //Edited objectives need to keep same order in antag objective list var/def_value - var/datum/antagonist/target_antag + var/datum/objective/old_objective //The old objective we're replacing/editing + var/datum/objective/new_objective //New objective we're be adding - if (href_list["obj_edit"]) - objective = locate(href_list["obj_edit"]) - if (!objective) + if(href_list["obj_edit"]) + for(var/datum/antagonist/A in antag_datums) + old_objective = locate(href_list["obj_edit"]) in A.objectives + if(old_objective) + target_antag = A + objective_pos = A.objectives.Find(old_objective) + break + if(!old_objective) + to_chat(usr,"Invalid objective.") return - for(var/datum/antagonist/A in antag_datums) - if(objective in A.objectives) - target_antag = A - objective_pos = A.objectives.Find(objective) - break - - if(!target_antag) //Shouldn't happen anymore - stack_trace("objective without antagonist found") - objective_pos = objectives.Find(objective) - - //Text strings are easy to manipulate. Revised for simplicity. - var/temp_obj_type = "[objective.type]"//Convert path into a text string. - def_value = copytext(temp_obj_type, 19)//Convert last part of path into an objective keyword. - if(!def_value)//If it's a custom objective, it will be an empty string. - def_value = "custom" else - //We're adding this objective if(href_list["target_antag"]) var/datum/antagonist/X = locate(href_list["target_antag"]) in antag_datums if(X) @@ -447,7 +437,7 @@ if(1) target_antag = antag_datums[1] else - var/datum/antagonist/target = input("Which antagonist gets the objective:", "Antagonist", def_value) as null|anything in antag_datums + "(new custom antag)" + var/datum/antagonist/target = input("Which antagonist gets the objective:", "Antagonist", "(new custom antag)") as null|anything in antag_datums + "(new custom antag)" if (QDELETED(target)) return else if(target == "(new custom antag)") @@ -455,149 +445,88 @@ else target_antag = target - var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in list("assassinate", "maroon", "debrain", "protect", "destroy", "prevent", "hijack", "escape", "survive", "martyr", "steal", "download", "nuclear", "capture", "absorb", "custom") - if (!new_obj_type) + var/static/list/choices + if(!choices) + choices = list() + + var/list/allowed_types = list( + /datum/objective/assassinate, + /datum/objective/maroon, + /datum/objective/debrain, + /datum/objective/protect, + /datum/objective/destroy, + /datum/objective/hijack, + /datum/objective/escape, + /datum/objective/survive, + /datum/objective/martyr, + /datum/objective/steal, + /datum/objective/download, + /datum/objective/nuclear, + /datum/objective/capture, + /datum/objective/absorb, + /datum/objective/custom + ) + + for(var/T in allowed_types) + var/datum/objective/X = T + choices[initial(X.name)] = T + + if(old_objective) + if(old_objective.name in choices) + def_value = old_objective.name + + var/selected_type = input("Select objective type:", "Objective type", def_value) as null|anything in choices + selected_type = choices[selected_type] + if (!selected_type) return - var/datum/objective/new_objective = null + if(!old_objective) + //Add new one + new_objective = new selected_type + new_objective.owner = src + new_objective.admin_edit(usr) + target_antag.objectives += new_objective - switch (new_obj_type) - if ("assassinate","protect","debrain","maroon") - var/list/possible_targets = list("Free objective") - for(var/datum/mind/possible_target in SSticker.minds) - if ((possible_target != src) && ishuman(possible_target.current)) - possible_targets += possible_target.current - - var/mob/def_target = null - var/list/objective_list = typecacheof(list(/datum/objective/assassinate, /datum/objective/protect, /datum/objective/debrain, /datum/objective/maroon)) - if (is_type_in_typecache(objective, objective_list) && objective.target) - def_target = objective.target.current - - var/mob/new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets - if (!new_target) - return - - var/objective_path = text2path("/datum/objective/[new_obj_type]") - if (new_target == "Free objective") - new_objective = new objective_path - new_objective.owner = src - new_objective.target = null - new_objective.explanation_text = "Free objective" - else - new_objective = new objective_path - new_objective.owner = src - new_objective.target = new_target.mind - //Will display as special role if the target is set as MODE. Ninjas/commandos/nuke ops. - new_objective.update_explanation_text() - - if ("destroy") - var/list/possible_targets = active_ais(1) - if(possible_targets.len) - var/mob/new_target = input("Select target:", "Objective target") as null|anything in possible_targets - new_objective = new /datum/objective/destroy - new_objective.target = new_target.mind - new_objective.owner = src - new_objective.update_explanation_text() - else - to_chat(usr, "No active AIs with minds") - - if ("prevent") - new_objective = new /datum/objective/block - new_objective.owner = src - - if ("hijack") - new_objective = new /datum/objective/hijack - new_objective.owner = src - - if ("escape") - new_objective = new /datum/objective/escape - new_objective.owner = src - - if ("survive") - new_objective = new /datum/objective/survive - new_objective.owner = src - - if("martyr") - new_objective = new /datum/objective/martyr - new_objective.owner = src - - if ("nuclear") - new_objective = new /datum/objective/nuclear - new_objective.owner = src - - if ("steal") - if (!istype(objective, /datum/objective/steal)) - new_objective = new /datum/objective/steal - new_objective.owner = src - else - new_objective = objective - var/datum/objective/steal/steal = new_objective - if (!steal.select_target()) - return - - if("download","capture","absorb") - var/def_num - if(objective&&objective.type==text2path("/datum/objective/[new_obj_type]")) - def_num = objective.target_amount - - var/target_number = input("Input target number:", "Objective", def_num) as num | null - if (isnull(target_number))//Ordinarily, you wouldn't need isnull. In this case, the value may already exist. - return - - switch(new_obj_type) - if("download") - new_objective = new /datum/objective/download - new_objective.explanation_text = "Download [target_number] research node\s." - if("capture") - new_objective = new /datum/objective/capture - new_objective.explanation_text = "Capture [target_number] lifeforms with an energy net. Live, rare specimens are worth more." - if("absorb") - new_objective = new /datum/objective/absorb - new_objective.explanation_text = "Absorb [target_number] compatible genomes." - new_objective.owner = src - new_objective.target_amount = target_number - - if ("custom") - var/expl = stripped_input(usr, "Custom objective:", "Objective", objective ? objective.explanation_text : "") - if (!expl) - return - new_objective = new /datum/objective - new_objective.owner = src - new_objective.explanation_text = expl - - if (!new_objective) - return - - if (objective) - if(target_antag) - target_antag.objectives -= objective - objectives -= objective - target_antag.objectives.Insert(objective_pos, new_objective) - message_admins("[key_name_admin(usr)] edited [current]'s objective to [new_objective.explanation_text]") - log_admin("[key_name(usr)] edited [current]'s objective to [new_objective.explanation_text]") - else - if(target_antag) - target_antag.objectives += new_objective - objectives += new_objective message_admins("[key_name_admin(usr)] added a new objective for [current]: [new_objective.explanation_text]") log_admin("[key_name(usr)] added a new objective for [current]: [new_objective.explanation_text]") + else + if(old_objective.type == selected_type) + //Edit the old + old_objective.admin_edit(usr) + new_objective = old_objective + else + //Replace the old + new_objective = new selected_type + new_objective.owner = src + new_objective.admin_edit(usr) + target_antag.objectives -= old_objective + target_antag.objectives.Insert(objective_pos, new_objective) + message_admins("[key_name_admin(usr)] edited [current]'s objective to [new_objective.explanation_text]") + log_admin("[key_name(usr)] edited [current]'s objective to [new_objective.explanation_text]") else if (href_list["obj_delete"]) - var/datum/objective/objective = locate(href_list["obj_delete"]) - if(!istype(objective)) - return + var/datum/objective/objective for(var/datum/antagonist/A in antag_datums) - if(objective in A.objectives) - A.objectives -= objective + objective = locate(href_list["obj_delete"]) in A.objectives + if(istype(objective)) break - objectives -= objective + if(!objective) + to_chat(usr,"Invalid objective.") + return + //qdel(objective) Needs cleaning objective destroys message_admins("[key_name_admin(usr)] removed an objective for [current]: [objective.explanation_text]") log_admin("[key_name(usr)] removed an objective for [current]: [objective.explanation_text]") else if(href_list["obj_completed"]) - var/datum/objective/objective = locate(href_list["obj_completed"]) - if(!istype(objective)) + var/datum/objective/objective + for(var/datum/antagonist/A in antag_datums) + objective = locate(href_list["obj_completed"]) in A.objectives + if(istype(objective)) + objective = objective + break + if(!objective) + to_chat(usr,"Invalid objective.") return objective.completed = !objective.completed log_admin("[key_name(usr)] toggled the win state for [current]'s objective: [objective.explanation_text]") @@ -652,10 +581,16 @@ usr = current traitor_panel() +/datum/mind/proc/get_all_objectives() + var/list/all_objectives = list() + for(var/datum/antagonist/A in antag_datums) + all_objectives |= A.objectives + return all_objectives + /datum/mind/proc/announce_objectives() var/obj_count = 1 to_chat(current, "Your current objectives:") - for(var/objective in objectives) + for(var/objective in get_all_objectives()) var/datum/objective/O = objective to_chat(current, "Objective #[obj_count]: [O.explanation_text]") obj_count++ diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index f747c563ad..f4ca3a8ebd 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -5,8 +5,8 @@ mood_change = -1 /datum/mood_event/broken_vow //Used for when mimes break their vow of silence - description = "I have brought shame upon my name, and betrayed my fellow mimes by breaking our sacred vow...\n" - mood_change = -8 + description = "I have brought shame upon my name, and betrayed my fellow mimes by breaking our sacred vow...\n" + mood_change = -8 /datum/mood_event/on_fire description = "I'M ON FIRE!!!\n" @@ -55,14 +55,14 @@ timeout = 2 MINUTES /datum/mood_event/shameful_suicide //suicide_acts that return SHAME, like sord - description = "I can't even end it all!\n" - mood_change = -10 - timeout = 1 MINUTES + description = "I can't even end it all!\n" + mood_change = -10 + timeout = 1 MINUTES /datum/mood_event/dismembered - description = "AHH! I WAS USING THAT LIMB!\n" - mood_change = -8 - timeout = 2400 + description = "AHH! I WAS USING THAT LIMB!\n" + mood_change = -8 + timeout = 2400 /datum/mood_event/noshoes description = "I am a disgrace to comedy everywhere!\n" @@ -92,20 +92,20 @@ mood_change = 2 /datum/mood_event/brain_damage - mood_change = -3 + mood_change = -3 /datum/mood_event/brain_damage/add_effects() - var/damage_message = pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage") - description = "Hurr durr... [damage_message]\n" + var/damage_message = pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage") + description = "Hurr durr... [damage_message]\n" /datum/mood_event/hulk //Entire duration of having the hulk mutation - description = "HULK SMASH!\n" - mood_change = -4 + description = "HULK SMASH!\n" + mood_change = -4 /datum/mood_event/epilepsy //Only when the mutation causes a seizure - description = "I should have paid attention to the epilepsy warning.\n" - mood_change = -3 - timeout = 3000 + description = "I should have paid attention to the epilepsy warning.\n" + mood_change = -3 + timeout = 3000 /datum/mood_event/nyctophobia description = "It sure is dark around here...\n" diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index 422ec4476c..678802aed9 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -80,12 +80,12 @@ description = "Heh...hehehe...hehe...\n" mood_change = 4 - /datum/mood_event/chemical_laughter +/datum/mood_event/chemical_laughter description = "Laughter really is the best medicine! Or is it?\n" mood_change = 4 timeout = 3 MINUTES - /datum/mood_event/chemical_superlaughter +/datum/mood_event/chemical_superlaughter description = "*WHEEZE*\n" mood_change = 12 timeout = 3 MINUTES diff --git a/code/datums/mutations.dm b/code/datums/mutations.dm index efa248b4f0..f689ff903e 100644 --- a/code/datums/mutations.dm +++ b/code/datums/mutations.dm @@ -30,7 +30,7 @@ GLOBAL_LIST_EMPTY(mutations_list) . = on_losing(owner) /datum/mutation/human/proc/set_se(se_string, on = 1) - if(!se_string || lentext(se_string) < DNA_STRUC_ENZYMES_BLOCKS * DNA_BLOCK_SIZE) + if(!se_string || length(se_string) < DNA_STRUC_ENZYMES_BLOCKS * DNA_BLOCK_SIZE) return var/before = copytext(se_string, 1, ((dna_block - 1) * DNA_BLOCK_SIZE) + 1) var/injection = num2hex(on ? rand(lowest_value, (256 * 16) - 1) : rand(0, lowest_value - 1), DNA_BLOCK_SIZE) @@ -42,7 +42,7 @@ GLOBAL_LIST_EMPTY(mutations_list) owner.dna.struc_enzymes = set_se(owner.dna.struc_enzymes, on) /datum/mutation/human/proc/check_block_string(se_string) - if(!se_string || lentext(se_string) < DNA_STRUC_ENZYMES_BLOCKS * DNA_BLOCK_SIZE) + if(!se_string || length(se_string) < DNA_STRUC_ENZYMES_BLOCKS * DNA_BLOCK_SIZE) return 0 if(hex2num(getblock(se_string, dna_block)) >= lowest_value) return 1 diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm index 8386b59d97..da379b9851 100755 --- a/code/datums/outfit.dm +++ b/code/datums/outfit.dm @@ -28,16 +28,16 @@ var/can_be_admin_equipped = TRUE // Set to FALSE if your outfit requires runtime parameters var/list/chameleon_extras //extra types for chameleon outfit changes, mostly guns -/datum/outfit/proc/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/proc/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) //to be overridden for customization depending on client prefs,species etc return -/datum/outfit/proc/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/proc/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) //to be overridden for toggling internals, id binding, access etc return -/datum/outfit/proc/equip(mob/living/carbon/human/H, visualsOnly = FALSE) - pre_equip(H, visualsOnly) +/datum/outfit/proc/equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) + pre_equip(H, visualsOnly, preference_source) //Start with uniform,suit,backpack for additional slots if(uniform) @@ -103,7 +103,7 @@ var/obj/item/clothing/suit/space/hardsuit/HS = H.wear_suit HS.ToggleHelmet() - post_equip(H, visualsOnly) + post_equip(H, visualsOnly, preference_source) if(!visualsOnly) apply_fingerprints(H) diff --git a/code/datums/radiation_wave.dm b/code/datums/radiation_wave.dm index 6118428547..8555e4cf3f 100644 --- a/code/datums/radiation_wave.dm +++ b/code/datums/radiation_wave.dm @@ -66,6 +66,8 @@ place = cmaster_turf for(var/i in 1 to distance) place = get_step(place, dir) + if(!place) + break atoms += get_rad_contents(place) return atoms @@ -108,7 +110,7 @@ if(!can_contaminate || blacklisted[thing.type]) continue if(prob(contamination_chance)) // Only stronk rads get to have little baby rads - if(SEND_SIGNAL(thing, COMSIG_ATOM_RAD_CONTAMINATING, strength) & COMPONENT_BLOCK_CONTAMINATION) + if(CHECK_BITFIELD(thing.rad_flags, RAD_NO_CONTAMINATE) || SEND_SIGNAL(thing, COMSIG_ATOM_RAD_CONTAMINATING, strength) & COMPONENT_BLOCK_CONTAMINATION) continue var/rad_strength = (strength-RAD_MINIMUM_CONTAMINATION) * RAD_CONTAMINATION_STR_COEFFICIENT thing.AddComponent(/datum/component/radioactive, rad_strength, source) diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm index 18efae955e..4f18e6fd62 100644 --- a/code/datums/ruins/lavaland.dm +++ b/code/datums/ruins/lavaland.dm @@ -163,6 +163,13 @@ suffix = "lavaland_surface_xeno_nest.dmm" cost = 20 */ +/datum/map_template/ruin/lavaland/alien_nest + name = "Alien Nest" + id = "alien-nest" + description = "Not even Necropolis is safe from alien infestation. The competition for hosts has locked the legion and aliens in an endless conflict that can only be resolved by a PKA." + suffix = "lavaland_surface_alien_nest.dmm" + cost = 20 + /datum/map_template/ruin/lavaland/fountain name = "Fountain Hall" id = "fountain" diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 563d06ca57..5c4fc61827 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -170,7 +170,7 @@ tick_interval = 4 alert_type = /obj/screen/alert/status_effect/his_grace var/bloodlust = 0 - + /obj/screen/alert/status_effect/his_grace name = "His Grace" desc = "His Grace hungers, and you must feed Him." @@ -356,7 +356,7 @@ var/new_staminaloss = owner.getStaminaLoss() if(new_staminaloss < last_staminaloss) var/heal_amount = -5 // CIT CHANGE - makes blood drunk status effect not exhaust you - owner.adjustStaminaLoss(heal_amount, updating_health = FALSE) + owner.adjustStaminaLoss(heal_amount, FALSE) new_staminaloss = owner.getStaminaLoss() needs_health_update = TRUE last_staminaloss = new_staminaloss diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index fb636f6911..84ed012b82 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -567,8 +567,7 @@ datum/status_effect/pacify tick_interval = 10 examine_text = "SUBJECTPRONOUN seems slow and unfocused." var/stun = TRUE - var/triggered = FALSE - alert_type = null + alert_type = /obj/screen/alert/status_effect/trance /obj/screen/alert/status_effect/trance name = "Trance" @@ -576,17 +575,6 @@ datum/status_effect/pacify icon_state = "high" /datum/status_effect/trance/tick() - if(HAS_TRAIT(owner, "hypnotherapy")) - if(triggered == TRUE) - UnregisterSignal(owner, COMSIG_MOVABLE_HEAR) - RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/hypnotize) - ADD_TRAIT(owner, TRAIT_MUTE, "trance") - if(!owner.has_quirk(/datum/quirk/monochromatic)) - owner.add_client_colour(/datum/client_colour/monochrome) - to_chat(owner, "[pick("You feel your thoughts slow down...", "You suddenly feel extremely dizzy...", "You feel like you're in the middle of a dream...","You feel incredibly relaxed...")]") - triggered = FALSE - else - return if(stun) owner.Stun(60, TRUE, TRUE) owner.dizziness = 20 @@ -594,47 +582,88 @@ datum/status_effect/pacify /datum/status_effect/trance/on_apply() if(!iscarbon(owner)) return FALSE - if(HAS_TRAIT(owner, "hypnotherapy")) - RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/listen) - return TRUE - alert_type = /obj/screen/alert/status_effect/trance RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/hypnotize) ADD_TRAIT(owner, TRAIT_MUTE, "trance") - if(!owner.has_quirk(/datum/quirk/monochromatic)) - owner.add_client_colour(/datum/client_colour/monochrome) + owner.add_client_colour(/datum/client_colour/monochrome/trance) owner.visible_message("[stun ? "[owner] stands still as [owner.p_their()] eyes seem to focus on a distant point." : ""]", \ "[pick("You feel your thoughts slow down...", "You suddenly feel extremely dizzy...", "You feel like you're in the middle of a dream...","You feel incredibly relaxed...")]") return TRUE -/datum/status_effect/trance/on_creation(mob/living/new_owner, _duration, _stun = TRUE, source_quirk = FALSE)//hypnoquirk makes no visible message, prevents self antag messages, and places phrase below objectives. +/datum/status_effect/trance/on_creation(mob/living/new_owner, _duration, _stun = TRUE) duration = _duration stun = _stun - if(source_quirk == FALSE && HAS_TRAIT(owner, "hypnotherapy")) - REMOVE_TRAIT(owner, "hypnotherapy", ROUNDSTART_TRAIT) return ..() /datum/status_effect/trance/on_remove() UnregisterSignal(owner, COMSIG_MOVABLE_HEAR) REMOVE_TRAIT(owner, TRAIT_MUTE, "trance") owner.dizziness = 0 - if(!owner.has_quirk(/datum/quirk/monochromatic)) - owner.remove_client_colour(/datum/client_colour/monochrome) + owner.remove_client_colour(/datum/client_colour/monochrome/trance) to_chat(owner, "You snap out of your trance!") -/datum/status_effect/trance/proc/listen(datum/source, message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) - to_chat(owner, "[speaker] accidentally sets off your implanted trigger, sending you into a hypnotic daze!") - triggered = TRUE - -/datum/status_effect/trance/proc/hypnotize(datum/source, message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) +/datum/status_effect/trance/proc/hypnotize(datum/source, list/hearing_args) if(!owner.can_hear()) return - if(speaker == owner) + if(hearing_args[HEARING_SPEAKER] == owner) return var/mob/living/carbon/C = owner C.cure_trauma_type(/datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY) //clear previous hypnosis - if(HAS_TRAIT(C, "hypnotherapy")) - addtimer(CALLBACK(C, /mob/living/carbon.proc/gain_trauma, /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, raw_message, TRUE), 10) - else - addtimer(CALLBACK(C, /mob/living/carbon.proc/gain_trauma, /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, raw_message), 10) + addtimer(CALLBACK(C, /mob/living/carbon.proc/gain_trauma, /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, hearing_args[HEARING_RAW_MESSAGE]), 10) addtimer(CALLBACK(C, /mob/living.proc/Stun, 60, TRUE, TRUE), 15) //Take some time to think about it qdel(src) + +/datum/status_effect/spasms + id = "spasms" + status_type = STATUS_EFFECT_MULTIPLE + alert_type = null + +/datum/status_effect/spasms/tick() + if(prob(15)) + switch(rand(1,5)) + if(1) + if((!owner.lying && !owner.buckled) && isturf(owner.loc)) + to_chat(owner, "Your leg spasms!") + step(owner, pick(GLOB.cardinals)) + if(2) + if(owner.incapacitated()) + return + var/obj/item/I = owner.get_active_held_item() + if(I) + to_chat(owner, "Your fingers spasm!") + owner.log_message("used [I] due to a Muscle Spasm", LOG_ATTACK) + I.attack_self(owner) + if(3) + var/prev_intent = owner.a_intent + owner.a_intent = INTENT_HARM + + var/range = 1 + if(istype(owner.get_active_held_item(), /obj/item/gun)) //get targets to shoot at + range = 7 + + var/list/mob/living/targets = list() + for(var/mob/M in oview(owner, range)) + if(isliving(M)) + targets += M + if(LAZYLEN(targets)) + to_chat(owner, "Your arm spasms!") + owner.log_message(" attacked someone due to a Muscle Spasm", LOG_ATTACK) //the following attack will log itself + owner.ClickOn(pick(targets)) + owner.a_intent = prev_intent + if(4) + var/prev_intent = owner.a_intent + owner.a_intent = INTENT_HARM + to_chat(owner, "Your arm spasms!") + owner.log_message("attacked [owner.p_them()]self to a Muscle Spasm", LOG_ATTACK) + owner.ClickOn(owner) + owner.a_intent = prev_intent + if(5) + if(owner.incapacitated()) + return + var/obj/item/I = owner.get_active_held_item() + var/list/turf/targets = list() + for(var/turf/T in oview(owner, 3)) + targets += T + if(LAZYLEN(targets) && I) + to_chat(owner, "Your arm spasms!") + owner.log_message("threw [I] due to a Muscle Spasm", LOG_ATTACK) + owner.throw_item(pick(targets)) \ No newline at end of file diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm index 655863e0e0..cb2b4174b5 100644 --- a/code/datums/status_effects/neutral.dm +++ b/code/datums/status_effects/neutral.dm @@ -69,3 +69,17 @@ /datum/status_effect/in_love/tick() if(date) new /obj/effect/temp_visual/love_heart/invisible(get_turf(date.loc), owner) + +/datum/status_effect/throat_soothed + id = "throat_soothed" + duration = 60 SECONDS + status_type = STATUS_EFFECT_REFRESH + alert_type = null + +/datum/status_effect/throat_soothed/on_apply() + . = ..() + ADD_TRAIT(owner, TRAIT_SOOTHED_THROAT, "[STATUS_EFFECT_TRAIT]_[id]") + +/datum/status_effect/throat_soothed/on_remove() + . = ..() + REMOVE_TRAIT(owner, TRAIT_SOOTHED_THROAT, "[STATUS_EFFECT_TRAIT]_[id]") \ No newline at end of file diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm index bc1cfba112..0d84aab763 100644 --- a/code/datums/status_effects/status_effect.dm +++ b/code/datums/status_effects/status_effect.dm @@ -64,6 +64,12 @@ owner = null qdel(src) +/datum/status_effect/proc/refresh() + var/original_duration = initial(duration) + if(original_duration == -1) + return + duration = world.time + original_duration + //clickdelay/nextmove modifiers! /datum/status_effect/proc/nextmove_modifier() return 1 @@ -92,6 +98,9 @@ if(S.id == initial(S1.id) && S.status_type) if(S.status_type == STATUS_EFFECT_REPLACE) S.be_replaced() + else if(S.status_type == STATUS_EFFECT_REFRESH) + S.refresh() + return else return var/list/arguments = args.Copy() diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm index c015dba5ec..9e05af03b6 100644 --- a/code/datums/traits/neutral.dm +++ b/code/datums/traits/neutral.dm @@ -103,14 +103,13 @@ lose_text = "You don't feel that burning sensation anymore." /datum/quirk/libido/add() - var/mob/living/M = quirk_holder - M.min_arousal = 16 - M.arousal_rate = 3 + quirk_holder.min_arousal = 16 + quirk_holder.arousal_rate = 3 /datum/quirk/libido/remove() - var/mob/living/M = quirk_holder - M.min_arousal = initial(M.min_arousal) - M.arousal_rate = initial(M.arousal_rate) + if(quirk_holder) + quirk_holder.min_arousal = initial(quirk_holder.min_arousal) + quirk_holder.arousal_rate = initial(quirk_holder.arousal_rate) /datum/quirk/maso name = "Masochism" diff --git a/code/datums/verbs.dm b/code/datums/verbs.dm index 79fe256bb4..d8d7ee7433 100644 --- a/code/datums/verbs.dm +++ b/code/datums/verbs.dm @@ -11,7 +11,7 @@ //do things for each entry in Generate_list //return value sets Generate_list[verbpath] -/datum/verbs/proc/HandleVerb(list/entry, atom/verb/verbpath, ...) +/datum/verbs/proc/HandleVerb(list/entry, procpath/verbpath, ...) return entry /datum/verbs/New() @@ -82,7 +82,7 @@ . += childlist for (var/thing in verblist) - var/atom/verb/verbpath = thing + var/procpath/verbpath = thing if (!verbpath) stack_trace("Bad VERB in [type] verblist: [english_list(verblist)]") var/list/entry = list() diff --git a/code/datums/weather/weather_types/ash_storm.dm b/code/datums/weather/weather_types/ash_storm.dm index 345212cc1b..3247b890c6 100644 --- a/code/datums/weather/weather_types/ash_storm.dm +++ b/code/datums/weather/weather_types/ash_storm.dm @@ -80,7 +80,7 @@ return TRUE if(ishuman(L)) //Are you immune? var/mob/living/carbon/human/H = L - var/thermal_protection = H.get_thermal_protection() + var/thermal_protection = H.easy_thermal_protection() if(thermal_protection >= FIRE_IMMUNITY_MAX_TEMP_PROTECT) return TRUE if(isliving(L))// if we're a non immune mob inside an immune mob we have to reconsider if that mob is immune to protect ourselves diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm index 26942a1ba6..db6d80f9bb 100644 --- a/code/datums/wires/airlock.dm +++ b/code/datums/wires/airlock.dm @@ -1,10 +1,35 @@ /datum/wires/airlock holder_type = /obj/machinery/door/airlock - proper_name = "Airlock" + proper_name = "Generic Airlock" + var/wiretype /datum/wires/airlock/secure randomize = TRUE +/datum/wires/airlock/command + proper_name = "Command Airlock" + wiretype = "commandairlock" + +/datum/wires/airlock/security + proper_name = "Security Airlock" + wiretype = "securityairlock" + +/datum/wires/airlock/engineering + proper_name = "Engineering Airlock" + wiretype = "engineeringairlock" + +/datum/wires/airlock/science + proper_name = "Science Airlock" + wiretype = "scienceairlock" + +/datum/wires/airlock/medical + proper_name = "Medical Airlock" + wiretype = "medicalairlock" + +/datum/wires/airlock/cargo + proper_name = "Cargo Airlock" + wiretype = "cargoairlock" + /datum/wires/airlock/New(atom/holder) wires = list( WIRE_POWER1, WIRE_POWER2, @@ -14,7 +39,16 @@ WIRE_ZAP1, WIRE_ZAP2 ) add_duds(2) - ..() + . = ..() + if(randomize || !wiretype) + return + if(!GLOB.wire_color_directory[wiretype]) + colors = list() + randomize() + GLOB.wire_color_directory[wiretype] = colors + GLOB.wire_name_directory[wiretype] = proper_name + else + colors = GLOB.wire_color_directory[wiretype] /datum/wires/airlock/interactable(mob/user) var/obj/machinery/door/airlock/A = holder diff --git a/code/game/area/Space_Station_13_areas.dm b/code/game/area/Space_Station_13_areas.dm index 798cd9c026..fa66306302 100644 --- a/code/game/area/Space_Station_13_areas.dm +++ b/code/game/area/Space_Station_13_areas.dm @@ -250,7 +250,12 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/maintenance/disposal/incinerator name = "Incinerator" icon_state = "disposal" +/area/maintenance/bar + name = "Maintenance Bar" + icon_state = "maintbar" +/area/maintenance/bar/cafe + name = "Abandoned Cafe" //Hallway @@ -499,6 +504,16 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "Abandoned Theatre" icon_state = "Theatre" +/area/crew_quarters/theatre/clown + name = "Clown's Office" + +/area/crew_quarters/theatre/mime + name = "Mime's Office" + +/area/crew_quarters/cryopod + name = "Cryogenics" + icon_state = "cryosleep" + /area/library name = "Library" icon_state = "library" diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index dfbb59811b..612c3cba42 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -53,8 +53,6 @@ var/parallax_movedir = 0 - var/global/global_uid = 0 - var/uid var/list/ambientsounds = GENERIC flags_1 = CAN_BE_DIRTY_1 @@ -96,7 +94,6 @@ GLOBAL_LIST_EMPTY(teleportlocs) /area/Initialize() icon_state = "" layer = AREA_LAYER - uid = ++global_uid map_name = name // Save the initial (the name set in the map) name of the area. canSmoothWithAreas = typecacheof(canSmoothWithAreas) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 68f22242e1..6f633f7c6d 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -186,6 +186,10 @@ else M.forceMove(src) +//common name +/atom/proc/update_multiz(prune_on_fail = FALSE) + return FALSE + /atom/proc/assume_air(datum/gas_mixture/giver) qdel(giver) return null @@ -266,7 +270,7 @@ 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 @@ -276,35 +280,35 @@ ///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)]" + return "[icon2html(src, user)] [thats? "That's ":""][get_examine_name(user)]" /atom/proc/examine(mob/user) - to_chat(user, "[get_examine_string(user, TRUE)].") + . = list("[get_examine_string(user, TRUE)].") if(desc) - to_chat(user, desc) + . += desc if(reagents) if(reagents.reagents_holder_flags & TRANSPARENT) - to_chat(user, "It contains:") - if(reagents.reagent_list.len) + . += "It contains:" + if(length(reagents.reagent_list)) if(user.can_see_reagents()) //Show each individual reagent for(var/datum/reagent/R in reagents.reagent_list) - to_chat(user, "[R.volume] units of [R.name]") + . += "[R.volume] units of [R.name]" else //Otherwise, just show the total volume var/total_volume = 0 for(var/datum/reagent/R in reagents.reagent_list) total_volume += R.volume - to_chat(user, "[total_volume] units of various reagents") + . += "[total_volume] units of various reagents" else - to_chat(user, "Nothing.") + . += "Nothing." else if(reagents.reagents_holder_flags & AMOUNT_VISIBLE) if(reagents.total_volume) - to_chat(user, "It has [reagents.total_volume] unit\s left.") + . += "It has [reagents.total_volume] unit\s left." else - to_chat(user, "It's empty.") + . += "It's empty." - SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user) + SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .) /atom/proc/relaymove(mob/user) if(buckle_message_cooldown <= world.time) @@ -563,7 +567,7 @@ //Hook for running code when a dir change occurs -/atom/proc/setDir(newdir) +/atom/proc/setDir(newdir, ismousemovement=FALSE) SEND_SIGNAL(src, COMSIG_ATOM_DIR_CHANGE, dir, newdir) dir = newdir @@ -656,7 +660,7 @@ var/atom/L = loc if(!L) return null - return L.AllowDrop() ? L : get_turf(L) + return L.AllowDrop() ? L : L.drop_location() /atom/Entered(atom/movable/AM, atom/oldLoc) SEND_SIGNAL(src, COMSIG_ATOM_ENTERED, AM, oldLoc) @@ -832,4 +836,7 @@ Proc for attack log creation, because really why not if(filter_data && filter_data[name]) filter_data -= name update_filters() - return TRUE \ No newline at end of file + return TRUE + +/atom/proc/intercept_zImpact(atom/movable/AM, levels = 1) + . |= SEND_SIGNAL(src, COMSIG_ATOM_INTERCEPT_Z_FALL, AM, levels) \ No newline at end of file diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 0957db5fcb..ef20b6e35e 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -34,6 +34,51 @@ var/datum/component/orbiter/orbiting var/can_be_z_moved = TRUE + var/zfalling = FALSE + +/atom/movable/proc/can_zFall(turf/source, levels = 1, turf/target, direction) + if(!direction) + direction = DOWN + if(!source) + source = get_turf(src) + if(!source) + return FALSE + if(!target) + target = get_step_multiz(source, direction) + if(!target) + return FALSE + return !(movement_type & FLYING) && has_gravity(source) && !throwing + +/atom/movable/proc/onZImpact(turf/T, levels) + var/atom/highest = T + for(var/i in T.contents) + var/atom/A = i + if(!A.density) + continue + if(isobj(A) || ismob(A)) + if(A.layer > highest.layer) + highest = A + INVOKE_ASYNC(src, .proc/SpinAnimation, 5, 2) + throw_impact(highest) + return TRUE + +//For physical constraints to travelling up/down. +/atom/movable/proc/can_zTravel(turf/destination, direction) + var/turf/T = get_turf(src) + if(!T) + return FALSE + if(!direction) + if(!destination) + return FALSE + direction = get_dir(T, destination) + if(direction != UP && direction != DOWN) + return FALSE + if(!destination) + destination = get_step_multiz(src, direction) + if(!destination) + return FALSE + return T.zPassOut(src, direction, destination) && destination.zPassIn(src, direction, T) + /atom/movable/vv_edit_var(var_name, var_value) var/static/list/banned_edits = list("step_x", "step_y", "step_size") var/static/list/careful_edits = list("bound_x", "bound_y", "bound_width", "bound_height") diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index 51a34f4194..a76e8234ba 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -167,6 +167,7 @@ Credit where due: number_players -= 30 starter_servants += round(number_players / 10) starter_servants = min(starter_servants, 8) //max 8 servants (that sould only happen with a ton of players) + GLOB.clockwork_vitality += 50 * starter_servants //some starter Vitality to help recover from initial fuck ups while(starter_servants) var/datum/mind/servant = antag_pick(antag_candidates) servants_to_serve += servant @@ -338,10 +339,6 @@ Credit where due: CLOCKCULTCHANGELOG\ \
\ -
  • Zelus oil: A new reagent. It can be used to heal the faithful to Ratvar, or kill heretics and moreso stun blood cultists,\ - or splashed onto metal sheets to make brass. This chemical can be found in minimal quantities by grinding brass sheets.\ -
  • Brass Flasks:Intended to store Zelus Oil in, but can also be used as fragile single use throwing weapons in a pinch! \ - These are crafted with a single sheet of brass and fit in the Clockwork Cuirass' suit storage.\ Good luck!" /obj/item/paper/servant_primer/Initialize() @@ -352,7 +349,7 @@ Credit where due: changelog_contents += "
  • [entry]
  • " info = replacetext(info, "CLOCKCULTCHANGELOG", changelog_contents) -/obj/item/paper/servant_primer/examine(mob/user) - if(!is_servant_of_ratvar(user) && !isobserver(user)) - to_chat(user, "You can't understand any of the words on [src].") - ..() +/obj/item/paper/servant_primer/oui_getcontent(mob/target) + if(!is_servant_of_ratvar(target) && !isobserver(target)) + return "[name][stars(info)]
    [stamps]" + return ..() diff --git a/code/game/gamemodes/clown_ops/clown_ops.dm b/code/game/gamemodes/clown_ops/clown_ops.dm index 66de72bad2..49a336e16a 100644 --- a/code/game/gamemodes/clown_ops/clown_ops.dm +++ b/code/game/gamemodes/clown_ops/clown_ops.dm @@ -53,7 +53,7 @@ /datum/outfit/syndicate/clownop/no_crystals tc = 0 -/datum/outfit/syndicate/clownop/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/syndicate/clownop/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) ..() if(visualsOnly) return diff --git a/code/game/gamemodes/clown_ops/clown_weapons.dm b/code/game/gamemodes/clown_ops/clown_weapons.dm index 79890e4cdd..ee96d1fa10 100644 --- a/code/game/gamemodes/clown_ops/clown_weapons.dm +++ b/code/game/gamemodes/clown_ops/clown_weapons.dm @@ -138,7 +138,7 @@ 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) +/obj/item/shield/energy/bananium/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback) if(active) if(iscarbon(thrower)) var/mob/living/carbon/C = thrower diff --git a/code/game/gamemodes/devil/devil agent/devil_agent.dm b/code/game/gamemodes/devil/devil agent/devil_agent.dm index ec09bfc739..789cff5c8f 100644 --- a/code/game/gamemodes/devil/devil agent/devil_agent.dm +++ b/code/game/gamemodes/devil/devil agent/devil_agent.dm @@ -34,11 +34,12 @@ //If you override this method, have it return the number of objectives added. if(devil_target_list.len && devil_target_list[devil]) // Is a double agent var/datum/mind/target_mind = devil_target_list[devil] + var/datum/antagonist/devil/D = target_mind.has_antag_datum(/datum/antagonist/devil) var/datum/objective/devil/outsell/outsellobjective = new outsellobjective.owner = devil outsellobjective.target = target_mind outsellobjective.update_explanation_text() - devil.objectives += outsellobjective + D.objectives += outsellobjective return 1 return 0 diff --git a/code/game/gamemodes/devil/game_mode.dm b/code/game/gamemodes/devil/game_mode.dm index 2255766e74..208a24f3e5 100644 --- a/code/game/gamemodes/devil/game_mode.dm +++ b/code/game/gamemodes/devil/game_mode.dm @@ -4,11 +4,12 @@ /datum/game_mode/proc/add_devil_objectives(datum/mind/devil_mind, quantity) var/list/validtypes = list(/datum/objective/devil/soulquantity, /datum/objective/devil/soulquality, /datum/objective/devil/sintouch, /datum/objective/devil/buy_target) + var/datum/antagonist/devil/D = devil_mind.has_antag_datum(/datum/antagonist/devil) for(var/i = 1 to quantity) var/type = pick(validtypes) var/datum/objective/devil/objective = new type(null) objective.owner = devil_mind - devil_mind.objectives += objective + D.objectives += objective if(!istype(objective, /datum/objective/devil/buy_target)) validtypes -= type //prevent duplicate objectives, EXCEPT for buy_target. else diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm index ca009f76ad..25edd0c68b 100644 --- a/code/game/gamemodes/dynamic/dynamic.dm +++ b/code/game/gamemodes/dynamic/dynamic.dm @@ -11,15 +11,26 @@ #define RULESET_STOP_PROCESSING 1 // -- Injection delays -GLOBAL_VAR_INIT(dynamic_latejoin_delay_min, (5 MINUTES)) -GLOBAL_VAR_INIT(dynamic_latejoin_delay_max, (25 MINUTES)) +GLOBAL_VAR_INIT(dynamic_latejoin_delay_min, (10 MINUTES)) +GLOBAL_VAR_INIT(dynamic_latejoin_delay_max, (30 MINUTES)) -GLOBAL_VAR_INIT(dynamic_midround_delay_min, (15 MINUTES)) -GLOBAL_VAR_INIT(dynamic_midround_delay_max, (35 MINUTES)) +GLOBAL_VAR_INIT(dynamic_midround_delay_min, (10 MINUTES)) +GLOBAL_VAR_INIT(dynamic_midround_delay_max, (30 MINUTES)) + +GLOBAL_VAR_INIT(dynamic_event_delay_min, (10 MINUTES)) +GLOBAL_VAR_INIT(dynamic_event_delay_max, (30 MINUTES)) // this is on top of regular events, so can't be quite as often + + +// -- Roundstart injection delays +GLOBAL_VAR_INIT(dynamic_first_latejoin_delay_min, (2 MINUTES)) +GLOBAL_VAR_INIT(dynamic_first_latejoin_delay_max, (30 MINUTES)) + +GLOBAL_VAR_INIT(dynamic_first_midround_delay_min, (20 MINUTES)) +GLOBAL_VAR_INIT(dynamic_first_midround_delay_max, (30 MINUTES)) // Are HIGHLANDER_RULESETs allowed to stack? GLOBAL_VAR_INIT(dynamic_no_stacking, TRUE) -// A number between -5 and +5. +// A number between -5 and +5. // A negative value will give a more peaceful round and // a positive value will give a round with higher threat. GLOBAL_VAR_INIT(dynamic_curve_centre, 0) @@ -27,7 +38,7 @@ GLOBAL_VAR_INIT(dynamic_curve_centre, 0) // Higher value will favour extreme rounds and // lower value rounds closer to the average. GLOBAL_VAR_INIT(dynamic_curve_width, 1.8) -// If enabled only picks a single starting rule and executes only autotraitor midround ruleset. +// If enabled only picks a single starting rule and executes only autotraitor midround ruleset. GLOBAL_VAR_INIT(dynamic_classic_secret, FALSE) // How many roundstart players required for high population override to take effect. GLOBAL_VAR_INIT(dynamic_high_pop_limit, 55) @@ -38,7 +49,7 @@ GLOBAL_VAR_INIT(dynamic_forced_extended, FALSE) GLOBAL_VAR_INIT(dynamic_stacking_limit, 90) // List of forced roundstart rulesets. GLOBAL_LIST_EMPTY(dynamic_forced_roundstart_ruleset) -// Forced threat level, setting this to zero or higher forces the roundstart threat to the value. +// Forced threat level, setting this to zero or higher forces the roundstart threat to the value. GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) /datum/game_mode/dynamic @@ -49,20 +60,28 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) announce_text = "Dynamic mode!" // This needs to be changed maybe reroll_friendly = FALSE; - + // Threat logging vars /// The "threat cap", threat shouldn't normally go above this and is used in ruleset calculations - var/threat_level = 0 + var/threat_level = 0 /// Set at the beginning of the round. Spent by the mode to "purchase" rules. var/threat = 0 + /// Starting threat level, for things that increase it but can bring it back down. + var/initial_threat_level = 0 + /// Things that cause a rolling threat adjustment to be displayed at roundend. + var/list/threat_tallies = list() /// Running information about the threat. Can store text or datum entries. var/list/threat_log = list() + /// As above, but with info such as refunds. + var/list/threat_log_verbose = list() /// List of roundstart rules used for selecting the rules. var/list/roundstart_rules = list() /// List of latejoin rules used for selecting the rules. var/list/latejoin_rules = list() /// List of midround rules used for selecting the rules. var/list/midround_rules = list() + /// List of events used for reducing threat without causing antag injection (necessarily). + var/list/events = list() /** # Pop range per requirement. * If the value is five the range is: * 0-4, 5-9, 10-14, 15-19, 20-24, 25-29, 30-34, 35-39, 40-54, 45+ @@ -71,15 +90,21 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) * If it is seven the range is: * 0-6, 7-13, 14-20, 21-27, 28-34, 35-41, 42-48, 49-55, 56-62, 63+ */ - var/pop_per_requirement = 6 - /// The requirement used for checking if a second rule should be selected. + var/pop_per_requirement = 9 + /// The requirement used for checking if a second rule should be selected. Index based on pop_per_requirement. var/list/second_rule_req = list(100, 100, 80, 70, 60, 50, 30, 20, 10, 0) - /// The requirement used for checking if a third rule should be selected. + /// The probability for a second ruleset with index being every ten threat. + var/list/second_rule_prob = list(0,0,60,80,80,80,100,100,100,100) + /// The requirement used for checking if a third rule should be selected. Index based on pop_per_requirement. var/list/third_rule_req = list(100, 100, 100, 90, 80, 70, 60, 50, 40, 30) - /// Threat requirement for a second ruleset when high pop override is in effect. + /// The probability for a third ruleset with index being every ten threat. + var/list/third_rule_prob = list(0,0,0,0,60,60,80,90,100,100) + /// Threat requirement for a second ruleset when high pop override is in effect. var/high_pop_second_rule_req = 40 - /// Threat requirement for a third ruleset when high pop override is in effect. + /// Threat requirement for a third ruleset when high pop override is in effect. var/high_pop_third_rule_req = 60 + /// The amount of additional rulesets waiting to be picked. + var/extra_rulesets_amount = 0 /// Number of players who were ready on roundstart. var/roundstart_pop_ready = 0 /// List of candidates used on roundstart rulesets. @@ -94,6 +119,8 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) var/latejoin_injection_cooldown = 0 /// When world.time is over this number the mode tries to inject a midround ruleset. var/midround_injection_cooldown = 0 + /// When wor.dtime is over this number the mode tries to do an event. + var/event_injection_cooldown = 0 /// When TRUE GetInjectionChance returns 100. var/forced_injection = FALSE /// Forced ruleset to be executed for the next latejoin. @@ -106,19 +133,33 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) var/highlander_executed = FALSE /// If a only ruleset has been executed. var/only_ruleset_executed = FALSE + /// Antags rolled by rules so far, to keep track of and discourage scaling past a certain ratio of crew/antags especially on lowpop. + var/antags_rolled = 0 /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) + second_rule_req = CONFIG_GET(number_list/dynamic_second_rule_requirements) + third_rule_req = CONFIG_GET(number_list/dynamic_third_rule_requirements) + if(second_rule_req.len<10) + second_rule_req = list(101, 101, 101, 101, 100, 90, 80, 70, 60, 50) + if(third_rule_req.len<10) + third_rule_req = list(101, 101, 101, 101, 101, 100, 90, 80, 70, 60) + high_pop_second_rule_req = CONFIG_GET(number/dynamic_second_rule_high_pop_requirement) + high_pop_third_rule_req = CONFIG_GET(number/dynamic_third_rule_high_pop_requirement) GLOB.dynamic_high_pop_limit = CONFIG_GET(number/dynamic_high_pop_limit) GLOB.dynamic_latejoin_delay_min = CONFIG_GET(number/dynamic_latejoin_delay_min)*600 GLOB.dynamic_latejoin_delay_max = CONFIG_GET(number/dynamic_latejoin_delay_max)*600 GLOB.dynamic_midround_delay_min = CONFIG_GET(number/dynamic_midround_delay_min)*600 GLOB.dynamic_midround_delay_max = CONFIG_GET(number/dynamic_midround_delay_max)*600 + GLOB.dynamic_first_latejoin_delay_min = CONFIG_GET(number/dynamic_first_latejoin_delay_min)*600 + GLOB.dynamic_first_latejoin_delay_max = CONFIG_GET(number/dynamic_first_latejoin_delay_max)*600 + GLOB.dynamic_first_midround_delay_min = CONFIG_GET(number/dynamic_first_midround_delay_min)*600 + GLOB.dynamic_first_midround_delay_max = CONFIG_GET(number/dynamic_first_midround_delay_max)*600 /datum/game_mode/dynamic/admin_panel() var/list/dat = list("Game Mode Panel

    Game Mode Panel

    ") - dat += "Dynamic Mode \[VV\]
    " + dat += "Dynamic Mode \[VV\]\[Refresh\]
    " dat += "Threat Level: [threat_level]
    " dat += "Threat to Spend: [threat] \[Adjust\] \[View Log\]
    " @@ -140,6 +181,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) dat += "
    Injection Timers: ([get_injection_chance(TRUE)]% chance)
    " dat += "Latejoin: [(latejoin_injection_cooldown-world.time)>60*10 ? "[round((latejoin_injection_cooldown-world.time)/60/10,0.1)] minutes" : "[(latejoin_injection_cooldown-world.time)] seconds"] \[Now!\]
    " dat += "Midround: [(midround_injection_cooldown-world.time)>60*10 ? "[round((midround_injection_cooldown-world.time)/60/10,0.1)] minutes" : "[(midround_injection_cooldown-world.time)] seconds"] \[Now!\]
    " + dat += "Event: [(event_injection_cooldown-world.time)>60*10 ? "[round((event_injection_cooldown-world.time)/60/10,0.1)] minutes" : "[(event_injection_cooldown-world.time)] seconds"] \[Now!\]
    " usr << browse(dat.Join(), "window=gamemode_panel;size=500x500") /datum/game_mode/dynamic/Topic(href, href_list) @@ -171,11 +213,15 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) midround_injection_cooldown = 0 forced_injection = TRUE message_admins("[key_name(usr)] forced a midround injection.", 1) + else if (href_list["forceevent"]) + event_injection_cooldown = 0 + // events always happen anyway + message_admins("[key_name(usr)] forced an event.", 1) else if (href_list["threatlog"]) show_threatlog(usr) else if (href_list["stacking_limit"]) GLOB.dynamic_stacking_limit = input(usr,"Change the threat limit at which round-endings rulesets will start to stack.", "Change stacking limit", null) as num - + admin_panel() // Refreshes the window // Checks if there are HIGHLANDER_RULESETs and calls the rule's round_result() proc @@ -193,30 +239,33 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) /datum/game_mode/dynamic/send_intercept() . = "Central Command Status Summary
    " switch(round(threat_level)) - if(0 to 19) - update_playercounts() - if(!current_players[CURRENT_LIVING_ANTAGS].len) - . += "Peaceful Waypoint
    " - . += "Your station orbits deep within controlled, core-sector systems and serves as a waypoint for routine traffic through Nanotrasen's trade empire. Due to the combination of high security, interstellar traffic, and low strategic value, it makes any direct threat of violence unlikely. Your primary enemies will be incompetence and bored crewmen: try to organize team-building events to keep staffers interested and productive." - else + if(0 to 20) + . += "Peaceful Waypoint
    " + . += "Your station orbits deep within controlled, core-sector systems and serves as a waypoint for routine traffic through Nanotrasen's trade empire. Due to the combination of high security, interstellar traffic, and low strategic value, it makes any direct threat of violence unlikely. Your primary enemies will be incompetence and bored crewmen: try to organize team-building events to keep staffers interested and productive. However, even deep in our territory there may be subversive elements, especially for such a high-value target as your station. Keep an eye out, but don't expect much trouble." + set_security_level(SEC_LEVEL_GREEN) + if(21 to 79) + var/perc_green = 100-round(100*((threat_level-21)/(79-21))) + if(prob(perc_green)) . += "Core Territory
    " . += "Your station orbits within reliably mundane, secure space. Although Nanotrasen has a firm grip on security in your region, the valuable resources and strategic position aboard your station make it a potential target for infiltrations. Monitor crew for non-loyal behavior, but expect a relatively tame shift free of large-scale destruction. We expect great things from your station." - if(20 to 39) - . += "Anomalous Exogeology
    " - . += "Although your station lies within what is generally considered Nanotrasen-controlled space, the course of its orbit has caused it to cross unusually close to exogeological features with anomalous readings. Although these features offer opportunities for our research department, it is known that these little understood readings are often correlated with increased activity from competing interstellar organizations and individuals, among them the Wizard Federation and Cult of the Geometer of Blood - all known competitors for Anomaly Type B sites. Exercise elevated caution." - if(40 to 65) - . += "Contested System
    " - . += "Your station's orbit passes along the edge of Nanotrasen's sphere of influence. While subversive elements remain the most likely threat against your station, hostile organizations are bolder here, where our grip is weaker. Exercise increased caution against elite Syndicate strike forces, or Executives forbid, some kind of ill-conceived unionizing attempt." - if(66 to 79) - . += "Uncharted Space
    " - . += "Congratulations and thank you for participating in the NT 'Frontier' space program! Your station is actively orbiting a high value system far from the nearest support stations. Little is known about your region of space, and the opportunity to encounter the unknown invites greater glory. You are encouraged to elevate security as necessary to protect Nanotrasen assets." + set_security_level(SEC_LEVEL_GREEN) + else if(prob(perc_green)) + . += "Contested System
    " + . += "Your station's orbit passes along the edge of Nanotrasen's sphere of influence. While subversive elements remain the most likely threat against your station, hostile organizations are bolder here, where our grip is weaker. Exercise increased caution against elite Syndicate strike forces, or Executives forbid, some kind of ill-conceived unionizing attempt." + set_security_level(SEC_LEVEL_BLUE) + else + . += "Uncharted Space
    " + . += "Congratulations and thank you for participating in the NT 'Frontier' space program! Your station is actively orbiting a high value system far from the nearest support stations. Little is known about your region of space, and the opportunity to encounter the unknown invites greater glory. You are encouraged to elevate security as necessary to protect Nanotrasen assets." + set_security_level(SEC_LEVEL_BLUE) if(80 to 99) . += "Black Orbit
    " . += "As part of a mandatory security protocol, we are required to inform you that as a result of your orbital pattern directly behind an astrological body (oriented from our nearest observatory), your station will be under decreased monitoring and support. It is anticipated that your extreme location and decreased surveillance could pose security risks. Avoid unnecessary risks and attempt to keep your station in one piece." + set_security_level(SEC_LEVEL_AMBER) if(100) . += "Impending Doom
    " . += "Your station is somehow in the middle of hostile territory, in clear view of any enemy of the corporation. Your likelihood to survive is low, and station destruction is expected and almost inevitable. Secure any sensitive material and neutralize any enemy you will come across. It is important that you at least try to maintain the station.
    " . += "Good luck." + set_security_level(SEC_LEVEL_RED) if(station_goals.len) . += "
    Special Orders for [station_name()]:" @@ -225,9 +274,10 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) . += G.get_report() print_command_report(., "Central Command Status Summary", announce=FALSE) - priority_announce("A summary has been copied and printed to all communications consoles.", "Security level elevated.", "intercept") - if(GLOB.security_level < SEC_LEVEL_BLUE) - set_security_level(SEC_LEVEL_BLUE) + if(GLOB.security_level >= SEC_LEVEL_BLUE) + priority_announce("A summary has been copied and printed to all communications consoles.", "Security level elevated.", "intercept") + else + priority_announce("Thanks to the tireless efforts of our security and intelligence divisions, there are currently no likely threats to [station_name()]. Have a secure shift!", "Security Report", "commandreport") // Yes, this is copy pasted from game_mode /datum/game_mode/dynamic/check_finished(force_ending) @@ -245,6 +295,11 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) if(rule.flags & HIGHLANDER_RULESET) return rule.check_finished() +/datum/game_mode/dynamic/proc/log_threat(var/log_str,var/verbose = FALSE) + threat_log_verbose += ("[worldtime2text()]: "+log_str) + if(!verbose) + threat_log += log_str + /datum/game_mode/dynamic/proc/show_threatlog(mob/admin) if(!SSticker.HasRoundStarted()) alert("The round hasn't started yet!") @@ -253,9 +308,9 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) if(!check_rights(R_ADMIN)) return - var/list/out = list("Threat LogThreat Log
    Starting Threat: [threat_level]
    ") + var/list/out = list("Threat LogThreat Log
    Starting Threat: [initial_threat_level]
    ") - for(var/entry in threat_log) + for(var/entry in threat_log_verbose) if(istext(entry)) out += "[entry]
    " @@ -273,15 +328,6 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) threat = threat_level /datum/game_mode/dynamic/can_start() - /* Disabled for now, had some changes that need to be tested and this might interfere with that. - if(GLOB.dynamic_curve_centre == 0) - // 10 is when the centre starts to decrease - // 6 is just 1 + 5 (from the maximum value and the one decreased) - // 1 just makes the curve look better, I don't know. - // Limited between 1 and 5 then inverted and rounded - // With this you get a centre curve that stays at -5 until 10 then first rapidly decreases but slows down at the end - GLOB.dynamic_curve_centre = round(-CLAMP((10*6/GLOB.player_list.len)-1, 0, 5), 0.5) - */ message_admins("Dynamic mode parameters for the round:") message_admins("Centre is [GLOB.dynamic_curve_centre], Width is [GLOB.dynamic_curve_width], Forced extended is [GLOB.dynamic_forced_extended ? "Enabled" : "Disabled"], No stacking is [GLOB.dynamic_no_stacking ? "Enabled" : "Disabled"].") message_admins("Stacking limit is [GLOB.dynamic_stacking_limit], Classic secret is [GLOB.dynamic_classic_secret ? "Enabled" : "Disabled"], High population limit is [GLOB.dynamic_high_pop_limit].") @@ -294,12 +340,17 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) else generate_threat() - var/latejoin_injection_cooldown_middle = 0.5*(GLOB.dynamic_latejoin_delay_max + GLOB.dynamic_latejoin_delay_min) - latejoin_injection_cooldown = round(CLAMP(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), GLOB.dynamic_latejoin_delay_min, GLOB.dynamic_latejoin_delay_max)) + world.time + var/latejoin_injection_cooldown_middle = 0.5*(GLOB.dynamic_first_latejoin_delay_max + GLOB.dynamic_first_latejoin_delay_min) + latejoin_injection_cooldown = round(CLAMP(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), GLOB.dynamic_first_latejoin_delay_min, GLOB.dynamic_first_latejoin_delay_max)) + world.time - 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 + var/midround_injection_cooldown_middle = 0.5*(GLOB.dynamic_first_midround_delay_min + GLOB.dynamic_first_midround_delay_max) + midround_injection_cooldown = round(CLAMP(EXP_DISTRIBUTION(midround_injection_cooldown_middle), GLOB.dynamic_first_midround_delay_min, GLOB.dynamic_first_midround_delay_max)) + world.time + + var/event_injection_cooldown_middle = 0.5*(GLOB.dynamic_event_delay_max + GLOB.dynamic_event_delay_min) + event_injection_cooldown = (round(CLAMP(EXP_DISTRIBUTION(event_injection_cooldown_middle), GLOB.dynamic_event_delay_min, GLOB.dynamic_event_delay_max)) + world.time) + log_game("DYNAMIC: Dynamic Mode initialized with a Threat Level of... [threat_level]!") + initial_threat_level = threat_level return TRUE /datum/game_mode/dynamic/pre_setup() @@ -316,24 +367,30 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) if ("Midround") if (ruleset.weight) midround_rules += ruleset + if("Event") + if(ruleset.weight) + events += ruleset for(var/mob/dead/new_player/player in GLOB.player_list) if(player.ready == PLAYER_READY_TO_PLAY && player.mind) roundstart_pop_ready++ candidates.Add(player) log_game("DYNAMIC: Listing [roundstart_rules.len] round start rulesets, and [candidates.len] players ready.") if (candidates.len <= 0) + log_game("DYNAMIC: [candidates.len] candidates.") return TRUE if (roundstart_rules.len <= 0) + log_game("DYNAMIC: [roundstart_rules.len] rules.") return TRUE - + if(GLOB.dynamic_forced_roundstart_ruleset.len > 0) rigged_roundstart() - else + else roundstart() var/starting_rulesets = "" for (var/datum/dynamic_ruleset/roundstart/DR in executed_rules) starting_rulesets += "[DR.name], " + log_game("DYNAMIC: Picked the following roundstart rules: [starting_rulesets]") candidates.Cut() return TRUE @@ -341,9 +398,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) update_playercounts() for(var/datum/dynamic_ruleset/roundstart/rule in executed_rules) - rule.candidates.Cut() // The rule should not use candidates at this point as they all are null. - if(!rule.execute()) - stack_trace("The starting rule \"[rule.name]\" failed to execute.") + addtimer(CALLBACK(src, /datum/game_mode/dynamic/.proc/execute_roundstart_rule, rule), rule.delay) ..() /// A simple roundstart proc used when dynamic_forced_roundstart_ruleset has rules in it. @@ -354,6 +409,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) message_admins("Drafting players for forced ruleset [rule.name].") log_game("DYNAMIC: Drafting players for forced ruleset [rule.name].") rule.mode = src + rule.acceptable(roundstart_pop_ready, threat_level) // Assigns some vars in the modes, running it here for consistency rule.candidates = candidates.Copy() rule.trim_candidates() if (rule.ready(TRUE)) @@ -370,9 +426,11 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) rule.trim_candidates() if (rule.ready() && rule.candidates.len > 0) drafted_rules[rule] = rule.weight - + if(!drafted_rules.len) + message_admins("Not enough threat level for roundstart antags!") + log_game("DYNAMIC: Not enough threat level for roundstart antags!") var/indice_pop = min(10,round(roundstart_pop_ready/pop_per_requirement)+1) - var/extra_rulesets_amount = 0 + extra_rulesets_amount = 0 if (GLOB.dynamic_classic_secret) extra_rulesets_amount = 0 else @@ -384,23 +442,28 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) if (threat_level > high_pop_third_rule_req) extra_rulesets_amount++ else - if (threat_level >= second_rule_req[indice_pop]) + var/threat_indice = min(10, max(round(threat_level ? threat_level/10 : 1), 1)) // 0-9 threat = 1, 10-19 threat = 2 ... + if (threat_level >= second_rule_req[indice_pop] && prob(second_rule_prob[threat_indice])) extra_rulesets_amount++ - if (threat_level >= third_rule_req[indice_pop]) + if (threat_level >= third_rule_req[indice_pop] && prob(third_rule_prob[threat_indice])) extra_rulesets_amount++ + log_game("DYNAMIC: Trying to roll [extra_rulesets_amount + 1] roundstart rulesets. Picking from [drafted_rules.len] eligible rulesets.") if (drafted_rules.len > 0 && picking_roundstart_rule(drafted_rules)) - if (extra_rulesets_amount > 0) // We've got enough population and threat for a second rulestart rule + log_game("DYNAMIC: First ruleset picked successfully. [extra_rulesets_amount] remaining.") + while(extra_rulesets_amount > 0 && drafted_rules.len > 0) // We had enough threat for one or two more rulesets for (var/datum/dynamic_ruleset/roundstart/rule in drafted_rules) if (rule.cost > threat) drafted_rules -= rule - if (drafted_rules.len > 0 && picking_roundstart_rule(drafted_rules)) - if (extra_rulesets_amount > 1) // We've got enough population and threat for a third rulestart rule - for (var/datum/dynamic_ruleset/roundstart/rule in drafted_rules) - if (rule.cost > threat) - drafted_rules -= rule - picking_roundstart_rule(drafted_rules) + if(drafted_rules.len) + picking_roundstart_rule(drafted_rules) + extra_rulesets_amount-- + log_game("DYNAMIC: Additional ruleset picked successfully, now [executed_rules.len] picked. [extra_rulesets_amount] remaining.") else + + if(threat >= 50) + message_admins("DYNAMIC: Picking first roundstart ruleset failed. You should report this.") + log_game("DYNAMIC: Picking first roundstart ruleset failed. drafted_rules.len = [drafted_rules.len] and threat = [threat]/[threat_level]") return FALSE return TRUE @@ -408,68 +471,74 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) /datum/game_mode/dynamic/proc/picking_roundstart_rule(list/drafted_rules = list(), forced = FALSE) var/datum/dynamic_ruleset/roundstart/starting_rule = pickweight(drafted_rules) if(!starting_rule) + log_game("DYNAMIC: Couldn't pick a starting ruleset. No rulesets available") return FALSE if(!forced) if(only_ruleset_executed) return FALSE // Check if a blocking ruleset has been executed. - else if(check_blocking(starting_rule.blocking_rules, executed_rules)) + else if(check_blocking(starting_rule.blocking_rules, executed_rules)) // Should already be filtered out, but making sure. Check filtering at end of proc if reported. drafted_rules -= starting_rule if(drafted_rules.len <= 0) + log_game("DYNAMIC: Picking [starting_rule.name] failed due to blocking_rules and no more rulesets available. Report this.") return FALSE starting_rule = pickweight(drafted_rules) // Check if the ruleset is highlander and if a highlander ruleset has been executed - else if(starting_rule.flags & HIGHLANDER_RULESET) - if(threat < GLOB.dynamic_stacking_limit && GLOB.dynamic_no_stacking) + else if(starting_rule.flags & HIGHLANDER_RULESET) // Should already be filtered out, but making sure. Check filtering at end of proc if reported. + if(threat_level > GLOB.dynamic_stacking_limit && GLOB.dynamic_no_stacking) if(highlander_executed) drafted_rules -= starting_rule if(drafted_rules.len <= 0) + log_game("DYNAMIC: Picking [starting_rule.name] failed due to no highlander stacking and no more rulesets available. Report this.") return FALSE starting_rule = pickweight(drafted_rules) + // With low pop and high threat there might be rulesets that get executed with no valid candidates. + else if(!starting_rule.ready()) // Should already be filtered out, but making sure. Check filtering at end of proc if reported. + drafted_rules -= starting_rule + if(drafted_rules.len <= 0) + log_game("DYNAMIC: Picking [starting_rule.name] failed because there were not enough candidates and no more rulesets available. Report this.") + return FALSE + starting_rule = pickweight(drafted_rules) - log_game("DYNAMIC: Picking a [istype(starting_rule, /datum/dynamic_ruleset/roundstart/delayed/) ? " delayed " : ""] ruleset [starting_rule.name]") + log_game("DYNAMIC: Picked a ruleset: [starting_rule.name]") roundstart_rules -= starting_rule drafted_rules -= starting_rule - if (istype(starting_rule, /datum/dynamic_ruleset/roundstart/delayed/)) - var/datum/dynamic_ruleset/roundstart/delayed/rule = starting_rule - addtimer(CALLBACK(src, .proc/execute_delayed, rule), rule.delay) - starting_rule.trim_candidates() + var/added_threat = starting_rule.scale_up(extra_rulesets_amount, threat) if (starting_rule.pre_execute()) - spend_threat(starting_rule.cost) - threat_log += "[worldtime2text()]: Roundstart [starting_rule.name] spent [starting_rule.cost]" + spend_threat(starting_rule.cost + added_threat) + log_threat("[starting_rule.ruletype] - [starting_rule.name] -[starting_rule.cost + starting_rule.scaled_times * starting_rule.scaling_cost] threat") if(starting_rule.flags & HIGHLANDER_RULESET) highlander_executed = TRUE else if(starting_rule.flags & ONLY_RULESET) only_ruleset_executed = TRUE executed_rules += starting_rule - if (starting_rule.persistent) - current_rules += starting_rule - for(var/mob/M in starting_rule.assigned) - for (var/datum/dynamic_ruleset/roundstart/rule in roundstart_rules) - if (!rule.ready()) - drafted_rules -= rule // And removing rules that are no longer elligible + for(var/datum/dynamic_ruleset/roundstart/rule in drafted_rules) + if(check_blocking(rule.blocking_rules, executed_rules)) + drafted_rules -= rule + if(highlander_executed && rule.flags & HIGHLANDER_RULESET) + drafted_rules -= rule + if(!rule.ready()) + drafted_rules -= rule // And removing rules that are no longer eligible return TRUE else stack_trace("The starting rule \"[starting_rule.name]\" failed to pre_execute.") return FALSE -/// Executes delayed roundstart rules and has a hack in it. -/datum/game_mode/dynamic/proc/execute_delayed(datum/dynamic_ruleset/roundstart/delayed/rule) - update_playercounts() - rule.candidates = current_players[CURRENT_LIVING_PLAYERS].Copy() - rule.trim_candidates() +/// Mainly here to facilitate delayed rulesets. All roundstart rulesets are executed with a timered callback to this proc. +/datum/game_mode/dynamic/proc/execute_roundstart_rule(sent_rule) + var/datum/dynamic_ruleset/rule = sent_rule if(rule.execute()) - executed_rules += rule - if (rule.persistent) + if(rule.persistent) current_rules += rule return TRUE - else - stack_trace("The delayed roundstart rule \"[rule.name]\" failed to execute.") - return FALSE + rule.clean_up() // Refund threat, delete teams and so on. + executed_rules -= rule + stack_trace("The starting rule \"[rule.name]\" failed to execute.") + return FALSE /// Picks a random midround OR latejoin rule from the list given as an argument and executes it. /// Also this could be named better. @@ -477,7 +546,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) var/datum/dynamic_ruleset/rule = pickweight(drafted_rules) if(!rule) return FALSE - + if(!forced) if(only_ruleset_executed) return FALSE @@ -489,23 +558,75 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) rule = pickweight(drafted_rules) // Check if the ruleset is highlander and if a highlander ruleset has been executed else if(rule.flags & HIGHLANDER_RULESET) - if(threat < GLOB.dynamic_stacking_limit && GLOB.dynamic_no_stacking) + if(threat_level > GLOB.dynamic_stacking_limit && GLOB.dynamic_no_stacking) if(highlander_executed) drafted_rules -= rule if(drafted_rules.len <= 0) return FALSE rule = pickweight(drafted_rules) - + if(!rule.repeatable) if(rule.ruletype == "Latejoin") latejoin_rules = remove_from_list(latejoin_rules, rule.type) - else if(rule.type == "Midround") + else if(rule.ruletype == "Midround") midround_rules = remove_from_list(midround_rules, rule.type) - + else if(rule.ruletype == "Event") + events = remove_from_list(events,rule.type) + addtimer(CALLBACK(src, /datum/game_mode/dynamic/.proc/execute_midround_latejoin_rule, rule), rule.delay) + return TRUE + +/// An experimental proc to allow admins to call rules on the fly or have rules call other rules. +/datum/game_mode/dynamic/proc/picking_specific_rule(ruletype, forced = FALSE) + var/datum/dynamic_ruleset/midround/new_rule + if(ispath(ruletype)) + new_rule = new ruletype() // You should only use it to call midround rules though. + else if(istype(ruletype, /datum/dynamic_ruleset)) + new_rule = ruletype + else + return FALSE + + if(!new_rule) + return FALSE + + if(!forced) + if(only_ruleset_executed) + return FALSE + // Check if a blocking ruleset has been executed. + else if(check_blocking(new_rule.blocking_rules, executed_rules)) + return FALSE + // Check if the ruleset is highlander and if a highlander ruleset has been executed + else if(new_rule.flags & HIGHLANDER_RULESET) + if(threat_level > GLOB.dynamic_stacking_limit && GLOB.dynamic_no_stacking) + if(highlander_executed) + return FALSE + + update_playercounts() + if ((forced || (new_rule.acceptable(current_players[CURRENT_LIVING_PLAYERS].len, threat_level) && new_rule.cost <= threat))) + new_rule.trim_candidates() + if (new_rule.ready(forced)) + spend_threat(new_rule.cost) + log_threat("[new_rule.ruletype] - [new_rule.name] -[new_rule.cost] threat") + if (new_rule.execute()) // This should never fail since ready() returned 1 + if(new_rule.flags & HIGHLANDER_RULESET) + highlander_executed = TRUE + else if(new_rule.flags & ONLY_RULESET) + only_ruleset_executed = TRUE + log_game("DYNAMIC: Making a call to a specific ruleset...[new_rule.name]!") + executed_rules += new_rule + if (new_rule.persistent) + current_rules += new_rule + return TRUE + else if (forced) + log_game("DYNAMIC: The ruleset [new_rule.name] couldn't be executed due to lack of eligible players.") + return FALSE + +/// Mainly here to facilitate delayed rulesets. All midround/latejoin rulesets are executed with a timered callback to this proc. +/datum/game_mode/dynamic/proc/execute_midround_latejoin_rule(sent_rule) + var/datum/dynamic_ruleset/rule = sent_rule if (rule.execute()) log_game("DYNAMIC: Injected a [rule.ruletype == "latejoin" ? "latejoin" : "midround"] ruleset [rule.name].") spend_threat(rule.cost) - threat_log += "[worldtime2text()]: [rule.ruletype] [rule.name] spent [rule.cost]" + log_threat("[rule.ruletype] [rule.name] spent [rule.cost]") if(rule.flags & HIGHLANDER_RULESET) highlander_executed = TRUE else if(rule.flags & ONLY_RULESET) @@ -519,54 +640,8 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) if (rule.persistent) current_rules += rule return TRUE - else - stack_trace("The [rule.ruletype] rule \"[rule.name]\" failed to execute.") - return FALSE - -/// An experimental proc to allow admins to call rules on the fly or have rules call other rules. -/datum/game_mode/dynamic/proc/picking_specific_rule(ruletype, forced = FALSE) - var/datum/dynamic_ruleset/midround/new_rule - if(ispath(ruletype)) - new_rule = new ruletype() // You should only use it to call midround rules though. - else if(istype(ruletype, /datum/dynamic_ruleset)) - new_rule = ruletype - else - return FALSE - - if(!new_rule) - return FALSE - - if(!forced) - if(only_ruleset_executed) - return FALSE - // Check if a blocking ruleset has been executed. - else if(check_blocking(new_rule.blocking_rules, executed_rules)) - return FALSE - // Check if the ruleset is highlander and if a highlander ruleset has been executed - else if(new_rule.flags & HIGHLANDER_RULESET) - if(threat < GLOB.dynamic_stacking_limit && GLOB.dynamic_no_stacking) - if(highlander_executed) - return FALSE - - update_playercounts() - if ((forced || (new_rule.acceptable(current_players[CURRENT_LIVING_PLAYERS].len, threat_level) && new_rule.cost <= threat))) - new_rule.candidates = current_players.Copy() - new_rule.trim_candidates() - if (new_rule.ready(forced)) - spend_threat(new_rule.cost) - threat_log += "[worldtime2text()]: Forced rule [new_rule.name] spent [new_rule.cost]" - if (new_rule.execute()) // This should never fail since ready() returned 1 - if(new_rule.flags & HIGHLANDER_RULESET) - highlander_executed = TRUE - else if(new_rule.flags & ONLY_RULESET) - only_ruleset_executed = TRUE - log_game("DYNAMIC: Making a call to a specific ruleset...[new_rule.name]!") - executed_rules += new_rule - if (new_rule.persistent) - current_rules += new_rule - return TRUE - else if (forced) - log_game("DYNAMIC: The ruleset [new_rule.name] couldn't be executed due to lack of elligible players.") + rule.clean_up() + stack_trace("The [rule.ruletype] rule \"[rule.name]\" failed to execute.") return FALSE /datum/game_mode/dynamic/process() @@ -581,35 +656,54 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) if (midround_injection_cooldown < world.time) if (GLOB.dynamic_forced_extended) return - - // Somehow it manages to trigger midround multiple times so this was moved here. + + // Somehow it managed to trigger midround multiple times so this was moved here. // There is no way this should be able to trigger an injection twice now. 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) - + // Time to inject some threat into the round if(EMERGENCY_ESCAPED_OR_ENDGAMED) // Unless the shuttle is gone return + message_admins("DYNAMIC: Checking for midround injection.") + log_game("DYNAMIC: Checking for midround injection.") - log_game("DYNAMIC: Checking state of the round.") - update_playercounts() - - if (prob(get_injection_chance())) + if (get_injection_chance()) + var/cur_threat_frac = threat/threat_level var/list/drafted_rules = list() + var/antag_num = current_players[CURRENT_LIVING_ANTAGS].len for (var/datum/dynamic_ruleset/midround/rule in midround_rules) + // if there are antags OR the rule is an antag rule, antag_acceptable will be true. if (rule.acceptable(current_players[CURRENT_LIVING_PLAYERS].len, threat_level) && threat >= rule.cost) // Classic secret : only autotraitor/minor roles if (GLOB.dynamic_classic_secret && !((rule.flags & TRAITOR_RULESET) || (rule.flags & MINOR_RULESET))) continue - rule.candidates = list() - rule.candidates = current_players.Copy() rule.trim_candidates() - if (rule.ready() && rule.candidates.len > 0) - drafted_rules[rule] = rule.get_weight() + if (rule.ready()) + if(!antag_num) + drafted_rules[rule] = round(rule.get_weight() + (rule.cost * cur_threat_frac)) + else + drafted_rules[rule] = rule.get_weight() if (drafted_rules.len > 0) picking_midround_latejoin_rule(drafted_rules) - + else + midround_injection_cooldown = (midround_injection_cooldown + world.time)/2 + + if(event_injection_cooldown < world.time) + var/event_injection_cooldown_middle = 0.5*(GLOB.dynamic_event_delay_max + GLOB.dynamic_event_delay_min) + event_injection_cooldown = (round(CLAMP(EXP_DISTRIBUTION(event_injection_cooldown_middle), GLOB.dynamic_event_delay_min, GLOB.dynamic_event_delay_max)) + world.time) + message_admins("DYNAMIC: Doing event injection.") + log_game("DYNAMIC: Doing event injection.") + update_playercounts() + var/list/drafted_rules = list() + for(var/datum/dynamic_ruleset/event/rule in events) + if(rule.acceptable(current_players[CURRENT_LIVING_PLAYERS].len, threat_level) && threat >= rule.cost) + if(rule.ready()) + drafted_rules[rule] = rule.get_weight() + if(drafted_rules.len > 0) + picking_midround_latejoin_rule(drafted_rules) + /// Updates current_players. /datum/game_mode/dynamic/proc/update_playercounts() current_players[CURRENT_LIVING_PLAYERS] = list() @@ -641,7 +735,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) var/high_pop_factor = (current_players[CURRENT_LIVING_PLAYERS].len >= GLOB.dynamic_high_pop_limit) var/max_pop_per_antag = max(5,15 - round(threat_level/10) - round(current_players[CURRENT_LIVING_PLAYERS].len/(high_pop_factor ? 10 : 5))) if (!current_players[CURRENT_LIVING_ANTAGS].len) - chance += 50 // No antags at all? let's boost those odds! + chance += 80 // No antags at all? let's boost those odds! else var/current_pop_per_antag = current_players[CURRENT_LIVING_PLAYERS].len / current_players[CURRENT_LIVING_ANTAGS].len if (current_pop_per_antag > max_pop_per_antag) @@ -704,11 +798,11 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) // Classic secret : only autotraitor/minor roles if (GLOB.dynamic_classic_secret && !((rule.flags & TRAITOR_RULESET) || (rule.flags & MINOR_RULESET))) continue - // No stacking : only one round-enter, unless > stacking_limit threat. - if (threat < GLOB.dynamic_stacking_limit && GLOB.dynamic_no_stacking) + // No stacking : only one round-ender, unless threat level > stacking_limit. + if (threat_level > GLOB.dynamic_stacking_limit && GLOB.dynamic_no_stacking) if(rule.flags & HIGHLANDER_RULESET && highlander_executed) continue - + rule.candidates = list(newPlayer) rule.trim_candidates() if (rule.ready()) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets.dm b/code/game/gamemodes/dynamic/dynamic_rulesets.dm index 011b6ec251..0c8ec0a2b8 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets.dm @@ -1,22 +1,28 @@ +#define EXTRA_RULESET_PENALTY 20 // Changes how likely a gamemode is to scale based on how many other roundstart rulesets are waiting to be rolled. +#define POP_SCALING_PENALTY 50 // Discourages scaling up rulesets if ratio of antags to crew is high. + +#define REVOLUTION_VICTORY 1 +#define STATION_VICTORY 2 + /datum/dynamic_ruleset /// For admin logging and round end screen. var/name = "" /// For admin logging and round end screen, do not change this unless making a new rule type. - var/ruletype = "" + 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 + 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) - var/repeatable = FALSE + var/repeatable = FALSE /// If set higher than 0 decreases weight by itself causing the ruleset to appear less often the more it is repeated. - var/repeatable_weight_decrease = 2 + var/repeatable_weight_decrease = 2 /// List of players that are being drafted for this rule - var/list/mob/candidates = list() + var/list/mob/candidates = list() /// List of players that were selected for this rule - var/list/datum/mind/assigned = list() + var/list/datum/mind/assigned = list() /// Preferences flag such as ROLE_WIZARD that need to be turned on for players to be antag - var/antag_flag = null + var/antag_flag = null /// The antagonist datum that is assigned to the mobs mind on ruleset execution. var/datum/antagonist/antag_datum = null /// The required minimum account age for this ruleset. @@ -24,19 +30,25 @@ /// If set, and config flag protect_roles_from_antagonist is false, then the rule will not pick players from these roles. var/list/protected_roles = list() /// If set, rule will deny candidates from those roles always. - var/list/restricted_roles = list() + var/list/restricted_roles = list() /// If set, rule will only accept candidates from those roles, IMPORTANT: DOES NOT WORK ON ROUNDSTART RULESETS. - var/list/exclusive_roles = list() + var/list/exclusive_roles = list() /// If set, there needs to be a certain amount of players doing those roles (among the players who won't be drafted) for the rule to be drafted IMPORTANT: DOES NOT WORK ON ROUNDSTART RULESETS. - var/list/enemy_roles = list() + var/list/enemy_roles = list() /// If enemy_roles was set, this is the amount of enemy job workers needed per threat_level range (0-10,10-20,etc) IMPORTANT: DOES NOT WORK ON ROUNDSTART RULESETS. - var/required_enemies = list(1,1,0,0,0,0,0,0,0,0) + var/required_enemies = list(1,1,0,0,0,0,0,0,0,0) /// The rule needs this many candidates (post-trimming) to be executed (example: Cult needs 4 players at round start) - var/required_candidates = 0 + var/required_candidates = 0 /// 1 -> 9, probability for this rule to be picked against other rules - var/weight = 5 + var/weight = 5 /// Threat cost for this rule, this is decreased from the mode's threat when the rule is executed. - var/cost = 0 + var/cost = 0 + /// Cost per level the rule scales up. + var/scaling_cost = 0 + /// How many times a rule has scaled up upon getting picked. + var/scaled_times = 0 + /// Used for the roundend report + var/total_cost = 0 /// A flag that determines how the ruleset is handled /// HIGHLANDER_RULESET are rulesets can end the round. /// TRAITOR_RULESET and MINOR_RULESET can't end the round and have no difference right now. @@ -46,20 +58,28 @@ /// Requirements are the threat level requirements per pop range. /// With the default values, The rule will never get drafted below 10 threat level (aka: "peaceful extended"), and it requires a higher threat level at lower pops. var/list/requirements = list(40,30,20,10,10,10,10,10,10,10) - /// An alternative, static requirement used instead when pop is over mode's high_pop_limit. + /// An alternative, static requirement used instead when pop is over mode's high_pop_limit. var/high_population_requirement = 10 /// Reference to the mode, use this instead of SSticker.mode. var/datum/game_mode/dynamic/mode = null /// If a role is to be considered another for the purpose of banning. - var/antag_flag_override = null + var/antag_flag_override = null /// If a ruleset type which is in this list has been executed, then the ruleset will not be executed. var/list/blocking_rules = list() - /// The minimum amount of players required for the rule to be considered. + /// The minimum amount of players required for the rule to be considered. var/minimum_players = 0 /// The maximum amount of players required for the rule to be considered. - /// Anything below zero or exactly zero is ignored. + /// Anything below zero or exactly zero is ignored. var/maximum_players = 0 - + /// Calculated during acceptable(), used in scaling and team sizes. + var/indice_pop = 0 + /// Population scaling. Used by team antags and scaling for solo antags. + var/list/antag_cap = list() + /// Base probability used in scaling. The higher it is, the more likely to scale. Kept as a var to allow for config editing._SendSignal(sigtype, list/arguments) + var/base_prob = 60 + /// Delay for when execute will get called from the time of post_setup (roundstart) or process (midround/latejoin). + /// Make sure your ruleset works with execute being called during the game when using this, and that the clean_up proc reverts it properly in case of faliure. + var/delay = 0 /datum/dynamic_ruleset/New() ..() @@ -87,10 +107,6 @@ /datum/dynamic_ruleset/roundstart // One or more of those drafted at roundstart ruletype = "Roundstart" -/datum/dynamic_ruleset/roundstart/delayed/ // Executed with a 30 seconds delay - var/delay = 30 SECONDS - var/required_type = /mob/living/carbon/human // No ghosts, new players or silicons allowed. - // Can be drafted when a player joins the server /datum/dynamic_ruleset/latejoin ruletype = "Latejoin" @@ -103,17 +119,48 @@ if(maximum_players > 0 && population > maximum_players) return FALSE if (population >= GLOB.dynamic_high_pop_limit) - return (threat_level >= high_population_requirement) + indice_pop = 10 + if(threat_level < high_population_requirement) + log_game("DYNAMIC: [name] did not reach threat level threshold: [threat_level]/[high_population_requirement]") + return FALSE + else + return TRUE else pop_per_requirement = pop_per_requirement > 0 ? pop_per_requirement : mode.pop_per_requirement - var/indice_pop = min(10,round(population/pop_per_requirement)+1) - return (threat_level >= requirements[indice_pop]) + if(antag_cap.len && requirements.len != antag_cap.len) + message_admins("DYNAMIC: requirements and antag_cap lists have different lengths in ruleset [name]. Likely config issue, report this.") + log_game("DYNAMIC: requirements and antag_cap lists have different lengths in ruleset [name]. Likely config issue, report this.") + indice_pop = min(requirements.len,round(population/pop_per_requirement)+1) + if(threat_level < requirements[indice_pop]) + log_game("DYNAMIC: [name] did not reach threat level threshold: [threat_level]/[requirements[indice_pop]]") + return FALSE + else + return TRUE + +/// Called when a suitable rule is picked during roundstart(). Will some times attempt to scale a rule up when there is threat remaining. Returns the amount of scaled steps. +/datum/dynamic_ruleset/proc/scale_up(extra_rulesets = 0, remaining_threat_level = 0) + remaining_threat_level -= cost + if(scaling_cost && scaling_cost <= remaining_threat_level) // Only attempts to scale the modes with a scaling cost explicitly set. + var/new_prob + var/pop_to_antags = (mode.antags_rolled + (antag_cap[indice_pop] * (scaled_times + 1))) / mode.roundstart_pop_ready + log_game("DYNAMIC: [name] roundstart ruleset attempting to scale up with [extra_rulesets] rulesets waiting and [remaining_threat_level] threat remaining.") + for(var/i in 1 to 3) //Can scale a max of 3 times + if(remaining_threat_level >= scaling_cost && pop_to_antags < 0.25) + new_prob = base_prob + (remaining_threat_level) - (scaled_times * scaling_cost) - (extra_rulesets * EXTRA_RULESET_PENALTY) - (pop_to_antags * POP_SCALING_PENALTY) + if (!prob(new_prob)) + break + remaining_threat_level -= scaling_cost + scaled_times++ + pop_to_antags = (mode.antags_rolled + (antag_cap[indice_pop] * (scaled_times + 1))) / mode.roundstart_pop_ready + log_game("DYNAMIC: [name] roundstart ruleset failed scaling up at [new_prob ? new_prob : 0]% chance after [scaled_times]/3 successful scaleups. [remaining_threat_level] threat remaining, antag to crew ratio: [pop_to_antags*100]%.") + mode.antags_rolled += (1 + scaled_times) * antag_cap[indice_pop] + return scaled_times * scaling_cost /// This is called if persistent variable is true everytime SSTicker ticks. /datum/dynamic_ruleset/proc/rule_process() return -/// Called on game mode pre_setup, used for non-delayed roundstart rulesets only. +/// Called on game mode pre_setup for roundstart rulesets. /// Do everything you need to do before job is assigned here. /// IMPORTANT: ASSIGN special_role HERE /datum/dynamic_ruleset/proc/pre_execute() @@ -126,20 +173,20 @@ M.add_antag_datum(antag_datum) return TRUE -/// Called after delay set in ruleset. -/// Give your candidates or assignees equipment and antag datum here. -/datum/dynamic_ruleset/roundstart/delayed/execute() - if (SSticker && SSticker.current_state < GAME_STATE_PLAYING) - CRASH("The delayed ruleset [name] executed before the round started.") - /// Here you can perform any additional checks you want. (such as checking the map etc) /// Remember that on roundstart no one knows what their job is at this point. /// IMPORTANT: If ready() returns TRUE, that means pre_execute() or execute() should never fail! -/datum/dynamic_ruleset/proc/ready(forced = 0) - if (required_candidates > candidates.len) +/datum/dynamic_ruleset/proc/ready(forced = 0) + if (required_candidates > candidates.len) return FALSE return TRUE +/// Runs from gamemode process() if ruleset fails to start, like delayed rulesets not getting valid candidates. +/// This one only handles refunding the threat, override in ruleset to clean up the rest. +/datum/dynamic_ruleset/proc/clean_up() + mode.refund_threat(cost + (scaled_times * scaling_cost)) + mode.log_threat("[ruletype] [name] refunded [cost + (scaled_times * scaling_cost)]",verbose=TRUE) + /// Gets weight of the ruleset /// Note that this decreases weight if repeatable is TRUE and repeatable_weight_decrease is higher than 0 /// Note: If you don't want repeatable rulesets to decrease their weight use the weight variable directly @@ -156,14 +203,6 @@ /datum/dynamic_ruleset/proc/trim_candidates() return -/// Counts how many players are ready at roundstart. -/// Used only by non-delayed roundstart rulesets. -/datum/dynamic_ruleset/proc/num_players() - . = 0 - for(var/mob/dead/new_player/P in GLOB.player_list) - if(P.client && P.ready == PLAYER_READY_TO_PLAY) - . ++ - /// Set mode result and news report here. /// Only called if ruleset is flagged as HIGHLANDER_RULESET /datum/dynamic_ruleset/proc/round_result() @@ -191,32 +230,14 @@ if(P.mind.special_role) // We really don't want to give antag to an antag. candidates.Remove(P) continue - if (!(antag_flag in P.client.prefs.be_special) || jobban_isbanned(P.ckey, list(antag_flag, ROLE_SYNDICATE)) || (antag_flag_override && jobban_isbanned(P.ckey, list(antag_flag_override, ROLE_SYNDICATE))))//are they willing and not antag-banned? - candidates.Remove(P) - continue - -/// Checks if candidates are required mob type, connected, banned and if the job is exclusive to the role. -/datum/dynamic_ruleset/roundstart/delayed/trim_candidates() - . = ..() - for (var/mob/P in candidates) - if (!istype(P, required_type)) - candidates.Remove(P) // Can be a new_player, etc. - continue - if(!mode.check_age(P.client, minimum_required_age)) - candidates.Remove(P) - continue - if (!P.client || !P.mind || !P.mind.assigned_role) // Are they connected? - candidates.Remove(P) - continue - if(P.mind.special_role || P.mind.antag_datums?.len > 0) // Are they an antag already? - candidates.Remove(P) - continue - if (!(antag_flag in P.client.prefs.be_special) || jobban_isbanned(P.ckey, list(antag_flag, ROLE_SYNDICATE)) || (antag_flag_override && jobban_isbanned(P.ckey, list(antag_flag_override, ROLE_SYNDICATE))))//are they willing and not antag-banned? - candidates.Remove(P) - continue - if ((exclusive_roles.len > 0) && !(P.mind.assigned_role in exclusive_roles)) // Is the rule exclusive to their job? - candidates.Remove(P) - continue + if(antag_flag_override) + if(!(antag_flag_override in P.client.prefs.be_special) || jobban_isbanned(P.ckey, antag_flag_override)) + candidates.Remove(P) + continue + else + if(!(antag_flag in P.client.prefs.be_special) || jobban_isbanned(P.ckey, antag_flag)) + candidates.Remove(P) + continue /// Do your checks if the ruleset is ready to be executed here. /// Should ignore certain checks if forced is TRUE diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_events.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_events.dm new file mode 100644 index 0000000000..4ac8cc91d3 --- /dev/null +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_events.dm @@ -0,0 +1,345 @@ +/datum/dynamic_ruleset/event + ruletype = "Event" + var/typepath // typepath of the event + var/triggering + +/datum/dynamic_ruleset/event/execute() + var/datum/round_event/E = new typepath() + E.current_players = get_active_player_count(alive_check = 1, afk_check = 1, human_check = 1) + // E.control = src // can't be done! we just don't use events that require these, those can be from_ghost almost always + + testing("[time2text(world.time, "hh:mm:ss")] [E.type]") + deadchat_broadcast("[name] has just been triggered by dynamic!") + log_game("Random Event triggering: [name] ([typepath])") + + return E + +/datum/dynamic_ruleset/event/ready(forced = FALSE) // same as midround cause we're still using enemy system + if (!forced) + var/job_check = 0 + if (enemy_roles.len > 0) + for (var/mob/M in mode.current_players[CURRENT_LIVING_PLAYERS]) + if (M.stat == DEAD) + continue // Dead players cannot count as opponents + if (M.mind && M.mind.assigned_role && (M.mind.assigned_role in enemy_roles)) + job_check++ // Checking for "enemies" (such as sec officers). To be counters, they must either not be candidates to that rule, or have a job that restricts them from it + + var/threat = round(mode.threat_level/10) + if (job_check < required_enemies[threat]) + return FALSE + return TRUE + +////////////////////////////////////////////// +// // +// PIRATES // +// // +////////////////////////////////////////////// + +/datum/dynamic_ruleset/event/pirates + name = "Space Pirates" + config_tag = "pirates" + typepath = /datum/round_event/pirates + antag_flag = ROLE_TRAITOR + enemy_roles = list("AI","Security Officer","Head of Security","Captain") + required_enemies = list(2,2,1,1,0,0,0,0,0,0) + weight = 5 + cost = 10 + blocking_rules = list(/datum/dynamic_ruleset/roundstart/nuclear,/datum/dynamic_ruleset/midround/from_ghosts/nuclear) + requirements = list(70,60,50,50,40,40,40,30,20,15) + high_population_requirement = 15 + +/datum/dynamic_ruleset/event/pirates/ready(forced = FALSE) + if (!SSmapping.empty_space) + return FALSE + return ..() + +////////////////////////////////////////////// +// // +// SPIDERS // +// // +////////////////////////////////////////////// + +/datum/dynamic_ruleset/event/spiders + name = "Spider Infestation" + config_tag = "spiders" + typepath = /datum/round_event/spider_infestation + enemy_roles = list("AI","Security Officer","Head of Security","Captain") + required_enemies = list(2,2,1,1,0,0,0,0,0,0) + weight = 5 + cost = 10 + requirements = list(70,60,50,50,40,40,40,30,20,15) + high_population_requirement = 15 + +////////////////////////////////////////////// +// // +// CLOGGED VENTS // +// // +////////////////////////////////////////////// + +/datum/dynamic_ruleset/event/ventclog + name = "Clogged Vents" + config_tag = "ventclog" + typepath = /datum/round_event/vent_clog + enemy_roles = list("Chemist","Medical Doctor","Chief Medical Officer") + required_enemies = list(1,1,1,0,0,0,0,0,0,0) + cost = 2 + weight = 4 + repeatable_weight_decrease = 3 + requirements = list(5,5,5,5,5,5,5,5,5,5) // yes, can happen on fake-extended + high_population_requirement = 5 + repeatable = TRUE + +/datum/dynamic_ruleset/event/ventclog/ready() + if(mode.threat_level > 30 && mode.threat >= 5 && prob(20)) + name = "Clogged Vents: Threatening" + cost = 5 + required_enemies = list(3,3,3,2,2,2,1,1,1,1) + typepath = /datum/round_event/vent_clog/threatening + else if(mode.threat_level > 15 && mode.threat > 15 && prob(30)) + name = "Clogged Vents: Catastrophic" + cost = 15 + required_enemies = list(2,2,1,1,1,1,0,0,0,0) + typepath = /datum/round_event/vent_clog/catastrophic + else + cost = 2 + name = "Clogged Vents: Normal" + required_enemies = list(1,1,1,0,0,0,0,0,0,0) + typepath = /datum/round_event/vent_clog + return ..() + +////////////////////////////////////////////// +// // +// ION STORM // +// // +////////////////////////////////////////////// + +/datum/dynamic_ruleset/event/ion_storm + name = "Ion Storm" + config_tag = "ion_storm" + typepath = /datum/round_event/ion_storm + enemy_roles = list("Research Director","Captain","Chief Engineer") + required_enemies = list(1,1,0,0,0,0,0,0,0,0) + weight = 4 + // no repeatable weight decrease. too variable to be unfun multiple times in one round + cost = 3 + requirements = list(5,5,5,5,5,5,5,5,5,5) + high_population_requirement = 5 + repeatable = TRUE + +////////////////////////////////////////////// +// // +// METEORS // +// // +////////////////////////////////////////////// + +/datum/dynamic_ruleset/event/meteor_wave + name = "Meteor Wave" + config_tag = "meteor_wave" + typepath = /datum/round_event/meteor_wave + enemy_roles = list("Chief Engineer","Station Engineer","Atmospheric Technician","Captain","Cyborg") + required_enemies = list(3,3,3,3,3,3,3,3,3,3) + cost = 15 + weight = 3 + repeatable_weight_decrease = 2 + requirements = list(60,50,40,30,30,30,30,30,30,30) + high_population_requirement = 30 + +/datum/dynamic_ruleset/event/meteor_wave/ready() + if(mode.threat_level > 40 && mode.threat >= 25 && prob(20)) + cost = 25 + typepath = /datum/round_event/meteor_wave/threatening + else if(mode.threat_level > 50 && mode.threat >= 40 && prob(30)) + cost = 40 + typepath = /datum/round_event/meteor_wave/catastrophic + else + cost = 15 + typepath = /datum/round_event/meteor_wave + return ..() + +////////////////////////////////////////////// +// // +// ANOMALIES // +// // +////////////////////////////////////////////// + +/datum/dynamic_ruleset/event/anomaly_bluespace + name = "Anomaly: Bluespace" + config_tag = "anomaly_bluespace" + typepath = /datum/round_event/anomaly/anomaly_bluespace + enemy_roles = list("Chief Engineer","Station Engineer","Atmospheric Technician","Research Director","Scientist","Captain") + required_enemies = list(1,1,1,0,0,0,0,0,0,0) + weight = 2 + repeatable_weight_decrease = 1 + cost = 3 + requirements = list(5,5,5,5,5,5,5,5,5,5) + high_population_requirement = 5 + repeatable = TRUE + +/datum/dynamic_ruleset/event/anomaly_flux + name = "Anomaly: Hyper-Energetic Flux" + config_tag = "anomaly_flux" + typepath = /datum/round_event/anomaly/anomaly_flux + enemy_roles = list("Chief Engineer","Station Engineer","Atmospheric Technician","Research Director","Scientist","Captain") + required_enemies = list(1,1,1,0,0,0,0,0,0,0) + weight = 2 + repeatable_weight_decrease = 1 + cost = 5 + requirements = list(5,5,5,5,5,5,5,5,5,5) + high_population_requirement = 10 + repeatable = TRUE + +/datum/dynamic_ruleset/event/anomaly_gravitational + name = "Anomaly: Gravitational" + config_tag = "anomaly_gravitational" + typepath = /datum/round_event/anomaly/anomaly_grav + weight = 2 + repeatable_weight_decrease = 1 + cost = 3 + requirements = list(5,5,5,5,5,5,5,5,5,5) + high_population_requirement = 5 + repeatable = TRUE + +/datum/dynamic_ruleset/event/anomaly_pyroclastic + name = "Anomaly: Pyroclastic" + config_tag = "anomaly_pyroclastic" + typepath = /datum/round_event/anomaly/anomaly_pyro + weight = 2 + repeatable_weight_decrease = 1 + cost = 5 + enemy_roles = list("Chief Engineer","Station Engineer","Atmospheric Technician","Research Director","Scientist","Captain","Cyborg") + required_enemies = list(1,1,1,1,1,1,1,1,1,1) + requirements = list(10,10,10,10,10,10,10,10,10,10) + high_population_requirement = 10 + repeatable = TRUE + +/datum/dynamic_ruleset/event/anomaly_vortex + name = "Anomaly: Vortex" + config_tag = "anomaly_vortex" + typepath = /datum/round_event/anomaly/anomaly_vortex + weight = 2 + repeatable_weight_decrease = 1 + cost = 5 + enemy_roles = list("Chief Engineer","Station Engineer","Atmospheric Technician","Research Director","Scientist","Captain","Cyborg") + required_enemies = list(1,1,1,1,1,1,1,1,1,1) + requirements = list(10,10,10,10,10,10,10,10,10,10) + high_population_requirement = 10 + repeatable = TRUE + +////////////////////////////////////////////// +// // +// WOW THAT'S A LOT OF EVENTS // +// // +////////////////////////////////////////////// + +/datum/dynamic_ruleset/event/brand_intelligence + name = "Brand Intelligence" + config_tag = "brand_intelligence" + typepath = /datum/round_event/brand_intelligence + weight = 1 + repeatable_weight_decrease = 1 + cost = 2 + enemy_roles = list("Chief Engineer","Station Engineer","Atmospheric Technician","Research Director","Scientist","Captain","Cyborg") + required_enemies = list(1,1,1,1,0,0,0,0,0,0) + requirements = list(10,10,10,10,10,10,10,10,10,10) + high_population_requirement = 10 + repeatable = TRUE + +/datum/dynamic_ruleset/event/carp_migration + name = "Carp Migration" + config_tag = "carp_migration" + typepath = /datum/round_event/carp_migration + weight = 7 + repeatable_weight_decrease = 3 + cost = 4 + requirements = list(10,10,10,10,10,10,10,10,10,10) + high_population_requirement = 10 + repeatable = TRUE + +/datum/dynamic_ruleset/event/communications_blackout + name = "Communications Blackout" + config_tag = "communications_blackout" + typepath = /datum/round_event/communications_blackout + cost = 4 + weight = 2 + repeatable_weight_decrease = 3 + enemy_roles = list("Chief Engineer","Station Engineer") + required_enemies = list(1,1,1,0,0,0,0,0,0,0) + requirements = list(5,5,5,5,5,5,5,5,5,5) + high_population_requirement = 5 + repeatable = TRUE + +/datum/dynamic_ruleset/event/processor_overload + name = "Processor Overload" + config_tag = "processor_overload" + typepath = /datum/round_event/processor_overload + cost = 4 + weight = 2 + repeatable_weight_decrease = 3 + enemy_roles = list("Chief Engineer","Station Engineer") + required_enemies = list(1,1,1,0,0,0,0,0,0,0) + requirements = list(5,5,5,5,5,5,5,5,5,5) + high_population_requirement = 5 + repeatable = TRUE + +/datum/dynamic_ruleset/event/space_dust + name = "Minor Space Dust" + config_tag = "space_dust" + typepath = /datum/round_event/space_dust + cost = 2 + weight = 2 + repeatable_weight_decrease = 1 + enemy_roles = list("Chief Engineer","Station Engineer") + required_enemies = list(1,1,1,0,0,0,0,0,0,0) + requirements = list(5,5,5,5,5,5,5,5,5,5) + high_population_requirement = 5 + repeatable = TRUE + +/datum/dynamic_ruleset/event/major_dust + name = "Major Space Dust" + config_tag = "major_dust" + typepath = /datum/round_event/meteor_wave/major_dust + cost = 4 + weight = 2 + repeatable_weight_decrease = 1 + enemy_roles = list("Chief Engineer","Station Engineer") + required_enemies = list(2,2,2,2,2,2,2,2,2,2) + requirements = list(10,10,10,10,10,10,10,10,10,10) + high_population_requirement = 10 + repeatable = TRUE + +/datum/dynamic_ruleset/event/electrical_storm + name = "Electrical Storm" + config_tag = "electrical_storm" + typepath = /datum/round_event/electrical_storm + cost = 1 + weight = 2 + repeatable_weight_decrease = 1 + enemy_roles = list("Chief Engineer","Station Engineer") + required_enemies = list(1,1,1,0,0,0,0,0,0,0) + requirements = list(5,5,5,5,5,5,5,5,5,5) + high_population_requirement = 5 + repeatable = TRUE + +/datum/dynamic_ruleset/event/heart_attack + name = "Random Heart Attack" + config_tag = "heart_attack" + typepath = /datum/round_event/heart_attack + cost = 3 + weight = 2 + repeatable_weight_decrease = 1 + enemy_roles = list("Medical Doctor","Chief Medical Officer") + required_enemies = list(2,2,2,2,2,2,2,2,2,2) + requirements = list(101,101,101,5,5,5,5,5,5,5) + high_population_requirement = 5 + repeatable = TRUE + +/datum/dynamic_ruleset/event/radiation_storm + name = "Radiation Storm" + config_tag = "radiation_storm" + typepath = /datum/round_event/radiation_storm + cost = 3 + weight = 1 + enemy_roles = list("Chemist","Chief Medical Officer","Geneticist","Medical Doctor","AI","Captain") + required_enemies = list(1,1,1,1,1,1,1,1,1,1) + requirements = list(5,5,5,5,5,5,5,5,5,5) + high_population_requirement = 5 diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm index fde020a3ae..5810fd0ae0 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm @@ -12,9 +12,14 @@ if(!mode.check_age(P.client, minimum_required_age)) candidates.Remove(P) continue - if (!(antag_flag in P.client.prefs.be_special) || jobban_isbanned(P.ckey, list(antag_flag, ROLE_SYNDICATE)) || (antag_flag_override && jobban_isbanned(P.ckey, list(antag_flag_override))))//are they willing and not antag-banned? - candidates.Remove(P) - continue + if(antag_flag_override) + if(!(antag_flag_override in P.client.prefs.be_special) || jobban_isbanned(P.ckey, list(antag_flag_override))) + candidates.Remove(P) + continue + else + if(!(antag_flag in P.client.prefs.be_special) || jobban_isbanned(P.ckey, list(antag_flag, ROLE_SYNDICATE))) + candidates.Remove(P) + continue if (P.mind.assigned_role in restricted_roles) // Does their job allow for it? candidates.Remove(P) continue @@ -60,8 +65,8 @@ required_candidates = 1 weight = 7 cost = 5 - requirements = list(40,30,20,10,10,10,10,10,10,10) - high_population_requirement = 10 + requirements = list(40,30,20,15,15,15,15,15,15,15) + high_population_requirement = 15 repeatable = TRUE flags = TRAITOR_RULESET @@ -73,40 +78,138 @@ /datum/dynamic_ruleset/latejoin/provocateur name = "Provocateur" + persistent = TRUE config_tag = "latejoin_revolution" antag_datum = /datum/antagonist/rev/head antag_flag = ROLE_REV_HEAD antag_flag_override = ROLE_REV restricted_roles = list("AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") enemy_roles = list("AI", "Cyborg", "Security Officer","Detective","Head of Security", "Captain", "Warden") - required_enemies = list(2,2,1,1,1,1,1,0,0,0) + required_enemies = list(4,4,3,3,3,3,3,2,2,1) required_candidates = 1 weight = 2 + delay = 1 MINUTES // Prevents rule start while head is offstation. cost = 20 - requirements = list(101,101,70,40,30,20,20,20,20,20) - high_population_requirement = 50 + requirements = list(101,101,70,40,40,40,40,40,40,40) + high_population_requirement = 40 flags = HIGHLANDER_RULESET - var/required_heads = 3 + var/required_heads_of_staff = 3 + var/finished = FALSE + var/datum/team/revolution/revolution /datum/dynamic_ruleset/latejoin/provocateur/ready(forced=FALSE) if (forced) - required_heads = 1 + required_heads_of_staff = 1 if(!..()) return FALSE var/head_check = 0 for(var/mob/player in mode.current_players[CURRENT_LIVING_PLAYERS]) if (player.mind.assigned_role in GLOB.command_positions) head_check++ - return (head_check >= required_heads) + return (head_check >= required_heads_of_staff) /datum/dynamic_ruleset/latejoin/provocateur/execute() - var/mob/M = pick(candidates) - assigned += M.mind - M.mind.special_role = antag_flag - var/datum/antagonist/rev/head/new_head = new() - new_head.give_flash = TRUE - new_head.give_hud = TRUE - new_head.remove_clumsy = TRUE - new_head = M.mind.add_antag_datum(new_head) - new_head.rev_team.max_headrevs = 1 // Only one revhead if it is latejoin. + var/mob/M = pick(candidates) // This should contain a single player, but in case. + if(check_eligible(M.mind)) // Didnt die/run off z-level/get implanted since leaving shuttle. + assigned += M.mind + M.mind.special_role = antag_flag + revolution = new() + var/datum/antagonist/rev/head/new_head = new() + new_head.give_flash = TRUE + new_head.give_hud = TRUE + new_head.remove_clumsy = TRUE + new_head = M.mind.add_antag_datum(new_head, revolution) + revolution.update_objectives() + revolution.update_heads() + SSshuttle.registerHostileEnvironment(src) + return TRUE + else + log_game("DYNAMIC: [ruletype] [name] discarded [M.name] from head revolutionary due to ineligibility.") + log_game("DYNAMIC: [ruletype] [name] failed to get any eligible headrevs. Refunding [cost] threat.") + return FALSE + +/datum/dynamic_ruleset/latejoin/provocateur/rule_process() + if(check_rev_victory()) + finished = REVOLUTION_VICTORY + return RULESET_STOP_PROCESSING + else if (check_heads_victory()) + finished = STATION_VICTORY + SSshuttle.clearHostileEnvironment(src) + priority_announce("It appears the mutiny has been quelled. Please return yourself and your colleagues to work. \ + We have remotely blacklisted the head revolutionaries from your cloning software to prevent accidental cloning.", null, "attention", null, "Central Command Loyalty Monitoring Division") + for(var/datum/mind/M in revolution.members) // Remove antag datums and prevent headrev cloning then restarting rebellions. + if(M.has_antag_datum(/datum/antagonist/rev/head)) + var/datum/antagonist/rev/head/R = M.has_antag_datum(/datum/antagonist/rev/head) + R.remove_revolutionary(FALSE, "gamemode") + var/mob/living/carbon/C = M.current + if(C.stat == DEAD) + C.makeUncloneable() + if(M.has_antag_datum(/datum/antagonist/rev)) + var/datum/antagonist/rev/R = M.has_antag_datum(/datum/antagonist/rev) + R.remove_revolutionary(FALSE, "gamemode") + return RULESET_STOP_PROCESSING + +/// Checks for revhead loss conditions and other antag datums. +/datum/dynamic_ruleset/latejoin/provocateur/proc/check_eligible(var/datum/mind/M) + var/turf/T = get_turf(M.current) + if(!considered_afk(M) && considered_alive(M) && is_station_level(T.z) && !M.antag_datums?.len && !HAS_TRAIT(M, TRAIT_MINDSHIELD)) + return TRUE + return FALSE + +/datum/dynamic_ruleset/latejoin/provocateur/check_finished() + if(finished == REVOLUTION_VICTORY) + return TRUE + else + return ..() + +/datum/dynamic_ruleset/latejoin/provocateur/proc/check_rev_victory() + for(var/datum/objective/mutiny/objective in revolution.objectives) + if(!(objective.check_completion())) + return FALSE return TRUE + +/datum/dynamic_ruleset/latejoin/provocateur/proc/check_heads_victory() + for(var/datum/mind/rev_mind in revolution.head_revolutionaries()) + var/turf/T = get_turf(rev_mind.current) + if(!considered_afk(rev_mind) && considered_alive(rev_mind) && is_station_level(T.z)) + if(ishuman(rev_mind.current) || ismonkey(rev_mind.current)) + return FALSE + return TRUE + +/datum/dynamic_ruleset/latejoin/provocateur/round_result() + if(finished == REVOLUTION_VICTORY) + SSticker.mode_result = "win - heads killed" + SSticker.news_report = REVS_WIN + else if(finished == STATION_VICTORY) + SSticker.mode_result = "loss - rev heads killed" + SSticker.news_report = REVS_LOSE + +////////////////////////////////////////////// +// // +// VAMPIRE // +// // +////////////////////////////////////////////// + +/* +/datum/dynamic_ruleset/latejoin/vampire + name = "vampire" + config_tag = "vampire_latejoin" + antag_flag = ROLE_VAMPIRE + antag_datum = ANTAG_DATUM_VAMPIRE + protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain") + restricted_roles = list("AI", "Cyborg") + required_candidates = 1 + weight = 5 + cost = 15 + requirements = list(80,70,60,50,40,20,20,15,15,15) + repeatable = TRUE + high_population_requirement = 15 + +/datum/dynamic_ruleset/latejoin/vampire/pre_execute() + var/mob/M = pick(candidates) + candidates -= M + assigned += M.mind + M.mind.restricted_roles = restricted_roles + M.mind.special_role = ROLE_VAMPIRE + return TRUE +*/ diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm index f24301d716..8cda402ebf 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm @@ -1,3 +1,6 @@ +#define REVENANT_SPAWN_THRESHOLD 20 +#define ABDUCTOR_MAX_TEAMS 4 // blame TG for not using the defines files + ////////////////////////////////////////////// // // // MIDROUND RULESETS // @@ -8,7 +11,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 mob type the ruleset is restricted to. var/required_type = /mob/living/carbon/human var/list/living_players = list() var/list/living_antags = list() @@ -17,44 +20,49 @@ /datum/dynamic_ruleset/midround/from_ghosts weight = 0 + required_type = /mob/dead/observer /// Whether the ruleset should call generate_ruleset_body or not. var/makeBody = TRUE /datum/dynamic_ruleset/midround/trim_candidates() - // Unlike the previous two types, these rulesets are not meant for /mob/dead/new_player - // And since I want those rulesets to be as flexible as possible, I'm not gonna put much here, // // All you need to know is that here, the candidates list contains 4 lists itself, indexed with the following defines: // Candidates = list(CURRENT_LIVING_PLAYERS, CURRENT_LIVING_ANTAGS, CURRENT_DEAD_PLAYERS, CURRENT_OBSERVERS) // So for example you can get the list of all current dead players with var/list/dead_players = candidates[CURRENT_DEAD_PLAYERS] // Make sure to properly typecheck the mobs in those lists, as the dead_players list could contain ghosts, or dead players still in their bodies. // We're still gonna trim the obvious (mobs without clients, jobbanned players, etc) - living_players = trim_list(mode.current_players[CURRENT_LIVING_PLAYERS]) - living_antags = trim_list(mode.current_players[CURRENT_LIVING_ANTAGS]) - dead_players = trim_list(mode.current_players[CURRENT_DEAD_PLAYERS]) - list_observers = trim_list(mode.current_players[CURRENT_OBSERVERS]) + living_players = trim_list(mode.current_players[CURRENT_LIVING_PLAYERS]) + living_antags = trim_list(mode.current_players[CURRENT_LIVING_ANTAGS]) + list_observers = trim_list(mode.current_players[CURRENT_OBSERVERS]) /datum/dynamic_ruleset/midround/proc/trim_list(list/L = list()) var/list/trimmed_list = L.Copy() - var/antag_name = initial(antag_flag) for(var/mob/M in trimmed_list) if (!istype(M, required_type)) trimmed_list.Remove(M) continue + if (M.GetComponent(/datum/component/virtual_reality)) + trimmed_list.Remove(M) + continue if (!M.client) // Are they connected? trimmed_list.Remove(M) continue if(!mode.check_age(M.client, minimum_required_age)) trimmed_list.Remove(M) continue - if (!(antag_name in M.client.prefs.be_special) || jobban_isbanned(M.ckey, list(antag_name, ROLE_SYNDICATE)))//are they willing and not antag-banned? - trimmed_list.Remove(M) - continue + if(antag_flag_override) + if(!(antag_flag_override in M.client.prefs.be_special) || jobban_isbanned(M.ckey, antag_flag_override)) + trimmed_list.Remove(M) + continue + else + if(!(antag_flag in M.client.prefs.be_special) || jobban_isbanned(M.ckey, antag_flag)) + trimmed_list.Remove(M) + continue if (M.mind) if (restrict_ghost_roles && M.mind.assigned_role in GLOB.exp_specialmap[EXP_TYPE_SPECIAL]) // Are they playing a ghost role? trimmed_list.Remove(M) continue - if (M.mind.assigned_role in restricted_roles || HAS_TRAIT(M, TRAIT_MINDSHIELD)) // Does their job allow it or are they mindshielded? + if (M.mind.assigned_role in restricted_roles) // Does their job allow it? trimmed_list.Remove(M) continue if ((exclusive_roles.len > 0) && !(M.mind.assigned_role in exclusive_roles)) // Is the rule exclusive to their job? @@ -71,7 +79,7 @@ if (!forced) var/job_check = 0 if (enemy_roles.len > 0) - for (var/mob/M in living_players) + for (var/mob/M in mode.current_players[CURRENT_LIVING_PLAYERS]) if (M.stat == DEAD) continue // Dead players cannot count as opponents if (M.mind && M.mind.assigned_role && (M.mind.assigned_role in enemy_roles) && (!(M in candidates) || (M.mind.assigned_role in restricted_roles))) @@ -100,13 +108,13 @@ message_admins("Polling [possible_volunteers.len] players to apply for the [name] ruleset.") 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) + candidates = pollGhostCandidates("The mode is looking for volunteers to become a [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.") + if(!candidates || candidates.len <= required_candidates) + message_admins("The ruleset [name] did not receive enough applications.") + log_game("DYNAMIC: The ruleset [name] did not receive enough applications.") mode.refund_threat(cost) - mode.threat_log += "[worldtime2text()]: Rule [name] refunded [cost] (no applications)" + mode.log_threat("Rule [name] refunded [cost] (not receive enough applications)",verbose=TRUE) mode.executed_rules -= src return @@ -122,7 +130,7 @@ if(i == 1) // We have found no candidates so far and we are out of applicants. mode.refund_threat(cost) - mode.threat_log += "[worldtime2text()]: Rule [name] refunded [cost] (all applications invalid)" + mode.log_threat("Rule [name] refunded [cost] (all applications invalid)",verbose=TRUE) mode.executed_rules -= src break var/mob/applicant = pick(candidates) @@ -145,7 +153,7 @@ finish_setup(new_character, i) assigned += applicant - notify_ghosts("[new_character] has been picked for the ruleset [name]!", source = new_character, action = NOTIFY_ORBIT, header="Something Interesting!") + notify_ghosts("[new_character] has been picked for the ruleset [name]!", source = new_character, action = NOTIFY_ORBIT) /datum/dynamic_ruleset/midround/from_ghosts/proc/generate_ruleset_body(mob/applicant) var/mob/living/carbon/human/new_character = makeBody(applicant) @@ -177,9 +185,9 @@ required_candidates = 1 weight = 7 cost = 10 - requirements = list(50,40,30,20,10,10,10,10,10,10) + requirements = list(30,25,20,15,15,15,15,15,15,15) repeatable = TRUE - high_population_requirement = 10 + high_population_requirement = 15 flags = TRAITOR_RULESET /datum/dynamic_ruleset/midround/autotraitor/acceptable(population = 0, threat = 0) @@ -225,24 +233,24 @@ /datum/dynamic_ruleset/midround/malf name = "Malfunctioning AI" - config_tag = "malf_ai" + config_tag = "midround_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") exclusive_roles = list("AI") - required_enemies = list(4,4,4,4,4,4,2,2,2,0) + required_enemies = list(6,6,6,4,4,4,2,2,2,1) required_candidates = 1 - weight = 3 + weight = 2 cost = 35 - requirements = list(101,101,80,70,60,60,50,50,40,40) - high_population_requirement = 35 + requirements = list(101,101,70,50,50,50,40,30,30,30) + high_population_requirement = 30 required_type = /mob/living/silicon/ai var/ion_announce = 33 var/removeDontImproveChance = 10 /datum/dynamic_ruleset/midround/malf/trim_candidates() ..() - candidates = candidates[CURRENT_LIVING_PLAYERS] + living_players = candidates[CURRENT_LIVING_PLAYERS] for(var/mob/living/player in candidates) if(!isAI(player)) candidates -= player @@ -256,8 +264,7 @@ /datum/dynamic_ruleset/midround/malf/execute() if(!candidates || !candidates.len) return FALSE - var/mob/living/silicon/ai/M = pick(candidates) - candidates -= M + var/mob/living/silicon/ai/M = pick_n_take(candidates) assigned += M.mind var/datum/antagonist/traitor/AI = new M.mind.special_role = antag_flag @@ -279,16 +286,18 @@ /datum/dynamic_ruleset/midround/from_ghosts/wizard name = "Wizard" config_tag = "midround_wizard" + persistent = TRUE antag_datum = /datum/antagonist/wizard antag_flag = ROLE_WIZARD enemy_roles = list("Security Officer","Detective","Head of Security", "Captain") - required_enemies = list(2,2,1,1,1,1,1,0,0,0) + required_enemies = list(4,4,3,2,2,1,1,0,0,0) required_candidates = 1 weight = 1 cost = 20 - requirements = list(90,90,70,40,30,20,10,10,10,10) - high_population_requirement = 50 + requirements = list(90,90,70,50,50,50,50,40,30,30) + high_population_requirement = 30 repeatable = TRUE + var/datum/mind/wizard /datum/dynamic_ruleset/midround/from_ghosts/wizard/ready(forced = FALSE) if (required_candidates > (dead_players.len + list_observers.len)) @@ -303,6 +312,20 @@ ..() new_character.forceMove(pick(GLOB.wizardstart)) +/datum/dynamic_ruleset/midround/from_ghosts/wizard/rule_process() // i can literally copy this from are_special_antags_dead it's great + if(isliving(wizard.current) && wizard.current.stat!=DEAD) + return FALSE + + for(var/obj/item/phylactery/P in GLOB.poi_list) //TODO : IsProperlyDead() + if(P.mind && P.mind.has_antag_datum(/datum/antagonist/wizard)) + return FALSE + + if(SSevents.wizardmode) //If summon events was active, turn it off + SSevents.toggleWizardmode() + SSevents.resetFrequency() + + return RULESET_STOP_PROCESSING + ////////////////////////////////////////////// // // // NUCLEAR OPERATIVES (MIDROUND) // @@ -315,12 +338,12 @@ antag_flag = ROLE_OPERATIVE antag_datum = /datum/antagonist/nukeop enemy_roles = list("AI", "Cyborg", "Security Officer", "Warden","Detective","Head of Security", "Captain") - required_enemies = list(3,3,3,3,3,2,1,1,0,0) + required_enemies = list(5,5,4,3,3,2,2,2,1,1) required_candidates = 5 weight = 5 cost = 35 - requirements = list(90,90,90,80,60,40,30,20,10,10) - high_population_requirement = 10 + requirements = list(90,90,90,80,70,60,50,40,40,40) + high_population_requirement = 40 var/operative_cap = list(2,2,3,3,4,5,5,5,5,5) var/datum/team/nuclear/nuke_team flags = HIGHLANDER_RULESET @@ -328,7 +351,13 @@ /datum/dynamic_ruleset/midround/from_ghosts/nuclear/acceptable(population=0, threat=0) if (locate(/datum/dynamic_ruleset/roundstart/nuclear) in mode.executed_rules) return FALSE // Unavailable if nuke ops were already sent at roundstart - var/indice_pop = min(10,round(living_players.len/5)+1) + indice_pop = min(10, round(living_players.len/5)+1) + /* NOTE: The above line's magic value of "10" is a hack due to the fact that byond was + not recognizing operative_cap as a defined variable. It should be operative_cap.len-- + and yes, this means that if the len is changed, this variable must be changed along with it. + One day, once the mystery of why this issue was occuring is figured out, + we may change it back, but until this day comes, we must make it simply 10. + */ required_candidates = operative_cap[indice_pop] return ..() @@ -359,14 +388,20 @@ antag_datum = /datum/antagonist/blob antag_flag = ROLE_BLOB enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain") - required_enemies = list(2,2,1,1,1,1,1,0,0,0) + required_enemies = list(3,3,2,2,2,1,1,1,1,0) required_candidates = 1 + blocking_rules = list(/datum/dynamic_ruleset/roundstart/clockcult) weight = 4 cost = 10 - requirements = list(101,101,101,80,60,50,30,20,10,10) + requirements = list(101,101,101,80,60,50,50,50,50,50) high_population_requirement = 50 repeatable = TRUE +/datum/dynamic_ruleset/midround/from_ghosts/blob/ready(forced = FALSE) + if (required_candidates > (dead_players.len + list_observers.len)) + return FALSE + return ..() + /datum/dynamic_ruleset/midround/from_ghosts/blob/generate_ruleset_body(mob/applicant) var/body = applicant.become_overmind() return body @@ -383,15 +418,21 @@ antag_datum = /datum/antagonist/xeno antag_flag = ROLE_ALIEN enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain") - required_enemies = list(2,2,1,1,1,1,1,0,0,0) + required_enemies = list(3,3,2,2,1,1,1,1,1,0) required_candidates = 1 weight = 3 cost = 10 - requirements = list(101,101,101,70,50,40,20,15,10,10) + requirements = list(101,101,101,70,50,50,50,50,50,50) high_population_requirement = 50 + repeatable_weight_decrease = 2 repeatable = TRUE var/list/vents = list() +/datum/dynamic_ruleset/midround/from_ghosts/xenomorph/ready(forced = FALSE) + if (required_candidates > (dead_players.len + list_observers.len)) + return FALSE + return ..() + /datum/dynamic_ruleset/midround/from_ghosts/xenomorph/execute() // 50% chance of being incremented by one required_candidates += prob(50) @@ -435,8 +476,9 @@ required_candidates = 1 weight = 3 cost = 10 - requirements = list(101,101,101,70,50,40,20,15,10,10) + requirements = list(101,101,101,70,50,40,20,15,15,15) high_population_requirement = 50 + repeatable_weight_decrease = 2 repeatable = TRUE var/list/spawn_locs = list() @@ -465,3 +507,240 @@ message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a Nightmare by the midround ruleset.") log_game("DYNAMIC: [key_name(S)] was spawned as a Nightmare by the midround ruleset.") return S + +////////////////////////////////////////////// +// // +// SENTIENT DISEASE // +// // +////////////////////////////////////////////// + + +/datum/dynamic_ruleset/midround/from_ghosts/sentient_disease + name = "Sentient Disease" + config_tag = "sentient_disease" + antag_flag = ROLE_ALIEN + enemy_roles = list("Virologist","Chief Medical Officer","Captain","Chemist") + required_enemies = list(2,1,1,1,0,0,0,0,0,0) + required_candidates = 1 + weight = 4 + cost = 5 + requirements = list(30,30,20,20,15,10,10,10,10,5) // yes, it can even happen in "extended"! + high_population_requirement = 5 + +/datum/dynamic_ruleset/midround/from_ghosts/sentient_disease/ready(forced = FALSE) + if (required_candidates > (dead_players.len + list_observers.len)) + return FALSE + return ..() + +/datum/dynamic_ruleset/midround/from_ghosts/sentient_disease/generate_ruleset_body(mob/applicant) + var/mob/camera/disease/virus = new /mob/camera/disease(SSmapping.get_station_center()) + applicant.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 the midround ruleset.") + log_game("[key_name(virus)] was spawned as a sentient disease by the midround ruleset.") + return virus + +////////////////////////////////////////////// +// // +// REVENANT // +// // +////////////////////////////////////////////// + + +/datum/dynamic_ruleset/midround/from_ghosts/revenant + name = "Revenant" + config_tag = "revenant" + antag_flag = ROLE_REVENANT + enemy_roles = list("Chief Engineer","Station Engineer","Captain","Chaplain","AI") + required_enemies = list(2,1,1,1,0,0,0,0,0,0) + required_candidates = 1 + weight = 4 + cost = 5 + requirements = list(30,30,30,30,20,15,15,15,15,15) + high_population_requirement = 15 + var/list/spawn_locs = list() + +/datum/dynamic_ruleset/midround/from_ghosts/revenant/ready(forced = FALSE) + var/deadMobs = 0 + for(var/mob/M in GLOB.dead_mob_list) + deadMobs++ + if(deadMobs < REVENANT_SPAWN_THRESHOLD) + return FALSE + if(required_candidates > (dead_players.len + list_observers.len)) + return FALSE + for(var/mob/living/L in GLOB.dead_mob_list) //look for any dead bodies + var/turf/T = get_turf(L) + if(T && is_station_level(T.z)) + spawn_locs += T + if(!spawn_locs.len || spawn_locs.len < 15) //look for any morgue trays, crematoriums, ect if there weren't alot of dead bodies on the station to pick from + for(var/obj/structure/bodycontainer/bc in GLOB.bodycontainers) + var/turf/T = get_turf(bc) + if(T && is_station_level(T.z)) + spawn_locs += T + if(!spawn_locs.len) //If we can't find any valid spawnpoints, try the carp spawns + for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list) + if(isturf(L.loc)) + spawn_locs += L.loc + if(!spawn_locs.len) //If we can't find THAT, then just give up and cry + return FALSE + return ..() + +/datum/dynamic_ruleset/midround/from_ghosts/revenant/generate_ruleset_body(mob/applicant) + var/mob/living/simple_animal/revenant/revvie = new(pick(spawn_locs)) + applicant.transfer_ckey(revvie, FALSE) + message_admins("[ADMIN_LOOKUPFLW(revvie)] has been made into a revenant by the midround ruleset.") + log_game("[key_name(revvie)] was spawned as a revenant by the midround ruleset.") + return revvie + +////////////////////////////////////////////// +// // +// SLAUGHTER DEMON // +// // +////////////////////////////////////////////// + + +/datum/dynamic_ruleset/midround/from_ghosts/slaughter_demon + name = "Slaughter Demon" + config_tag = "slaughter_demon" + antag_flag = ROLE_ALIEN + enemy_roles = list("Security Officer","Shaft Miner","Head of Security","Captain","Janitor","AI","Cyborg") + required_enemies = list(3,2,2,2,2,1,1,1,1,0) + required_candidates = 1 + weight = 4 + cost = 15 + requirements = list(101,101,101,90,80,70,60,50,40,30) + high_population_requirement = 30 + var/list/spawn_locs = list() + +/datum/dynamic_ruleset/midround/from_ghosts/slaughter_demon/ready(forced = FALSE) + if(required_candidates > (dead_players.len + list_observers.len)) + return FALSE + for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list) + if(isturf(L.loc)) + spawn_locs += L.loc + + if(!spawn_locs.len) + return FALSE + return ..() + +/datum/dynamic_ruleset/midround/from_ghosts/slaughter_demon/generate_ruleset_body(mob/applicant) + var/datum/mind/player_mind = new /datum/mind(applicant.key) + player_mind.active = 1 + var/obj/effect/dummy/phased_mob/slaughter/holder = new /obj/effect/dummy/phased_mob/slaughter((pick(spawn_locs))) + var/mob/living/simple_animal/slaughter/S = new (holder) + S.holder = holder + player_mind.transfer_to(S) + player_mind.assigned_role = "Slaughter Demon" + player_mind.special_role = "Slaughter Demon" + player_mind.add_antag_datum(/datum/antagonist/slaughter) + to_chat(S, S.playstyle_string) + to_chat(S, "You are currently not currently in the same plane of existence as the station. Blood Crawl near a blood pool to manifest.") + SEND_SOUND(S, 'sound/magic/demon_dies.ogg') + message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a slaughter demon by dynamic.") + log_game("[key_name(S)] was spawned as a slaughter demon by dynamic.") + return S + +////////////////////////////////////////////// +// // +// ABDUCTORS // +// // +////////////////////////////////////////////// + +/datum/dynamic_ruleset/midround/from_ghosts/abductors + name = "Abductors" + config_tag = "abductors" + antag_flag = ROLE_ABDUCTOR + // Has two antagonist flags, in fact + enemy_roles = list("AI", "Cyborg", "Security Officer", "Warden","Detective","Head of Security", "Captain") + required_enemies = list(3,3,2,2,1,1,0,0,0,0) + required_candidates = 2 + weight = 8 + cost = 10 + requirements = list(101,101,70,50,40,30,30,20,15,15) + blocking_rules = list(/datum/dynamic_ruleset/roundstart/nuclear,/datum/dynamic_ruleset/midround/from_ghosts/nuclear) + high_population_requirement = 15 + var/datum/team/abductor_team/team + repeatable_weight_decrease = 4 + repeatable = TRUE + +/datum/dynamic_ruleset/midround/from_ghosts/abductors/ready(forced = FALSE) + if(required_candidates > (dead_players.len + list_observers.len)) + return FALSE + team = new /datum/team/abductor_team + if(team.team_number > ABDUCTOR_MAX_TEAMS) + return FALSE + return ..() + +/datum/dynamic_ruleset/midround/from_ghosts/abductors/finish_setup(mob/new_character, index) + switch(index) + if(1) // yeah this seems like a baffling anti-pattern but it's actually the best way to do this, shit you not + var/mob/living/carbon/human/agent = new_character + agent.mind.add_antag_datum(/datum/antagonist/abductor/agent, team) + log_game("[key_name(agent)] has been selected as [team.name] abductor agent.") + if(2) + var/mob/living/carbon/human/scientist = new_character + scientist.mind.add_antag_datum(/datum/antagonist/abductor/scientist, team) + log_game("[key_name(scientist)] has been selected as [team.name] abductor scientist.") + +////////////////////////////////////////////// +// // +// SPACE NINJA // +// // +////////////////////////////////////////////// + +/datum/dynamic_ruleset/midround/from_ghosts/ninja + name = "Space Ninja" + config_tag = "ninja" + antag_flag = ROLE_NINJA + enemy_roles = list("Security Officer","Head of Security","Captain","AI","Cyborg") + required_enemies = list(3,2,2,2,2,1,1,1,1,0) + required_candidates = 1 + weight = 4 + cost = 15 + requirements = list(101,101,101,90,80,70,60,50,40,30) + high_population_requirement = 30 + var/list/spawn_locs = list() + var/spawn_loc + +/datum/dynamic_ruleset/midround/from_ghosts/ninja/ready(forced = FALSE) + if(required_candidates > (dead_players.len + list_observers.len)) + return FALSE + if(!spawn_loc) + var/list/spawn_locs = list() + for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list) + if(isturf(L.loc)) + spawn_locs += L.loc + if(!spawn_locs.len) + return FALSE + spawn_loc = pick(spawn_locs) + if(!spawn_loc) + return FALSE + return ..() + +/datum/dynamic_ruleset/midround/from_ghosts/ninja/generate_ruleset_body(mob/applicant) + var/key = applicant.key + + //Prepare ninja player mind + var/datum/mind/Mind = new /datum/mind(key) + Mind.assigned_role = ROLE_NINJA + Mind.special_role = ROLE_NINJA + Mind.active = 1 + + //spawn the ninja and assign the candidate + var/mob/living/carbon/human/Ninja = create_space_ninja(spawn_loc) + Mind.transfer_to(Ninja) + var/datum/antagonist/ninja/ninjadatum = new + ninjadatum.helping_station = pick(TRUE,FALSE) + if(ninjadatum.helping_station) + mode.refund_threat(5) + Mind.add_antag_datum(ninjadatum) + + if(Ninja.mind != Mind) //something has gone wrong! + throw EXCEPTION("Ninja created with incorrect mind") + + message_admins("[ADMIN_LOOKUPFLW(Ninja)] has been made into a ninja by dynamic.") + log_game("[key_name(Ninja)] was spawned as a ninja by dynamic.") + return Ninja + +#undef ABDUCTOR_MAX_TEAMS +#undef REVENANT_SPAWN_THRESHOLD diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm index 6a9aefa996..56b02a1364 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm @@ -13,20 +13,20 @@ antag_datum = /datum/antagonist/traitor/ minimum_required_age = 0 protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster", "Cyborg") - restricted_roles = list("Cyborg") + restricted_roles = list("Cyborg", "AI") required_candidates = 1 weight = 5 - cost = 10 - requirements = list(10,10,10,10,10,10,10,10,10,10) - high_population_requirement = 10 + cost = 10 // Avoid raising traitor threat above 10, as it is the default low cost ruleset. + scaling_cost = 10 + requirements = list(50,50,50,50,50,50,50,50,50,50) + high_population_requirement = 40 + antag_cap = list(1,1,1,1,2,2,2,2,3,3) var/autotraitor_cooldown = 450 // 15 minutes (ticks once per 2 sec) /datum/dynamic_ruleset/roundstart/traitor/pre_execute() - var/traitor_scaling_coeff = 10 - max(0,round(mode.threat_level/10)-5) // Above 50 threat level, coeff goes down by 1 for every 10 levels - var/num_traitors = min(round(mode.candidates.len / traitor_scaling_coeff) + 1, candidates.len) + var/num_traitors = antag_cap[indice_pop] * (scaled_times + 1) for (var/i = 1 to num_traitors) - var/mob/M = pick(candidates) - candidates -= M + var/mob/M = pick_n_take(candidates) assigned += M.mind M.mind.special_role = ROLE_TRAITOR M.mind.restricted_roles = restricted_roles @@ -51,32 +51,27 @@ name = "Blood Brothers" config_tag = "traitorbro" antag_flag = ROLE_BROTHER - antag_datum = /datum/antagonist/brother/ + antag_datum = /datum/antagonist/brother restricted_roles = list("AI", "Cyborg") protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") required_candidates = 2 weight = 4 cost = 10 - requirements = list(40,30,30,20,20,15,15,15,10,10) - high_population_requirement = 15 + requirements = list(101,101,101,101,101,101,101,101,101,101) + high_population_requirement = 101 + antag_cap = list(2,2,2,2,2,2,2,2,2,2) // Can pick 3 per team, but rare enough it doesn't matter. var/list/datum/team/brother_team/pre_brother_teams = list() - var/const/team_amount = 2 // Hard limit on brother teams if scaling is turned off var/const/min_team_size = 2 /datum/dynamic_ruleset/roundstart/traitorbro/pre_execute() - var/num_teams = team_amount - var/bsc = CONFIG_GET(number/brother_scaling_coeff) - if(bsc) - num_teams = max(1, round(num_players() / bsc)) - + var/num_teams = (antag_cap[indice_pop]/min_team_size) * (scaled_times + 1) // 1 team per scaling for(var/j = 1 to num_teams) if(candidates.len < min_team_size || candidates.len < required_candidates) break var/datum/team/brother_team/team = new var/team_size = prob(10) ? min(3, candidates.len) : 2 for(var/k = 1 to team_size) - var/mob/bro = pick(candidates) - candidates -= bro + var/mob/bro = pick_n_take(candidates) assigned += bro.mind team.add_member(bro.mind) bro.mind.special_role = "brother" @@ -109,16 +104,17 @@ protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") required_candidates = 1 weight = 3 - cost = 30 - requirements = list(80,70,60,50,40,20,20,10,10,10) + cost = 15 + scaling_cost = 15 + requirements = list(101,101,101,101,101,101,101,101,101,101) high_population_requirement = 10 + antag_cap = list(1,1,1,1,1,2,2,2,2,3) var/team_mode_probability = 30 /datum/dynamic_ruleset/roundstart/changeling/pre_execute() - var/num_changelings = min(round(mode.candidates.len / 10) + 1, candidates.len) + var/num_changelings = antag_cap[indice_pop] * (scaled_times + 1) for (var/i = 1 to num_changelings) - var/mob/M = pick(candidates) - candidates -= M + var/mob/M = pick_n_take(candidates) assigned += M.mind M.mind.restricted_roles = restricted_roles M.mind.special_role = ROLE_CHANGELING @@ -126,7 +122,7 @@ /datum/dynamic_ruleset/roundstart/changeling/execute() var/team_mode = FALSE - if(prob(team_mode_probability)) + if(prob(team_mode_probability)) team_mode = TRUE var/list/team_objectives = subtypesof(/datum/objective/changeling_team_objective) var/list/possible_team_objectives = list() @@ -153,6 +149,7 @@ /datum/dynamic_ruleset/roundstart/wizard name = "Wizard" config_tag = "wizard" + persistent = TRUE antag_flag = ROLE_WIZARD antag_datum = /datum/antagonist/wizard minimum_required_age = 14 @@ -160,8 +157,8 @@ required_candidates = 1 weight = 1 cost = 30 - requirements = list(90,90,70,40,30,20,10,10,10,10) - high_population_requirement = 10 + requirements = list(101,101,101,60,50,50,50,50,50,50) + high_population_requirement = 50 var/list/roundstart_wizards = list() /datum/dynamic_ruleset/roundstart/wizard/acceptable(population=0, threat=0) @@ -174,22 +171,38 @@ /datum/dynamic_ruleset/roundstart/wizard/pre_execute() if(GLOB.wizardstart.len == 0) return FALSE - - var/mob/M = pick(candidates) + mode.antags_rolled += 1 + var/mob/M = pick_n_take(candidates) if (M) - candidates -= M assigned += M.mind M.mind.assigned_role = ROLE_WIZARD M.mind.special_role = ROLE_WIZARD - + return TRUE /datum/dynamic_ruleset/roundstart/wizard/execute() for(var/datum/mind/M in assigned) M.current.forceMove(pick(GLOB.wizardstart)) M.add_antag_datum(new antag_datum()) + roundstart_wizards += M return TRUE - + +/datum/dynamic_ruleset/roundstart/wizard/rule_process() // i can literally copy this from are_special_antags_dead it's great + for(var/datum/mind/wizard in roundstart_wizards) + if(isliving(wizard.current) && wizard.current.stat!=DEAD) + return FALSE + + for(var/obj/item/phylactery/P in GLOB.poi_list) //TODO : IsProperlyDead() + if(P.mind && P.mind.has_antag_datum(/datum/antagonist/wizard)) + return FALSE + + if(SSevents.wizardmode) //If summon events was active, turn it off + SSevents.toggleWizardmode() + SSevents.resetFrequency() + + return RULESET_STOP_PROCESSING + + ////////////////////////////////////////////// // // // BLOOD CULT // @@ -207,26 +220,23 @@ required_candidates = 2 weight = 3 cost = 30 - requirements = list(100,90,80,60,40,30,10,10,10,10) - high_population_requirement = 10 - pop_per_requirement = 5 + requirements = list(101,101,101,80,70,60,50,50,50,50) + high_population_requirement = 50 flags = HIGHLANDER_RULESET - var/cultist_cap = list(2,2,2,3,3,4,4,4,4,4) + antag_cap = list(2,2,2,3,3,4,4,4,4,4) var/datum/team/cult/main_cult /datum/dynamic_ruleset/roundstart/bloodcult/ready(forced = FALSE) - var/indice_pop = min(10,round(mode.roundstart_pop_ready/pop_per_requirement)+1) - required_candidates = cultist_cap[indice_pop] + required_candidates = antag_cap[indice_pop] . = ..() /datum/dynamic_ruleset/roundstart/bloodcult/pre_execute() - var/indice_pop = min(10,round(mode.roundstart_pop_ready/pop_per_requirement)+1) - var/cultists = cultist_cap[indice_pop] + var/cultists = antag_cap[indice_pop] + mode.antags_rolled += cultists for(var/cultists_number = 1 to cultists) if(candidates.len <= 0) break - var/mob/M = pick(candidates) - candidates -= M + var/mob/M = pick_n_take(candidates) assigned += M.mind M.mind.special_role = ROLE_CULTIST M.mind.restricted_roles = restricted_roles @@ -238,7 +248,7 @@ var/datum/antagonist/cult/new_cultist = new antag_datum() new_cultist.cult_team = main_cult new_cultist.give_equipment = TRUE - M.add_antag_datum(new_cultist) + M.add_antag_datum(new_cultist) main_cult.setup_objectives() return TRUE @@ -268,28 +278,24 @@ required_candidates = 5 weight = 3 cost = 40 - requirements = list(90,90,90,80,60,40,30,20,10,10) - high_population_requirement = 10 - pop_per_requirement = 5 + requirements = list(100,90,80,70,60,50,50,50,50,50) + high_population_requirement = 50 flags = HIGHLANDER_RULESET - var/operative_cap = list(2,2,2,3,3,3,4,4,5,5) + antag_cap = list(1,1,2,3,4,5,5,5,5,5) var/datum/team/nuclear/nuke_team /datum/dynamic_ruleset/roundstart/nuclear/ready(forced = FALSE) - var/indice_pop = min(10,round(mode.roundstart_pop_ready/pop_per_requirement)+1) - required_candidates = operative_cap[indice_pop] + required_candidates = antag_cap[indice_pop] . = ..() /datum/dynamic_ruleset/roundstart/nuclear/pre_execute() // If ready() did its job, candidates should have 5 or more members in it - - var/indice_pop = min(10,round(mode.roundstart_pop_ready/5)+1) - var/operatives = operative_cap[indice_pop] + var/operatives = antag_cap[indice_pop] + mode.antags_rolled += operatives for(var/operatives_number = 1 to operatives) if(candidates.len <= 0) break - var/mob/M = pick(candidates) - candidates -= M + var/mob/M = pick_n_take(candidates) assigned += M.mind M.mind.assigned_role = "Nuclear Operative" M.mind.special_role = "Nuclear Operative" @@ -347,7 +353,7 @@ // // ////////////////////////////////////////////// -/datum/dynamic_ruleset/roundstart/delayed/revs +/datum/dynamic_ruleset/roundstart/revs name = "Revolution" config_tag = "revolution" persistent = TRUE @@ -358,63 +364,98 @@ restricted_roles = list("AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") required_candidates = 3 weight = 2 + delay = 7 MINUTES cost = 35 - requirements = list(101,101,70,40,30,20,10,10,10,10) - high_population_requirement = 10 - delay = 5 MINUTES + requirements = list(101,101,101,60,50,50,50,50,50,50) + high_population_requirement = 50 + antag_cap = list(3,3,3,3,3,3,3,3,3,3) flags = HIGHLANDER_RULESET // I give up, just there should be enough heads with 35 players... minimum_players = 35 var/datum/team/revolution/revolution - var/finished = 0 + var/finished = FALSE -/datum/dynamic_ruleset/roundstart/delayed/revs/execute() - var/max_canditates = 4 - revolution = new() - for(var/i = 1 to max_canditates) +/datum/dynamic_ruleset/roundstart/revs/pre_execute() + var/max_candidates = antag_cap[indice_pop] + mode.antags_rolled += max_candidates + for(var/i = 1 to max_candidates) if(candidates.len <= 0) break - var/mob/M = pick(candidates) - candidates -= M + var/mob/M = pick_n_take(candidates) assigned += M.mind M.mind.restricted_roles = restricted_roles M.mind.special_role = antag_flag - var/datum/antagonist/rev/head/new_head = new antag_datum() - new_head.give_flash = TRUE - new_head.give_hud = TRUE - new_head.remove_clumsy = TRUE - M.mind.add_antag_datum(new_head,revolution) - - revolution.update_objectives() - revolution.update_heads() - SSshuttle.registerHostileEnvironment(src) - return TRUE - -/datum/dynamic_ruleset/roundstart/delayed/revs/rule_process() - if(check_rev_victory()) - finished = 1 - else if(check_heads_victory()) - finished = 2 - return -/datum/dynamic_ruleset/roundstart/delayed/revs/check_finished() - if(CONFIG_GET(keyed_list/continuous)["revolution"]) - if(finished) - SSshuttle.clearHostileEnvironment(src) - return ..() - if(finished != 0) +/datum/dynamic_ruleset/roundstart/revs/execute() + var/success = TRUE + revolution = new() + for(var/datum/mind/M in assigned) + if(check_eligible(M)) + var/datum/antagonist/rev/head/new_head = new antag_datum() + new_head.give_flash = TRUE + new_head.give_hud = TRUE + new_head.remove_clumsy = TRUE + M.add_antag_datum(new_head,revolution) + else + assigned -= M + log_game("DYNAMIC: [ruletype] [name] discarded [M.name] from head revolutionary due to ineligibility.") + if(!revolution.members.len) + success = FALSE + log_game("DYNAMIC: [ruletype] [name] failed to get any eligible headrevs. Refunding [cost] threat.") + if(success) + revolution.update_objectives() + revolution.update_heads() + SSshuttle.registerHostileEnvironment(src) + return TRUE + return FALSE + +/datum/dynamic_ruleset/roundstart/revs/clean_up() + qdel(revolution) + ..() + +/datum/dynamic_ruleset/roundstart/revs/rule_process() + if(check_rev_victory()) + finished = REVOLUTION_VICTORY + return RULESET_STOP_PROCESSING + else if (check_heads_victory()) + finished = STATION_VICTORY + SSshuttle.clearHostileEnvironment(src) + priority_announce("It appears the mutiny has been quelled. Please return yourself and your incapacitated colleagues to work. \ + We have remotely blacklisted the head revolutionaries from your cloning software to prevent accidental cloning.", null, "attention", null, "Central Command Loyalty Monitoring Division") + + for(var/datum/mind/M in revolution.members) // Remove antag datums and prevents podcloned or exiled headrevs restarting rebellions. + if(M.has_antag_datum(/datum/antagonist/rev/head)) + var/datum/antagonist/rev/head/R = M.has_antag_datum(/datum/antagonist/rev/head) + R.remove_revolutionary(FALSE, "gamemode") + var/mob/living/carbon/C = M.current + if(C.stat == DEAD) + C.makeUncloneable() + if(M.has_antag_datum(/datum/antagonist/rev)) + var/datum/antagonist/rev/R = M.has_antag_datum(/datum/antagonist/rev) + R.remove_revolutionary(FALSE, "gamemode") + return RULESET_STOP_PROCESSING + +/// Checks for revhead loss conditions and other antag datums. +/datum/dynamic_ruleset/roundstart/revs/proc/check_eligible(var/datum/mind/M) + var/turf/T = get_turf(M.current) + if(!considered_afk(M) && considered_alive(M) && is_station_level(T.z) && !M.antag_datums?.len && !HAS_TRAIT(M, TRAIT_MINDSHIELD)) + return TRUE + return FALSE + +/datum/dynamic_ruleset/roundstart/revs/check_finished() + if(finished == REVOLUTION_VICTORY) return TRUE else return ..() -/datum/dynamic_ruleset/roundstart/delayed/revs/proc/check_rev_victory() +/datum/dynamic_ruleset/roundstart/revs/proc/check_rev_victory() for(var/datum/objective/mutiny/objective in revolution.objectives) if(!(objective.check_completion())) return FALSE return TRUE -/datum/dynamic_ruleset/roundstart/delayed/revs/proc/check_heads_victory() +/datum/dynamic_ruleset/roundstart/revs/proc/check_heads_victory() for(var/datum/mind/rev_mind in revolution.head_revolutionaries()) var/turf/T = get_turf(rev_mind.current) if(!considered_afk(rev_mind) && considered_alive(rev_mind) && is_station_level(T.z)) @@ -422,11 +463,11 @@ return FALSE return TRUE -/datum/dynamic_ruleset/roundstart/delayed/revs/round_result() - if(finished == 1) +/datum/dynamic_ruleset/roundstart/revs/round_result() + if(finished == REVOLUTION_VICTORY) SSticker.mode_result = "win - heads killed" SSticker.news_report = REVS_WIN - else if(finished == 2) + else if(finished == STATION_VICTORY) SSticker.mode_result = "loss - rev heads killed" SSticker.news_report = REVS_LOSE @@ -470,10 +511,11 @@ restricted_roles = list("AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") required_candidates = 4 weight = 3 - cost = 0 - requirements = list(101,101,101,101,101,101,101,101,101,101) - high_population_requirement = 101 + cost = 35 + requirements = list(101,101,101,80,70,60,50,50,50,50) + high_population_requirement = 50 flags = HIGHLANDER_RULESET + antag_cap = list(2,3,3,4,4,4,4,4,4,4) var/ark_time /datum/dynamic_ruleset/roundstart/clockcult/pre_execute() @@ -486,15 +528,15 @@ for(var/datum/parsed_map/PM in reebes) PM.initTemplateBounds() - var/starter_servants = 4 - var/number_players = num_players() + var/starter_servants = antag_cap[indice_pop] + var/number_players = mode.roundstart_pop_ready if(number_players > 30) number_players -= 30 - starter_servants += round(number_players / 10) - starter_servants = min(starter_servants, 8) + starter_servants += min(round(number_players / 10), 5) + mode.antags_rolled += starter_servants + GLOB.clockwork_vitality += 50 * starter_servants for (var/i in 1 to starter_servants) - var/mob/servant = pick(candidates) - candidates -= servant + var/mob/servant = pick_n_take(candidates) assigned += servant.mind servant.mind.assigned_role = ROLE_SERVANT_OF_RATVAR servant.mind.special_role = ROLE_SERVANT_OF_RATVAR @@ -603,23 +645,16 @@ cost = 0 requirements = list(101,101,101,101,101,101,101,101,101,101) high_population_requirement = 101 - var/devil_limit = 4 // Hard limit on devils if scaling is turned off - -/datum/dynamic_ruleset/roundstart/devil/pre_execute() - var/tsc = CONFIG_GET(number/traitor_scaling_coeff) - var/num_devils = 1 - - if(tsc) - num_devils = max(required_candidates, min(round(num_players() / (tsc * 3)) + 2, round(num_players() / (tsc * 1.5)))) - else - num_devils = max(required_candidates, min(num_players(), devil_limit)) + antag_cap = list(1,1,1,2,2,2,3,3,3,4) +/datum/dynamic_ruleset/roundstart/devil/pre_execute() + var/num_devils = antag_cap[indice_pop] + mode.antags_rolled += num_devils for(var/j = 0, j < num_devils, j++) if (!candidates.len) break - var/mob/devil = pick(candidates) - assigned += devil - candidates -= devil + var/mob/devil = pick_n_take(candidates) + assigned += devil.mind devil.mind.special_role = ROLE_DEVIL devil.mind.restricted_roles = restricted_roles @@ -668,13 +703,13 @@ var/datum/team/monkey/monkey_team /datum/dynamic_ruleset/roundstart/monkey/pre_execute() - var/carriers_to_make = max(round(num_players()/players_per_carrier, 1), 1) + var/carriers_to_make = max(round(mode.roundstart_pop_ready / players_per_carrier, 1), 1) + mode.antags_rolled += carriers_to_make for(var/j = 0, j < carriers_to_make, j++) if (!candidates.len) break - var/mob/carrier = pick(candidates) - candidates -= carrier + var/mob/carrier = pick_n_take(candidates) assigned += carrier.mind carrier.mind.special_role = "Monkey Leader" carrier.mind.restricted_roles = restricted_roles diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 17e26e66af..4d7b346241 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -31,7 +31,7 @@ var/recommended_enemies = 0 var/antag_flag = null //preferences flag such as BE_WIZARD that need to be turned on for players to be antag var/mob/living/living_antag_player = null - var/list/datum/game_mode/replacementmode = null + var/datum/game_mode/replacementmode = null var/round_converted = 0 //0: round not converted, 1: round going to convert, 2: round converted var/reroll_friendly //During mode conversion only these are in the running var/continuous_sanity_checked //Catches some cases where config options could be used to suggest that modes without antagonists should end when all antagonists die diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 58f551c648..6d681f8108 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -167,7 +167,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event /obj/effect/meteor/examine(mob/user) if(!(flags_1 & ADMIN_SPAWNED_1) && isliving(user)) SSmedals.UnlockMedal(MEDAL_METEOR, user.client) - ..() + return ..() /obj/effect/meteor/attackby(obj/item/I, mob/user, params) if(I.tool_behaviour == TOOL_MINING) diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 1767d468ec..632d59c84d 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -144,7 +144,7 @@ /datum/outfit/syndicate/no_crystals tc = 0 -/datum/outfit/syndicate/post_equip(mob/living/carbon/human/H) +/datum/outfit/syndicate/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) var/obj/item/radio/R = H.ears R.set_frequency(FREQ_SYNDICATE) R.freqlock = TRUE diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index f6b1def645..f99fe5c3e4 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -4,7 +4,8 @@ GLOBAL_LIST_EMPTY(objectives) /datum/objective var/datum/mind/owner //The primary owner of the objective. !!SOMEWHAT DEPRECATED!! Prefer using 'team' for new code. - var/datum/team/team //An alternative to 'owner': a team. Use this when writing new code. + var/datum/team/team //An alternative to 'owner': a team. Use this when writing new code. + var/name = "generic objective" //Name for admin prompts var/explanation_text = "Nothing" //What that person is supposed to do. var/team_explanation_text //For when there are multiple owners. var/datum/mind/target = null //If they are focused on a particular person. @@ -22,6 +23,32 @@ GLOBAL_LIST_EMPTY(objectives) if(owner) . += owner +/datum/objective/proc/admin_edit(mob/admin) + return + +//Shared by few objective types +/datum/objective/proc/admin_simple_target_pick(mob/admin) + var/list/possible_targets = list("Free objective") + var/def_value + for(var/datum/mind/possible_target in SSticker.minds) + if ((possible_target != src) && ishuman(possible_target.current)) + possible_targets += possible_target.current + + + if(target && target.current) + def_value = target.current + + var/mob/new_target = input(admin,"Select target:", "Objective target", def_value) as null|anything in possible_targets + if (!new_target) + return + + if (new_target == "Free objective") + target = null + else + target = new_target.mind + + update_explanation_text() + /datum/objective/proc/considered_escaped(datum/mind/M) if(!considered_alive(M)) return FALSE @@ -42,7 +69,7 @@ GLOBAL_LIST_EMPTY(objectives) /datum/objective/proc/is_unique_objective(possible_target) var/list/datum/mind/owners = get_owners() for(var/datum/mind/M in owners) - for(var/datum/objective/O in M.objectives) + for(var/datum/objective/O in M.get_all_objectives()) //This scope is debatable, probably should be passed in by caller. if(istype(O, type) && O.get_target() == possible_target) return FALSE return TRUE @@ -122,6 +149,7 @@ GLOBAL_LIST_EMPTY(objectives) H.equip_in_one_of_slots(O, slots) /datum/objective/assassinate + name = "assasinate" var/target_role_type=0 martyr_compatible = 1 @@ -141,6 +169,9 @@ GLOBAL_LIST_EMPTY(objectives) else explanation_text = "Free Objective" +/datum/objective/assassinate/admin_edit(mob/admin) + admin_simple_target_pick(admin) + /datum/objective/assassinate/internal var/stolen = 0 //Have we already eliminated this target? @@ -150,6 +181,7 @@ GLOBAL_LIST_EMPTY(objectives) explanation_text = "Assassinate [target.name], who was obliterated" /datum/objective/mutiny + name = "mutiny" var/target_role_type=0 martyr_compatible = 1 @@ -173,6 +205,7 @@ GLOBAL_LIST_EMPTY(objectives) explanation_text = "Free Objective" /datum/objective/maroon + name = "maroon" var/target_role_type=0 martyr_compatible = 1 @@ -191,7 +224,11 @@ GLOBAL_LIST_EMPTY(objectives) else explanation_text = "Free Objective" +/datum/objective/maroon/admin_edit(mob/admin) + admin_simple_target_pick(admin) + /datum/objective/debrain + name = "debrain" var/target_role_type=0 /datum/objective/debrain/find_target_by_role(role, role_type=0, invert=0) @@ -222,7 +259,11 @@ GLOBAL_LIST_EMPTY(objectives) else explanation_text = "Free Objective" +/datum/objective/debrain/admin_edit(mob/admin) + admin_simple_target_pick(admin) + /datum/objective/protect//The opposite of killing a dude. + name = "protect" martyr_compatible = 1 var/target_role_type = 0 var/human_check = TRUE @@ -243,10 +284,15 @@ GLOBAL_LIST_EMPTY(objectives) else explanation_text = "Free Objective" +/datum/objective/protect/admin_edit(mob/admin) + admin_simple_target_pick(admin) + /datum/objective/protect/nonhuman + name = "protect nonhuman" human_check = FALSE /datum/objective/hijack + name = "hijack" explanation_text = "Hijack the shuttle to ensure no loyalist Nanotrasen crew escape alive and out of custody." team_explanation_text = "Hijack the shuttle to ensure no loyalist Nanotrasen crew escape alive and out of custody. Leave no team member behind." martyr_compatible = 0 //Technically you won't get both anyway. @@ -261,6 +307,7 @@ GLOBAL_LIST_EMPTY(objectives) return SSshuttle.emergency.is_hijacked() /datum/objective/block + name = "no organics on shuttle" explanation_text = "Do not allow any organic lifeforms to escape on the shuttle alive." martyr_compatible = 1 @@ -274,6 +321,7 @@ GLOBAL_LIST_EMPTY(objectives) return TRUE /datum/objective/purge + name = "no mutants on shuttle" explanation_text = "Ensure no mutant humanoid species are present aboard the escape shuttle." martyr_compatible = 1 @@ -288,6 +336,7 @@ GLOBAL_LIST_EMPTY(objectives) return TRUE /datum/objective/robot_army + name = "robot army" explanation_text = "Have at least eight active cyborgs synced to you." martyr_compatible = 0 @@ -304,6 +353,7 @@ GLOBAL_LIST_EMPTY(objectives) return counter >= 8 /datum/objective/escape + name = "escape" explanation_text = "Escape on the shuttle or an escape pod alive and without being in custody." team_explanation_text = "Have all members of your team escape on a shuttle or pod alive, without being in custody." @@ -316,6 +366,7 @@ GLOBAL_LIST_EMPTY(objectives) return TRUE /datum/objective/escape/escape_with_identity + name = "escape with identity" var/target_real_name // Has to be stored because the target's real_name can change over the course of the round var/target_missing_id @@ -351,7 +402,11 @@ GLOBAL_LIST_EMPTY(objectives) return TRUE return FALSE +/datum/objective/escape/escape_with_identity/admin_edit(mob/admin) + admin_simple_target_pick(admin) + /datum/objective/survive + name = "survive" explanation_text = "Stay alive until the end." /datum/objective/survive/check_completion() @@ -362,6 +417,7 @@ GLOBAL_LIST_EMPTY(objectives) return TRUE /datum/objective/survive/exist //Like survive, but works for silicons and zombies and such. + name = "survive nonhuman" /datum/objective/survive/exist/check_completion() var/list/datum/mind/owners = get_owners() @@ -371,6 +427,7 @@ GLOBAL_LIST_EMPTY(objectives) return TRUE /datum/objective/martyr + name = "martyr" explanation_text = "Die a glorious death." /datum/objective/martyr/check_completion() @@ -383,6 +440,7 @@ GLOBAL_LIST_EMPTY(objectives) return TRUE /datum/objective/nuclear + name = "nuclear" explanation_text = "Destroy the station with a nuclear device." martyr_compatible = 1 @@ -393,6 +451,7 @@ GLOBAL_LIST_EMPTY(objectives) GLOBAL_LIST_EMPTY(possible_items) /datum/objective/steal + name = "steal" var/datum/objective_item/targetinfo = null //Save the chosen item datum so we can access it later. var/obj/item/steal_target = null //Needed for custom objectives (they're just items, not datums). martyr_compatible = 0 @@ -430,18 +489,19 @@ GLOBAL_LIST_EMPTY(possible_items) explanation_text = "Free objective" return -/datum/objective/steal/proc/select_target() //For admins setting objectives manually. +/datum/objective/steal/admin_edit(mob/admin) var/list/possible_items_all = GLOB.possible_items+"custom" - var/new_target = input("Select target:", "Objective target", steal_target) as null|anything in possible_items_all + var/new_target = input(admin,"Select target:", "Objective target", steal_target) as null|anything in possible_items_all if (!new_target) return if (new_target == "custom") //Can set custom items. - var/obj/item/custom_target = input("Select type:","Type") as null|anything in typesof(/obj/item) - if (!custom_target) + var/custom_path = input(admin,"Search for target item type:","Type") as null|text + if (!custom_path) return + var/obj/item/custom_target = pick_closest_path(custom_path, make_types_fancy(subtypesof(/obj/item))) var/custom_name = initial(custom_target.name) - custom_name = stripped_input("Enter target name:", "Objective target", custom_name) + custom_name = stripped_input(admin,"Enter target name:", "Objective target", custom_name) if (!custom_name) return steal_target = custom_target @@ -449,7 +509,6 @@ GLOBAL_LIST_EMPTY(possible_items) else set_target(new_target) - return steal_target /datum/objective/steal/check_completion() var/list/datum/mind/owners = get_owners() @@ -476,6 +535,7 @@ GLOBAL_LIST_EMPTY(possible_items) GLOBAL_LIST_EMPTY(possible_items_special) /datum/objective/steal/special //ninjas are so special they get their own subtype good for them + name = "steal special" /datum/objective/steal/special/New() ..() @@ -487,8 +547,12 @@ GLOBAL_LIST_EMPTY(possible_items_special) return set_target(pick(GLOB.possible_items_special)) /datum/objective/steal/exchange + name = "exchange" martyr_compatible = 0 +/datum/objective/steal/exchange/admin_edit(mob/admin) + return + /datum/objective/steal/exchange/proc/set_faction(faction,otheragent) target = otheragent if(faction == "red") @@ -508,6 +572,7 @@ GLOBAL_LIST_EMPTY(possible_items_special) /datum/objective/steal/exchange/backstab + name = "prevent exchange" /datum/objective/steal/exchange/backstab/set_faction(faction) if(faction == "red") @@ -519,12 +584,17 @@ GLOBAL_LIST_EMPTY(possible_items_special) /datum/objective/download + name = "download" /datum/objective/download/proc/gen_amount_goal() target_amount = rand(20,40) - explanation_text = "Download [target_amount] research node\s." + update_explanation_text() return target_amount +/datum/objective/download/update_explanation_text() + ..() + explanation_text = "Download [target_amount] research node\s." + /datum/objective/download/check_completion() var/datum/techweb/checking = new var/list/datum/mind/owners = get_owners() @@ -541,13 +611,24 @@ GLOBAL_LIST_EMPTY(possible_items_special) TD.stored_research.copy_research_to(checking) return checking.researched_nodes.len >= target_amount +/datum/objective/download/admin_edit(mob/admin) + var/count = input(admin,"How many nodes ?","Nodes",target_amount) as num|null + if(count) + target_amount = count + update_explanation_text() + /datum/objective/capture + name = "capture" var/captured_amount = 0 /datum/objective/capture/proc/gen_amount_goal() - target_amount = rand(5,10) - explanation_text = "Capture [target_amount] lifeform\s with an energy net. Live, rare specimens are worth more." - return target_amount + target_amount = rand(5,10) + explanation_text = "Capture [target_amount] lifeform\s with an energy net. Live, rare specimens are worth more." + return target_amount + +/datum/objective/capture/update_explanation_text() + . = ..() + explanation_text = "Capture [target_amount] lifeform\s with an energy net. Live, rare specimens are worth more." /datum/objective/capture/check_completion()//Basically runs through all the mobs in the area to determine how much they are worth. /*var/area/centcom/holding/A = GLOB.areas_by_type[/area/centcom/holding] @@ -576,10 +657,16 @@ GLOBAL_LIST_EMPTY(possible_items_special) captured_amount+=2*/ //Removed in favour of adding points on capture, in energy_net_nets.dm return captured_amount >= target_amount +/datum/objective/capture/admin_edit(mob/admin) + var/count = input(admin,"How many mobs to capture ?","capture",target_amount) as num|null + if(count) + target_amount = count + update_explanation_text() //Changeling Objectives /datum/objective/absorb + name = "absorb" /datum/objective/absorb/proc/gen_amount_goal(lowbound = 4, highbound = 6) target_amount = rand (lowbound,highbound) @@ -595,9 +682,19 @@ GLOBAL_LIST_EMPTY(possible_items_special) n_p ++ target_amount = min(target_amount, n_p) - explanation_text = "Extract [target_amount] compatible genome\s." + update_explanation_text() return target_amount +/datum/objective/absorb/update_explanation_text() + . = ..() + explanation_text = "Extract [target_amount] compatible genome\s." + +/datum/objective/absorb/admin_edit(mob/admin) + var/count = input(admin,"How many people to absorb?","absorb",target_amount) as num|null + if(count) + target_amount = count + update_explanation_text() + /datum/objective/absorb/check_completion() var/list/datum/mind/owners = get_owners() var/absorbedcount = 0 @@ -611,6 +708,7 @@ GLOBAL_LIST_EMPTY(possible_items_special) return absorbedcount >= target_amount /datum/objective/absorb_most + name = "absorb most" explanation_text = "Extract more compatible genomes than any other Changeling." /datum/objective/absorb_most/check_completion() @@ -631,6 +729,7 @@ GLOBAL_LIST_EMPTY(possible_items_special) return TRUE /datum/objective/absorb_changeling + name = "absorb changeling" explanation_text = "Absorb another Changeling." /datum/objective/absorb_changeling/check_completion() @@ -653,6 +752,7 @@ GLOBAL_LIST_EMPTY(possible_items_special) //End Changeling Objectives /datum/objective/destroy + name = "destroy AI" martyr_compatible = 1 /datum/objective/destroy/find_target() @@ -674,10 +774,20 @@ GLOBAL_LIST_EMPTY(possible_items_special) else explanation_text = "Free Objective" +/datum/objective/destroy/admin_edit(mob/admin) + var/list/possible_targets = active_ais(1) + if(possible_targets.len) + var/mob/new_target = input(admin,"Select target:", "Objective target") as null|anything in possible_targets + target = new_target.mind + else + to_chat(admin, "No active AIs with minds") + update_explanation_text() + /datum/objective/destroy/internal var/stolen = FALSE //Have we already eliminated this target? /datum/objective/steal_five_of_type + name = "steal five of" explanation_text = "Steal at least five items!" var/list/wanted_items = list(/obj/item) @@ -686,10 +796,12 @@ GLOBAL_LIST_EMPTY(possible_items_special) wanted_items = typecacheof(wanted_items) /datum/objective/steal_five_of_type/summon_guns + name = "steal guns" explanation_text = "Steal at least five guns!" wanted_items = list(/obj/item/gun) /datum/objective/steal_five_of_type/summon_magic + name = "steal magic" explanation_text = "Steal at least five magical artefacts!" wanted_items = list(/obj/item/spellbook, /obj/item/gun/magic, /obj/item/clothing/suit/space/hardsuit/wizard, /obj/item/scrying, /obj/item/antag_spawner/contract, /obj/item/necromantic_stone) @@ -705,6 +817,14 @@ GLOBAL_LIST_EMPTY(possible_items_special) stolen_count++ return stolen_count >= 5 +//Created by admin tools +/datum/objective/custom + name = "custom" + +/datum/objective/custom/admin_edit(mob/admin) + var/expl = stripped_input(admin, "Custom objective:", "Objective", explanation_text) + if(expl) + explanation_text = expl //////////////////////////////// // Changeling team objectives // diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm index 64aaeebacd..d54dda5353 100644 --- a/code/game/gamemodes/sandbox/h_sandbox.dm +++ b/code/game/gamemodes/sandbox/h_sandbox.dm @@ -25,14 +25,14 @@ GLOBAL_VAR_INIT(hsboxspawn, TRUE) var/canisterinfo = null var/hsbinfo = null //items that shouldn't spawn on the floor because they would bug or act weird - var/global/list/spawn_forbidden = list( + var/static/list/spawn_forbidden = list( /obj/item/tk_grab, /obj/item/implant, // not implanter, the actual thing that is inside you /obj/item/assembly, /obj/item/onetankbomb, /obj/item/pda/ai, /obj/item/smallDelivery, /obj/item/projectile, /obj/item/borg/sight, /obj/item/borg/stun, /obj/item/robot_module) /datum/hSB/proc/update() - var/global/list/hrefs = list( + var/static/list/hrefs = list( "Space Gear", "Suit Up (Space Travel Gear)" = "hsbsuit", "Spawn Gas Mask" = "hsbspawn&path=[/obj/item/clothing/mask/gas]", diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 513fea4360..281f28688e 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -130,8 +130,8 @@ open_machine() /obj/machinery/sleeper/examine(mob/user) - ..() - to_chat(user, "Alt-click [src] to [state_open ? "close" : "open"] it.") + . = ..() + . += "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) diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 667c1f6054..ff7383cd9e 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -113,11 +113,6 @@ Class Procs: var/atom/movable/occupant = null var/speed_process = FALSE // Process as fast as possible? var/obj/item/circuitboard/circuit // Circuit to be created and inserted when the machinery is created - var/obj/item/card/id/inserted_scan_id - var/obj/item/card/id/inserted_modify_id - var/list/region_access = null // For the identification console (card.dm) - var/list/head_subordinates = null // For the identification console (card.dm) - var/authenticated = 0 // For the identification console (card.dm) var/interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_SET_MACHINE @@ -473,8 +468,6 @@ Class Procs: . += "It's falling apart!" if(user.research_scanner && component_parts) . += display_parts(user, TRUE) - if(inserted_scan_id || inserted_modify_id) - . += "Alt-click to eject the ID card." //called on machinery construction (i.e from frame to machinery) but not on initialization /obj/machinery/proc/on_construction() @@ -509,73 +502,3 @@ Class Procs: . = . % 9 AM.pixel_x = -8 + ((.%3)*8) AM.pixel_y = -8 + (round( . / 3)*8) - -/obj/machinery/proc/id_insert_scan(mob/user, obj/item/card/id/I) - I = user.get_active_held_item() - if(istype(I)) - if(inserted_scan_id) - to_chat(user, "There's already an ID card in the console!") - return - if(!user.transferItemToLoc(I, src)) - return - inserted_scan_id = I - user.visible_message("[user] inserts an ID card into the console.", \ - "You insert the ID card into the console.") - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) - updateUsrDialog() - -/obj/machinery/proc/id_eject_scan(mob/user) - if(!inserted_scan_id) - to_chat(user, "There's no ID card in the console!") - return - if(inserted_scan_id) - inserted_scan_id.forceMove(drop_location()) - if(!issilicon(user) && Adjacent(user)) - user.put_in_hands(inserted_scan_id) - inserted_scan_id = null - user.visible_message("[user] gets an ID card from the console.", \ - "You get the ID card from the console.") - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) - updateUsrDialog() - -/obj/machinery/proc/id_eject_modify(mob/user) - if(inserted_modify_id) - GLOB.data_core.manifest_modify(inserted_modify_id.registered_name, inserted_modify_id.assignment) - inserted_modify_id.update_label() - inserted_modify_id.forceMove(drop_location()) - if(!issilicon(user) && Adjacent(user)) - user.put_in_hands(inserted_modify_id) - user.visible_message("[user] gets an ID card from the console.", \ - "You get the ID card from the console.") - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) - inserted_modify_id = null - region_access = null - head_subordinates = null - updateUsrDialog() - -/obj/machinery/proc/id_insert_modify(mob/user) - var/obj/item/card/id/I = user.get_active_held_item() - if(istype(I)) - if(inserted_modify_id) - to_chat(user, "There's already an ID card in the console!") - return - if(!user.transferItemToLoc(I, src)) - return - inserted_modify_id = I - user.visible_message("[user] inserts an ID card into the console.", \ - "You insert the ID card into the console.") - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) - updateUsrDialog() - -/obj/machinery/AltClick(mob/user) - . = ..() - if(!user.canUseTopic(src, !issilicon(user)) || !is_operational()) - return - if(inserted_modify_id) - id_eject_modify(user) - authenticated = FALSE - return - if(inserted_scan_id) - id_eject_scan(user) - authenticated = FALSE - return diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index cac29404d2..1703ce57d1 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -14,8 +14,8 @@ req_access = list(ACCESS_AI_UPLOAD) /obj/machinery/ai_slipper/examine(mob/user) - ..() - to_chat(user, "It has [uses] uses of foam remaining.") + . = ..() + . += "It has [uses] uses of foam remaining." /obj/machinery/ai_slipper/power_change() if(stat & BROKEN) diff --git a/code/game/machinery/aug_manipulator.dm b/code/game/machinery/aug_manipulator.dm index 99200e510e..b9d63e5771 100644 --- a/code/game/machinery/aug_manipulator.dm +++ b/code/game/machinery/aug_manipulator.dm @@ -11,13 +11,13 @@ var/static/list/style_list_icons = list("standard" = 'icons/mob/augmentation/augments.dmi', "engineer" = 'icons/mob/augmentation/augments_engineer.dmi', "security" = 'icons/mob/augmentation/augments_security.dmi', "mining" = 'icons/mob/augmentation/augments_mining.dmi') /obj/machinery/aug_manipulator/examine(mob/user) - ..() + . = ..() if(storedpart) - to_chat(user, "Alt-click to eject the limb.") + . += "Alt-click to eject the limb." /obj/machinery/aug_manipulator/Initialize() - initial_icon_state = initial(icon_state) - return ..() + initial_icon_state = initial(icon_state) + return ..() /obj/machinery/aug_manipulator/update_icon() cut_overlays() diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 1c6e21491c..bdb90c4c97 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -176,7 +176,7 @@ matching_designs.Cut() for(var/v in stored_research.researched_designs) - var/datum/design/D = stored_research.researched_designs[v] + var/datum/design/D = SSresearch.techweb_design_by_id(v) if(findtext(D.name,href_list["to_search"])) matching_designs.Add(D) updateUsrDialog() @@ -252,7 +252,7 @@ dat += materials_printout() for(var/v in stored_research.researched_designs) - var/datum/design/D = stored_research.researched_designs[v] + var/datum/design/D = SSresearch.techweb_design_by_id(v) if(!(selected_category in D.category)) continue @@ -366,7 +366,7 @@ /obj/machinery/autolathe/proc/adjust_hacked(state) hacked = state for(var/id in SSresearch.techweb_designs) - var/datum/design/D = SSresearch.techweb_designs[id] + var/datum/design/D = SSresearch.techweb_design_by_id(id) if((D.build_type & AUTOLATHE) && ("hacked" in D.category)) if(hacked) stored_research.add_design(D) diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index fb384d55ae..1839e44e3b 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -24,10 +24,10 @@ add_overlay("ccharger-o[newlevel]") /obj/machinery/cell_charger/examine(mob/user) - ..() - to_chat(user, "There's [charging ? "a" : "no"] cell in the charger.") + . = ..() + . += "There's [charging ? "a" : "no"] cell in the charger." if(charging) - to_chat(user, "Current charge: [round(charging.percent(), 1)]%.") + . += "Current charge: [round(charging.percent(), 1)]%." /obj/machinery/cell_charger/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/stock_parts/cell) && !panel_open) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 89c5e56b71..e683d67be2 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -93,20 +93,20 @@ to_chat(user, "You flip the write-protect tab to [read_only ? "protected" : "unprotected"].") /obj/item/disk/data/examine(mob/user) - ..() - to_chat(user, "The write-protect tab is set to [read_only ? "protected" : "unprotected"].") + . = ..() + . += "The write-protect tab is set to [read_only ? "protected" : "unprotected"]." //Clonepod /obj/machinery/clonepod/examine(mob/user) - ..() + . = ..() var/mob/living/mob_occupant = occupant if(mess) - to_chat(user, "It's filled with blood and viscera. You swear you can see it moving...") + . += "It's filled with blood and viscera. You swear you can see it moving..." if(is_operational() && mob_occupant) if(mob_occupant.stat != DEAD) - to_chat(user, "Current clone cycle is [round(get_completion())]% complete.") + . += "Current clone cycle is [round(get_completion())]% complete." /obj/machinery/clonepod/return_air() // We want to simulate the clone not being in contact with @@ -354,7 +354,8 @@ O.organ_flags &= ~ORGAN_FROZEN unattached_flesh.Cut() mess = FALSE - new /obj/effect/gibspawner/generic(get_turf(src)) + if(mob_occupant) + mob_occupant.spawn_gibs() audible_message("You hear a splat.") update_icon() return @@ -474,8 +475,6 @@ flesh_number = unattached_flesh.len -#define CRYOMOBS 'icons/obj/cryo_mobs.dmi' - /obj/machinery/clonepod/update_icon() cut_overlays() diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index c317cbba0d..858a0a995b 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -32,7 +32,7 @@ /obj/machinery/computer/operating/proc/sync_surgeries() for(var/i in linked_techweb.researched_designs) - var/datum/design/surgery/D = linked_techweb.researched_designs[i] + var/datum/design/surgery/D = SSresearch.techweb_design_by_id(i) if(!istype(D)) continue advanced_surgeries |= D.surgery diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm index fb46229bdb..2eea845c70 100644 --- a/code/game/machinery/computer/_computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -13,6 +13,7 @@ var/icon_keyboard = "generic_key" var/icon_screen = "generic" var/clockwork = FALSE + var/authenticated = FALSE /obj/machinery/computer/Initialize(mapload, obj/item/circuitboard/C) . = ..() diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm index 6d505c8f95..8ddbd68c7b 100644 --- a/code/game/machinery/computer/apc_control.dm +++ b/code/game/machinery/computer/apc_control.dm @@ -92,9 +92,7 @@ if(!usr || !usr.canUseTopic(src) || stat || QDELETED(src)) return if(href_list["authenticate"]) - var/obj/item/card/id/ID = usr.get_active_held_item() - if(!istype(ID)) - ID = usr.get_idcard() + var/obj/item/card/id/ID = usr.get_idcard(TRUE) if(ID && istype(ID)) if(check_access(ID)) authenticated = TRUE diff --git a/code/game/machinery/computer/arcade/orion_trail.dm b/code/game/machinery/computer/arcade/orion_trail.dm index 023b1048ce..c8c7bc1319 100644 --- a/code/game/machinery/computer/arcade/orion_trail.dm +++ b/code/game/machinery/computer/arcade/orion_trail.dm @@ -762,13 +762,13 @@ var/active = 0 //if the ship is on /obj/item/orion_ship/examine(mob/user) - ..() + . = ..() if(!(in_range(user, src))) return if(!active) - to_chat(user, "There's a little switch on the bottom. It's flipped down.") + . += "There's a little switch on the bottom. It's flipped down." else - to_chat(user, "There's a little switch on the bottom. It's flipped up.") + . += "There's a little switch on the bottom. It's flipped up." /obj/item/orion_ship/attack_self(mob/user) //Minibomb-level explosion. Should probably be more because of how hard it is to survive the machine! Also, just over a 5-second fuse if(active) diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index c8a4d68575..056beb2e96 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -19,7 +19,7 @@ return to_chat(user, "You start deconstructing the frame...") - if(P.use_tool(src, user, 20, volume=50)) + if(P.use_tool(src, user, 20, volume=50) && state == 0) to_chat(user, "You deconstruct the frame.") var/obj/item/stack/sheet/metal/M = new (drop_location(), 5) M.add_fingerprint(user) @@ -28,7 +28,7 @@ if(1) if(istype(P, /obj/item/wrench)) to_chat(user, "You start to unfasten the frame...") - if(P.use_tool(src, user, 20, volume=50)) + if(P.use_tool(src, user, 20, volume=50) && state == 1) to_chat(user, "You unfasten the frame.") setAnchored(FALSE) state = 0 @@ -72,9 +72,7 @@ if(!P.tool_start_check(user, amount=5)) return to_chat(user, "You start adding cables to the frame...") - if(P.use_tool(src, user, 20, volume=50, amount=5)) - if(state != 2) - return + if(P.use_tool(src, user, 20, 5, 50, CALLBACK(src, .proc/check_state, 2))) to_chat(user, "You add cables to the frame.") state = 3 icon_state = "3" @@ -94,9 +92,7 @@ return playsound(src, 'sound/items/deconstruct.ogg', 50, 1) to_chat(user, "You start to put in the glass panel...") - if(P.use_tool(src, user, 20, amount=2)) - if(state != 3) - return + if(P.use_tool(src, user, 20, 2, 0, CALLBACK(src, .proc/check_state, 3))) to_chat(user, "You put in the glass panel.") state = 4 src.icon_state = "4" @@ -121,6 +117,11 @@ if(user.a_intent == INTENT_HARM) return ..() +//callback proc used on stacks use_tool to stop unnecessary amounts being wasted from spam clicking. +/obj/structure/frame/computer/proc/check_state(target_state) + if(state == target_state) + return TRUE + return FALSE /obj/structure/frame/computer/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 11935e2bfc..1bafa73aaa 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -17,13 +17,7 @@ network += lowertext(i) /obj/machinery/computer/security/check_eye(mob/user) - 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)) - user.unset_machine() - return - if(!watchers[user]) + if(!can_interact(user) || !(user in watchers) || !watchers[user]) user.unset_machine() return var/obj/machinery/camera/C = watchers[user] @@ -41,55 +35,50 @@ M.unset_machine() //to properly reset the view of the users if the console is deleted. return ..() -/obj/machinery/computer/security/attack_hand(mob/user) +/obj/machinery/computer/security/can_interact(mob/user) + if((!issilicon(user) && !Adjacent(user)) || is_blind(user) || !in_view_range(user, src)) + return FALSE + return ..() + +/obj/machinery/computer/security/interact(mob/user, special_state) . = ..() - if(.) - return - if(stat) + if (ismob(user) && !isliving(user)) // ghosts don't need cameras return if (!network) - throw EXCEPTION("No camera network") + CRASH("No camera network") user.unset_machine() - return + return FALSE if (!(islist(network))) - throw EXCEPTION("Camera network is not a list") + CRASH("Camera network is not a list") user.unset_machine() - return - if(..()) - user.unset_machine() - return + return FALSE var/list/camera_list = get_available_cameras() if(!(user in watchers)) for(var/Num in camera_list) var/obj/machinery/camera/CAM = camera_list[Num] - if(istype(CAM)) - if(CAM.can_use()) - watchers[user] = CAM //let's give the user the first usable camera, and then let him change to the camera he wants. - break + if(istype(CAM) && CAM.can_use()) + watchers[user] = CAM //let's give the user the first usable camera, and then let him change to the camera he wants. + break if(!(user in watchers)) user.unset_machine() // no usable camera on the network, we disconnect the user from the computer. - return + return FALSE playsound(src, 'sound/machines/terminal_prompt.ogg', 25, 0) use_camera_console(user) /obj/machinery/computer/security/proc/use_camera_console(mob/user) var/list/camera_list = get_available_cameras() var/t = input(user, "Which camera should you change to?") as null|anything in camera_list - if(user.machine != src) //while we were choosing we got disconnected from our computer or are using another machine. + if(!src || user.machine != src) //while we were choosing we got disconnected from our computer or are using another machine. return - if(!t) + if(!t || t == "Cancel") user.unset_machine() playsound(src, 'sound/machines/terminal_off.ogg', 25, 0) return var/obj/machinery/camera/C = camera_list[t] - if(t == "Cancel") - user.unset_machine() - playsound(src, 'sound/machines/terminal_off.ogg', 25, 0) - return - if(!C || !C.can_use() || CHECK_BITFIELD(stat, NOPOWER|BROKEN) || is_blind(user) || !in_view_range(user, src) || !user.canUseTopic(src, !issilicon(user), FALSE)) + if(!C || !C.can_use() || !can_interact(user)) user.unset_machine() return FALSE diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index 43582e39bf..8de470fdb8 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -287,9 +287,9 @@ /obj/machinery/computer/camera_advanced/ratvar/CreateEye() ..() - eyeobj.visible_icon = 1 - eyeobj.icon = 'icons/obj/abductor.dmi' //in case you still had any doubts - eyeobj.icon_state = "camera_target" + eyeobj.visible_icon = TRUE + eyeobj.icon = 'icons/mob/cameramob.dmi' //in case you still had any doubts + eyeobj.icon_state = "generic_camera" /obj/machinery/computer/camera_advanced/ratvar/GrantActions(mob/living/carbon/user) ..() diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 886851a6a8..e8e8e1cdd6 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -4,6 +4,11 @@ //increase the slots of many jobs. GLOBAL_VAR_INIT(time_last_changed_position, 0) +#define JOB_ALLOWED 1 +#define JOB_COOLDOWN -2 +#define JOB_MAX_POSITIONS -1 // Trying to reduce the number of slots below that of current holders of that job, or trying to open more slots than allowed +#define JOB_DENIED 0 + /obj/machinery/computer/card name = "identification console" desc = "You can use this to manage jobs and ID access." @@ -11,8 +16,6 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) icon_keyboard = "id_key" req_one_access = list(ACCESS_HEADS, ACCESS_CHANGE_IDS) circuit = /obj/item/circuitboard/computer/card - var/obj/item/card/id/scan = null - var/obj/item/card/id/modify = null var/mode = 0 var/printing = null var/target_dept = 0 //Which department this computer has access to. 0=all departments @@ -31,81 +34,79 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) "Head of Security", "Chief Engineer", "Research Director", - "Chief Medical Officer") + "Chief Medical Officer", + "Quartermaster") //The scaling factor of max total positions in relation to the total amount of people on board the station in % var/max_relative_positions = 30 //30%: Seems reasonable, limit of 6 @ 20 players //This is used to keep track of opened positions for jobs to allow instant closing //Assoc array: "JobName" = (int) - var/list/opened_positions = list(); + var/list/opened_positions = list() + var/obj/item/card/id/inserted_scan_id + var/obj/item/card/id/inserted_modify_id + var/list/region_access = null + var/list/head_subordinates = null light_color = LIGHT_COLOR_BLUE -/obj/machinery/computer/card/examine(mob/user) - ..() - if(scan || modify) - to_chat(user, "Alt-click to eject the ID card.") +/obj/machinery/computer/card/proc/get_jobs() + return get_all_jobs() + +/obj/machinery/computer/card/centcom/get_jobs() + return get_all_centcom_jobs() /obj/machinery/computer/card/Initialize() . = ..() change_position_cooldown = CONFIG_GET(number/id_console_jobslot_delay) -/obj/machinery/computer/card/attackby(obj/O, mob/user, params)//TODO:SANITY - if(istype(O, /obj/item/card/id)) - var/obj/item/card/id/idcard = O - if(check_access(idcard)) - if(!scan) - if (!user.transferItemToLoc(idcard,src)) - return - scan = idcard - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) - else if(!modify) - if (!user.transferItemToLoc(idcard,src)) - return - modify = idcard - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) - else - if(!modify) - if (!user.transferItemToLoc(idcard,src)) - return - modify = idcard - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) - updateUsrDialog() +/obj/machinery/computer/card/examine(mob/user) + . = ..() + if(inserted_scan_id || inserted_modify_id) + . += "Alt-click to eject the ID card." + +/obj/machinery/computer/card/attackby(obj/I, mob/user, params) + if(isidcard(I)) + if(check_access(I) && !inserted_scan_id) + if(id_insert(user, I, inserted_scan_id)) + inserted_scan_id = I + updateUsrDialog() + else if(id_insert(user, I, inserted_modify_id)) + inserted_modify_id = I + updateUsrDialog() else return ..() /obj/machinery/computer/card/Destroy() - if(scan) - qdel(scan) - scan = null - if(modify) - qdel(modify) - modify = null + if(inserted_scan_id) + qdel(inserted_scan_id) + inserted_scan_id = null + if(inserted_modify_id) + qdel(inserted_modify_id) + inserted_modify_id = null return ..() /obj/machinery/computer/card/handle_atom_del(atom/A) ..() - if(A == scan) - scan = null + if(A == inserted_scan_id) + inserted_scan_id = null updateUsrDialog() - if(A == modify) - modify = null + if(A == inserted_modify_id) + inserted_modify_id = null updateUsrDialog() /obj/machinery/computer/card/on_deconstruction() - if(scan) - scan.forceMove(drop_location()) - scan = null - if(modify) - modify.forceMove(drop_location()) - modify = null + if(inserted_scan_id) + inserted_scan_id.forceMove(drop_location()) + inserted_scan_id = null + if(inserted_modify_id) + inserted_modify_id.forceMove(drop_location()) + inserted_modify_id = null //Check if you can't open a new position for a certain job /obj/machinery/computer/card/proc/job_blacklisted(jobtitle) return (jobtitle in blacklisted) - //Logic check for Topic() if you can open the job /obj/machinery/computer/card/proc/can_open_job(datum/job/job) if(job) @@ -113,10 +114,10 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) if((job.total_positions <= GLOB.player_list.len * (max_relative_positions / 100))) var/delta = (world.time / 10) - GLOB.time_last_changed_position if((change_position_cooldown < delta) || (opened_positions[job.title] < 0)) - return 1 - return -2 - return -1 - return 0 + return JOB_ALLOWED + return JOB_COOLDOWN + return JOB_MAX_POSITIONS + return JOB_DENIED //Logic check for Topic() if you can close the job /obj/machinery/computer/card/proc/can_close_job(datum/job/job) @@ -125,84 +126,118 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) if(job.total_positions > job.current_positions) var/delta = (world.time / 10) - GLOB.time_last_changed_position if((change_position_cooldown < delta) || (opened_positions[job.title] > 0)) - return 1 - return -2 - return -1 - return 0 + return JOB_ALLOWED + return JOB_COOLDOWN + return JOB_MAX_POSITIONS + return JOB_DENIED + + +/obj/machinery/computer/card/proc/id_insert(mob/user, obj/item/inserting_item, obj/item/target) + var/obj/item/card/id/card_to_insert = inserting_item + var/holder_item = FALSE + + if(!isidcard(card_to_insert)) + card_to_insert = inserting_item.RemoveID() + holder_item = TRUE + + if(!card_to_insert || !user.transferItemToLoc(card_to_insert, src)) + return FALSE + + if(target) + if(holder_item && inserting_item.InsertID(target)) + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + else + id_eject(user, target) + + user.visible_message("[user] inserts \the [card_to_insert] into \the [src].", + "You insert \the [card_to_insert] into \the [src].") + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + updateUsrDialog() + return TRUE + +/obj/machinery/computer/card/proc/id_eject(mob/user, obj/target) + if(!target) + to_chat(user, "That slot is empty!") + return FALSE + else + target.forceMove(drop_location()) + if(!issilicon(user) && Adjacent(user)) + user.put_in_hands(target) + user.visible_message("[user] gets \the [target] from \the [src].", \ + "You get \the [target] from \the [src].") + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + updateUsrDialog() + return TRUE + +/obj/machinery/computer/card/AltClick(mob/user) + ..() + if(!user.canUseTopic(src, !issilicon(user)) || !is_operational()) + return + if(inserted_modify_id) + if(id_eject(user, inserted_modify_id)) + inserted_modify_id = null + updateUsrDialog() + return + if(inserted_scan_id) + if(id_eject(user, inserted_scan_id)) + inserted_scan_id = null + updateUsrDialog() + return /obj/machinery/computer/card/ui_interact(mob/user) . = ..() - - var/dat - if(!SSticker) - return + var/list/dat = list() if (mode == 1) // accessing crew manifest - var/crew = "" + dat += "Crew Manifest:
    Please use security record computer to modify entries.

    " for(var/datum/data/record/t in sortRecord(GLOB.data_core.general)) - crew += t.fields["name"] + " - " + t.fields["rank"] + "
    " - dat = "Crew Manifest:
    Please use security record computer to modify entries.

    [crew]Print

    Access ID modification console.
    " + dat += {"[t.fields["name"]] - [t.fields["rank"]]
    "} + dat += "Print

    Access ID modification console.
    " else if(mode == 2) // JOB MANAGEMENT - dat = "Return" - dat += " || Confirm Identity: " - var/S - if(scan) - S = html_encode(scan.name) - else - S = "--------" - dat += "[S]" - dat += "" - dat += "" - var/ID - if(scan && (ACCESS_CHANGE_IDS in scan.access) && !target_dept) - ID = 1 - else - ID = 0 + dat += {"Return +
    JobSlotsOpen jobClose jobPrioritize
    + "} for(var/datum/job/job in SSjob.occupations) dat += "" if(job.title in blacklisted) continue - dat += "" - dat += "" - dat += " + + " dat += "
    JobSlotsOpen jobClose jobPrioritize
    [job.title][job.current_positions]/[job.total_positions]" + dat += {"[job.title][job.current_positions]/[job.total_positions]"} switch(can_open_job(job)) - if(1) - if(ID) + if(JOB_ALLOWED) + if(authenticated == 2) dat += "Open Position
    " else dat += "Open Position" - if(-1) - dat += "Denied" - if(-2) + if(JOB_COOLDOWN) var/time_to_wait = round(change_position_cooldown - ((world.time / 10) - GLOB.time_last_changed_position), 1) var/mins = round(time_to_wait / 60) var/seconds = time_to_wait - (60*mins) dat += "Cooldown ongoing: [mins]:[(seconds < 10) ? "0[seconds]" : "[seconds]"]" - if(0) + else dat += "Denied" dat += "
    " switch(can_close_job(job)) - if(1) - if(ID) + if(JOB_ALLOWED) + if(authenticated == 2) dat += "Close Position" else dat += "Close Position" - if(-1) - dat += "Denied" - if(-2) + if(JOB_COOLDOWN) var/time_to_wait = round(change_position_cooldown - ((world.time / 10) - GLOB.time_last_changed_position), 1) var/mins = round(time_to_wait / 60) var/seconds = time_to_wait - (60*mins) dat += "Cooldown ongoing: [mins]:[(seconds < 10) ? "0[seconds]" : "[seconds]"]" - if(0) + else dat += "Denied" dat += "" switch(job.total_positions) if(0) dat += "Denied" else - if(ID) + if(authenticated == 2) if(job in SSjob.prioritized_jobs) dat += "Deprioritize" else @@ -216,57 +251,36 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) dat += "
    " else - var/header = "" + var/list/header = list() - var/target_name - var/target_owner - var/target_rank - if(modify) - target_name = html_encode(modify.name) - else - target_name = "--------" - if(modify && modify.registered_name) - target_owner = html_encode(modify.registered_name) - else - target_owner = "--------" - if(modify && modify.assignment) - target_rank = html_encode(modify.assignment) - else - target_rank = "Unassigned" - - var/scan_name - if(scan) - scan_name = html_encode(scan.name) - else - scan_name = "--------" + var/scan_name = inserted_scan_id ? html_encode(inserted_scan_id.name) : "--------" + var/target_name = inserted_modify_id ? html_encode(inserted_modify_id.name) : "--------" + var/target_owner = (inserted_modify_id && inserted_modify_id.registered_name) ? html_encode(inserted_modify_id.registered_name) : "--------" + var/target_rank = (inserted_modify_id && inserted_modify_id.assignment) ? html_encode(inserted_modify_id.assignment) : "Unassigned" if(!authenticated) - header += "
    Please insert the cards into the slots
    " - header += "Target: [target_name]
    " - header += "Confirm Identity: [scan_name]
    " + header += {"
    Please insert the cards into the slots
    + Target: [target_name]
    + Confirm Identity: [scan_name]
    "} else - header += "

    " - header += "Remove [target_name] || " - header += "Remove [scan_name]
    " - header += "Access Crew Manifest
    " - header += "Log Out
    " + header += {"

    + Target: Remove [target_name] || + Confirm Identity: Remove [scan_name]
    + Access Crew Manifest
    + [!target_dept ? "Job Management
    " : ""] + Log Out
    "} header += "
    " - var/jobs_all = "" - var/list/alljobs = list("Unassigned") - alljobs += (istype(src, /obj/machinery/computer/card/centcom)? get_all_centcom_jobs() : get_all_jobs()) + "Custom" - for(var/job in alljobs) - jobs_all += "[replacetext(job, " ", " ")] " //make sure there isn't a line break in the middle of a job - - var/body - if (authenticated && modify) - - var/carddesc = text("") - var/jobs = text("") - if( authenticated == 2) + if (authenticated && inserted_modify_id) + var/list/carddesc = list() + var/list/jobs = list() + if (authenticated == 2) + var/list/jobs_all = list() + for(var/job in (list("Unassigned") + get_jobs() + "Custom")) + jobs_all += "[replacetext(job, " ", " ")] " //make sure there isn't a line break in the middle of a job carddesc += {""} - carddesc += "
    " - carddesc += "" - carddesc += "" - carddesc += "registered name: " - carddesc += "" - carddesc += "
    " - carddesc += "Assignment: " + carddesc += {"
    + + + registered name: + +
    + Assignment: "} jobs += "[target_rank]" //CHECK THIS @@ -299,18 +313,18 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) carddesc += "registered_name: [target_owner]
    " jobs += "Assignment: [target_rank] (Demote)" - var/accesses = "" - if(istype(src, /obj/machinery/computer/card/centcom)) + var/list/accesses = list() + if(istype(src, /obj/machinery/computer/card/centcom)) // REE accesses += "
    Central Command:
    " for(var/A in get_all_centcom_access()) - if(A in modify.access) - accesses += "[replacetext(get_centcom_access_desc(A), " ", " ")] " + if(A in inserted_modify_id.access) + accesses += "[replacetext(get_centcom_access_desc(A), " ", " ")] " else accesses += "[replacetext(get_centcom_access_desc(A), " ", " ")] " else - accesses += "
    Access
    " - accesses += "" - accesses += "" + accesses += {"
    Access
    +
    + "} for(var/i = 1; i <= 7; i++) if(authenticated == 1 && !(i in region_access)) continue @@ -321,24 +335,24 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) continue accesses += "" accesses += "
    " for(var/A in get_region_accesses(i)) - if(A in modify.access) - accesses += "[replacetext(get_access_desc(A), " ", " ")] " + if(A in inserted_modify_id.access) + accesses += "[replacetext(get_access_desc(A), " ", " ")] " else accesses += "[replacetext(get_access_desc(A), " ", " ")] " accesses += "
    " accesses += "
    " - body = "[carddesc]
    [jobs]

    [accesses]" //CHECK THIS + body = "[carddesc.Join()]
    [jobs.Join()]

    [accesses.Join()]
    " //CHECK THIS - else - body = "{Log in}

    " - body += "Access Crew Manifest" + else if (!authenticated) + body = {"Log In

    + Access Crew Manifest

    "} if(!target_dept) - body += "

    Job Management" + body += "Job Management
    " - dat = "[header][body]

    " + dat = list("", header.Join(), body, "
    ") var/datum/browser/popup = new(user, "id_com", src.name, 900, 620) - popup.set_content(dat) + popup.set_content(dat.Join()) popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) popup.open() @@ -353,52 +367,72 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) usr.set_machine(src) switch(href_list["choice"]) - if ("modify") - eject_id_modify(usr) - if ("scan") - eject_id_scan(usr) + if ("inserted_modify_id") + if(inserted_modify_id && !usr.get_active_held_item()) + if(id_eject(usr, inserted_modify_id)) + inserted_modify_id = null + updateUsrDialog() + return + if(usr.get_id_in_hand()) + var/obj/item/held_item = usr.get_active_held_item() + var/obj/item/card/id/id_to_insert = held_item.GetID() + if(id_insert(usr, held_item, inserted_modify_id)) + inserted_modify_id = id_to_insert + updateUsrDialog() + if ("inserted_scan_id") + if(inserted_scan_id && !usr.get_active_held_item()) + if(id_eject(usr, inserted_scan_id)) + inserted_scan_id = null + updateUsrDialog() + return + if(usr.get_id_in_hand()) + var/obj/item/held_item = usr.get_active_held_item() + var/obj/item/card/id/id_to_insert = held_item.GetID() + if(id_insert(usr, held_item, inserted_scan_id)) + inserted_scan_id = id_to_insert + updateUsrDialog() if ("auth") - if ((!( authenticated ) && (scan || issilicon(usr)) && (modify || mode))) - if (check_access(scan)) + if ((!( authenticated ) && (inserted_scan_id || issilicon(usr)) || mode)) + if (check_access(inserted_scan_id)) region_access = list() head_subordinates = list() - if(ACCESS_CHANGE_IDS in scan.access) + if(ACCESS_CHANGE_IDS in inserted_scan_id.access) if(target_dept) head_subordinates = get_all_jobs() region_access |= target_dept authenticated = 1 else authenticated = 2 - playsound(src, 'sound/machines/terminal_on.ogg', 50, 0) + playsound(src, 'sound/machines/terminal_on.ogg', 50, FALSE) else - if((ACCESS_HOP in scan.access) && ((target_dept==1) || !target_dept)) + if((ACCESS_HOP in inserted_scan_id.access) && ((target_dept==1) || !target_dept)) region_access |= 1 get_subordinates("Head of Personnel") - if((ACCESS_HOS in scan.access) && ((target_dept==2) || !target_dept)) + if((ACCESS_HOS in inserted_scan_id.access) && ((target_dept==2) || !target_dept)) region_access |= 2 get_subordinates("Head of Security") - if((ACCESS_CMO in scan.access) && ((target_dept==3) || !target_dept)) + if((ACCESS_CMO in inserted_scan_id.access) && ((target_dept==3) || !target_dept)) region_access |= 3 get_subordinates("Chief Medical Officer") - if((ACCESS_RD in scan.access) && ((target_dept==4) || !target_dept)) + if((ACCESS_RD in inserted_scan_id.access) && ((target_dept==4) || !target_dept)) region_access |= 4 get_subordinates("Research Director") - if((ACCESS_CE in scan.access) && ((target_dept==5) || !target_dept)) + if((ACCESS_CE in inserted_scan_id.access) && ((target_dept==5) || !target_dept)) region_access |= 5 get_subordinates("Chief Engineer") - if((ACCESS_QM in scan.access) && ((target_dept==6) || !target_dept)) + if((ACCESS_QM in inserted_scan_id.access) && ((target_dept==6) || !target_dept)) region_access |= 6 get_subordinates("Quartermaster") if(region_access) authenticated = 1 - else if ((!( authenticated ) && issilicon(usr)) && (!modify)) + else if ((!( authenticated ) && issilicon(usr)) && (!inserted_modify_id)) to_chat(usr, "You can't modify an ID without an ID inserted to modify! Once one is in the modify slot on the computer, you can log in.") if ("logout") region_access = null head_subordinates = null authenticated = 0 - playsound(src, 'sound/machines/terminal_off.ogg', 50, 0) + playsound(src, 'sound/machines/terminal_off.ogg', 50, FALSE) if("access") if(href_list["allowed"]) @@ -406,20 +440,20 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) var/access_type = text2num(href_list["access_target"]) var/access_allowed = text2num(href_list["allowed"]) if(access_type in (istype(src, /obj/machinery/computer/card/centcom)?get_all_centcom_access() : get_all_accesses())) - modify.access -= access_type + inserted_modify_id.access -= access_type if(access_allowed == 1) - modify.access += access_type - playsound(src, "terminal_type", 50, 0) + inserted_modify_id.access += access_type + playsound(src, "terminal_type", 50, FALSE) if ("assign") if (authenticated == 2) var/t1 = href_list["assign_target"] if(t1 == "Custom") - var/newJob = reject_bad_text(input("Enter a custom job assignment.", "Assignment", modify ? modify.assignment : "Unassigned"), MAX_NAME_LEN) + var/newJob = reject_bad_text(input("Enter a custom job assignment.", "Assignment", inserted_modify_id ? inserted_modify_id.assignment : "Unassigned"), MAX_NAME_LEN) if(newJob) t1 = newJob else if(t1 == "Unassigned") - modify.access -= get_all_accesses() + inserted_modify_id.access -= get_all_accesses() else var/datum/job/jobdatum @@ -430,30 +464,30 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) updateUsrDialog() break if(!jobdatum) - to_chat(usr, "No log exists for this job.") + to_chat(usr, "No log exists for this job.") updateUsrDialog() return - modify.access = ( istype(src, /obj/machinery/computer/card/centcom) ? get_centcom_access(t1) : jobdatum.get_access() ) - if (modify) - modify.assignment = t1 - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) + inserted_modify_id.access = ( istype(src, /obj/machinery/computer/card/centcom) ? get_centcom_access(t1) : jobdatum.get_access() ) + if (inserted_modify_id) + inserted_modify_id.assignment = t1 + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) if ("demote") - if(modify.assignment in head_subordinates || modify.assignment == "Assistant") - modify.assignment = "Unassigned" - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) + if(inserted_modify_id.assignment in head_subordinates || inserted_modify_id.assignment == "Assistant") + inserted_modify_id.assignment = "Unassigned" + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) else - to_chat(usr, "You are not authorized to demote this position.") + to_chat(usr, "You are not authorized to demote this position.") if ("reg") if (authenticated) - var/t2 = modify - if ((authenticated && modify == t2 && (in_range(src, usr) || issilicon(usr)) && isturf(loc))) + var/t2 = inserted_modify_id + if ((authenticated && inserted_modify_id == t2 && (in_range(src, usr) || issilicon(usr)) && isturf(loc))) var/newName = reject_bad_name(href_list["reg"]) if(newName) - modify.registered_name = newName - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) + inserted_modify_id.registered_name = newName + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) else - to_chat(usr, "Invalid name entered.") + to_chat(usr, "Invalid name entered.") updateUsrDialog() return if ("mode") @@ -462,11 +496,11 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) if("return") //DISPLAY MAIN MENU mode = 3; - playsound(src, "terminal_type", 25, 0) + playsound(src, "terminal_type", 25, FALSE) if("make_job_available") // MAKE ANOTHER JOB POSITION AVAILABLE FOR LATE JOINERS - if(scan && (ACCESS_CHANGE_IDS in scan.access) && !target_dept) + if(authenticated && !target_dept) var/edit_job_target = href_list["job"] var/datum/job/j = SSjob.GetJob(edit_job_target) if(!j) @@ -479,11 +513,11 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) GLOB.time_last_changed_position = world.time / 10 j.total_positions++ opened_positions[edit_job_target]++ - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) if("make_job_unavailable") // MAKE JOB POSITION UNAVAILABLE FOR LATE JOINERS - if(scan && (ACCESS_CHANGE_IDS in scan.access) && !target_dept) + if(authenticated && !target_dept) var/edit_job_target = href_list["job"] var/datum/job/j = SSjob.GetJob(edit_job_target) if(!j) @@ -497,11 +531,11 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) GLOB.time_last_changed_position = world.time / 10 j.total_positions-- opened_positions[edit_job_target]-- - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) if ("prioritize_job") // TOGGLE WHETHER JOB APPEARS AS PRIORITIZED IN THE LOBBY - if(scan && (ACCESS_CHANGE_IDS in scan.access) && !target_dept) + if(authenticated && !target_dept) var/priority_target = href_list["job"] var/datum/job/j = SSjob.GetJob(priority_target) if(!j) @@ -517,8 +551,8 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) return else SSjob.prioritized_jobs += j - to_chat(usr, "[j.title] has been successfully [priority ? "prioritized" : "unprioritized"]. Potential employees will notice your request.") - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) + to_chat(usr, "[j.title] has been successfully [priority ? "prioritized" : "unprioritized"]. Potential employees will notice your request.") + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) if ("print") if (!( printing )) @@ -531,59 +565,9 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) P.info = t1 P.name = "paper- 'Crew Manifest'" printing = null - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) - if (modify) - modify.update_label() - updateUsrDialog() - -/obj/machinery/computer/card/AltClick(mob/user) - if(!user.canUseTopic(src, !issilicon(user)) || !is_operational()) - return - if(scan) - eject_id_scan(user) - if(modify) - eject_id_modify(user) - -/obj/machinery/computer/card/proc/eject_id_scan(mob/user) - if(scan) - scan.forceMove(drop_location()) - if(!issilicon(user) && Adjacent(user)) - user.put_in_hands(scan) - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) - scan = null - else //switching the ID with the one you're holding - if(issilicon(user) || !Adjacent(user)) - return - var/obj/item/I = user.get_active_held_item() - if(istype(I, /obj/item/card/id)) - if(!user.transferItemToLoc(I,src)) - return - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) - scan = I - authenticated = FALSE - updateUsrDialog() - -/obj/machinery/computer/card/proc/eject_id_modify(mob/user) - if(modify) - GLOB.data_core.manifest_modify(modify.registered_name, modify.assignment) - modify.update_label() - modify.forceMove(drop_location()) - if(!issilicon(user) && Adjacent(user)) - user.put_in_hands(modify) - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) - modify = null - region_access = null - head_subordinates = null - else //switching the ID with the one you're holding - if(issilicon(user) || !Adjacent(user)) - return - var/obj/item/I = user.get_active_held_item() - if(istype(I, /obj/item/card/id)) - if (!user.transferItemToLoc(I,src)) - return - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) - modify = I - authenticated = FALSE + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + if (inserted_modify_id) + inserted_modify_id.update_label() updateUsrDialog() /obj/machinery/computer/card/proc/get_subordinates(rank) @@ -638,4 +622,9 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) target_dept = 6 icon_screen = "idqm" - light_color = LIGHT_COLOR_ORANGE \ No newline at end of file + light_color = LIGHT_COLOR_ORANGE + +#undef JOB_ALLOWED +#undef JOB_COOLDOWN +#undef JOB_MAX_POSITIONS +#undef JOB_DENIED diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index f3612078d6..b5cb066b3a 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -70,9 +70,7 @@ if("login") var/mob/M = usr - var/obj/item/card/id/I = M.get_active_held_item() - if(!istype(I)) - I = M.get_idcard() + var/obj/item/card/id/I = M.get_idcard(TRUE) if(I && istype(I)) if(check_access(I)) diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index 9d49574317..394cc4593d 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -468,7 +468,7 @@ var/len = length(viable_occupant.dna.uni_identity) num = WRAP(num, 1, len+1) num = randomize_radiation_accuracy(num, radduration + (connected.precision_coeff ** 2), len) //Each manipulator level above 1 makes randomization as accurate as selected time + manipulator lvl^2 - //Value is this high for the same reason as with laser - not worth the hassle of upgrading if the bonus is low + //Value is this high for the same reason as with laser - not worth the hassle of upgrading if the bonus is low var/block = round((num-1)/DNA_BLOCK_SIZE)+1 var/subblock = num - block*DNA_BLOCK_SIZE last_change = "UI #[block]-[subblock]; " diff --git a/code/game/machinery/computer/gulag_teleporter.dm b/code/game/machinery/computer/gulag_teleporter.dm deleted file mode 100644 index 68cbf03f03..0000000000 --- a/code/game/machinery/computer/gulag_teleporter.dm +++ /dev/null @@ -1,163 +0,0 @@ -//computer that handle the points and teleports the prisoner -/obj/machinery/computer/gulag_teleporter_computer - name = "labor camp teleporter console" - desc = "Used to send criminals to the Labor Camp." - icon_screen = "explosive" - icon_keyboard = "security_key" - req_access = list(ACCESS_ARMORY) - circuit = /obj/item/circuitboard/computer/gulag_teleporter_console - var/default_goal = 200 - var/obj/item/card/id/prisoner/id = null - var/obj/machinery/gulag_teleporter/teleporter = null - var/obj/structure/gulag_beacon/beacon = null - var/mob/living/carbon/human/prisoner = null - var/datum/data/record/temporary_record = null - - light_color = LIGHT_COLOR_RED - -/obj/machinery/computer/gulag_teleporter_computer/Initialize() - . = ..() - scan_machinery() - -/obj/machinery/computer/gulag_teleporter_computer/Destroy() - if(id) - id.forceMove(get_turf(src)) - return ..() - -/obj/machinery/computer/gulag_teleporter_computer/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/card/id/prisoner)) - if(!id) - if (!user.transferItemToLoc(W,src)) - return - id = W - to_chat(user, "You insert [W].") - return - else - to_chat(user, "There's an ID inserted already.") - return ..() - -/obj/machinery/computer/gulag_teleporter_computer/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ - datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) - if(!ui) - ui = new(user, src, ui_key, "gulag_console", name, 455, 440, master_ui, state) - ui.open() - -/obj/machinery/computer/gulag_teleporter_computer/ui_data(mob/user) - var/list/data = list() - - var/list/prisoner_list = list() - var/can_teleport = FALSE - - if(teleporter && (teleporter.occupant && ishuman(teleporter.occupant))) - prisoner = teleporter.occupant - prisoner_list["name"] = prisoner.real_name - if(id) - can_teleport = TRUE - if(!isnull(GLOB.data_core.general)) - for(var/r in GLOB.data_core.security) - var/datum/data/record/R = r - if(R.fields["name"] == prisoner_list["name"]) - temporary_record = R - prisoner_list["crimstat"] = temporary_record.fields["criminal"] - - data["prisoner"] = prisoner_list - - if(teleporter) - data["teleporter"] = teleporter - data["teleporter_location"] = "([teleporter.x], [teleporter.y], [teleporter.z])" - data["teleporter_lock"] = teleporter.locked - data["teleporter_state_open"] = teleporter.state_open - if(beacon) - data["beacon"] = beacon - data["beacon_location"] = "([beacon.x], [beacon.y], [beacon.z])" - if(id) - data["id"] = id - data["id_name"] = id.registered_name - data["goal"] = id.goal - data["can_teleport"] = can_teleport - - return data - -/obj/machinery/computer/gulag_teleporter_computer/ui_act(action, list/params) - if(..()) - return - if(!allowed(usr)) - to_chat(usr, "Access denied.") - return - switch(action) - if("scan_teleporter") - teleporter = findteleporter() - if("scan_beacon") - beacon = findbeacon() - if("handle_id") - if(id) - usr.put_in_hands(id) - id = null - else - var/obj/item/I = usr.is_holding_item_of_type(/obj/item/card/id/prisoner) - if(I) - if(!usr.transferItemToLoc(I, src)) - return - id = I - if("set_goal") - var/new_goal = input("Set the amount of points:", "Points", id.goal) as num|null - if(!isnum(new_goal)) - return - if(!new_goal) - new_goal = default_goal - if (new_goal > 1000) - to_chat(usr, "The entered amount of points is too large. Points have instead been set to the maximum allowed amount.") - id.goal = CLAMP(new_goal, 0, 1000) //maximum 1000 points - if("toggle_open") - if(teleporter.locked) - to_chat(usr, "The teleporter is locked") - return - teleporter.toggle_open() - if("teleporter_lock") - if(teleporter.state_open) - to_chat(usr, "Close the teleporter before locking!") - return - teleporter.locked = !teleporter.locked - if("teleport") - if(!teleporter || !beacon) - return - addtimer(CALLBACK(src, .proc/teleport, usr), 5) - -/obj/machinery/computer/gulag_teleporter_computer/proc/scan_machinery() - teleporter = findteleporter() - beacon = findbeacon() - -/obj/machinery/computer/gulag_teleporter_computer/proc/findteleporter() - var/obj/machinery/gulag_teleporter/teleporterf = null - - for(var/direction in GLOB.cardinals) - teleporterf = locate(/obj/machinery/gulag_teleporter, get_step(src, direction)) - if(teleporterf && teleporterf.is_operational()) - return teleporterf - -/obj/machinery/computer/gulag_teleporter_computer/proc/findbeacon() - return locate(/obj/structure/gulag_beacon) - -/obj/machinery/computer/gulag_teleporter_computer/proc/teleport(mob/user) - if(!id) //incase the ID was removed after the transfer timer was set. - say("Warning: Unable to transfer prisoner without a valid Prisoner ID inserted!") - return - var/id_goal_not_set - if(!id.goal) - id_goal_not_set = TRUE - id.goal = default_goal - say("[id]'s ID card goal defaulting to [id.goal] points.") - log_game("[key_name(user)] teleported [key_name(prisoner)] to the Labor Camp [COORD(beacon)] for [id_goal_not_set ? "default goal of ":""][id.goal] points.") - teleporter.handle_prisoner(id, temporary_record) - playsound(src, 'sound/weapons/emitter.ogg', 50, 1) - prisoner.forceMove(get_turf(beacon)) - prisoner.Knockdown(40) // small travel dizziness - to_chat(prisoner, "The teleportation makes you a little dizzy.") - new /obj/effect/particle_effect/sparks(get_turf(prisoner)) - playsound(src, "sparks", 50, 1) - if(teleporter.locked) - teleporter.locked = FALSE - teleporter.toggle_open() - id = null - temporary_record = null diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 93bc637d8d..33de8bfce2 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -22,12 +22,6 @@ /obj/machinery/computer/med_data/syndie icon_keyboard = "syndie_key" -/obj/machinery/computer/med_data/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/card/id)) - id_insert_scan(user) - else - return ..() - /obj/machinery/computer/med_data/ui_interact(mob/user) . = ..() if(isliving(user)) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index ae235dc73f..c9f2f28ab1 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -35,7 +35,8 @@ //Someone needs to break down the dat += into chunks instead of long ass lines. /obj/machinery/computer/secure_data/ui_interact(mob/user) . = ..() - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) + if(isliving(user)) + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) if(src.z > 6) to_chat(user, "Unable to establish a connection: \black You're too far away from the station!") return diff --git a/code/game/machinery/computer/telecrystalconsoles.dm b/code/game/machinery/computer/telecrystalconsoles.dm index 67407d220e..75e4a866f0 100644 --- a/code/game/machinery/computer/telecrystalconsoles.dm +++ b/code/game/machinery/computer/telecrystalconsoles.dm @@ -148,7 +148,6 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E virgin = 0 /obj/machinery/computer/telecrystals/boss/proc/getDangerous()//This scales the TC assigned with the round population. - ..() var/list/nukeops = get_antag_minds(/datum/antagonist/nukeop) var/danger = GLOB.joined_player_list.len - nukeops.len danger = CEILING(danger, 10) diff --git a/code/game/machinery/computer/teleporter.dm b/code/game/machinery/computer/teleporter.dm index b5869ef36b..21fb70c38c 100644 --- a/code/game/machinery/computer/teleporter.dm +++ b/code/game/machinery/computer/teleporter.dm @@ -130,12 +130,12 @@ 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.imp_in)) + if(!I.imp_in || !I.allow_teleport || !isliving(I.imp_in)) continue else var/mob/living/M = I.imp_in if(M.stat == DEAD) - if(M.timeofdeath + 6000 < world.time) + if(M.timeofdeath + I.lifespan_postmortem < world.time) continue if(is_eligible(M)) L[avoid_assoc_duplicate_keys(M.real_name, areaindex)] = M diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index de5022d751..7a39e73ad3 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -8,9 +8,9 @@ var/state = 1 /obj/structure/frame/examine(user) - ..() + . = ..() if(circuit) - to_chat(user, "It has \a [circuit] installed.") + . += "It has \a [circuit] installed." /obj/structure/frame/deconstruct(disassembled = TRUE) @@ -29,7 +29,7 @@ var/list/req_component_names = null // user-friendly names of components /obj/structure/frame/machine/examine(user) - ..() + . = ..() if(state == 3 && req_components && req_component_names) var/hasContent = 0 var/requires = "It requires" @@ -44,9 +44,9 @@ hasContent = 1 if(hasContent) - to_chat(user, requires + ".") + . += requires + "." else - to_chat(user, "It does not require any more components.") + . += "It does not require any more components." /obj/structure/frame/machine/proc/update_namelist() if(!req_components) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index e358f10346..98dd91d3bd 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -307,7 +307,6 @@ //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) @@ -370,16 +369,14 @@ O.find_target() O.update_explanation_text() if(!(O.target)) - O.owner.objectives -= O qdel(O) - if(mob_occupant.mind && mob_occupant.mind.assigned_role) + if(mob_occupant.mind) //Handle job slot/tater cleanup. - var/job = mob_occupant.mind.assigned_role - SSjob.FreeRole(job) - if(mob_occupant.mind.objectives.len) - mob_occupant.mind.objectives.Cut() - mob_occupant.mind.special_role = null + if(mob_occupant.mind.assigned_role) + var/job = mob_occupant.mind.assigned_role + SSjob.FreeRole(job) + mob_occupant.mind.special_role = null // Delete them from datacore. @@ -411,7 +408,7 @@ // 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 + mob_occupant.ghostize(FALSE, penalize = TRUE) QDEL_NULL(occupant) open_machine() diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index 1c6d713437..91306585b8 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -364,7 +364,7 @@ //for(var/mob/living/carbon/NS in rangers) // NS.resting = !NS.resting // NS.update_canmove() - time-- + time-- /obj/machinery/jukebox/disco/proc/dance5(var/mob/living/M) animate(M, transform = matrix(180, MATRIX_ROTATE), time = 1, loop = 0) diff --git a/code/game/machinery/defibrillator_mount.dm b/code/game/machinery/defibrillator_mount.dm index 4210435f33..97cc0f5748 100644 --- a/code/game/machinery/defibrillator_mount.dm +++ b/code/game/machinery/defibrillator_mount.dm @@ -24,13 +24,13 @@ . = ..() /obj/machinery/defibrillator_mount/examine(mob/user) - ..() + . = ..() if(defib) - to_chat(user, "There is a defib unit hooked up. Alt-click to remove it.") + . += "There is a defib unit hooked up. Alt-click to remove it." if(GLOB.security_level >= SEC_LEVEL_RED) - to_chat(user, "Due to a security situation, its locking clamps can be toggled by swiping any ID.") + . += "Due to a security situation, its locking clamps can be toggled by swiping any ID." else - to_chat(user, "Its locking clamps can be [clamps_locked ? "dis" : ""]engaged by swiping an ID with access.") + . += "Its locking clamps can be [clamps_locked ? "dis" : ""]engaged by swiping an ID with access." /obj/machinery/defibrillator_mount/process() if(defib && defib.cell && defib.cell.charge < defib.cell.maxcharge && is_operational()) diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index eaf8faef12..b94dbad2de 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -149,8 +149,8 @@ var/mode = SINGLE /obj/item/grenade/barrier/examine(mob/user) - ..() - to_chat(user, "Alt-click to toggle modes.") + . = ..() + . += "Alt-click to toggle modes." /obj/item/grenade/barrier/AltClick(mob/living/carbon/user) if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) diff --git a/code/game/machinery/dish_drive.dm b/code/game/machinery/dish_drive.dm index 66aa1347cb..3aad8d874c 100644 --- a/code/game/machinery/dish_drive.dm +++ b/code/game/machinery/dish_drive.dm @@ -27,9 +27,9 @@ RefreshParts() /obj/machinery/dish_drive/examine(mob/user) - ..() + . = ..() if(user.Adjacent(src)) - to_chat(user, "Alt-click it to beam its contents to any nearby disposal bins.") + . += "Alt-click it to beam its contents to any nearby disposal bins." /obj/machinery/dish_drive/attack_hand(mob/living/user) if(!contents.len) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 365d19b826..52b52eb288 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -83,6 +83,7 @@ var/boltDown = 'sound/machines/boltsdown.ogg' var/noPower = 'sound/machines/doorclick.ogg' var/previous_airlock = /obj/structure/door_assembly //what airlock assembly mineral plating was applied to + var/wiretypepath = /datum/wires/airlock // which set of per round randomized wires this airlock type has. var/airlock_material //material of inner filling; if its an airlock with glass, this should be set to "glass" var/overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi' var/note_overlay_file = 'icons/obj/doors/airlocks/station/overlays.dmi' //Used for papers and photos pinned to the airlock @@ -639,47 +640,47 @@ update_icon(AIRLOCK_CLOSED) /obj/machinery/door/airlock/examine(mob/user) - ..() + . = ..() if(obj_flags & EMAGGED) - to_chat(user, "Its access panel is smoking slightly.") + . += "Its access panel is smoking slightly." if(charge && !panel_open && in_range(user, src)) - to_chat(user, "The maintenance panel seems haphazardly fastened.") + . += "The maintenance panel seems haphazardly fastened." if(charge && panel_open) - to_chat(user, "Something is wired up to the airlock's electronics!") + . += "Something is wired up to the airlock's electronics!" if(note) if(!in_range(user, src)) - to_chat(user, "There's a [note.name] pinned to the front. You can't read it from here.") + . += "There's a [note.name] pinned to the front. You can't read it from here." else - to_chat(user, "There's a [note.name] pinned to the front...") - note.examine(user) + . += "There's a [note.name] pinned to the front..." + . += note.examine(user) if(panel_open) switch(security_level) if(AIRLOCK_SECURITY_NONE) - to_chat(user, "Its wires are exposed!") + . += "Its wires are exposed!" if(AIRLOCK_SECURITY_METAL) - to_chat(user, "Its wires are hidden behind a welded metal cover.") + . += "Its wires are hidden behind a welded metal cover." if(AIRLOCK_SECURITY_PLASTEEL_I_S) - to_chat(user, "There is some shredded plasteel inside.") + . += "There is some shredded plasteel inside." if(AIRLOCK_SECURITY_PLASTEEL_I) - to_chat(user, "Its wires are behind an inner layer of plasteel.") + . += "Its wires are behind an inner layer of plasteel." if(AIRLOCK_SECURITY_PLASTEEL_O_S) - to_chat(user, "There is some shredded plasteel inside.") + . += "There is some shredded plasteel inside." if(AIRLOCK_SECURITY_PLASTEEL_O) - to_chat(user, "There is a welded plasteel cover hiding its wires.") + . += "There is a welded plasteel cover hiding its wires." if(AIRLOCK_SECURITY_PLASTEEL) - to_chat(user, "There is a protective grille over its panel.") + . += "There is a protective grille over its panel." else if(security_level) if(security_level == AIRLOCK_SECURITY_METAL) - to_chat(user, "It looks a bit stronger.") + . += "It looks a bit stronger." else - to_chat(user, "It looks very robust.") + . += "It looks very robust." if(issilicon(user) && (!stat & BROKEN)) - to_chat(user, "Shift-click [src] to [ density ? "open" : "close"] it.") - to_chat(user, "Ctrl-click [src] to [ locked ? "raise" : "drop"] its bolts.") - to_chat(user, "Alt-click [src] to [ secondsElectrified ? "un-electrify" : "permanently electrify"] it.") - to_chat(user, "Ctrl-Shift-click [src] to [ emergency ? "disable" : "enable"] emergency access.") + . += "Shift-click [src] to [ density ? "open" : "close"] it." + . += "Ctrl-click [src] to [ locked ? "raise" : "drop"] its bolts." + . += "Alt-click [src] to [ secondsElectrified ? "un-electrify" : "permanently electrify"] it." + . += "Ctrl-Shift-click [src] to [ emergency ? "disable" : "enable"] emergency access." /obj/machinery/door/airlock/attack_ai(mob/user) if(!src.canAIControl(user)) diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm index cfaa94b842..54774a8f99 100644 --- a/code/game/machinery/doors/airlock_electronics.dm +++ b/code/game/machinery/doors/airlock_electronics.dm @@ -7,8 +7,8 @@ var/unres_sides = 0 //unrestricted sides, or sides of the airlock that will open regardless of access /obj/item/electronics/airlock/examine(mob/user) - ..() - to_chat(user, "Has a neat selection menu for modifying airlock access levels.") + . = ..() + . += "Has a neat selection menu for modifying airlock access levels." /obj/item/electronics/airlock/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.hands_state) diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index 8704a4c749..50ae7dab18 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -8,16 +8,19 @@ /obj/machinery/door/airlock/command icon = 'icons/obj/doors/airlocks/station/command.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_com + wiretypepath = /datum/wires/airlock/command normal_integrity = 450 /obj/machinery/door/airlock/security icon = 'icons/obj/doors/airlocks/station/security.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_sec + wiretypepath = /datum/wires/airlock/security normal_integrity = 450 /obj/machinery/door/airlock/engineering icon = 'icons/obj/doors/airlocks/station/engineering.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_eng + wiretypepath = /datum/wires/airlock/engineering /obj/machinery/door/airlock/engineering/abandoned abandoned = TRUE @@ -25,6 +28,7 @@ /obj/machinery/door/airlock/medical icon = 'icons/obj/doors/airlocks/station/medical.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_med + wiretypepath = /datum/wires/airlock/medical /obj/machinery/door/airlock/maintenance name = "maintenance access" @@ -44,11 +48,13 @@ name = "mining airlock" icon = 'icons/obj/doors/airlocks/station/mining.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_min + wiretypepath = /datum/wires/airlock/cargo /obj/machinery/door/airlock/atmos name = "atmospherics airlock" icon = 'icons/obj/doors/airlocks/station/atmos.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_atmo + wiretypepath = /datum/wires/airlock/engineering /obj/machinery/door/airlock/atmos/abandoned abandoned = TRUE @@ -56,6 +62,7 @@ /obj/machinery/door/airlock/research icon = 'icons/obj/doors/airlocks/station/research.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_research + wiretypepath = /datum/wires/airlock/science /obj/machinery/door/airlock/freezer name = "freezer airlock" @@ -65,10 +72,12 @@ /obj/machinery/door/airlock/science icon = 'icons/obj/doors/airlocks/station/science.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_science + wiretypepath = /datum/wires/airlock/science /obj/machinery/door/airlock/virology icon = 'icons/obj/doors/airlocks/station/virology.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_viro + wiretypepath = /datum/wires/airlock/medical ////////////////////////////////// /* @@ -249,10 +258,10 @@ return 0 /obj/machinery/door/airlock/plasma/attackby(obj/item/C, mob/user, params) - if(C.is_hot() > 300)//If the temperature of the object is over 300, then ignite + if(C.get_temperature() > 300)//If the temperature of the object is over 300, then ignite message_admins("Plasma airlock ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_VERBOSEJMP(src)]") log_game("Plasma airlock ignited by [key_name(user)] in [AREACOORD(src)]") - ignite(C.is_hot()) + ignite(C.get_temperature()) else return ..() @@ -376,6 +385,7 @@ icon = 'icons/obj/doors/airlocks/vault/vault.dmi' overlays_file = 'icons/obj/doors/airlocks/vault/overlays.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_vault + wiretypepath = /datum/wires/airlock/secure explosion_block = 2 normal_integrity = 400 // reverse engieneerd: 400 * 1.5 (sec lvl 6) = 600 = original security_level = 6 @@ -499,7 +509,7 @@ SEND_SOUND(L, sound(pick('sound/hallucinations/turn_around1.ogg','sound/hallucinations/turn_around2.ogg'),0,1,50)) flash_color(L, flash_color="#960000", flash_time=20) L.Knockdown(40) - L.throw_at(throwtarget, 5, 1,src) + L.throw_at(throwtarget, 5, 1) return 0 /obj/machinery/door/airlock/cult/proc/conceal() @@ -583,14 +593,12 @@ return ..() /obj/machinery/door/airlock/clockwork/examine(mob/user) - ..() - var/gear_text = "The cogwheel is flickering and twisting wildly. Report this to a coder." + . = ..() switch(construction_state) if(GEAR_SECURE) - gear_text = "The cogwheel is solidly wrenched to the brass around it." + . += "The cogwheel is solidly wrenched to the brass around it." if(GEAR_LOOSE) - gear_text = "The cogwheel has been loosened, but remains connected loosely to the door!" - to_chat(user, gear_text) + . += "The cogwheel has been loosened, but remains connected loosely to the door!" /obj/machinery/door/airlock/clockwork/emp_act(severity) if(prob(80/severity)) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 3ac386e1fb..ee8742e84f 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -37,14 +37,14 @@ var/unres_sides = 0 //Unrestricted sides. A bitflag for which direction (if any) can open the door with no access /obj/machinery/door/examine(mob/user) - ..() + . = ..() if(red_alert_access) if(GLOB.security_level >= SEC_LEVEL_RED) - to_chat(user, "Due to a security threat, its access requirements have been lifted!") + . += "Due to a security threat, its access requirements have been lifted!" else - to_chat(user, "In the event of a red alert, its access requirements will automatically lift.") + . += "In the event of a red alert, its access requirements will automatically lift." if(!poddoor) - to_chat(user, "Its maintenance panel is screwed in place.") + . += "Its maintenance panel is screwed in place." /obj/machinery/door/check_access_list(list/access_list) if(red_alert_access && GLOB.security_level >= SEC_LEVEL_RED) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 507769f9a3..dec41b0a59 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -34,13 +34,13 @@ /obj/machinery/door/firedoor/examine(mob/user) ..() if(!density) - to_chat(user, "It is open, but could be pried closed.") + . += "It is open, but could be pried closed." else if(!welded) - to_chat(user, "It is closed, but could be pried open. Deconstruction would require it to be welded shut.") + . += "It is closed, but could be pried open. Deconstruction would require it to be welded shut." else if(boltslocked) - to_chat(user, "It is welded shut. The floor bolts have been locked by screws.") + . += "It is welded shut. The floor bolts have been locked by screws." else - to_chat(user, "The bolt locks have been unscrewed, but the bolts themselves are still wrenched to the floor.") + . += "The bolt locks have been unscrewed, but the bolts themselves are still wrenched to the floor." /obj/machinery/door/firedoor/proc/CalculateAffectingAreas() remove_from_areas() @@ -270,18 +270,18 @@ var/reinforced = 0 /obj/structure/firelock_frame/examine(mob/user) - ..() + . = ..() switch(constructionStep) if(CONSTRUCTION_PANEL_OPEN) - to_chat(user, "It is unbolted from the floor. A small loosely connected metal plate is covering the wires.") + . += "It is unbolted from the floor. A small loosely connected metal plate is covering the wires." if(!reinforced) - to_chat(user, "It could be reinforced with plasteel.") + . += "It could be reinforced with plasteel." if(CONSTRUCTION_WIRES_EXPOSED) - to_chat(user, "The maintenance plate has been pried away, and wires are trailing.") + . += "The maintenance plate has been pried away, and wires are trailing." if(CONSTRUCTION_GUTTED) - to_chat(user, "The maintenance panel is missing wires and the circuit board is loosely connected.") + . += "The maintenance panel is missing wires and the circuit board is loosely connected." if(CONSTRUCTION_NOCIRCUIT) - to_chat(user, "There are no firelock electronics in the frame. The frame could be cut apart.") + . += "There are no firelock electronics in the frame. The frame could be cut apart." /obj/structure/firelock_frame/update_icon() ..() diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 7fb240c711..1c25c7b242 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -22,8 +22,8 @@ GLOBAL_LIST_EMPTY(doppler_arrays) return ..() /obj/machinery/doppler_array/examine(mob/user) - ..() - to_chat(user, "Its dish is facing to the [dir2text(dir)].") + . = ..() + . += "Its dish is facing to the [dir2text(dir)]." /obj/machinery/doppler_array/process() return PROCESS_KILL @@ -114,13 +114,13 @@ GLOBAL_LIST_EMPTY(doppler_arrays) return var/point_gain = 0 - + /*****The Point Calculator*****/ - + if(orig_light < 10) say("Explosion not large enough for research calculations.") return - else if(orig_light < 4500) + else if(orig_light < 4500) point_gain = (83300 * orig_light) / (orig_light + 3000) else point_gain = TECHWEB_BOMB_POINTCAP diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm index b121057315..96ac8981c9 100644 --- a/code/game/machinery/droneDispenser.dm +++ b/code/game/machinery/droneDispenser.dm @@ -129,9 +129,9 @@ break_message = "slowly falls dark, lights stuttering." /obj/machinery/droneDispenser/examine(mob/user) - ..() + . = ..() if((mode == DRONE_RECHARGING) && !stat && recharging_text) - to_chat(user, "[recharging_text]") + . += "[recharging_text]" /obj/machinery/droneDispenser/power_change() ..() diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 5e20e5ee0e..def530a14d 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -196,8 +196,8 @@ var/id = null /obj/item/wallframe/flasher/examine(mob/user) - ..() - to_chat(user, "Its channel ID is '[id]'.") + . = ..() + . += "Its channel ID is '[id]'." /obj/item/wallframe/flasher/after_attach(var/obj/O) ..() diff --git a/code/game/machinery/harvester.dm b/code/game/machinery/harvester.dm index db015eb7c1..e6b8fe3b88 100644 --- a/code/game/machinery/harvester.dm +++ b/code/game/machinery/harvester.dm @@ -183,10 +183,10 @@ container_resist(user) /obj/machinery/harvester/examine(mob/user) - ..() + . = ..() if(stat & BROKEN) return if(state_open) - to_chat(user, "[src] must be closed before harvesting.") + . += "[src] must be closed before harvesting." else if(!harvesting) - to_chat(user, "Alt-click [src] to start harvesting.") \ No newline at end of file + . += "Alt-click [src] to start harvesting." \ No newline at end of file diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 621ca266bb..aee1cf4f69 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -221,7 +221,6 @@ . += "\tNo chemicals are attached.\n" . += "\t[attached ? attached : "No one"] is attached." - to_chat(user,.) #undef IV_TAKING #undef IV_INJECTING \ No newline at end of file diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm index db59f3f413..5418dcdb97 100644 --- a/code/game/machinery/launch_pad.dm +++ b/code/game/machinery/launch_pad.dm @@ -153,11 +153,11 @@ var/obj/item/storage/briefcase/launchpad/briefcase /obj/machinery/launchpad/briefcase/Initialize(mapload, briefcase) - . = ..() - if(!briefcase) - log_game("[src] has been spawned without a briefcase.") - return INITIALIZE_HINT_QDEL - src.briefcase = briefcase + . = ..() + if(!briefcase) + log_game("[src] has been spawned without a briefcase.") + return INITIALIZE_HINT_QDEL + src.briefcase = briefcase /obj/machinery/launchpad/briefcase/Destroy() QDEL_NULL(briefcase) diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index cbb9b4f253..694df02eb5 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -33,8 +33,8 @@ icon_state = "light0" /obj/machinery/light_switch/examine(mob/user) - ..() - to_chat(user, "It is [on? "on" : "off"].") + . = ..() + . += "It is [on? "on" : "off"]." /obj/machinery/light_switch/interact(mob/user) . = ..() diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index 88ab4ec6f8..794509801b 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -178,7 +178,7 @@ dat += materials_printout() for(var/v in stored_research.researched_designs) - var/datum/design/D = stored_research.researched_designs[v] + var/datum/design/D = SSresearch.techweb_design_by_id(v) if(!(selected_category in D.category)) continue if(disabled || !can_build(D)) @@ -221,7 +221,7 @@ if(obj_flags & EMAGGED) return for(var/id in SSresearch.techweb_designs) - var/datum/design/D = SSresearch.techweb_designs[id] + var/datum/design/D = SSresearch.techweb_design_by_id(id) if((D.build_type & LIMBGROWER) && ("emagged" in D.category)) stored_research.add_design(D) to_chat(user, "A warning flashes onto the screen, stating that safety overrides have been deactivated!") diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index c37c607a6e..6bf9930eec 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -515,7 +515,7 @@ GLOBAL_LIST_EMPTY(allCasters) if(href_list["set_channel_name"]) channel_name = stripped_input(usr, "Provide a Feed Channel Name", "Network Channel Handler", "", MAX_NAME_LEN) while (findtext(channel_name," ") == 1) - channel_name = copytext(channel_name,2,lentext(channel_name)+1) + channel_name = copytext(channel_name,2,length(channel_name)+1) updateUsrDialog() else if(href_list["set_channel_lock"]) c_locked = !c_locked diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 7aaab0d8ea..8c2a04bfbc 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -647,6 +647,7 @@ has_cover = 0 scan_range = 9 req_access = list(ACCESS_SYNDICATE) + mode = TURRET_LETHAL stun_projectile = /obj/item/projectile/bullet lethal_projectile = /obj/item/projectile/bullet lethal_projectile_sound = 'sound/weapons/gunshot.ogg' @@ -695,6 +696,24 @@ stun_projectile = /obj/item/projectile/bullet/syndicate_turret lethal_projectile = /obj/item/projectile/bullet/syndicate_turret +/obj/machinery/porta_turret/syndicate/shuttle + scan_range = 9 + shot_delay = 3 + stun_projectile = /obj/item/projectile/bullet/p50/penetrator/shuttle + lethal_projectile = /obj/item/projectile/bullet/p50/penetrator/shuttle + lethal_projectile_sound = 'sound/weapons/gunshot_smg.ogg' + stun_projectile_sound = 'sound/weapons/gunshot_smg.ogg' + armor = list("melee" = 50, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 80, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) + +/obj/machinery/porta_turret/syndicate/shuttle/target(atom/movable/target) + if(target) + setDir(get_dir(base, target))//even if you can't shoot, follow the target + shootAt(target) + addtimer(CALLBACK(src, .proc/shootAt, target), 5) + addtimer(CALLBACK(src, .proc/shootAt, target), 10) + addtimer(CALLBACK(src, .proc/shootAt, target), 15) + return TRUE + /obj/machinery/porta_turret/ai faction = list("silicon") nonlethal_projectile = /obj/item/projectile/beam/disabler @@ -819,10 +838,10 @@ T.cp = src /obj/machinery/turretid/examine(mob/user) - ..() + . = ..() if(issilicon(user) && (!stat & BROKEN)) - to_chat(user, "Ctrl-click [src] to [ enabled ? "disable" : "enable"] turrets.") - to_chat(user, "Alt-click [src] to set turrets to [ lethal ? "stun" : "kill"].") + . += "Ctrl-click [src] to [ enabled ? "disable" : "enable"] turrets." + . += "Alt-click [src] to set turrets to [ lethal ? "stun" : "kill"]." /obj/machinery/turretid/attackby(obj/item/I, mob/user, params) if(stat & BROKEN) diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm index b5ef38b42c..f9fda50daf 100644 --- a/code/game/machinery/quantum_pad.dm +++ b/code/game/machinery/quantum_pad.dm @@ -30,12 +30,12 @@ return ..() /obj/machinery/quantumpad/examine(mob/user) - ..() - to_chat(user, "It is [ linked_pad ? "currently" : "not"] linked to another pad.") + . = ..() + . += "It is [ linked_pad ? "currently" : "not"] linked to another pad." if(!panel_open) - to_chat(user, "The panel is screwed in, obstructing the linking device.") + . += "The panel is screwed in, obstructing the linking device." else - to_chat(user, "The linking device is now able to be scanned with a multitool.") + . += "The linking device is now able to be scanned with a multitool." /obj/machinery/quantumpad/RefreshParts() var/E = 0 diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 1a8bc7ece4..d39de4d37d 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -40,10 +40,10 @@ butchering.bonus_modifier = amount_produced/5 /obj/machinery/recycler/examine(mob/user) - ..() - to_chat(user, "The power light is [(stat & NOPOWER) ? "off" : "on"].") - to_chat(user, "The safety-mode light is [safety_mode ? "on" : "off"].") - to_chat(user, "The safety-sensors status light is [obj_flags & EMAGGED ? "off" : "on"].") + . = ..() + . += "The power light is [(stat & NOPOWER) ? "off" : "on"]." + . += "The safety-mode light is [safety_mode ? "on" : "off"]." + . += "The safety-sensors status light is [obj_flags & EMAGGED ? "off" : "on"]." /obj/machinery/recycler/power_change() ..() @@ -109,7 +109,7 @@ var/atom/movable/AM = i var/obj/item/bodypart/head/as_head = AM var/obj/item/mmi/as_mmi = AM - var/brain_holder = istype(AM, /obj/item/organ/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain) || isbrain(AM) + var/brain_holder = istype(AM, /obj/item/organ/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain) || isbrain(AM) || istype(AM, /obj/item/dullahan_relay) if(brain_holder) emergency_stop(AM) else if(isliving(AM)) diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index ce325505e2..984a911d32 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -46,12 +46,12 @@ return ..() /obj/machinery/space_heater/examine(mob/user) - ..() - to_chat(user, "\The [src] is [on ? "on" : "off"], and the hatch is [panel_open ? "open" : "closed"].") + . = ..() + . += "\The [src] is [on ? "on" : "off"], and the hatch is [panel_open ? "open" : "closed"]." if(cell) - to_chat(user, "The charge meter reads [cell ? round(cell.percent(), 1) : 0]%.") + . += "The charge meter reads [cell ? round(cell.percent(), 1) : 0]%." else - to_chat(user, "There is no power cell installed.") + . += "There is no power cell installed." /obj/machinery/space_heater/update_icon() if(on) diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index e9216ca736..af5f50f28d 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -114,12 +114,11 @@ /obj/machinery/status_display/examine(mob/user) . = ..() if (message1 || message2) - var/list/msg = list("The display says:") + . += "The display says:" if (message1) - msg += "
    \t[html_encode(message1)]" + . += "\t[html_encode(message1)]" if (message2) - msg += "
    \t[html_encode(message2)]" - to_chat(user, msg.Join()) + . += "\t[html_encode(message2)]" // Helper procs for child display types. /obj/machinery/status_display/proc/display_shuttle_status(obj/docking_port/mobile/shuttle) @@ -146,9 +145,9 @@ modestr = "
    \t[modestr]: [shuttle.getTimerStr()]" else modestr = "
    \t[modestr]" - to_chat(user, "The display says:
    \t[shuttle.name][modestr]") + return "The display says:
    \t[shuttle.name][modestr]" else - to_chat(user, "The display says:
    \tShuttle missing!") + return "The display says:
    \tShuttle missing!" /// Evac display which shows shuttle timer or message set by Command. @@ -195,9 +194,9 @@ /obj/machinery/status_display/evac/examine(mob/user) . = ..() if(mode == SD_EMERGENCY) - examine_shuttle(user, SSshuttle.emergency) + . += examine_shuttle(user, SSshuttle.emergency) else if(!message1 && !message2) - to_chat(user, "The display is blank.") + . += "The display is blank." /obj/machinery/status_display/evac/receive_signal(datum/signal/signal) switch(signal.data["command"]) @@ -243,7 +242,7 @@ else line1 = "CARGO" line2 = SSshuttle.supply.getTimerStr() - if(lentext(line2) > CHARS_PER_LINE) + if(length(line2) > CHARS_PER_LINE) line2 = "Error" update_display(line1, line2) @@ -257,9 +256,9 @@ else shuttleMsg = "[shuttle.getModeStr()]: [shuttle.getTimerStr()]" if (shuttleMsg) - to_chat(user, "The display says:
    \t[shuttleMsg]") + . += "The display says:
    \t[shuttleMsg]" else - to_chat(user, "The display is blank.") + . += "The display is blank." /// General-purpose shuttle status display. @@ -278,9 +277,9 @@ /obj/machinery/status_display/shuttle/examine(mob/user) . = ..() if(shuttle_id) - examine_shuttle(user, SSshuttle.getShuttle(shuttle_id)) + . += examine_shuttle(user, SSshuttle.getShuttle(shuttle_id)) else - to_chat(user, "The display is blank.") + . += "The display is blank." /obj/machinery/status_display/shuttle/vv_edit_var(var_name, var_value) . = ..() diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index d7c2a5734b..ebc2533124 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -1,5 +1,5 @@ #define BUTTON_COOLDOWN 60 // cant delay the bomb forever -#define BUTTON_DELAY 50 //five seconds +#define BUTTON_DELAY 20 // two seconds /obj/machinery/syndicatebomb icon = 'icons/obj/assemblies.dmi' @@ -99,8 +99,8 @@ return ..() /obj/machinery/syndicatebomb/examine(mob/user) - ..() - to_chat(user, "A digital display on it reads \"[seconds_remaining()]\".") + . = ..() + . += "A digital display on it reads \"[seconds_remaining()]\"." /obj/machinery/syndicatebomb/update_icon() icon_state = "[initial(icon_state)][active ? "-active" : "-inactive"][open_panel ? "-wires" : ""]" @@ -500,7 +500,7 @@ /obj/item/syndicatedetonator name = "big red button" - desc = "Your standard issue bomb synchronizing button. Five second safety delay to prevent 'accidents'." + desc = "Your standard issue bomb synchronizing button. Two second safety delay to prevent 'accidents'." icon = 'icons/obj/assemblies.dmi' icon_state = "bigred" item_state = "electronic" diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm index 1ebe8cb463..3ff2424d83 100644 --- a/code/game/machinery/transformer.dm +++ b/code/game/machinery/transformer.dm @@ -28,7 +28,7 @@ /obj/machinery/transformer/examine(mob/user) . = ..() if(cooldown && (issilicon(user) || isobserver(user))) - to_chat(user, "It will be ready in [DisplayTimeText(cooldown_timer - world.time)].") + . += "It will be ready in [DisplayTimeText(cooldown_timer - world.time)]." /obj/machinery/transformer/Destroy() QDEL_NULL(countdown) diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index 8be079656b..081d91e56f 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -12,8 +12,8 @@ var/max_wash_capacity = 5 /obj/machinery/washing_machine/examine(mob/user) - ..() - to_chat(user, "Alt-click it to start a wash cycle.") + . = ..() + . += "Alt-click it to start a wash cycle." /obj/machinery/washing_machine/AltClick(mob/user) if(!user.canUseTopic(src)) diff --git a/code/game/mecha/combat/honker.dm b/code/game/mecha/combat/honker.dm index ed29809f91..3a3d98ad1e 100644 --- a/code/game/mecha/combat/honker.dm +++ b/code/game/mecha/combat/honker.dm @@ -57,19 +57,19 @@ [js_byjax] [js_dropdowns] function SSticker() { - setInterval(function(){ - window.location='byond://?src=[REF(src)]&update_content=1'; - document.body.style.color = get_rand_color_string(); - document.body.style.background = get_rand_color_string(); - }, 1000); + setInterval(function(){ + window.location='byond://?src=[REF(src)]&update_content=1'; + document.body.style.color = get_rand_color_string(); + document.body.style.background = get_rand_color_string(); + }, 1000); } function get_rand_color_string() { - var color = new Array; - for(var i=0;i<3;i++){ - color.push(Math.floor(Math.random()*255)); - } - return "rgb("+color.toString()+")"; + var color = new Array; + for(var i=0;i<3;i++){ + color.push(Math.floor(Math.random()*255)); + } + return "rgb("+color.toString()+")"; } window.onload = function() { diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm index f198bfbd87..bc8a675085 100644 --- a/code/game/mecha/mech_bay.dm +++ b/code/game/mecha/mech_bay.dm @@ -9,7 +9,7 @@ /turf/open/floor/mech_bay_recharge_floor/airless icon_state = "recharge_floor_asteroid" - initial_gas_mix = "TEMP=2.7" + initial_gas_mix = AIRLESS_ATMOS /obj/machinery/mech_bay_recharge_port name = "mech bay power port" diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 4acf7981bc..417fefce6e 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -34,12 +34,12 @@ ) /obj/machinery/mecha_part_fabricator/Initialize() - var/datum/component/material_container/materials = AddComponent(/datum/component/material_container, - list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE), 0, - TRUE, /obj/item/stack, CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert)) - materials.precise_insertion = TRUE - stored_research = new - return ..() + var/datum/component/material_container/materials = AddComponent(/datum/component/material_container, + list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE), 0, + TRUE, /obj/item/stack, CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert)) + materials.precise_insertion = TRUE + stored_research = new + return ..() /obj/machinery/mecha_part_fabricator/RefreshParts() var/T = 0 @@ -85,7 +85,7 @@ /obj/machinery/mecha_part_fabricator/proc/output_parts_list(set_name) var/output = "" for(var/v in stored_research.researched_designs) - var/datum/design/D = stored_research.researched_designs[v] + var/datum/design/D = SSresearch.techweb_design_by_id(v) if(D.build_type & MECHFAB) if(!(set_name in D.category)) continue @@ -166,7 +166,7 @@ /obj/machinery/mecha_part_fabricator/proc/add_part_set_to_queue(set_name) if(set_name in part_sets) for(var/v in stored_research.researched_designs) - var/datum/design/D = stored_research.researched_designs[v] + var/datum/design/D = SSresearch.techweb_design_by_id(v) if(D.build_type & MECHFAB) if(set_name in D.category) add_to_queue(D) @@ -324,7 +324,7 @@ if(href_list["part"]) var/T = afilter.getStr("part") for(var/v in stored_research.researched_designs) - var/datum/design/D = stored_research.researched_designs[v] + var/datum/design/D = SSresearch.techweb_design_by_id(v) if(D.build_type & MECHFAB) if(D.id == T) if(!processing_queue) @@ -335,7 +335,7 @@ if(href_list["add_to_queue"]) var/T = afilter.getStr("add_to_queue") for(var/v in stored_research.researched_designs) - var/datum/design/D = stored_research.researched_designs[v] + var/datum/design/D = SSresearch.techweb_design_by_id(v) if(D.build_type & MECHFAB) if(D.id == T) add_to_queue(D) @@ -373,7 +373,7 @@ if(href_list["part_desc"]) var/T = afilter.getStr("part_desc") for(var/v in stored_research.researched_designs) - var/datum/design/D = stored_research.researched_designs[v] + var/datum/design/D = SSresearch.techweb_design_by_id(v) if(D.build_type & MECHFAB) if(D.id == T) var/obj/part = D.build_path diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 717c94362c..fe0ec33ed6 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -270,23 +270,23 @@ //////////////////////////////////////////////////////////////////////////////// /obj/mecha/examine(mob/user) - ..() + . = ..() var/integrity = obj_integrity*100/max_integrity switch(integrity) if(85 to 100) - to_chat(user, "It's fully intact.") + . += "It's fully intact." if(65 to 85) - to_chat(user, "It's slightly damaged.") + . += "It's slightly damaged." if(45 to 65) - to_chat(user, "It's badly damaged.") + . += "It's badly damaged." if(25 to 45) - to_chat(user, "It's heavily damaged.") + . += "It's heavily damaged." else - to_chat(user, "It's falling apart.") + . += "It's falling apart." if(equipment && equipment.len) - to_chat(user, "It's equipped with:") + . += "It's equipped with:" for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment) - to_chat(user, "[icon2html(ME, user)] \A [ME].") + . += "[icon2html(ME, user)] \A [ME]." //processing internal damage, temperature, air regulation, alert updates, lights power use. /obj/mecha/process() diff --git a/code/game/mecha/mecha_topic.dm b/code/game/mecha/mecha_topic.dm index 79ee7435e4..f9e04990fc 100644 --- a/code/game/mecha/mecha_topic.dm +++ b/code/game/mecha/mecha_topic.dm @@ -21,9 +21,9 @@ [js_byjax] [js_dropdowns] function SSticker() { - setInterval(function(){ - window.location='byond://?src=[REF(src)]&update_content=1'; - }, 1000); + setInterval(function(){ + window.location='byond://?src=[REF(src)]&update_content=1'; + }, 1000); } window.onload = function() { diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm index 645c13292b..d6ba08e021 100644 --- a/code/game/mecha/mecha_wreckage.dm +++ b/code/game/mecha/mecha_wreckage.dm @@ -30,9 +30,9 @@ AI.remote_control = null /obj/structure/mecha_wreckage/examine(mob/user) - ..() + . = ..() if(AI) - to_chat(user, "The AI recovery beacon is active.") + . += "The AI recovery beacon is active." /obj/structure/mecha_wreckage/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weldingtool)) diff --git a/code/game/mecha/medical/odysseus.dm b/code/game/mecha/medical/odysseus.dm index b6a4ac2390..360ac51444 100644 --- a/code/game/mecha/medical/odysseus.dm +++ b/code/game/mecha/medical/odysseus.dm @@ -17,8 +17,15 @@ hud.add_hud_to(H) /obj/mecha/medical/odysseus/go_out() - if(ishuman(occupant)) - var/mob/living/carbon/human/H = occupant + if(isliving(occupant)) + var/mob/living/carbon/human/L = occupant var/datum/atom_hud/hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] - hud.remove_hud_from(H) + hud.remove_hud_from(L) ..() + +/obj/mecha/medical/odysseus/mmi_moved_inside(obj/item/mmi/mmi_as_oc, mob/user) + . = ..() + if(.) + var/datum/atom_hud/hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] + var/mob/living/brain/B = mmi_as_oc.brainmob + hud.add_hud_to(B) diff --git a/code/game/objects/effects/countdown.dm b/code/game/objects/effects/countdown.dm index eea6b6ba39..6017e8fc07 100644 --- a/code/game/objects/effects/countdown.dm +++ b/code/game/objects/effects/countdown.dm @@ -20,7 +20,7 @@ /obj/effect/countdown/examine(mob/user) . = ..() - to_chat(user, "This countdown is displaying: [displayed_text].") + . += "This countdown is displaying: [displayed_text]." /obj/effect/countdown/proc/attach(atom/A) attached_to = A diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index 2eb4a6aa0c..cab4a66fdd 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -45,11 +45,11 @@ if(!reagents.total_volume) //scooped up all of it qdel(src) return - if(W.is_hot()) //todo: make heating a reagent holder proc + if(W.get_temperature()) //todo: make heating a reagent holder proc if(istype(W, /obj/item/clothing/mask/cigarette)) return else - var/hotness = W.is_hot() + var/hotness = W.get_temperature() reagents.expose_temperature(hotness) to_chat(user, "You heat [name] with [W]!") else diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index 842b230b53..4eab5e826b 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -130,12 +130,10 @@ /obj/effect/decal/cleanable/blood/footprints/examine(mob/user) . = ..() if(shoe_types.len) - . += "You recognise the footprints as belonging to:\n" + . += "You recognise the footprints as belonging to:" for(var/shoe in shoe_types) var/obj/item/clothing/shoes/S = shoe - . += "some [initial(S.name)] [icon2html(initial(S.icon), user)]\n" - - to_chat(user, .) + . += "some [initial(S.name)] [icon2html(initial(S.icon), 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 diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm index b6a3c7cfef..2fa7277d8b 100644 --- a/code/game/objects/effects/decals/decal.dm +++ b/code/game/objects/effects/decals/decal.dm @@ -15,7 +15,7 @@ qdel(src) /obj/effect/decal/proc/NeverShouldHaveComeHere(turf/T) - return isspaceturf(T) || isclosedturf(T) || islava(T) || istype(T, /turf/open/water) || ischasm(T) + return isclosedturf(T) || isgroundlessturf(T) /obj/effect/decal/ex_act(severity, target) qdel(src) diff --git a/code/game/objects/effects/decals/turfdecal/weather.dm b/code/game/objects/effects/decals/turfdecal/weather.dm index 9e8da6a3f8..52c1a165f2 100644 --- a/code/game/objects/effects/decals/turfdecal/weather.dm +++ b/code/game/objects/effects/decals/turfdecal/weather.dm @@ -9,4 +9,17 @@ /obj/effect/turf_decal/weather/snow/corner name = "snow corner piece" icon = 'icons/turf/snow.dmi' - icon_state = "snow_corner" \ No newline at end of file + icon_state = "snow_corner" + +/obj/effect/turf_decal/weather/dirt + name = "dirt siding" + icon = 'icons/turf/decals.dmi' + icon_state = "dirt_side" + +/obj/effect/turf_decal/weather/sand + name = "sand siding" + icon = 'icons/misc/beach.dmi' + icon_state = "sand_side" + +/obj/effect/turf_decal/weather/sand/light + icon_state = "lightsand_side" diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm index 410923fe25..d48013d472 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -57,6 +57,9 @@ /obj/effect/abstract/singularity_act() return +/obj/effect/abstract/has_gravity(turf/T) + return FALSE + /obj/effect/dummy/singularity_pull() return diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index c009d3ec79..9a498c9a70 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -36,7 +36,7 @@ /obj/structure/glowshroom/examine(mob/user) . = ..() - to_chat(user, "This is a [generation]\th generation [name]!") + . += "This is a [generation]\th generation [name]!" /obj/structure/glowshroom/Destroy() if(myseed) diff --git a/code/game/objects/effects/spawners/gibspawner.dm b/code/game/objects/effects/spawners/gibspawner.dm index dd39bc567a..fe1590caba 100644 --- a/code/game/objects/effects/spawners/gibspawner.dm +++ b/code/game/objects/effects/spawners/gibspawner.dm @@ -32,7 +32,8 @@ 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(!issilicon(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) @@ -51,15 +52,11 @@ 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) + qdel(temp_mob) else dna_to_add = list("Non-human DNA" = random_blood_type()) //else, generate a random bloodtype for it. diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index c92721082c..08a3501be6 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -201,7 +201,7 @@ S.directive = directive if(player_spiders) S.playable_spider = TRUE - notify_ghosts("Spider [S.name] can be controlled", null, enter_link="(Click to play)", source=S, action=NOTIFY_ATTACK, ignore_key = POLL_IGNORE_SPIDER) + notify_ghosts("Spider [S.name] can be controlled", null, enter_link="(Click to play)", source=S, action=NOTIFY_ATTACK, ignore_key = POLL_IGNORE_SPIDER, ignore_dnr_observers = TRUE) qdel(src) diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index fbad000098..0990486ae3 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -315,6 +315,11 @@ randomdir = 0 duration = 6 +/obj/effect/temp_visual/desynchronizer + name = "desynchronizer field" + icon_state = "chronofield" + duration = 3 + /obj/effect/temp_visual/impact_effect icon_state = "impact_bullet" duration = 5 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 4f81a875f1..1c9ea1edcb 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -183,14 +183,24 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) src.loc = T /obj/item/examine(mob/user) //This might be spammy. Remove? - ..() - var/pronoun - if(src.gender == PLURAL) - pronoun = "They are" + . = ..() + + . += "[gender == PLURAL ? "They are" : "It is"] a [weightclass2text(w_class)] item." + + if(resistance_flags & INDESTRUCTIBLE) + . += "[src] seems extremely robust! It'll probably withstand anything that could happen to it!" else - pronoun = "It is" - var/size = weightclass2text(src.w_class) - to_chat(user, "[pronoun] a [size] item." ) + if(resistance_flags & LAVA_PROOF) + . += "[src] is made of an extremely heat-resistant material, it'd probably be able to withstand lava!" + if(resistance_flags & (ACID_PROOF | UNACIDABLE)) + . += "[src] looks pretty robust! It'd probably be able to withstand acid!" + if(resistance_flags & FREEZE_PROOF) + . += "[src] is made of cold-resistant materials." + if(resistance_flags & FIRE_PROOF) + . += "[src] is made of fire-retardant materials." + + + if(!user.research_scanner) return @@ -202,7 +212,9 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) var/list/boostable_nodes = techweb_item_boost_check(src) if (boostable_nodes) for(var/id in boostable_nodes) - var/datum/techweb_node/node = SSresearch.techweb_nodes[id] + var/datum/techweb_node/node = SSresearch.techweb_node_by_id(id) + if(!node) + continue research_msg += sep research_msg += node.display_name sep = ", " @@ -225,7 +237,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) else research_msg += "None" research_msg += "." - to_chat(user, research_msg.Join()) + . += research_msg.Join() /obj/item/interact(mob/user) add_fingerprint(user) @@ -553,7 +565,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) /obj/item/throw_impact(atom/A, datum/thrownthing/throwingdatum) if(A && !QDELETED(A)) SEND_SIGNAL(src, COMSIG_MOVABLE_IMPACT, A, throwingdatum) - if(is_hot() && isliving(A)) + if(get_temperature() && isliving(A)) var/mob/living/L = A L.IgniteMob() var/itempush = 1 @@ -620,10 +632,10 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) if(flags & ITEM_SLOT_NECK) owner.update_inv_neck() -/obj/item/proc/is_hot() +/obj/item/proc/get_temperature() return heat -/obj/item/proc/is_sharp() +/obj/item/proc/get_sharpness() return sharpness /obj/item/proc/get_dismemberment_chance(obj/item/bodypart/affecting) @@ -650,7 +662,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) location.hotspot_expose(flame_heat, 1) /obj/item/proc/ignition_effect(atom/A, mob/user) - if(is_hot()) + if(get_temperature()) . = "[user] lights [A] with [src]." else . = "" diff --git a/code/game/objects/items/AI_modules.dm b/code/game/objects/items/AI_modules.dm index a8d0bed2aa..15881ab2a5 100644 --- a/code/game/objects/items/AI_modules.dm +++ b/code/game/objects/items/AI_modules.dm @@ -25,7 +25,7 @@ AI MODULES materials = list(MAT_GOLD=50) /obj/item/aiModule/examine(var/mob/user as mob) - ..() + . = ..() if(Adjacent(user)) show_laws(user) diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index 5e798e1281..016bfb5e8b 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -46,8 +46,8 @@ RLD spark_system.attach(src) /obj/item/construction/examine(mob/user) - ..() - to_chat(user, "\A [src]. It currently holds [matter]/[max_matter] matter-units." ) + . = ..() + . += "\A [src]. It currently holds [matter]/[max_matter] matter-units." /obj/item/construction/Destroy() QDEL_NULL(spark_system) @@ -225,11 +225,10 @@ RLD t1 += "

    Close

    \n" - var/datum/browser/popup = new(user, "rcd_access", "Access Control", 900, 500) + var/datum/browser/popup = new(user, "rcd_access", "Access Control", 900, 500, src) popup.set_content(t1) popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) popup.open() - onclose(user, "rcd_access") /obj/item/construction/rcd/Topic(href, href_list) ..() @@ -439,11 +438,11 @@ RLD /obj/item/construction/rcd/proc/rcd_create(atom/A, mob/user) var/list/rcd_results = A.rcd_vals(user, src) + if(!rcd_results) + return FALSE 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)) if(checkResource(rcd_results["cost"], user)) var/atom/cached = A @@ -555,6 +554,7 @@ RLD desc = "A device used to rapidly build walls and floors." canRturf = TRUE upgrade = TRUE + var/energyfactor = 72 /obj/item/construction/rcd/borg/useResource(amount, mob/user) @@ -565,7 +565,7 @@ RLD if(user) to_chat(user, no_ammo_message) return 0 - . = borgy.cell.use(amount * 72) //borgs get 1.3x the use of their RCDs + . = borgy.cell.use(amount * energyfactor) //borgs get 1.3x the use of their RCDs if(!. && user) to_chat(user, no_ammo_message) return . @@ -578,11 +578,16 @@ RLD if(user) to_chat(user, no_ammo_message) return 0 - . = borgy.cell.charge >= (amount * 72) + . = borgy.cell.charge >= (amount * energyfactor) if(!. && user) to_chat(user, no_ammo_message) return . +/obj/item/construction/rcd/borg/syndicate + icon_state = "ircd" + item_state = "ircd" + energyfactor = 66 + /obj/item/construction/rcd/loaded matter = 160 diff --git a/code/game/objects/items/RCL.dm b/code/game/objects/items/RCL.dm index 93293155a3..0eb97a8dee 100644 --- a/code/game/objects/items/RCL.dm +++ b/code/game/objects/items/RCL.dm @@ -79,9 +79,9 @@ ..() /obj/item/twohanded/rcl/examine(mob/user) - ..() + . = ..() if(loaded) - to_chat(user, "It contains [loaded.amount]/[max_amount] cables.") + . += "It contains [loaded.amount]/[max_amount] cables." /obj/item/twohanded/rcl/Destroy() QDEL_NULL(loaded) diff --git a/code/game/objects/items/RSF.dm b/code/game/objects/items/RSF.dm index 9c343c2e06..a68f2ecff6 100644 --- a/code/game/objects/items/RSF.dm +++ b/code/game/objects/items/RSF.dm @@ -20,8 +20,8 @@ RSF w_class = WEIGHT_CLASS_NORMAL /obj/item/rsf/examine(mob/user) - ..() - to_chat(user, "It currently holds [matter]/30 fabrication-units.") + . = ..() + . += "It currently holds [matter]/30 fabrication-units." /obj/item/rsf/cyborg matter = 30 @@ -127,8 +127,8 @@ RSF w_class = WEIGHT_CLASS_NORMAL /obj/item/cookiesynth/examine(mob/user) - ..() - to_chat(user, "It currently holds [matter]/10 cookie-units.") + . = ..() + . += "It currently holds [matter]/10 cookie-units." /obj/item/cookiesynth/attackby() return diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm index afb2b22076..d8a21de35a 100644 --- a/code/game/objects/items/airlock_painter.dm +++ b/code/game/objects/items/airlock_painter.dm @@ -91,9 +91,9 @@ /obj/item/airlock_painter/examine(mob/user) - ..() + . = ..() if(!ink) - to_chat(user, "It doesn't have a toner cartridge installed.") + . += "It doesn't have a toner cartridge installed." return var/ink_level = "high" if(ink.charges < 1) @@ -102,7 +102,7 @@ ink_level = "low" else if((ink.charges/ink.max_charges) > 1) //Over 100% (admin var edit) ink_level = "dangerously high" - to_chat(user, "Its ink levels look [ink_level].") + . += "Its ink levels look [ink_level]." /obj/item/airlock_painter/attackby(obj/item/W, mob/user, params) diff --git a/code/game/objects/items/body_egg.dm b/code/game/objects/items/body_egg.dm index f0d20afbbd..59a5c50bf6 100644 --- a/code/game/objects/items/body_egg.dm +++ b/code/game/objects/items/body_egg.dm @@ -14,7 +14,7 @@ src.Insert(loc) return ..() -/obj/item/organ/body_egg/Insert(var/mob/living/carbon/M, special = 0) +/obj/item/organ/body_egg/Insert(var/mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) ..() ADD_TRAIT(owner, TRAIT_XENO_HOST, TRAIT_GENERIC) owner.med_hud_set_status() diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index d0b732cf42..b591d6d64c 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -46,10 +46,10 @@ /obj/item/bodybag/bluespace/examine(mob/user) - ..() + . = ..() if(contents.len) var/s = contents.len == 1 ? "" : "s" - to_chat(user, "You can make out the shape[s] of [contents.len] object[s] through the fabric.") + . += "You can make out the shape[s] of [contents.len] object[s] through the fabric." /obj/item/bodybag/bluespace/Destroy() for(var/atom/movable/A in contents) diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm index 1165501d9a..fa9c25960a 100644 --- a/code/game/objects/items/candle.dm +++ b/code/game/objects/items/candle.dm @@ -34,7 +34,7 @@ light() //honk return ..() -/obj/item/candle/is_hot() +/obj/item/candle/get_temperature() return lit * heat /obj/item/candle/proc/light(show_message) diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm index 109078f804..f3ed99b132 100644 --- a/code/game/objects/items/cardboard_cutouts.dm +++ b/code/game/objects/items/cardboard_cutouts.dm @@ -9,10 +9,10 @@ // Possible restyles for the cutout; // add an entry in change_appearance() if you add to here var/list/possible_appearances = list("Assistant", "Clown", "Mime", - "Traitor", "Nuke Op", "Cultist", "Clockwork Cultist", + "Traitor", "Nuke Op", "Cultist", "Brass Cultist", "Clockwork Cultist", "Revolutionary", "Wizard", "Shadowling", "Xenomorph", "Xenomorph Maid", "Swarmer", "Ash Walker", "Deathsquad Officer", "Ian", "Slaughter Demon", - "Laughter Demon", "Private Security Officer") + "Laughter Demon", "Private Security Officer", "Securitron", "Gondola", "Monkey") var/pushed_over = FALSE //If the cutout is pushed over and has to be righted var/deceptive = FALSE //If the cutout actually appears as what it portray and not a discolored version @@ -123,10 +123,14 @@ name = "Unknown" desc = "A cardboard cutout of a cultist." icon_state = "cutout_cultist" + if("Brass Cultist") + name = "[pick(GLOB.first_names_male)] [pick(GLOB.last_names)]" + desc = "A cardboard cutout of a \"servant\" of Ratvar." + icon_state = "cutout_servant" if("Clockwork Cultist") name = "[pick(GLOB.first_names_male)] [pick(GLOB.last_names)]" desc = "A cardboard cutout of a servant of Ratvar." - icon_state = "cutout_servant" + icon_state = "cutout_new_servant" if("Revolutionary") name = "Unknown" desc = "A cardboard cutout of a revolutionary." @@ -179,6 +183,18 @@ name = "Private Security Officer" desc = "A cardboard cutout of a private security officer." icon_state = "cutout_ntsec" + if("Securitron") + name = "[pick("Officer", "Oftiser", "Sergeant", "General")][pick(" Genesky", " Pingsky", " Beepsky", " Pipsqueak", "-at-Armsky")]" + desc = "A cardboard cutout of a securitron." + icon_state = "cutout_law" + if("Gondola") + name = "gondola" + desc = "A cardboard cutout of a gondola." + icon_state = "cutout_gondola" + if("Monkey") + name = "monkey ([rand(1, 999)])" + desc = "A cardboard cutout of a monkey." + icon_state = "cutout_monky" return 1 /obj/item/cardboard_cutout/setDir(newdir) diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 0e422a3fe9..97f5989eb4 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -113,7 +113,7 @@ /obj/item/card/emag/examine(mob/user) . = ..() - to_chat(user, "It has [uses ? uses : "no"] charges left.") + . += "It has [uses ? uses : "no"] charges left." /obj/item/card/emag/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/emagrecharge)) @@ -139,9 +139,9 @@ /obj/item/emagrecharge/examine(mob/user) . = ..() if(uses) - to_chat(user, "It can add up to [uses] charges to compatible devices") + . += "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.") + . += "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." @@ -193,9 +193,9 @@ return /obj/item/card/id/examine(mob/user) - ..() + . = ..() if(mining_points) - to_chat(user, "There's [mining_points] mining equipment redemption point\s loaded onto this card.") + . += "There's [mining_points] mining equipment redemption point\s loaded onto this card." /obj/item/card/id/GetAccess() return access @@ -203,6 +203,9 @@ /obj/item/card/id/GetID() return src +/obj/item/card/id/RemoveID() + return src + /* Usage: update_label() @@ -402,13 +405,13 @@ update_label("John Doe", "Clowny") /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.") + . += "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.") + . += "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].") + . += "You are currently serving a permanent sentence for [crime]." else - to_chat(user, "Your sentence is up! You're free!") + . += "Your sentence is up! You're free!" /obj/item/card/id/prisoner/one name = "Prisoner #13-001" @@ -530,8 +533,8 @@ update_label("John Doe", "Clowny") update_icon() /obj/item/card/id/knight/examine(mob/user) - ..() - to_chat(user, "Alt-click to recolor it.") + . = ..() + . += "Alt-click to recolor it." /obj/item/card/id/knight/blue id_color = "#0000FF" diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index 09a128c558..cf8d38d9c9 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -90,7 +90,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(istype(mask_item, /obj/item/clothing/mask/cigarette)) return mask_item -/obj/item/match/is_hot() +/obj/item/match/get_temperature() return lit * heat ////////////////// @@ -255,7 +255,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/cigarette/fire_act(exposed_temperature, exposed_volume) light() -/obj/item/clothing/mask/cigarette/is_hot() +/obj/item/clothing/mask/cigarette/get_temperature() return lit * heat // Cigarette brands. @@ -530,7 +530,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM add_overlay(lighter_overlay) /obj/item/lighter/ignition_effect(atom/A, mob/user) - if(is_hot()) + if(get_temperature()) . = "With a single flick of [user.p_their()] wrist, [user] smoothly lights [A] with [src]. Damn [user.p_theyre()] cool." /obj/item/lighter/proc/set_lit(new_lit) @@ -605,7 +605,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/lighter/process() open_flame() -/obj/item/lighter/is_hot() +/obj/item/lighter/get_temperature() return lit * heat @@ -654,7 +654,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM add_overlay(lighter_overlay) /obj/item/lighter/greyscale/ignition_effect(atom/A, mob/user) - if(is_hot()) + if(get_temperature()) . = "After some fiddling, [user] manages to light [A] with [src]." diff --git a/code/game/objects/items/circuitboards/circuitboard.dm b/code/game/objects/items/circuitboards/circuitboard.dm index 26c13263d2..8106733ac6 100644 --- a/code/game/objects/items/circuitboards/circuitboard.dm +++ b/code/game/objects/items/circuitboards/circuitboard.dm @@ -56,7 +56,7 @@ micro-manipulator, console screen, beaker, Microlaser, matter bin, power cells. M.RefreshParts() /obj/item/circuitboard/machine/examine(mob/user) - ..() + . = ..() if(LAZYLEN(req_components)) var/list/nice_list = list() for(var/B in req_components) @@ -64,4 +64,4 @@ micro-manipulator, console screen, beaker, Microlaser, matter bin, power cells. if(!ispath(A)) continue nice_list += list("[req_components[A]] [initial(A.name)]") - to_chat(user,"Required components: [english_list(nice_list)].") + . += "Required components: [english_list(nice_list)]." diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index ac7879f9ec..32c879e2d2 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -69,8 +69,8 @@ return ..() /obj/item/circuitboard/computer/card/minor/examine(user) - ..() - to_chat(user, "Currently set to \"[dept_list[target_dept]]\".") + . = ..() + . += "Currently set to \"[dept_list[target_dept]]\"." //obj/item/circuitboard/computer/shield // name = "Shield Control (Computer Board)" diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 1059a310eb..791d62123a 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -429,8 +429,8 @@ return ..() /obj/item/circuitboard/machine/smartfridge/examine(mob/user) - ..() - to_chat(user, "[src] is set to [fridges_name_paths[build_path]]. You can use a screwdriver to reconfigure it.") + . = ..() + . += "[src] is set to [fridges_name_paths[build_path]]. You can use a screwdriver to reconfigure it." /obj/item/circuitboard/machine/biogenerator name = "Biogenerator (Machine Board)" @@ -775,7 +775,7 @@ /obj/item/circuitboard/machine/public_nanite_chamber/examine(mob/user) . = ..() - to_chat(user, "Cloud ID is currently set to [cloud_id].") + . += "Cloud ID is currently set to [cloud_id]." /obj/item/circuitboard/machine/nanite_program_hub name = "Nanite Program Hub (Machine Board)" @@ -936,9 +936,9 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/dish_drive/examine(mob/user) - ..() - to_chat(user, "Its suction function is [suction ? "enabled" : "disabled"]. Use it in-hand to switch.") - to_chat(user, "Its disposal auto-transmit function is [transmit ? "enabled" : "disabled"]. Alt-click it to switch.") + . = ..() + . += "Its suction function is [suction ? "enabled" : "disabled"]. Use it in-hand to switch." + . += "Its disposal auto-transmit function is [transmit ? "enabled" : "disabled"]. Alt-click it to switch." /obj/item/circuitboard/machine/dish_drive/attack_self(mob/living/user) suction = !suction @@ -983,3 +983,12 @@ name = "Ore Silo (Machine Board)" build_path = /obj/machinery/ore_silo req_components = list() + +/obj/item/circuitboard/machine/autobottler + name = "Auto-Bottler (Machine Board)" + build_path = /obj/machinery/rnd/production/protolathe/department/autobottler //Manips make you print things cheaper, even chems + req_components = list(/obj/item/stock_parts/matter_bin = 5, + /obj/item/stack/sheet/glass = 2, + /obj/item/stock_parts/capacitor = 1, + /obj/item/stack/cable_coil = 5, + /obj/item/reagent_containers/glass/beaker = 6) //So it can hold lots of chems \ No newline at end of file diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm index 1d302b409e..0ff54d884f 100644 --- a/code/game/objects/items/clown_items.dm +++ b/code/game/objects/items/clown_items.dm @@ -111,18 +111,20 @@ throw_speed = 3 throw_range = 7 attack_verb = list("HONKED") + var/moodlet = "honk" //used to define which kind of moodlet is added to the honked target + var/list/honksounds = list('sound/items/bikehorn.ogg' = 1) -/obj/item/bikehorn/Initialize() +/obj/item/bikehorn/ComponentInitialize() . = ..() - AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg'=1), 50) + AddComponent(/datum/component/squeak, honksounds, 50) /obj/item/bikehorn/attack(mob/living/carbon/M, mob/living/carbon/user) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "honk", /datum/mood_event/honk) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, moodlet, /datum/mood_event/honk) return ..() /obj/item/bikehorn/suicide_act(mob/user) user.visible_message("[user] solemnly points the horn at [user.p_their()] temple! It looks like [user.p_theyre()] trying to commit suicide!") - playsound(src, 'sound/items/bikehorn.ogg', 50, 1) + playsound(src, pickweight(honksounds), 50, 1) return (BRUTELOSS) //air horn @@ -130,10 +132,7 @@ name = "air horn" desc = "Damn son, where'd you find this?" icon_state = "air_horn" - -/obj/item/bikehorn/airhorn/Initialize() - . = ..() - AddComponent(/datum/component/squeak, list('sound/items/airhorn2.ogg'=1), 50) + honksounds = list('sound/items/airhorn2.ogg' = 1) //golden bikehorn /obj/item/bikehorn/golden @@ -163,6 +162,19 @@ M.emote("flip") flip_cooldown = world.time + 7 +/obj/item/bikehorn/silver + name = "silver bike horn" + desc = "A shiny bike horn handcrafted in the artisan workshops of Mars, with superior kevlar-reinforced rubber bulb attached to a polished plasteel reed horn." + attack_verb = list("elegantly HONKED") + icon_state = "silverhorn" + +/obj/item/bikehorn/bluespacehonker + name = "bluespace bike horn" + desc = "A normal bike horn colored blue and has bluespace dust held in to reed horn allowing for silly honks through space and time, into your in childhood." + attack_verb = list("HONKED in bluespace", "HONKED", "quantumly HONKED") + icon_state = "bluespacehonker" + moodlet = "bshonk" + //canned laughter /obj/item/reagent_containers/food/drinks/soda_cans/canned_laughter name = "Canned Laughter" diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index d014f70315..2a7b5d24cd 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -665,10 +665,10 @@ /obj/item/toy/crayon/spraycan/examine(mob/user) . = ..() if(charges_left) - to_chat(user, "It has [charges_left] use\s left.") + . += "It has [charges_left] use\s left." else - to_chat(user, "It is empty.") - to_chat(user, "Alt-click [src] to [ is_capped ? "take the cap off" : "put the cap on"].") + . += "It is empty." + . += "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, params) if(!proximity) @@ -829,7 +829,7 @@ /obj/item/toy/crayon/spraycan/gang/examine(mob/user) . = ..() 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.") + . += "This spraycan has been specially modified with a stage 2 nozzle kit, making it faster." /obj/item/toy/crayon/spraycan/infinite name = "infinite spraycan" diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 92d936e0d4..37d2c77373 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -103,12 +103,11 @@ GLOBAL_LIST_EMPTY(PDAs) /obj/item/pda/examine(mob/user) . = ..() - var/dat = id ? "Alt-click to remove the id." : "" + . += id ? "Alt-click to remove the id." : "" if(inserted_item && (!isturf(loc))) - dat += "\nCtrl-click to remove [inserted_item]." + . += "Ctrl-click to remove [inserted_item]." if(LAZYLEN(GLOB.pda_reskins)) - dat += "\nCtrl-shift-click it to reskin it." - to_chat(user, dat) + . += "Ctrl-shift-click it to reskin it." /obj/item/pda/Initialize() . = ..() @@ -140,7 +139,7 @@ GLOBAL_LIST_EMPTY(PDAs) var/choice = input(M, "Choose the a reskin for [src]","Reskin Object") as null|anything in GLOB.pda_reskins var/new_icon = GLOB.pda_reskins[choice] - if(QDELETED(src) || isnull(new_icon) || new_icon == icon || M.incapacitated() || !in_range(M,src)) + if(QDELETED(src) || isnull(new_icon) || new_icon == icon || !M.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) return icon = new_icon update_icon(FALSE, TRUE) @@ -162,31 +161,33 @@ GLOBAL_LIST_EMPTY(PDAs) /obj/item/pda/equipped(mob/user, slot) . = ..() - if(equipped) + if(equipped || !user.client) return - if(user.client) - background_color = user.client.prefs.pda_color - switch(user.client.prefs.pda_style) - if(MONO) - font_index = MODE_MONO - font_mode = FONT_MONO - if(SHARE) - font_index = MODE_SHARE - font_mode = FONT_SHARE - if(ORBITRON) - font_index = MODE_ORBITRON - font_mode = FONT_ORBITRON - if(VT) - font_index = MODE_VT - font_mode = FONT_VT - else - font_index = MODE_MONO - font_mode = FONT_MONO - var/pref_skin = GLOB.pda_reskins[user.client.prefs.pda_skin] - if(icon != pref_skin) - icon = pref_skin - update_icon(FALSE, TRUE) - equipped = TRUE + update_style(user.client) + +/obj/item/pda/proc/update_style(client/C) + background_color = C.prefs.pda_color + switch(C.prefs.pda_style) + if(MONO) + font_index = MODE_MONO + font_mode = FONT_MONO + if(SHARE) + font_index = MODE_SHARE + font_mode = FONT_SHARE + if(ORBITRON) + font_index = MODE_ORBITRON + font_mode = FONT_ORBITRON + if(VT) + font_index = MODE_VT + font_mode = FONT_VT + else + font_index = MODE_MONO + font_mode = FONT_MONO + var/pref_skin = GLOB.pda_reskins[C.prefs.pda_skin] + if(icon != pref_skin) + icon = pref_skin + update_icon(FALSE, TRUE) + equipped = TRUE /obj/item/pda/proc/update_label() name = "PDA-[owner] ([ownjob])" //Name generalisation @@ -200,6 +201,18 @@ GLOBAL_LIST_EMPTY(PDAs) /obj/item/pda/GetID() return id +/obj/item/pda/RemoveID() + return do_remove_id() + +/obj/item/pda/InsertID(obj/item/inserting_item) + var/obj/item/card/inserting_id = inserting_item.RemoveID() + if(!inserting_id) + return + insert_id(inserting_id) + if(id == inserting_id) + return TRUE + return FALSE + /obj/item/pda/update_icon(alert = FALSE, new_overlays = FALSE) if(new_overlays) set_new_overlays() @@ -688,15 +701,27 @@ GLOBAL_LIST_EMPTY(PDAs) return /obj/item/pda/proc/remove_id() - if(issilicon(usr) || !usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) return + do_remove_id(usr) - if (id) - usr.put_in_hands(id) - to_chat(usr, "You remove the ID from the [name].") - id = null - update_icon() +/obj/item/pda/proc/do_remove_id(mob/user) + if(!id) + return + if(user) + user.put_in_hands(id) + to_chat(user, "You remove the ID from the [name].") + else + id.forceMove(get_turf(src)) + + . = id + id = null + update_icon() + + if(ishuman(loc)) + var/mob/living/carbon/human/H = loc + if(H.wear_id == src) + H.sec_hud_set_ID() /obj/item/pda/proc/msg_input(mob/living/U = usr) var/t = stripped_input(U, "Please enter message", name) @@ -878,17 +903,27 @@ GLOBAL_LIST_EMPTY(PDAs) if(istype(C)) I = C - if(I && I.registered_name) + if(I?.registered_name) if(!user.transferItemToLoc(I, src)) return FALSE - var/obj/old_id = id - id = I - if(old_id) - user.put_in_hands(old_id) + insert_id(I, user) update_icon() playsound(src, 'sound/machines/button.ogg', 50, 1) return TRUE +/obj/item/pda/proc/insert_id(obj/item/card/id/inserting_id, mob/user) + var/obj/old_id = id + id = inserting_id + if(ishuman(loc)) + var/mob/living/carbon/human/human_wearer = loc + if(human_wearer.wear_id == src) + human_wearer.sec_hud_set_ID() + if(old_id) + if(user) + user.put_in_hands(old_id) + else + old_id.forceMove(get_turf(src)) + // access to status display signals /obj/item/pda/attackby(obj/item/C, mob/user, params) if(istype(C, /obj/item/cartridge) && !cartridge) diff --git a/code/game/objects/items/devices/PDA/PDA_types.dm b/code/game/objects/items/devices/PDA/PDA_types.dm index 54b82d8e07..2da47d481e 100644 --- a/code/game/objects/items/devices/PDA/PDA_types.dm +++ b/code/game/objects/items/devices/PDA/PDA_types.dm @@ -10,7 +10,7 @@ /obj/item/pda/clown/Initialize() . = ..() - AddComponent(/datum/component/slippery, 120, NO_SLIP_WHEN_WALKING, CALLBACK(src, .proc/AfterSlip)) + AddComponent(/datum/component/slippery, 120, NO_SLIP_WHEN_WALKING|SLIP_WHEN_JOGGING, CALLBACK(src, .proc/AfterSlip)) /obj/item/pda/clown/proc/AfterSlip(mob/living/carbon/human/M) if (istype(M) && (M.real_name != owner)) diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index 3885a1f4d9..8be18a5f61 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -697,7 +697,7 @@ Code: if(href_list["mule"]) //MULEbots are special snowflakes, and need different args due to how they work. - active_bot.bot_control(command= href_list["mule"], user= usr, pda= 1) + active_bot.bot_control(href_list["mule"], usr, TRUE) if(!host_pda) return @@ -772,4 +772,4 @@ Code: return "" //This is called for special abilities of cartridges -/obj/item/cartridge/proc/special(mov/living/user, list/params) +/obj/item/cartridge/proc/special(mob/living/user, list/params) diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 679dbecd10..7c21ac9144 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -17,6 +17,11 @@ desc = "A stylish upgrade (?) to the intelliCard." icon_state = "aitater" +/obj/item/aicard/aispook + name = "intelliLantern" + desc = "A spoOoOoky upgrade to the intelliCard." + icon_state = "aispook" + /obj/item/aicard/suicide_act(mob/living/user) user.visible_message("[user] is trying to upload [user.p_them()]self into [src]! That's not going to work out well!") return BRUTELOSS @@ -26,16 +31,18 @@ if(!proximity || !target) return if(AI) //AI is on the card, implies user wants to upload it. - target.transfer_ai(AI_TRANS_FROM_CARD, user, AI, src) log_combat(user, AI, "carded", src) + target.transfer_ai(AI_TRANS_FROM_CARD, user, AI, src) else //No AI on the card, therefore the user wants to download one. target.transfer_ai(AI_TRANS_TO_CARD, user, null, src) + if(AI) + log_combat(user, AI, "carded", src) update_icon() //Whatever happened, update the card's state (icon, name) to match. /obj/item/aicard/update_icon() cut_overlays() if(AI) - name = "[initial(name)]- [AI.name]" + name = "[initial(name)] - [AI.name]" if(AI.stat == DEAD) icon_state = "[initial(icon_state)]-404" else diff --git a/code/game/objects/items/devices/compressionkit.dm b/code/game/objects/items/devices/compressionkit.dm index a5a9377690..6e62c389c7 100644 --- a/code/game/objects/items/devices/compressionkit.dm +++ b/code/game/objects/items/devices/compressionkit.dm @@ -12,9 +12,9 @@ var/mode = 0 /obj/item/compressionkit/examine(mob/user) - ..() - to_chat(user, "It has [charges] charges left. Recharge with bluespace crystals.") - to_chat(user, "Use in-hand to swap toggle compress/expand mode (expand mode not yet implemented).") + . = ..() + . += "It has [charges] charges left. Recharge with bluespace crystals." + . += "Use in-hand to swap toggle compress/expand mode (expand mode not yet implemented)." /obj/item/compressionkit/attack_self(mob/user) if(mode == 0) diff --git a/code/game/objects/items/devices/desynchronizer.dm b/code/game/objects/items/devices/desynchronizer.dm new file mode 100644 index 0000000000..4a6e2d5a46 --- /dev/null +++ b/code/game/objects/items/devices/desynchronizer.dm @@ -0,0 +1,87 @@ +/obj/item/desynchronizer + name = "desynchronizer" + desc = "An experimental device that can temporarily desynchronize the user from spacetime, effectively making them disappear while it's active." + icon = 'icons/obj/device.dmi' + icon_state = "desynchronizer" + item_state = "electronic" + w_class = WEIGHT_CLASS_SMALL + item_flags = NOBLUDGEON + lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' + materials = list(MAT_METAL = 250, MAT_GLASS = 500) + var/max_duration = 3000 + var/duration = 300 + var/last_use = 0 + var/next_use = 0 + var/obj/effect/abstract/sync_holder/sync_holder + +/obj/item/desynchronizer/attack_self(mob/living/user) + if(world.time < next_use) + to_chat(user, "[src] is still recharging.") + return + if(!sync_holder) + desync(user) + else + resync() + +/obj/item/desynchronizer/examine(mob/user) + . = ..() + if(world.time < next_use) + . += "Time left to recharge: [DisplayTimeText(next_use - world.time)]" + . += "Alt-click to customize the duration. Current duration: [DisplayTimeText(duration)]." + . += "Can be used again to interrupt the effect early. The recharge time is the same as the time spent in desync." + +/obj/item/desynchronizer/AltClick(mob/living/user) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + return + var/new_duration = input(user, "Set the duration (5-300):", "Desynchronizer", duration / 10) as null|num + if(new_duration) + new_duration = new_duration SECONDS + new_duration = CLAMP(new_duration, 50, max_duration) + duration = new_duration + to_chat(user, "You set the duration to [DisplayTimeText(duration)].") + +/obj/item/desynchronizer/proc/desync(mob/living/user) + if(sync_holder) + return + sync_holder = new(drop_location()) + new /obj/effect/temp_visual/desynchronizer(drop_location()) + to_chat(user, "You activate [src], desynchronizing yourself from the present. You can still see your surroundings, but you feel eerily dissociated from reality.") + user.forceMove(sync_holder) + SEND_SIGNAL(user, COMSIG_MOVABLE_SECLUDED_LOCATION) + for(var/thing in user) + var/atom/movable/AM = thing + SEND_SIGNAL(AM, COMSIG_MOVABLE_SECLUDED_LOCATION) + last_use = world.time + icon_state = "desynchronizer-on" + addtimer(CALLBACK(src, .proc/resync), duration) + +/obj/item/desynchronizer/proc/resync() + new /obj/effect/temp_visual/desynchronizer(sync_holder.drop_location()) + QDEL_NULL(sync_holder) + icon_state = initial(icon_state) + next_use = world.time + (world.time - last_use) // Could be 2*world.time-last_use but that would just be confusing + +/obj/item/desynchronizer/Destroy() + resync() + return ..() + +/obj/effect/abstract/sync_holder + name = "desyncronized pocket" + desc = "A pocket in spacetime, keeping the user a fraction of a second in the future." + icon = null + icon_state = null + alpha = 0 + invisibility = INVISIBILITY_ABSTRACT + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + anchored = TRUE + resistance_flags = INDESTRUCTIBLE + +/obj/effect/abstract/sync_holder/Destroy() + for(var/I in contents) + var/atom/movable/AM = I + AM.forceMove(drop_location()) + return ..() + +/obj/effect/abstract/sync_holder/AllowDrop() + return TRUE //no dropping spaghetti out of your spacetime pocket \ No newline at end of file diff --git a/code/game/objects/items/devices/dogborg_sleeper.dm b/code/game/objects/items/devices/dogborg_sleeper.dm index 3c945f464e..1a3bc283d9 100644 --- a/code/game/objects/items/devices/dogborg_sleeper.dm +++ b/code/game/objects/items/devices/dogborg_sleeper.dm @@ -134,7 +134,6 @@ var/voracious = hound ? TRUE : FALSE var/list/targets = target && hound ? list(target) : contents if(hound) - hound.setClickCooldown(50) if(!hound.client || !(hound.client.prefs.cit_toggles & MEDIHOUND_SLEEPER)) voracious = FALSE else @@ -447,7 +446,7 @@ if (!target.devourable) to_chat(user, "The target registers an error code. Unable to insert into [src].") return - if(target) + if(patient) to_chat(user,"Your [src] is already occupied.") return if(target.buckled) @@ -524,3 +523,7 @@ update_gut() 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) + +/obj/item/dogborg/sleeper/K9/flavour + name = "Mobile Sleeper" + desc = "A mounted, underslung sleeper, intended for holding willing occupants for leisurely purposes." \ No newline at end of file diff --git a/code/game/objects/items/devices/doorCharge.dm b/code/game/objects/items/devices/doorCharge.dm index 9b009da7a4..8def1d5ca3 100644 --- a/code/game/objects/items/devices/doorCharge.dm +++ b/code/game/objects/items/devices/doorCharge.dm @@ -35,8 +35,8 @@ return ..() /obj/item/doorCharge/examine(mob/user) - ..() + . = ..() if(user.mind && user.mind.has_antag_datum(/datum/antagonist/traitor)) //No nuke ops because the device is excluded from nuclear - to_chat(user, "A small explosive device that can be used to sabotage airlocks to cause an explosion upon opening. To apply, remove the airlock's maintenance panel and place it within.") + . += "A small explosive device that can be used to sabotage airlocks to cause an explosion upon opening. To apply, remove the airlock's maintenance panel and place it within." else - to_chat(user, "A small, suspicious object that feels lukewarm when held.") + . += "A small, suspicious object that feels lukewarm when held." diff --git a/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm b/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm index b909e7a1e8..97392ca71e 100644 --- a/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm +++ b/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm @@ -16,11 +16,11 @@ maptext = "[circuits]" /obj/item/electroadaptive_pseudocircuit/examine(mob/user) - ..() + . = ..() if(iscyborg(user)) - to_chat(user, "It has material for [circuits] circuit[circuits == 1 ? "" : "s"]. Use the pseudocircuit on existing circuits to gain material.") - to_chat(user, "Serves as a substitute for fire/air alarm, firelock, and APC electronics.") - to_chat(user, "It can also be used on an APC with no power cell to fabricate a low-capacity cell at a high power cost.") + . += "It has material for [circuits] circuit[circuits == 1 ? "" : "s"]. Use the pseudocircuit on existing circuits to gain material." + . += "Serves as a substitute for fire/air alarm, firelock, and APC electronics." + . += "It can also be used on an APC with no power cell to fabricate a low-capacity cell at a high power cost." /obj/item/electroadaptive_pseudocircuit/proc/adapt_circuit(mob/living/silicon/robot/R, circuit_cost = 0) if(QDELETED(R) || !istype(R)) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index b937f961c0..8d7fa05ec6 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -324,7 +324,7 @@ damtype = "fire" START_PROCESSING(SSobj, src) -/obj/item/flashlight/flare/is_hot() +/obj/item/flashlight/flare/get_temperature() return on * heat /obj/item/flashlight/flare/torch diff --git a/code/game/objects/items/devices/forcefieldprojector.dm b/code/game/objects/items/devices/forcefieldprojector.dm index de62869e7e..0c73d829ff 100644 --- a/code/game/objects/items/devices/forcefieldprojector.dm +++ b/code/game/objects/items/devices/forcefieldprojector.dm @@ -52,9 +52,9 @@ qdel(F) /obj/item/forcefield_projector/examine(mob/user) - ..() + . = ..() var/percent_charge = round((shield_integrity/max_shield_integrity)*100) - to_chat(user, "It is currently sustaining [LAZYLEN(current_fields)]/[max_fields] fields, and it's [percent_charge]% charged.") + . += "It is currently sustaining [LAZYLEN(current_fields)]/[max_fields] fields, and it's [percent_charge]% charged." /obj/item/forcefield_projector/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm index 110676de1b..e6044ceadf 100644 --- a/code/game/objects/items/devices/geiger_counter.dm +++ b/code/game/objects/items/devices/geiger_counter.dm @@ -63,28 +63,28 @@ current_tick_amount = 0 /obj/item/geiger_counter/examine(mob/user) - ..() + . = ..() if(!scanning) - return 1 - to_chat(user, "Alt-click it to clear stored radiation levels.") + return + . += "Alt-click it to clear stored radiation levels." if(obj_flags & EMAGGED) - to_chat(user, "The display seems to be incomprehensible.") - return 1 + . += "The display seems to be incomprehensible." + return switch(radiation_count) if(-INFINITY to RAD_LEVEL_NORMAL) - to_chat(user, "Ambient radiation level count reports that all is well.") + . += "Ambient radiation level count reports that all is well." if(RAD_LEVEL_NORMAL + 1 to RAD_LEVEL_MODERATE) - to_chat(user, "Ambient radiation levels slightly above average.") + . += "Ambient radiation levels slightly above average." if(RAD_LEVEL_MODERATE + 1 to RAD_LEVEL_HIGH) - to_chat(user, "Ambient radiation levels above average.") + . += "Ambient radiation levels above average." if(RAD_LEVEL_HIGH + 1 to RAD_LEVEL_VERY_HIGH) - to_chat(user, "Ambient radiation levels highly above average.") + . += "Ambient radiation levels highly above average." if(RAD_LEVEL_VERY_HIGH + 1 to RAD_LEVEL_CRITICAL) - to_chat(user, "Ambient radiation levels nearing critical level.") + . += "Ambient radiation levels nearing critical level." if(RAD_LEVEL_CRITICAL + 1 to INFINITY) - to_chat(user, "Ambient radiation levels above critical level!") + . += "Ambient radiation levels above critical level!" - to_chat(user, "The last radiation amount detected was [last_tick_amount]") + . += "The last radiation amount detected was [last_tick_amount]" /obj/item/geiger_counter/update_icon() if(!scanning) diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index 9d1b670e71..2368cdc4f0 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -14,8 +14,10 @@ GLOBAL_LIST_EMPTY(GPS_list) var/global_mode = TRUE //If disabled, only GPS signals of the same Z level are shown /obj/item/gps/examine(mob/user) - ..() - to_chat(user, "Alt-click to switch it [tracking ? "off":"on"].") + . = ..() + var/turf/curr = get_turf(src) + . += "The screen says: [get_area_name(curr, TRUE)] ([curr.x], [curr.y], [curr.z])" + . += "Alt-click to switch it [tracking ? "off":"on"]." /obj/item/gps/Initialize() . = ..() diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 1e31f14cfd..2352a34e23 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -73,8 +73,8 @@ ..() /obj/item/lightreplacer/examine(mob/user) - ..() - to_chat(user, status_string()) + . = ..() + . += status_string() /obj/item/lightreplacer/attackby(obj/item/W, mob/user, params) diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index cf55d4178e..f3b53ba352 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -51,11 +51,11 @@ AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, null, null, FALSE) /obj/item/multitool/examine(mob/user) - ..() + . = ..() if(selected_io) - to_chat(user, "Activate [src] to detach the data wire.") + . += "Activate [src] to detach the data wire." if(buffer) - to_chat(user, "Its buffer contains [buffer].") + . += "Its buffer contains [buffer]." /obj/item/multitool/suicide_act(mob/living/carbon/user) user.visible_message("[user] puts the [src] to [user.p_their()] chest. It looks like [user.p_theyre()] trying to pulse [user.p_their()] heart off!") @@ -247,6 +247,8 @@ /obj/item/multitool/cyborg name = "multitool" desc = "Optimised and stripped-down version of a regular multitool." + icon = 'icons/obj/items_cyborg.dmi' + icon_state = "multitool_cyborg" toolspeed = 0.5 /obj/item/multitool/abductor diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index 1f69db1bbc..7dc2f1d60b 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -148,9 +148,11 @@ if(10) src.add_overlay("pai-null") if(11) - src.add_overlay(mutable_appearance('modular_citadel/icons/obj/aicards.dmi', "pai-exclamation")) // CITADEL EDIT + src.add_overlay("pai-exclamation") if(12) - src.add_overlay(mutable_appearance('modular_citadel/icons/obj/aicards.dmi', "pai-question")) // CITADEL EDIT + src.add_overlay("pai-question") + if(13) + src.add_overlay("pai-sunglasses") /obj/item/paicard/proc/alertUpdate() visible_message("[src] flashes a message across its screen, \"Additional personalities available for download.\"", "[src] bleeps electronically.") diff --git a/code/game/objects/items/devices/pipe_painter.dm b/code/game/objects/items/devices/pipe_painter.dm index 567cb0c73d..2d0af2cf3c 100644 --- a/code/game/objects/items/devices/pipe_painter.dm +++ b/code/game/objects/items/devices/pipe_painter.dm @@ -26,5 +26,5 @@ paint_color = input("Which colour do you want to use?","Pipe painter") in GLOB.pipe_paint_colors /obj/item/pipe_painter/examine(mob/user) - ..() - to_chat(user, "It is set to [paint_color].") + . = ..() + . += "It is set to [paint_color]." diff --git a/code/game/objects/items/devices/quantum_keycard.dm b/code/game/objects/items/devices/quantum_keycard.dm index 37079722c0..fc9ccddaf9 100644 --- a/code/game/objects/items/devices/quantum_keycard.dm +++ b/code/game/objects/items/devices/quantum_keycard.dm @@ -10,12 +10,12 @@ var/obj/machinery/quantumpad/qpad /obj/item/quantum_keycard/examine(mob/user) - ..() + . = ..() if(qpad) - to_chat(user, "It's currently linked to a quantum pad.") - to_chat(user, "Alt-click to unlink the keycard.") + . += "It's currently linked to a quantum pad." + . += "Alt-click to unlink the keycard." else - to_chat(user, "Insert [src] into an active quantum pad to link it.") + . += "Insert [src] into an active quantum pad to link it." /obj/item/quantum_keycard/AltClick(mob/living/user) if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm index 9adc0488aa..4d91fee9aa 100644 --- a/code/game/objects/items/devices/radio/encryptionkey.dm +++ b/code/game/objects/items/devices/radio/encryptionkey.dm @@ -21,7 +21,7 @@ for(var/i in channels) examine_text_list += "[GLOB.channel_tokens[i]] - [lowertext(i)]" - to_chat(user, "It can access the following channels; [jointext(examine_text_list, ", ")].") + . += "It can access the following channels; [jointext(examine_text_list, ", ")]." /obj/item/encryptionkey/syndicate name = "syndicate encryption key" diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index cca5eb4217..9f371f1ddb 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -32,7 +32,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( return TOXLOSS /obj/item/radio/headset/examine(mob/user) - ..() + . = ..() if(item_flags & IN_INVENTORY && loc == user) // construction of frequency description @@ -45,12 +45,12 @@ GLOBAL_LIST_INIT(channel_tokens, list( avail_chans += "use [MODE_TOKEN_DEPARTMENT] or [GLOB.channel_tokens[channels[i]]] for [lowertext(channels[i])]" else avail_chans += "use [GLOB.channel_tokens[channels[i]]] for [lowertext(channels[i])]" - to_chat(user, "A small screen on the headset displays the following available frequencies:\n[english_list(avail_chans)].") + . += "A small screen on the headset displays the following available frequencies:\n[english_list(avail_chans)]." if(command) - to_chat(user, "Alt-click to toggle the high-volume mode.") + . += "Alt-click to toggle the high-volume mode." else - to_chat(user, "A small screen on the headset flashes, it's too small to read without holding or wearing the headset.") + . += "A small screen on the headset flashes, it's too small to read without holding or wearing the headset." /obj/item/radio/headset/Initialize() . = ..() diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index eb0271c1b9..c8118e615f 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -49,11 +49,11 @@ return ..() /obj/item/radio/intercom/examine(mob/user) - ..() + . = ..() if(!unfastened) - to_chat(user, "It's screwed and secured to the wall.") + . += "It's screwed and secured to the wall." else - to_chat(user, "It's unscrewed from the wall, and can be detached.") + . += "It's unscrewed from the wall, and can be detached." /obj/item/radio/intercom/attackby(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/screwdriver)) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 926810cfbf..55858e217a 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -319,11 +319,11 @@ /obj/item/radio/examine(mob/user) - ..() + . = ..() if (unscrewed) - to_chat(user, "It can be attached and modified.") + . += "It can be attached and modified." else - to_chat(user, "It cannot be modified or attached.") + . += "It cannot be modified or attached." /obj/item/radio/attackby(obj/item/W, mob/user, params) add_fingerprint(user) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index d644e0637e..40052bcee5 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -338,17 +338,17 @@ SLIME SCANNER 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: " + max_damage = "\tNon-Functional Organs: \n" else - max_damage += "" + max_damage += "\n" if(!major_damage) - major_damage = "\tSeverely Damaged Organs: " + major_damage = "\tSeverely Damaged Organs: \n" else - major_damage += "" + major_damage += "
    \n" if(!minor_damage) - minor_damage = "\tMildly Damaged Organs: " + minor_damage = "\tMildly Damaged Organs: \n" else - minor_damage += "
    " + minor_damage += "
    \n" msg += "[minor_damage]" msg += "[major_damage]" msg += "[max_damage]" @@ -382,10 +382,11 @@ SLIME SCANNER else if (S.mutantstomach != initial(S.mutantstomach)) mutant = TRUE - msg += "Species: [H.dna.custom_species ? H.dna.custom_species : S.name] Base: [S.name]\n" + msg += "\tReported Species: [H.dna.custom_species ? H.dna.custom_species : S.name]\n" + msg += "\tBase Species: [S.name]\n" if(mutant) - msg += "Subject has mutations present." - msg += "Body temperature: [round(M.bodytemperature-T0C,0.1)] °C ([round(M.bodytemperature*1.8-459.67,0.1)] °F)\n" + msg += "\tSubject has mutations present.\n" + msg += "\tBody temperature: [round(M.bodytemperature-T0C,0.1)] °C ([round(M.bodytemperature*1.8-459.67,0.1)] °F)\n" // Time of death if(M.tod && (M.stat == DEAD || ((HAS_TRAIT(M, TRAIT_FAKEDEATH)) && !advanced))) @@ -522,7 +523,7 @@ SLIME SCANNER /obj/item/analyzer/examine(mob/user) . = ..() - to_chat(user, "Alt-click [src] to activate the barometer function.") + . += "Alt-click [src] to activate the barometer function." /obj/item/analyzer/suicide_act(mob/living/carbon/user) user.visible_message("[user] begins to analyze [user.p_them()]self with [src]! The display shows that [user.p_theyre()] dead!") @@ -650,7 +651,7 @@ SLIME SCANNER /proc/atmosanalyzer_scan(mixture, mob/living/user, atom/target = src) var/icon = target - user.visible_message("[user] has used the analyzer on [icon2html(icon, viewers(src))] [target].", "You use the analyzer on [icon2html(icon, user)] [target].") + user.visible_message("[user] has used the analyzer on [icon2html(icon, viewers(user))] [target].", "You use the analyzer on [icon2html(icon, user)] [target].") to_chat(user, "Results of analysis of [icon2html(icon, user)] [target].") var/list/airs = islist(mixture) ? mixture : list(mixture) diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 2df7892f61..5a9a2027a0 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -29,8 +29,8 @@ /obj/item/taperecorder/examine(mob/user) - ..() - to_chat(user, "The wire panel is [open_panel ? "opened" : "closed"].") + . = ..() + . += "The wire panel is [open_panel ? "opened" : "closed"]." /obj/item/taperecorder/attackby(obj/item/I, mob/user, params) diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm index 9fb4206845..b69d32617f 100644 --- a/code/game/objects/items/extinguisher.dm +++ b/code/game/objects/items/extinguisher.dm @@ -106,11 +106,11 @@ return ..() /obj/item/extinguisher/examine(mob/user) - ..() - to_chat(user, "The safety is [safety ? "on" : "off"].") + . = ..() + . += "The safety is [safety ? "on" : "off"]." if(reagents.total_volume) - to_chat(user, "You can loose its screws to empty it.") + . += "You can loose its screws to empty it." /obj/item/extinguisher/proc/AttemptRefill(atom/target, mob/user) if(istype(target, tanktype) && target.Adjacent(user)) diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index fd51ecf26b..d9525ab931 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -145,9 +145,9 @@ update_icon() /obj/item/flamethrower/examine(mob/user) - ..() + . = ..() if(ptank) - to_chat(user, "\The [src] has \a [ptank] attached. Alt-click to remove it.") + . += "\The [src] has \a [ptank] attached. Alt-click to remove it." /obj/item/flamethrower/proc/toggle_igniter(mob/user) if(!ptank) diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm index 7a0c5fd8df..76d3a9fbf5 100644 --- a/code/game/objects/items/grenades/chem_grenade.dm +++ b/code/game/objects/items/grenades/chem_grenade.dm @@ -27,19 +27,19 @@ /obj/item/grenade/chem_grenade/examine(mob/user) display_timer = (stage == READY && !nadeassembly) //show/hide the timer based on assembly state - ..() + . = ..() if(user.can_see_reagents()) var/count = 0 if(beakers.len) - to_chat(user, "You scan the grenade and detect the following reagents:") + . += "You scan the grenade and detect the following reagents:" for(var/obj/item/reagent_containers/glass/G in beakers) var/textcount = thtotext(++count) for(var/datum/reagent/R in G.reagents.reagent_list) - to_chat(user, "[R.volume] units of [R.name] in the [textcount] beaker.") + . += "[R.volume] units of [R.name] in the [textcount] beaker." if(beakers.len == 1) - to_chat(user, "You detect no second beaker in the grenade.") + . += "You detect no second beaker in the grenade." else - to_chat(user, "You scan the grenade, but detect nothing.") + . += "You scan the grenade, but detect nothing." /obj/item/grenade/chem_grenade/attack_self(mob/user) diff --git a/code/game/objects/items/grenades/ghettobomb.dm b/code/game/objects/items/grenades/ghettobomb.dm index d450764702..2d3d5e69b6 100644 --- a/code/game/objects/items/grenades/ghettobomb.dm +++ b/code/game/objects/items/grenades/ghettobomb.dm @@ -56,5 +56,5 @@ qdel(src) /obj/item/grenade/iedcasing/examine(mob/user) - ..() - to_chat(user, "You can't tell when it will explode!") + . = ..() + . += "You can't tell when it will explode!" diff --git a/code/game/objects/items/grenades/grenade.dm b/code/game/objects/items/grenades/grenade.dm index 28d8739369..98a1aed4c1 100644 --- a/code/game/objects/items/grenades/grenade.dm +++ b/code/game/objects/items/grenades/grenade.dm @@ -47,12 +47,12 @@ /obj/item/grenade/examine(mob/user) - ..() + . = ..() if(display_timer) if(det_time > 1) - to_chat(user, "The timer is set to [DisplayTimeText(det_time)].") + . += "The timer is set to [DisplayTimeText(det_time)]." else - to_chat(user, "\The [src] is set for instant detonation.") + . += "\The [src] is set for instant detonation." /obj/item/grenade/attack_self(mob/user) diff --git a/code/game/objects/items/his_grace.dm b/code/game/objects/items/his_grace.dm index 7e7dddefb6..da572d4d61 100644 --- a/code/game/objects/items/his_grace.dm +++ b/code/game/objects/items/his_grace.dm @@ -52,23 +52,23 @@ return /obj/item/his_grace/examine(mob/user) - ..() + . = ..() if(awakened) switch(bloodthirst) if(HIS_GRACE_SATIATED to HIS_GRACE_PECKISH) - to_chat(user, "[src] isn't very hungry. Not yet.") + . += "[src] isn't very hungry. Not yet." if(HIS_GRACE_PECKISH to HIS_GRACE_HUNGRY) - to_chat(user, "[src] would like a snack.") + . += "[src] would like a snack." if(HIS_GRACE_HUNGRY to HIS_GRACE_FAMISHED) - to_chat(user, "[src] is quite hungry now.") + . += "[src] is quite hungry now." if(HIS_GRACE_FAMISHED to HIS_GRACE_STARVING) - to_chat(user, "[src] is openly salivating at the sight of you. Be careful.") + . += "[src] is openly salivating at the sight of you. Be careful." if(HIS_GRACE_STARVING to HIS_GRACE_CONSUME_OWNER) - to_chat(user, "You walk a fine line. [src] is very close to devouring you.") + . += "You walk a fine line. [src] is very close to devouring you." if(HIS_GRACE_CONSUME_OWNER to HIS_GRACE_FALL_ASLEEP) - to_chat(user, "[src] is shaking violently and staring directly at you.") + . += "[src] is shaking violently and staring directly at you." else - to_chat(user, "[src] is latched closed.") + . += "[src] is latched closed." /obj/item/his_grace/relaymove(mob/living/user) //Allows changelings, etc. to climb out of Him after they revive, provided He isn't active if(!awakened) diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index 84439985b2..7a83893f8b 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -755,3 +755,47 @@ righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi' w_class = WEIGHT_CLASS_NORMAL attack_verb = list("bashes", "smacks", "whacks") + +/obj/item/nullrod/rosary + icon_state = "rosary" + item_state = null + name = "prayer beads" + desc = "A set of prayer beads used by many of the more traditional religions in space" + force = 4 + throwforce = 0 + attack_verb = list("whipped", "repented", "lashed", "flagellated") + var/praying = FALSE + var/deity_name = "Coderbus" //This is the default, hopefully won't actually appear if the religion subsystem is running properly + +/obj/item/nullrod/rosary/Initialize() + .=..() + if(GLOB.deity) + deity_name = GLOB.deity + +/obj/item/nullrod/rosary/attack(mob/living/M, mob/living/user) + if(user.a_intent == INTENT_HARM) + return ..() + + if(!user.mind || user.mind.assigned_role != "Chaplain") + to_chat(user, "You are not close enough with [deity_name] to use [src].") + return + + if(praying) + to_chat(user, "You are already using [src].") + return + + user.visible_message("[user] kneels[M == user ? null : " next to [M]"] and begins to utter a prayer to [deity_name].", \ + "You kneel[M == user ? null : " next to [M]"] and begin a prayer to [deity_name].") + + praying = TRUE + if(do_after(user, 20, target = M)) + M.reagents?.add_reagent("holywater", 5) + to_chat(M, "[user]'s prayer to [deity_name] has eased your pain!") + M.adjustToxLoss(-5, TRUE, TRUE) + M.adjustOxyLoss(-5) + M.adjustBruteLoss(-5) + M.adjustFireLoss(-5) + praying = FALSE + else + to_chat(user, "Your prayer to [deity_name] was interrupted.") + praying = FALSE diff --git a/code/game/objects/items/hot_potato.dm b/code/game/objects/items/hot_potato.dm index e7b05d7a01..40f2741a17 100644 --- a/code/game/objects/items/hot_potato.dm +++ b/code/game/objects/items/hot_potato.dm @@ -81,9 +81,9 @@ /obj/item/hot_potato/examine(mob/user) . = ..() if(active) - to_chat(user, "[src] is flashing red-hot! You should probably get rid of it!") + . += "[src] is flashing red-hot! You should probably get rid of it!" if(show_timer) - to_chat(user, "[src]'s timer looks to be at [DisplayTimeText(activation_time - world.time)]!") + . += "[src]'s timer looks to be at [DisplayTimeText(activation_time - world.time)]!" /obj/item/hot_potato/equipped(mob/user) . = ..() diff --git a/code/game/objects/items/implants/implant_track.dm b/code/game/objects/items/implants/implant_track.dm index 4b7ae3bbac..4f81432a39 100644 --- a/code/game/objects/items/implants/implant_track.dm +++ b/code/game/objects/items/implants/implant_track.dm @@ -1,7 +1,19 @@ /obj/item/implant/tracking name = "tracking implant" desc = "Track with this." - activated = 0 + activated = FALSE + var/lifespan_postmortem = 10 MINUTES //for how many deciseconds after user death will the implant work? + var/allow_teleport = TRUE //will people implanted with this act as teleporter beacons? + +/obj/item/implant/tracking/c38 + name = "TRAC implant" + desc = "A smaller tracking implant that supplies power for only a few minutes." + var/lifespan = 5 MINUTES //how many deciseconds does the implant last? + allow_teleport = FALSE + +/obj/item/implant/tracking/c38/Initialize() + . = ..() + QDEL_IN(src, lifespan) /obj/item/implant/tracking/Initialize() . = ..() @@ -45,7 +57,7 @@ var/dat = {"Implant Specifications:
    Name: Tracking Beacon
    Life: 10 minutes after death of host
    - Important Notes: None
    + Important Notes: Implant also works as a teleporter beacon.

    Implant Details:
    Function: Continuously transmits low power signal. Useful for tracking.
    diff --git a/code/game/objects/items/inducer.dm b/code/game/objects/items/inducer.dm index bbd2e67464..19dbf4fea3 100644 --- a/code/game/objects/items/inducer.dm +++ b/code/game/objects/items/inducer.dm @@ -155,13 +155,13 @@ /obj/item/inducer/examine(mob/living/M) - ..() + . = ..() if(cell) - to_chat(M, "Its display shows: [DisplayEnergy(cell.charge)].") + . += "Its display shows: [DisplayEnergy(cell.charge)]." else - to_chat(M,"Its display is dark.") + . += "Its display is dark." if(opened) - to_chat(M,"Its battery compartment is open.") + . += "Its battery compartment is open." /obj/item/inducer/update_icon() cut_overlays() diff --git a/code/game/objects/items/latexballoon.dm b/code/game/objects/items/latexballoon.dm index 709bc6662a..11be6b88e9 100644 --- a/code/game/objects/items/latexballoon.dm +++ b/code/game/objects/items/latexballoon.dm @@ -52,5 +52,5 @@ var/obj/item/tank/T = W blow(T, user) return - if (W.is_sharp() || W.is_hot() || is_pointed(W)) + if (W.get_sharpness() || W.get_temperature() || is_pointed(W)) burst() diff --git a/code/game/objects/items/manuals.dm b/code/game/objects/items/manuals.dm index 6ae34e9ca2..d038ea7b4a 100644 --- a/code/game/objects/items/manuals.dm +++ b/code/game/objects/items/manuals.dm @@ -260,7 +260,7 @@ function pageloaded(myframe) { document.getElementById("loading").style.display = "none"; myframe.style.display = "inline"; - } + }

    You start skimming through the manual...

    @@ -295,7 +295,7 @@ function pageloaded(myframe) { document.getElementById("loading").style.display = "none"; myframe.style.display = "block"; - } + }

    You start skimming through the manual...

    diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index 624dbdd8ef..561af8ded6 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -28,7 +28,7 @@ /obj/item/melee/transforming/energy/add_blood_DNA(list/blood_dna) return FALSE -/obj/item/melee/transforming/energy/is_sharp() +/obj/item/melee/transforming/energy/get_sharpness() return active * sharpness /obj/item/melee/transforming/energy/process() @@ -46,7 +46,7 @@ STOP_PROCESSING(SSobj, src) set_light(0) -/obj/item/melee/transforming/energy/is_hot() +/obj/item/melee/transforming/energy/get_temperature() return active * heat /obj/item/melee/transforming/energy/ignition_effect(atom/A, mob/user) @@ -334,8 +334,8 @@ update_light() /obj/item/melee/transforming/energy/sword/cx/examine(mob/user) - ..() - to_chat(user, "Alt-click to recolor it.") + . = ..() + . += "Alt-click to recolor it." /obj/item/melee/transforming/energy/sword/cx/worn_overlays(isinhands, icon_file) . = ..() diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 10b84917bb..d7c2f7f4f6 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -265,7 +265,7 @@ if (B && !QDELETED(B)) H.internal_organs -= B qdel(B) - new /obj/effect/gibspawner/generic(get_turf(H), H.dna) + H.spawn_gibs() return (BRUTELOSS) /obj/item/melee/classic_baton/telescopic/attack_self(mob/user) diff --git a/code/game/objects/items/melee/transforming.dm b/code/game/objects/items/melee/transforming.dm index 850810bdb2..7eb35ed06b 100644 --- a/code/game/objects/items/melee/transforming.dm +++ b/code/game/objects/items/melee/transforming.dm @@ -23,7 +23,7 @@ else if(attack_verb_off.len) attack_verb = attack_verb_off - if(is_sharp()) + if(get_sharpness()) AddComponent(/datum/component/butchering, 50, 100, 0, hitsound, !active) /obj/item/melee/transforming/attack_self(mob/living/carbon/user) @@ -65,7 +65,7 @@ icon_state = initial(icon_state) w_class = initial(w_class) total_mass = initial(total_mass) - if(is_sharp()) + if(get_sharpness()) var/datum/component/butchering/BT = LoadComponent(/datum/component/butchering) BT.butchering_enabled = TRUE else diff --git a/code/game/objects/items/mop.dm b/code/game/objects/items/mop.dm index 3f7fe7ee8d..5d384a9346 100644 --- a/code/game/objects/items/mop.dm +++ b/code/game/objects/items/mop.dm @@ -119,8 +119,8 @@ reagents.add_reagent(refill_reagent, refill_rate) /obj/item/mop/advanced/examine(mob/user) - ..() - to_chat(user, "The condenser switch is set to [refill_enabled ? "ON" : "OFF"].") + . = ..() + . += "The condenser switch is set to [refill_enabled ? "ON" : "OFF"]." /obj/item/mop/advanced/Destroy() if(refill_enabled) diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm index 30442d7304..9d1a1ff4f9 100644 --- a/code/game/objects/items/pet_carrier.dm +++ b/code/game/objects/items/pet_carrier.dm @@ -43,17 +43,17 @@ ..() /obj/item/pet_carrier/examine(mob/user) - ..() + . = ..() if(occupants.len) for(var/V in occupants) var/mob/living/L = V - to_chat(user, "It has [L] inside.") + . += "It has [L] inside." else - to_chat(user, "It has nothing inside.") + . += "It has nothing inside." if(user.canUseTopic(src)) - to_chat(user, "Activate it in your hand to [open ? "close" : "open"] its door.") + . += "Activate it in your hand to [open ? "close" : "open"] its door." if(!open) - to_chat(user, "Alt-click to [locked ? "unlock" : "lock"] its door.") + . += "Alt-click to [locked ? "unlock" : "lock"] its door." /obj/item/pet_carrier/attack_self(mob/living/user) if(open) diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 4847919a08..ffbbea84dc 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -117,7 +117,7 @@ to_chat(user, "You try to pet [src], but it has no stuffing. Aww...") /obj/item/toy/plush/attackby(obj/item/I, mob/living/user, params) - if(I.is_sharp()) + if(I.get_sharpness()) if(!grenade) if(!stuffed) to_chat(user, "You already murdered it!") @@ -558,6 +558,37 @@ item_state = "almaz" squeak_override = list('modular_citadel/sound/voice/raptor_purr.ogg' = 1) +/obj/item/toy/plush/lizardplushie/garou + icon_state = "garou" + item_state = "garou" + +/obj/item/toy/plush/lizardplushie/augments + icon_state = "augments" + item_state = "augments" + squeak_override = list('modular_citadel/sound/voice/weh.ogg' = 1) //I have no mouth and I must weh + attack_verb = list("hugged", "patted", "snugged", "booped") + +/obj/item/toy/plush/lizardplushie/xekov + icon_state = "xekov" + item_state = "xekov" + +/obj/item/toy/plush/lizardplushie/greg + icon_state = "greg" + item_state = "greg" + +/obj/item/toy/plush/lizardplushie/sin + icon_state = "sin" + item_state = "sin" + desc = "An adorable stuffed toy that resembles a lizardperson.. It faintly smells of sulfur." + +/obj/item/toy/plush/lizardplushie/ends + icon_state = "ends" + item_state = "ends" + +/obj/item/toy/plush/lizardplushie/lyssa + icon_state = "lyssa" + item_state = "lyssa" + /obj/item/toy/plush/snakeplushie name = "snake plushie" desc = "An adorable stuffed toy that resembles a snake. Not to be mistaken for the real thing." @@ -715,6 +746,14 @@ item_state = "bhijn" attack_verb = list("closed", "reworked", "merged") +/obj/item/toy/plush/aiplush + name = "AI plushie" + desc = "A little stuffed toy AI core... it appears to be malfunctioning." + icon_state = "exo" + item_state = "exo" + attack_verb = list("hacked", "detonated", "overloaded") + squeak_override = list('sound/machines/beep.ogg' = 9, 'sound/machines/buzz-two.ogg' = 1) + /obj/item/toy/plush/bird name = "bird plushie" desc = "An adorable stuffed plushie that resembles an avian." @@ -862,6 +901,18 @@ item_state = "redwood" attack_verb = list("ordered", "bapped", "reprimanded") +/obj/item/toy/plush/mammal/marisol + desc = "An adorable stuffed toy resembling a demi-wolf security officer." + icon_state = "marisol" + item_state = "marisol" + attack_verb = list("arrested", "harmbattoned", "lasered") + +/obj/item/toy/plush/mammal/minty + desc = "An adorable stuffed toy resembling some sort of crew member. It smells like mint.." + icon_state = "minty" + item_state = "minty" + attack_verb = list("freshened", "brushed") + /obj/item/toy/plush/mammal/dog desc = "An adorable stuffed toy that resembles a canine." icon_state = "katlin" @@ -929,8 +980,8 @@ /obj/item/toy/plush/catgirl/skylar desc = "An adorable stuffed toy that resembles a degenerate." - icon_state = "skylar" - item_state = "skylar" + icon_state = "skylar2" + item_state = "skylar2" attack_verb = list("powergamed", "merged", "tabled") squeak_override = list('sound/effects/meow1.ogg' = 1) @@ -942,15 +993,15 @@ desc = "A masked stuffed toy that resembles a feline scientist." icon_state = "trilby" item_state = "trilby" - attack_verb = list("pred", "coded", "remembered") + attack_verb = list("PR'd", "coded", "remembered") /obj/item/toy/plush/catgirl/fermis - name = "medcat plushie" - desc = "An affectionate stuffed toy that resembles a certain medcat, comes complete with battery operated wagging tail!! You get the impression she's cheering you on to to find happiness and be kind to people." - icon_state = "fermis" - item_state = "fermis" - attack_verb = list("cuddled", "petpatted", "wigglepurred") - squeak_override = list('modular_citadel/sound/voice/merowr.ogg' = 1) + name = "medcat plushie" + desc = "An affectionate stuffed toy that resembles a certain medcat, comes complete with battery operated wagging tail!! You get the impression she's cheering you on to to find happiness and be kind to people." + icon_state = "fermis" + item_state = "fermis" + attack_verb = list("cuddled", "petpatted", "wigglepurred") + squeak_override = list('modular_citadel/sound/voice/merowr.ogg' = 1) /obj/item/toy/plush/catgirl/mariaf desc = "An adorable stuffed toy that resembles a very tall cat girl." @@ -963,3 +1014,9 @@ icon_state = "maya" item_state = "maya" attack_verb = list("nuked", "arrested", "harmbatonned") + +/obj/item/toy/plush/catgirl/marisa + desc = "An adorable stuffed toy that resembles a crew member, or maybe a witch. Having it makes you feel you can win." + icon_state = "marisa" + item_state = "marisa" + attack_verb = list("blasted", "sparked", "dazzled") diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index bd301c36f7..72d27ae544 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -55,17 +55,15 @@ return automatic /obj/item/pneumatic_cannon/examine(mob/user) - ..() - var/list/out = list() + . = ..() if(!in_range(user, src)) - out += "You'll need to get closer to see any more." + . += "You'll need to get closer to see any more." return for(var/obj/item/I in loadedItems) - out += "[icon2html(I, user)] It has \a [I] loaded." + . += "[icon2html(I, user)] It has \a [I] loaded." CHECK_TICK if(tank) - out += "[icon2html(tank, user)] It has \a [tank] mounted onto it." - to_chat(user, out.Join("
    ")) + . += "[icon2html(tank, user)] It has \a [tank] mounted onto it." /obj/item/pneumatic_cannon/attackby(obj/item/W, mob/user, params) if(user.a_intent == INTENT_HARM) diff --git a/code/game/objects/items/powerfist.dm b/code/game/objects/items/powerfist.dm index f02e92bb3c..27ed0f82e3 100644 --- a/code/game/objects/items/powerfist.dm +++ b/code/game/objects/items/powerfist.dm @@ -20,12 +20,12 @@ /obj/item/melee/powerfist/examine(mob/user) - ..() + . = ..() if(!in_range(user, src)) - to_chat(user, "You'll need to get closer to see any more.") + . += "You'll need to get closer to see any more." return if(tank) - to_chat(user, "[icon2html(tank, user)] It has \a [tank] mounted onto it.") + . += "[icon2html(tank, user)] It has \a [tank] mounted onto it." /obj/item/melee/powerfist/attackby(obj/item/W, mob/user, params) diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm index 7b3dcb1e00..ddc49a456c 100644 --- a/code/game/objects/items/religion.dm +++ b/code/game/objects/items/religion.dm @@ -16,9 +16,9 @@ var/warcry /obj/item/banner/examine(mob/user) - ..() + . = ..() if(inspiration_available) - to_chat(user, "Activate it in your hand to inspire nearby allies of this banner's allegiance!") + . += "Activate it in your hand to inspire nearby allies of this banner's allegiance!" /obj/item/banner/attack_self(mob/living/carbon/human/user) if(!inspiration_available) diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index d9045a7a34..a0b78d8b27 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -203,7 +203,7 @@ desc = "A trash bag of holding replacement for the janiborg's standard trash bag." icon_state = "cyborg_upgrade3" require_module = 1 - module_type = list(/obj/item/robot_module/janitor, /obj/item/robot_module/scrubpup) + module_type = list(/obj/item/robot_module/butler) /obj/item/borg/upgrade/tboh/action(mob/living/silicon/robot/R) . = ..() @@ -230,7 +230,7 @@ desc = "An advanced mop replacement for the janiborg's standard mop." icon_state = "cyborg_upgrade3" require_module = 1 - module_type = list(/obj/item/robot_module/janitor, /obj/item/robot_module/scrubpup) + module_type = list(/obj/item/robot_module/butler) /obj/item/borg/upgrade/amop/action(mob/living/silicon/robot/R) . = ..() @@ -522,8 +522,7 @@ module_type = list( /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/medihound) /obj/item/borg/upgrade/advhealth/action(mob/living/silicon/robot/R, user = usr) . = ..() @@ -607,7 +606,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "borg_BS_RPED" require_module = TRUE - module_type = list(/obj/item/robot_module/engineering) + module_type = list(/obj/item/robot_module/engineering, /obj/item/robot_module/saboteur) /obj/item/borg/upgrade/rped/action(mob/living/silicon/robot/R, user = usr) . = ..() diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 886997eab9..9f3e5f6bd4 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -128,7 +128,7 @@ /obj/item/stack/medical/gauze/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/wirecutters) || I.is_sharp()) + if(istype(I, /obj/item/wirecutters) || I.get_sharpness()) if(get_amount() < 2) to_chat(user, "You need at least two gauzes to do this!") return diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 01351ab2e2..7297bb3aae 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -219,7 +219,7 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \ //Step one - dehairing. /obj/item/stack/sheet/animalhide/attackby(obj/item/W, mob/user, params) - if(W.is_sharp()) + if(W.get_sharpness()) playsound(loc, 'sound/weapons/slice.ogg', 50, 1, -1) user.visible_message("[user] starts cutting hair off \the [src].", "You start cutting the hair off \the [src]...", "You hear the sound of a knife rubbing against flesh.") if(do_after(user, 50, target = src)) diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 46c0d47388..96546d6eb6 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -178,11 +178,11 @@ GLOBAL_LIST_INIT(plasma_recipes, list ( \ . = ..() /obj/item/stack/sheet/mineral/plasma/attackby(obj/item/W as obj, mob/user as mob, params) - if(W.is_hot() > 300)//If the temperature of the object is over 300, then ignite + if(W.get_temperature() > 300)//If the temperature of the object is over 300, then ignite var/turf/T = get_turf(src) message_admins("Plasma sheets ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_VERBOSEJMP(T)]") log_game("Plasma sheets ignited by [key_name(user)] in [AREACOORD(T)]") - fire_act(W.is_hot()) + fire_act(W.get_temperature()) else return ..() diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index c085306892..c10fb0fa2c 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -10,6 +10,7 @@ * Runed Metal (cult) * Brass (clockwork cult) * Bronze (bake brass) + * Cotton/Duracotton */ /* @@ -186,31 +187,43 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \ */ GLOBAL_LIST_INIT(wood_recipes, list ( \ new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1), \ + new/datum/stack_recipe("tiki mask", /obj/item/clothing/mask/gas/tiki_mask, 2), \ new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20), \ new/datum/stack_recipe("wood table frame", /obj/structure/table_frame/wood, 2, time = 10), \ + null, \ + new/datum/stack_recipe_list("pews", list( + new /datum/stack_recipe("pew (middle)", /obj/structure/chair/pew, 3, one_per_turf = TRUE, on_floor = TRUE),\ + new /datum/stack_recipe("pew (left)", /obj/structure/chair/pew/left, 3, one_per_turf = TRUE, on_floor = TRUE),\ + new /datum/stack_recipe("pew (right)", /obj/structure/chair/pew/right, 3, one_per_turf = TRUE, on_floor = TRUE),\ + )), + null, \ new/datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 40), \ new/datum/stack_recipe("rolling pin", /obj/item/kitchen/rollingpin, 2, time = 30), \ + new/datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40), \ + new/datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 5, time = 15),\ + null, \ new/datum/stack_recipe("wooden chair", /obj/structure/chair/wood/, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("winged wooden chair", /obj/structure/chair/wood/wings, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("plywood chair", /obj/structure/chair/comfy/plywood, 4, time = 10, one_per_turf = TRUE, on_floor = TRUE), \ + null, \ new/datum/stack_recipe("wooden barricade", /obj/structure/barricade/wooden, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("wooden door", /obj/structure/mineral_door/wood, 10, time = 20, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("rustic wooden door", /obj/structure/mineral_door/woodrustic, 10, time = 20, one_per_turf = TRUE, on_floor = TRUE), \ + null, \ + new/datum/stack_recipe("wooden barrel", /obj/structure/fermenting_barrel, 10, time = 20, one_per_turf = TRUE, on_floor = TRUE),\ new/datum/stack_recipe("coffin", /obj/structure/closet/crate/coffin, 5, time = 15, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("book case", /obj/structure/bookcase, 4, time = 15, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("drying rack", /obj/machinery/smartfridge/drying_rack, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("dog bed", /obj/structure/bed/dogbed, 10, time = 10, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("dresser", /obj/structure/dresser, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \ - new/datum/stack_recipe("picture frame", /obj/item/wallframe/picture, 1, time = 10),\ - new/datum/stack_recipe("display case chassis", /obj/structure/displaycase_chassis, 5, one_per_turf = TRUE, on_floor = TRUE), \ - new/datum/stack_recipe("loom", /obj/structure/loom, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \ - new/datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40), \ - new/datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 50),\ - new/datum/stack_recipe("tiki mask", /obj/item/clothing/mask/gas/tiki_mask, 2), \ - new/datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10),\ new/datum/stack_recipe("ore box", /obj/structure/ore_box, 4, time = 50, one_per_turf = TRUE, on_floor = TRUE),\ new/datum/stack_recipe("wooden crate", /obj/structure/closet/crate/wooden, 6, time = 50, one_per_turf = TRUE, on_floor = TRUE),\ - new/datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 5, time = 15),\ + new/datum/stack_recipe("display case chassis", /obj/structure/displaycase_chassis, 5, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("loom", /obj/structure/loom, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 50),\ + null, \ + new/datum/stack_recipe("picture frame", /obj/item/wallframe/picture, 1, time = 10),\ + new/datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10),\ )) /obj/item/stack/sheet/mineral/wood @@ -272,6 +285,9 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ resistance_flags = FLAMMABLE force = 0 throwforce = 0 + pull_effort = 90 + is_fabric = TRUE + loom_result = /obj/item/stack/sheet/silk merge_type = /obj/item/stack/sheet/cloth /obj/item/stack/sheet/cloth/Initialize(mapload, new_amount, merge = TRUE) @@ -281,6 +297,22 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ /obj/item/stack/sheet/cloth/ten amount = 10 +/obj/item/stack/sheet/cloth/thirty + amount = 30 + +/obj/item/stack/sheet/silk + name = "silk" + desc = "A long soft material. This one is just made out of cotton rather then any spiders or wyrms" + singular_name = "silk sheet" + icon_state = "sheet-silk" + item_state = "sheet-cloth" + novariants = TRUE + merge_type = /obj/item/stack/sheet/silk + +//obj/item/stack/sheet/silk/Initialize(mapload, new_amount, merge = TRUE) +// recipes = GLOB.silk_recipes +// return ..() + //Durathread fuck slash-asterisk comments GLOBAL_LIST_INIT(durathread_recipes, list ( \ new/datum/stack_recipe("durathread jumpsuit", /obj/item/clothing/under/durathread, 4, time = 40), @@ -649,6 +681,12 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra pull_effort = 30 loom_result = /obj/item/stack/sheet/cloth +/obj/item/stack/sheet/cotton/ten + amount = 10 + +/obj/item/stack/sheet/cotton/thirty + amount = 30 + /obj/item/stack/sheet/cotton/durathread name = "raw durathread bundle" desc = "A bundle of raw durathread ready to be spun on the loom." diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 7654199cf5..965e78036a 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -76,23 +76,23 @@ . = ..() /obj/item/stack/examine(mob/user) - ..() + . = ..() if (is_cyborg) if(singular_name) - to_chat(user, "There is enough energy for [get_amount()] [singular_name]\s.") + . += "There is enough energy for [get_amount()] [singular_name]\s." else - to_chat(user, "There is enough energy for [get_amount()].") + . += "There is enough energy for [get_amount()]." return if(singular_name) if(get_amount()>1) - to_chat(user, "There are [get_amount()] [singular_name]\s in the stack.") + . += "There are [get_amount()] [singular_name]\s in the stack." else - to_chat(user, "There is [get_amount()] [singular_name] in the stack.") + . += "There is [get_amount()] [singular_name] in the stack." else if(get_amount()>1) - to_chat(user, "There are [get_amount()] in the stack.") + . += "There are [get_amount()] in the stack." else - to_chat(user, "There is [get_amount()] in the stack.") - to_chat(user, "Alt-click to take a custom amount.") + . += "There is [get_amount()] in the stack." + . += "Alt-click to take a custom amount." /obj/item/stack/proc/get_amount() if(is_cyborg) diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 847e1b521e..3fc9bd9535 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -73,6 +73,15 @@ turf_type = /turf/open/floor/grass resistance_flags = FLAMMABLE +//Fairygrass +/obj/item/stack/tile/fairygrass + name = "fairygrass tile" + singular_name = "fairygrass floor tile" + desc = "A patch of odd, glowing blue grass." + icon_state = "tile_fairygrass" + item_state = "tile-fairygrass" + turf_type = /turf/open/floor/grass/fairy + resistance_flags = FLAMMABLE //Wood /obj/item/stack/tile/wood diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index a79eb299da..f6e169a4d5 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -60,7 +60,7 @@ . = ..() var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.allow_big_nesting = TRUE - STR.max_w_class = WEIGHT_CLASS_GIGANTIC + STR.max_w_class = WEIGHT_CLASS_BULKY STR.max_combined_w_class = 35 /obj/item/storage/backpack/holding/suicide_act(mob/living/user) diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 713dbe4133..e6e4b31547 100755 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -757,9 +757,9 @@ STR.can_hold = typecacheof(fitting_swords) /obj/item/storage/belt/sabre/examine(mob/user) - ..() + . = ..() if(length(contents)) - to_chat(user, "Alt-click it to quickly draw the blade.") + . += "Alt-click it to quickly draw the blade." /obj/item/storage/belt/sabre/AltClick(mob/user) if(!iscarbon(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index f50b5d1be6..e053ff2a5c 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -855,7 +855,7 @@ if(SMILEY) desc = "A paper sack with a crude smile etched onto the side." return 0 - else if(W.is_sharp()) + else if(W.get_sharpness()) if(!contents.len) if(item_state == "paperbag_None") user.show_message("You cut eyeholes into [src].", 1) diff --git a/code/game/objects/items/storage/dakis.dm b/code/game/objects/items/storage/dakis.dm index 2703581a94..1939593c8e 100644 --- a/code/game/objects/items/storage/dakis.dm +++ b/code/game/objects/items/storage/dakis.dm @@ -7,7 +7,7 @@ desc = "A large pillow depicting a girl in a compromising position. Featuring as many dimensions as you." icon = 'icons/obj/daki.dmi' icon_state = "daki_base" - slot_flags = SLOT_BACK + slot_flags = ITEM_SLOT_BACK var/cooldowntime = 20 var/static/list/dakimakura_options = list("Callie","Casca","Chaika","Elisabeth","Foxy Grandpa","Haruko","Holo","Ian","Jolyne","Kurisu","Marie","Mugi","Nar'Sie","Patchouli","Plutia","Rei","Reisen","Naga","Squid","Squigly","Tomoko","Toriel","Umaru","Yaranaika","Yoko") //Kurisu is the ideal girl." - Me, Logos. diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index f0a9ad019b..6cc2cb6882 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -36,12 +36,12 @@ icon_state = "[icon_type]box" /obj/item/storage/fancy/examine(mob/user) - ..() + . = ..() if(fancy_open) if(length(contents) == 1) - to_chat(user, "There is one [icon_type] left.") + . += "There is one [icon_type] left." else - to_chat(user, "There are [contents.len <= 0 ? "no" : "[contents.len]"] [icon_type]s left.") + . += "There are [contents.len <= 0 ? "no" : "[contents.len]"] [icon_type]s left." /obj/item/storage/fancy/attack_self(mob/user) fancy_open = !fancy_open @@ -143,8 +143,8 @@ STR.can_hold = typecacheof(list(/obj/item/clothing/mask/cigarette, /obj/item/lighter)) /obj/item/storage/fancy/cigarettes/examine(mob/user) - ..() - to_chat(user, "Alt-click to extract contents.") + . = ..() + . += "Alt-click to extract contents." /obj/item/storage/fancy/cigarettes/AltClick(mob/living/carbon/user) if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) @@ -309,9 +309,10 @@ if(fancy_open) icon_state = "[initial(icon_state)]_open" - var/cigar_position = 1 //generate sprites for cigars in the box + var/cigar_position = 0 //to keep track of the pixel_x offset of each new overlay. for(var/obj/item/clothing/mask/cigarette/cigar/smokes in contents) - var/mutable_appearance/cigar_overlay = mutable_appearance(icon, "[smokes.icon_off]_[cigar_position]") + var/mutable_appearance/cigar_overlay = mutable_appearance(icon, "[smokes.icon_off]") + cigar_overlay.pixel_x = 3 * cigar_position add_overlay(cigar_overlay) cigar_position++ diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm index 1607b19c2f..bd234d8188 100644 --- a/code/game/objects/items/storage/lockbox.dm +++ b/code/game/objects/items/storage/lockbox.dm @@ -108,10 +108,10 @@ STR.can_hold = typecacheof(list(/obj/item/clothing/accessory/medal)) /obj/item/storage/lockbox/medal/examine(mob/user) - ..() + . = ..() var/locked = SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED) if(!locked) - to_chat(user, "Alt-click to [open ? "close":"open"] it.") + . += "Alt-click to [open ? "close":"open"] it." /obj/item/storage/lockbox/medal/AltClick(mob/user) if(user.canUseTopic(src, BE_CLOSE)) diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm index 8618e4c3ae..a2bf5773d1 100644 --- a/code/game/objects/items/storage/secure.dm +++ b/code/game/objects/items/storage/secure.dm @@ -31,8 +31,8 @@ STR.max_combined_w_class = 14 /obj/item/storage/secure/examine(mob/user) - ..() - to_chat(user, text("The service panel is currently [open ? "unscrewed" : "screwed shut"].")) + . = ..() + . += "The service panel is currently [open ? "unscrewed" : "screwed shut"]." /obj/item/storage/secure/attackby(obj/item/W, mob/user, params) if(SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED)) diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index 251703f907..1e37de2581 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -239,8 +239,8 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) /obj/item/storage/toolbox/gold_real name = "golden toolbox" desc = "A larger then normal toolbox made of gold plated plastitanium." - item_state = "gold" icon_state = "gold" + item_state = "toolbox_gold" has_latches = FALSE force = 16 // Less then a spear throwforce = 14 @@ -266,7 +266,7 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) name = "golden toolbox" desc = "A gold plated toolbox, fancy and harmless due to the gold plating being on cardboard!" icon_state = "gold" - item_state = "gold" + item_state = "toolbox_gold" has_latches = FALSE force = 0 throwforce = 0 @@ -288,7 +288,6 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) generate_rubber_toolbox_icon() icon = GLOB.rubber_toolbox_icons[icon_state] AddComponent(/datum/component/bouncy) - . = ..() /obj/item/storage/toolbox/proc/generate_rubber_toolbox_icon() var/icon/new_icon = icon(icon, icon_state) diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 84ebc28afa..223c8e9cf6 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -381,3 +381,13 @@ new /obj/item/gun/ballistic/automatic/pistol/m1911/kitchengun(src) new /obj/item/ammo_box/magazine/m45/kitchengun(src) new /obj/item/ammo_box/magazine/m45/kitchengun(src) + + +/obj/item/storage/box/strange_seeds_10pack + +/obj/item/storage/box/strange_seeds_10pack/PopulateContents() + for(var/i in 1 to 10) + new /obj/item/seeds/random(src) + + if(prob(50)) + new /obj/item/seeds/random(src) //oops, an additional packet might have slipped its way into the box \ No newline at end of file diff --git a/code/game/objects/items/storage/wallets.dm b/code/game/objects/items/storage/wallets.dm index 7a6899ad15..891a4689d0 100644 --- a/code/game/objects/items/storage/wallets.dm +++ b/code/game/objects/items/storage/wallets.dm @@ -68,6 +68,21 @@ /obj/item/storage/wallet/GetID() return front_id +/obj/item/storage/wallet/RemoveID() + if(!front_id) + return + . = front_id + front_id.forceMove(get_turf(src)) + +/obj/item/storage/wallet/InsertID(obj/item/inserting_item) + var/obj/item/card/inserting_id = inserting_item.RemoveID() + if(!inserting_id) + return FALSE + attackby(inserting_id) + if(inserting_id in contents) + return TRUE + return FALSE + /obj/item/storage/wallet/GetAccess() if(LAZYLEN(combined_access)) return combined_access diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index ee126971a7..484b9862ff 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -91,9 +91,9 @@ . = ..() var/obj/item/stock_parts/cell/copper_top = get_cell() if(copper_top) - to_chat(user, "\The [src] is [round(copper_top.percent())]% charged.") + . += "\The [src] is [round(copper_top.percent())]% charged." else - to_chat(user, "\The [src] does not have a power source installed.") + . += "\The [src] does not have a power source installed." /obj/item/melee/baton/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/stock_parts/cell)) @@ -191,7 +191,7 @@ L.Knockdown(stunpwr) - L.adjustStaminaLoss(stunpwr*0.1, affected_zone = (istype(user) ? user.zone_selected : BODY_ZONE_CHEST))//CIT CHANGE - makes stunbatons deal extra staminaloss. Todo: make this also deal pain when pain gets implemented. + L.adjustStaminaLoss(stunpwr*0.1)//CIT CHANGE - makes stunbatons deal extra staminaloss. Todo: make this also deal pain when pain gets implemented. L.apply_effect(EFFECT_STUTTER, stunforce) SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK) if(user) diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index d409e40575..f763fe87fc 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -74,15 +74,15 @@ /obj/item/tank/examine(mob/user) var/obj/icon = src - ..() + . = ..() if (istype(src.loc, /obj/item/assembly)) icon = src.loc if(!in_range(src, user)) if (icon == src) - to_chat(user, "If you want any more information you'll need to get closer.") + . += "If you want any more information you'll need to get closer." return - to_chat(user, "The pressure gauge reads [round(src.air_contents.return_pressure(),0.01)] kPa.") + . += "The pressure gauge reads [round(src.air_contents.return_pressure(),0.01)] kPa." var/celsius_temperature = src.air_contents.temperature-T0C var/descriptive @@ -100,7 +100,7 @@ else descriptive = "furiously hot" - to_chat(user, "It feels [descriptive].") + . += "It feels [descriptive]." /obj/item/tank/blob_act(obj/structure/blob/B) if(B && B.loc == loc) diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm index e16b0dd690..e0e875b739 100644 --- a/code/game/objects/items/teleportation.dm +++ b/code/game/objects/items/teleportation.dm @@ -79,7 +79,7 @@ continue var/mob/living/M = W.imp_in if (M.stat == DEAD) - if (M.timeofdeath + 6000 < world.time) + if (M.timeofdeath + W.lifespan_postmortem < world.time) continue var/turf/tr = get_turf(M) diff --git a/code/game/objects/items/theft_tools.dm b/code/game/objects/items/theft_tools.dm index b99be7e988..d52c280f1b 100644 --- a/code/game/objects/items/theft_tools.dm +++ b/code/game/objects/items/theft_tools.dm @@ -49,6 +49,10 @@ lefthand_file = 'icons/mob/inhands/misc/sheets_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/sheets_righthand.dmi' var/obj/item/nuke_core/core + var/nt =FALSE //For the lid + +/obj/item/nuke_core_container/nt + nt = TRUE /obj/item/nuke_core_container/Destroy() QDEL_NULL(core) @@ -67,10 +71,13 @@ /obj/item/nuke_core_container/proc/seal() if(istype(core)) STOP_PROCESSING(SSobj, core) - icon_state = "core_container_sealed" playsound(src, 'sound/items/deconstruct.ogg', 60, 1) if(ismob(loc)) to_chat(loc, "[src] is permanently sealed, [core]'s radiation is contained.") + if(nt != TRUE) + icon_state = "core_container_sealed" + else + icon_state = "core_container_sealed_nt" /obj/item/nuke_core_container/attackby(obj/item/nuke_core/core, mob/user) if(istype(core)) @@ -92,6 +99,11 @@ toolspeed = 0.5 random_color = FALSE +/obj/item/screwdriver/nuke/nt + desc = "A screwdriver with an ultra thin diamon tip." + toolspeed = 0.25 + icon_state = "screwdriver_nt" + /obj/item/paper/guides/antag/nuke_instructions info = "How to break into a Nanotrasen self-destruct terminal and remove its plutonium core:
    \
      \ @@ -103,6 +115,18 @@
    • ???
    • \
    " +/obj/item/paper/guides/nt/nuke_instructions + info = "How to remove its plutonium core:
    \ +
      \ +
    • Use a screwdriver with a very thin tip (provided) to unscrew the terminal's front panel
    • \ +
    • Dislodge and remove the front panel with a crowbar
    • \ +
    • Cut the inner metal plate with a welding tool
    • \ +
    • Pry off the inner plate with a crowbar to expose the radioactive core
    • \ +
    • Use the core container to remove the plutonium core; the container will take some time to seal
    • \ +
    • Send core back to CC
    • \ +
    " + + // STEALING SUPERMATTER /obj/item/paper/guides/antag/supermatter_sliver diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm index f891a48df6..bc5bc6811e 100644 --- a/code/game/objects/items/tools/crowbar.dm +++ b/code/game/objects/items/tools/crowbar.dm @@ -63,6 +63,8 @@ /obj/item/crowbar/cyborg name = "hydraulic crowbar" desc = "A hydraulic prying tool, compact but powerful. Designed to replace crowbar in construction cyborgs." + icon = 'icons/obj/items_cyborg.dmi' + icon_state = "crowbar_cyborg" usesound = 'sound/items/jaws_pry.ogg' force = 10 toolspeed = 0.5 diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index 6cbede78a8..91a94e05c3 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -138,10 +138,14 @@ user.put_in_active_hand(b_drill) /obj/item/screwdriver/cyborg - name = "powered screwdriver" + name = "automated screwdriver" desc = "An electrical screwdriver, designed to be both precise and quick." + icon = 'icons/obj/items_cyborg.dmi' + icon_state = "screwdriver_cyborg" + hitsound = 'sound/items/drill_hit.ogg' usesound = 'sound/items/drill_use.ogg' toolspeed = 0.5 + random_color = FALSE /obj/item/screwdriver/advanced name = "advanced screwdriver" diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index fb38e4335e..65b240c528 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -220,10 +220,10 @@ /obj/item/weldingtool/examine(mob/user) - ..() - to_chat(user, "It contains [get_fuel()] unit\s of fuel out of [max_fuel].") + . = ..() + . += "It contains [get_fuel()] unit\s of fuel out of [max_fuel]." -/obj/item/weldingtool/is_hot() +/obj/item/weldingtool/get_temperature() return welding * heat //Returns whether or not the welding tool is currently on. @@ -302,6 +302,8 @@ /obj/item/weldingtool/largetank/cyborg name = "integrated welding tool" desc = "An advanced welder designed to be used in robotic systems." + icon = 'icons/obj/items_cyborg.dmi' + icon_state = "indwelder_cyborg" toolspeed = 0.5 /obj/item/weldingtool/largetank/flamethrower_screwdriver() diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm index e40ae8bdc1..fe8b4b2d56 100644 --- a/code/game/objects/items/tools/wirecutters.dm +++ b/code/game/objects/items/tools/wirecutters.dm @@ -87,7 +87,10 @@ /obj/item/wirecutters/cyborg name = "wirecutters" desc = "This cuts wires." + icon = 'icons/obj/items_cyborg.dmi' + icon_state = "wirecutters_cyborg" toolspeed = 0.5 + random_color = FALSE /obj/item/wirecutters/power name = "jaws of life" diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm index 462eb22aaa..89f135ed67 100644 --- a/code/game/objects/items/tools/wrench.dm +++ b/code/game/objects/items/tools/wrench.dm @@ -26,6 +26,8 @@ /obj/item/wrench/cyborg name = "automatic wrench" desc = "An advanced robotic wrench. Can be found in construction cyborgs." + icon = 'icons/obj/items_cyborg.dmi' + icon_state = "wrench_cyborg" toolspeed = 0.5 /obj/item/wrench/brass diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 638dcd3556..c5b62f0f33 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -79,7 +79,7 @@ to_chat(user, "You fill the balloon with the contents of [I].") I.reagents.trans_to(src, 10) update_icon() - else if(I.is_sharp()) + else if(I.get_sharpness()) balloon_burst() else return ..() @@ -148,8 +148,8 @@ var/bullets = 7 /obj/item/toy/gun/examine(mob/user) - ..() - to_chat(user, "There [bullets == 1 ? "is" : "are"] [bullets] cap\s left.") + . = ..() + . += "There [bullets == 1 ? "is" : "are"] [bullets] cap\s left." /obj/item/toy/gun/attackby(obj/item/toy/ammo/gun/A, mob/user, params) @@ -204,8 +204,8 @@ src.icon_state = text("357OLD-[]", src.amount_left) /obj/item/toy/ammo/gun/examine(mob/user) - ..() - to_chat(user, "There [amount_left == 1 ? "is" : "are"] [amount_left] cap\s left.") + . = ..() + . += "There [amount_left == 1 ? "is" : "are"] [amount_left] cap\s left." /* * Toy swords @@ -373,8 +373,8 @@ return ..() /obj/item/toy/sword/cx/examine(mob/user) - ..() - to_chat(user, "Alt-click to recolor it.") + . = ..() + . += "Alt-click to recolor it." /* * Foam armblade @@ -994,8 +994,7 @@ if(cardUser.is_holding(src)) cardUser.visible_message("[cardUser] checks [cardUser.p_their()] card.", "The card reads: [cardname].") else - to_chat(cardUser, "You need to have the card in your hand to check it!") - + . += "You need to have the card in your hand to check it!" /obj/item/toy/cards/singlecard/verb/Flip() set name = "Flip Card" @@ -1221,8 +1220,8 @@ to_chat(user, "The cogwheels are already turning!") /obj/item/toy/clockwork_watch/examine(mob/user) - ..() - to_chat(user, "Station Time: [STATION_TIME_TIMESTAMP("hh:mm:ss")]") + . = ..() + . += "Station Time: [STATION_TIME_TIMESTAMP("hh:mm:ss")]" /* * Toy Dagger @@ -1293,8 +1292,8 @@ var/toysound = 'sound/machines/click.ogg' /obj/item/toy/figure/New() - desc = "A \"Space Life\" brand [src]." - ..() + desc = "A \"Space Life\" brand [src]." + ..() /obj/item/toy/figure/attack_self(mob/user as mob) if(cooldown <= world.time) @@ -1517,3 +1516,18 @@ /obj/item/toy/dummy/GetVoice() return doll_name + +/obj/item/toy/seashell + name = "seashell" + desc = "May you always have a shell in your pocket and sand in your shoes. Whatever that's supposed to mean." + icon = 'icons/misc/beach.dmi' + icon_state = "shell1" + var/static/list/possible_colors = list("" = 2, COLOR_PURPLE_GRAY = 1, COLOR_OLIVE = 1, COLOR_PALE_BLUE_GRAY = 1, COLOR_RED_GRAY = 1) + +/obj/item/toy/seashell/Initialize() + . = ..() + pixel_x = rand(-5, 5) + pixel_y = rand(-5, 5) + icon_state = "shell[rand(1,3)]" + color = pickweight(possible_colors) + setDir(pick(GLOB.cardinals)) diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm index 14f924a27e..f559d2801d 100644 --- a/code/game/objects/items/twohanded.dm +++ b/code/game/objects/items/twohanded.dm @@ -566,9 +566,9 @@ . += blade_inhand /obj/item/twohanded/dualsaber/hypereutactic/examine(mob/user) - ..() + . = ..() if(!hacked) - to_chat(user, "Alt-click to recolor it.") + . += "Alt-click to recolor it." /obj/item/twohanded/dualsaber/hypereutactic/rainbow_process() . = ..() @@ -634,9 +634,9 @@ AddComponent(/datum/component/jousting) /obj/item/twohanded/spear/examine(mob/user) - ..() + . = ..() if(explosive) - to_chat(user, "Use in your hands to activate the attached explosive.
    Alt-click to set your war cry.
    Right-click in combat mode to wield") + . += "Use in your hands to activate the attached explosive.
    Alt-click to set your war cry.
    Right-click in combat mode to wield" /obj/item/twohanded/spear/update_icon() if(explosive) diff --git a/code/game/objects/items/vending_items.dm b/code/game/objects/items/vending_items.dm index 3be12abf4f..af647550ea 100755 --- a/code/game/objects/items/vending_items.dm +++ b/code/game/objects/items/vending_items.dm @@ -30,14 +30,14 @@ name = "\improper [machine_name] restocking unit" /obj/item/vending_refill/examine(mob/user) - ..() + . = ..() var/num = get_part_rating() if (num == INFINITY) - to_chat(user, "It's sealed tight, completely full of supplies.") + . += "It's sealed tight, completely full of supplies." else if (num == 0) - to_chat(user, "It's empty!") + . += "It's empty!" else - to_chat(user, "It can restock [num] item\s.") + . += "It can restock [num] item\s." /obj/item/vending_refill/get_part_rating() if (!products || !contraband || !premium) diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index fec17cfa69..fe1086eb6e 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -125,10 +125,10 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 qdel(src) //If this ever happens, it's because you lost an arm /obj/item/claymore/highlander/examine(mob/user) - ..() - to_chat(user, "It has [!notches ? "nothing" : "[notches] notches"] scratched into the blade.") + . = ..() + . += "It has [!notches ? "nothing" : "[notches] notches"] scratched into the blade." if(nuke_disk) - to_chat(user, "It's holding the nuke disk!") + . += "It's holding the nuke disk!" /obj/item/claymore/highlander/attack(mob/living/target, mob/living/user) . = ..() @@ -216,7 +216,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK force = 40 throwforce = 10 - w_class = WEIGHT_CLASS_HUGE + w_class = WEIGHT_CLASS_BULKY hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") block_chance = 50 @@ -427,7 +427,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi' item_flags = ABSTRACT | DROPDEL - w_class = WEIGHT_CLASS_HUGE + w_class = WEIGHT_CLASS_BULKY force = 24 throwforce = 0 throw_range = 0 @@ -512,7 +512,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 force = 10 throwforce = 12 attack_verb = list("beat", "smacked") - w_class = WEIGHT_CLASS_HUGE + w_class = WEIGHT_CLASS_BULKY var/homerun_ready = 0 var/homerun_able = 0 total_mass = 2.7 //a regular wooden major league baseball bat weighs somewhere between 2 to 3.4 pounds, according to google diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 6dd8a43130..e6c7f987d5 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -224,11 +224,11 @@ .["Modify armor values"] = "?_src_=vars;[HrefToken()];modarmor=[REF(src)]" /obj/examine(mob/user) - ..() + . = ..() if(obj_flags & UNIQUE_RENAME) - to_chat(user, "Use a pen on it to rename it or change its description.") + . += "Use a pen on it to rename it or change its description." if(unique_reskin && (!current_skin || always_reskinnable)) - to_chat(user, "Alt-click it to reskin it.") + . += "Alt-click it to reskin it." /obj/AltClick(mob/user) . = ..() diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 7526807eeb..cf050f62d1 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -89,15 +89,15 @@ structureclimber = null /obj/structure/examine(mob/user) - ..() + . = ..() if(!(resistance_flags & INDESTRUCTIBLE)) if(resistance_flags & ON_FIRE) - to_chat(user, "It's on fire!") + . += "It's on fire!" if(broken) - to_chat(user, "It appears to be broken.") + . += "It appears to be broken." var/examine_status = examine_status(user) if(examine_status) - to_chat(user, examine_status) + . += examine_status /obj/structure/proc/examine_status(mob/user) //An overridable proc, mostly for falsewalls. var/healthpercent = (obj_integrity/max_integrity) * 100 diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm index be26567c7e..8964d1ca41 100644 --- a/code/game/objects/structures/ai_core.dm +++ b/code/game/objects/structures/ai_core.dm @@ -39,7 +39,7 @@ /obj/structure/AIcore/latejoin_inactive/examine(mob/user) . = ..() - to_chat(user, "Its transmitter seems to be [active? "on" : "off"].") + . += "Its transmitter seems to be [active? "on" : "off"]." /obj/structure/AIcore/latejoin_inactive/proc/is_available() //If people still manage to use this feature to spawn-kill AI latejoins ahelp them. if(!available) diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm index 12dcb97903..e9e09ddc91 100644 --- a/code/game/objects/structures/beds_chairs/bed.dm +++ b/code/game/objects/structures/beds_chairs/bed.dm @@ -23,9 +23,9 @@ var/bolts = TRUE /obj/structure/bed/examine(mob/user) - ..() + . = ..() if(bolts) - to_chat(user, "It's held together by a couple of bolts.") + . += "It's held together by a couple of bolts." /obj/structure/bed/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) @@ -148,8 +148,8 @@ ..() /obj/item/roller/robo/examine(mob/user) - ..() - to_chat(user, "The dock is [loaded ? "loaded" : "empty"].") + . = ..() + . += "The dock is [loaded ? "loaded" : "empty"]." /obj/item/roller/robo/deploy_roller(mob/user, atom/location) if(loaded) diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index cec97d5d8b..d19e76d238 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -15,10 +15,10 @@ layer = OBJ_LAYER /obj/structure/chair/examine(mob/user) - ..() - to_chat(user, "It's held together by a couple of bolts.") + . = ..() + . += "It's held together by a couple of bolts." if(!has_buckled_mobs()) - to_chat(user, "Drag your sprite to sit in it.") + . += "Drag your sprite to sit in it." /obj/structure/chair/Initialize() . = ..() diff --git a/code/game/objects/structures/beds_chairs/pew.dm b/code/game/objects/structures/beds_chairs/pew.dm new file mode 100644 index 0000000000..65440fb5d8 --- /dev/null +++ b/code/game/objects/structures/beds_chairs/pew.dm @@ -0,0 +1,72 @@ +/obj/structure/chair/pew + name = "wooden pew" + desc = "Kneel here and pray." + icon = 'icons/obj/sofa.dmi' + icon_state = "pewmiddle" + resistance_flags = FLAMMABLE + max_integrity = 70 + buildstacktype = /obj/item/stack/sheet/mineral/wood + buildstackamount = 3 + item_chair = null + +/obj/structure/chair/pew/left + name = "left wooden pew end" + icon_state = "pewend_left" + var/mutable_appearance/leftpewarmrest + +/obj/structure/chair/pew/left/Initialize() + leftpewarmrest = GetLeftPewArmrest() + leftpewarmrest.layer = ABOVE_MOB_LAYER + return ..() + +/obj/structure/chair/pew/left/proc/GetLeftPewArmrest() + return mutable_appearance('icons/obj/sofa.dmi', "pewend_left_armrest") + +/obj/structure/chair/pew/left/Destroy() + QDEL_NULL(leftpewarmrest) + return ..() + +/obj/structure/chair/pew/left/post_buckle_mob(mob/living/M) + . = ..() + update_leftpewarmrest() + +/obj/structure/chair/pew/left/proc/update_leftpewarmrest() + if(has_buckled_mobs()) + add_overlay(leftpewarmrest) + else + cut_overlay(leftpewarmrest) + +/obj/structure/chair/pew/left/post_unbuckle_mob() + . = ..() + update_leftpewarmrest() + +/obj/structure/chair/pew/right + name = "left wooden pew end" + icon_state = "pewend_right" + var/mutable_appearance/rightpewarmrest + +/obj/structure/chair/pew/right/Initialize() + rightpewarmrest = GetRightPewArmrest() + rightpewarmrest.layer = ABOVE_MOB_LAYER + return ..() + +/obj/structure/chair/pew/right/proc/GetRightPewArmrest() + return mutable_appearance('icons/obj/sofa.dmi', "pewend_right_armrest") + +/obj/structure/chair/pew/right/Destroy() + QDEL_NULL(rightpewarmrest) + return ..() + +/obj/structure/chair/pew/right/post_buckle_mob(mob/living/M) + . = ..() + update_rightpewarmrest() + +/obj/structure/chair/pew/right/proc/update_rightpewarmrest() + if(has_buckled_mobs()) + add_overlay(rightpewarmrest) + else + cut_overlay(rightpewarmrest) + +/obj/structure/chair/pew/right/post_unbuckle_mob() + . = ..() + update_rightpewarmrest() diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 1f7f0ab391..82a0c4d32f 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -41,7 +41,7 @@ LINEN BINS return /obj/item/bedsheet/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/wirecutters) || I.is_sharp()) + if(istype(I, /obj/item/wirecutters) || I.get_sharpness()) var/obj/item/stack/sheet/cloth/C = new (get_turf(src), 3) transfer_fingerprints_to(C) C.add_fingerprint(user) @@ -294,13 +294,13 @@ LINEN BINS var/obj/item/hidden = null /obj/structure/bedsheetbin/examine(mob/user) - ..() + . = ..() if(amount < 1) - to_chat(user, "There are no sheets in the bin.") + . += "There are no sheets in the bin." else if(amount == 1) - to_chat(user, "There is one sheet in the bin.") + . += "There is one sheet in the bin." else - to_chat(user, "There are [amount] sheets in the bin.") + . += "There are [amount] sheets in the bin." /obj/structure/bedsheetbin/update_icon() diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 172120861b..0f8963012f 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -44,7 +44,7 @@ update_icon() PopulateContents() if(mapload && !opened) // if closed, any item at the crate's loc is put in the contents - take_contents() + addtimer(CALLBACK(src, .proc/take_contents), 0) if(secure) lockerelectronics = new(src) lockerelectronics.accesses = req_access @@ -84,22 +84,22 @@ add_overlay("unlocked") /obj/structure/closet/examine(mob/user) - ..() + . = ..() if(welded) - to_chat(user, "It's welded shut.") + . += "It's welded shut." if(anchored) - to_chat(user, "It is bolted to the ground.") + . += "It is bolted to the ground." if(opened) - to_chat(user, "The parts are welded together.") + . += "The parts are welded together." else if(secure && !opened) else if(broken) - to_chat(user, "The lock is screwed in.") + . += "The lock is screwed in." else if(secure) - to_chat(user, "Alt-click to [locked ? "unlock" : "lock"].") + . += "Alt-click to [locked ? "unlock" : "lock"]." if(isliving(user)) var/mob/living/L = user if(HAS_TRAIT(L, TRAIT_SKITTISH)) - to_chat(user, "Ctrl-Shift-click [src] to jump inside.") + . += "Ctrl-Shift-click [src] to jump inside." /obj/structure/closet/CanPass(atom/movable/mover, turf/target) if(wall_mounted) diff --git a/code/game/objects/structures/crates_lockers/closets/fitness.dm b/code/game/objects/structures/crates_lockers/closets/fitness.dm index ad493dd6f5..0adfe77853 100644 --- a/code/game/objects/structures/crates_lockers/closets/fitness.dm +++ b/code/game/objects/structures/crates_lockers/closets/fitness.dm @@ -12,6 +12,9 @@ new /obj/item/clothing/under/shorts/blue(src) new /obj/item/clothing/under/shorts/green(src) new /obj/item/clothing/under/jabroni(src) + new /obj/item/clothing/under/polychromic/shortpants(src) + new /obj/item/clothing/under/polychromic/shortpants(src) + new /obj/item/clothing/under/polychromic/shortpants(src) /obj/structure/closet/boxinggloves diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index b49d0a77d5..9deca71269 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -352,6 +352,7 @@ icon_door = "black" /obj/structure/closet/wardrobe/curator/PopulateContents() + new /obj/item/clothing/accessory/pocketprotector/full(src) new /obj/item/clothing/head/fedora/curator(src) new /obj/item/clothing/suit/curator(src) new /obj/item/clothing/under/rank/curator/treasure_hunter(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm index 18928424c0..b06073812a 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm @@ -11,7 +11,7 @@ new /obj/item/clothing/under/rank/cargo(src) new /obj/item/clothing/under/rank/cargo/skirt(src) new /obj/item/clothing/shoes/sneakers/brown(src) - new /obj/item/radio/headset/headset_cargo(src) + new /obj/item/radio/headset/heads/qm(src) new /obj/item/clothing/suit/fire/firefighter(src) new /obj/item/clothing/gloves/fingerless(src) new /obj/item/megaphone/cargo(src) @@ -23,3 +23,4 @@ new /obj/item/circuitboard/machine/techfab/department/cargo(src) new /obj/item/storage/photo_album/QM(src) new /obj/item/circuitboard/machine/ore_silo(src) + new /obj/item/clothing/suit/hooded/wintercoat/qm(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index a7adafdad4..9abd81b787 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -10,7 +10,7 @@ new /obj/item/clothing/under/rank/chief_engineer(src) new /obj/item/clothing/under/rank/chief_engineer/skirt(src) new /obj/item/clothing/head/hardhat/white(src) - new /obj/item/clothing/head/welding(src) + new /obj/item/clothing/head/hardhat/weldhat/white(src) new /obj/item/clothing/gloves/color/yellow(src) new /obj/item/clothing/shoes/sneakers/brown(src) new /obj/item/tank/jetpack/suit(src) @@ -34,6 +34,7 @@ new /obj/item/storage/photo_album/CE(src) new /obj/item/storage/lockbox/medal/engineering(src) new /obj/item/construction/rcd/loaded/upgraded(src) + new /obj/item/clothing/suit/hooded/wintercoat/ce(src) /obj/structure/closet/secure_closet/engineering_electrical name = "electrical supplies locker" 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 9dab3679fa..dd72eb6b5d 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm @@ -61,6 +61,11 @@ ..() for(var/i = 0, i < 4, i++) new /obj/item/reagent_containers/food/snacks/meat/slab/monkey(src) + +/obj/structure/closet/secure_closet/freezer/meat/open + req_access = null + locked = FALSE + /obj/structure/closet/secure_closet/freezer/fridge name = "refrigerator" @@ -73,6 +78,10 @@ for(var/i = 0, i < 2, i++) new /obj/item/storage/fancy/egg_box(src) +/obj/structure/closet/secure_closet/freezer/fridge/open + req_access = null + locked = FALSE + /obj/structure/closet/secure_closet/freezer/money name = "freezer" desc = "This contains cold hard cash." diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index 0f810225b3..9c4b58cd20 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -71,7 +71,7 @@ new /obj/item/storage/belt/medical(src) new /obj/item/healthanalyzer/advanced(src) new /obj/item/assembly/flash/handheld(src) -// new /obj/item/reagent_containers/hypospray/CMO(src) // CITADEL EDIT comments out the hypospray mk I. the MK II kit is modularized + new /obj/item/storage/hypospraykit/cmo(src) new /obj/item/autosurgeon/cmo(src) new /obj/item/door_remote/chief_medical_officer(src) new /obj/item/clothing/neck/petcollar(src) @@ -81,6 +81,7 @@ new /obj/item/circuitboard/machine/techfab/department/medical(src) new /obj/item/storage/photo_album/CMO(src) new /obj/item/storage/lockbox/medal/medical(src) + new /obj/item/clothing/suit/hooded/wintercoat/cmo(src) /obj/structure/closet/secure_closet/animal name = "animal control" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm index e44d3c9079..bb70532ecc 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm @@ -5,9 +5,9 @@ var/registered_name = null /obj/structure/closet/secure_closet/personal/examine(mob/user) - ..() + . = ..() if(registered_name) - to_chat(user, "The display reads, \"Owned by [registered_name]\".") + . += "The display reads, \"Owned by [registered_name]\"." /obj/structure/closet/secure_closet/personal/check_access(obj/item/card/id/I) . = ..() diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm index efcc2aa7ca..97c0c8f3e2 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -30,3 +30,4 @@ new /obj/item/door_remote/research_director(src) new /obj/item/circuitboard/machine/techfab/department/science(src) new /obj/item/storage/photo_album/RD(src) + new /obj/item/clothing/suit/hooded/wintercoat/rd(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 3cb8ceb22b..e87cb22f31 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -61,6 +61,7 @@ new /obj/item/door_remote/civillian(src) new /obj/item/circuitboard/machine/techfab/department/service(src) new /obj/item/storage/photo_album/HoP(src) + new /obj/item/clothing/suit/hooded/wintercoat/hop(src) /obj/structure/closet/secure_closet/hos name = "\proper head of security's locker" req_access = list(ACCESS_HOS) @@ -94,6 +95,7 @@ new /obj/item/pinpointer/nuke(src) new /obj/item/circuitboard/machine/techfab/department/security(src) new /obj/item/storage/photo_album/HoS(src) + new /obj/item/clothing/suit/hooded/wintercoat/hos(src) /obj/structure/closet/secure_closet/warden name = "\proper warden's locker" req_access = list(ACCESS_ARMORY) diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm index 585f60a347..6ef6f2d5ce 100644 --- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm @@ -26,7 +26,7 @@ if (prob(40)) new /obj/item/storage/toolbox/emergency(src) - switch (pickweight(list("small" = 40, "aid" = 25, "tank" = 20, "both" = 10, "nothing" = 4, "delete" = 1))) + switch (pickweight(list("small" = 40, "aid" = 25, "tank" = 20, "both" = 10, "nothing" = 5))) if ("small") new /obj/item/tank/internals/emergency_oxygen(src) new /obj/item/tank/internals/emergency_oxygen(src) @@ -49,9 +49,7 @@ if ("nothing") // doot - // teehee - if ("delete") - qdel(src) + return /* * Fire Closet diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index d83922d708..9d554181eb 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -142,28 +142,21 @@ new /obj/item/clothing/suit/jacket(src) if(prob(40)) new /obj/item/clothing/suit/jacket(src) - new /obj/item/clothing/under/color/white(src) - new /obj/item/clothing/under/skirt/color/white(src) - new /obj/item/clothing/under/color/blue(src) - new /obj/item/clothing/under/skirt/color/blue(src) - new /obj/item/clothing/under/color/yellow(src) - new /obj/item/clothing/under/skirt/color/yellow(src) - new /obj/item/clothing/under/color/green(src) - new /obj/item/clothing/under/skirt/color/green(src) - new /obj/item/clothing/under/color/orange(src) - new /obj/item/clothing/under/skirt/color/orange(src) - new /obj/item/clothing/under/color/pink(src) - new /obj/item/clothing/under/skirt/color/pink(src) - new /obj/item/clothing/under/color/red(src) - new /obj/item/clothing/under/skirt/color/red(src) - new /obj/item/clothing/under/color/darkblue(src) - new /obj/item/clothing/under/skirt/color/darkblue(src) - new /obj/item/clothing/under/color/teal(src) - new /obj/item/clothing/under/skirt/color/teal(src) - new /obj/item/clothing/under/color/lightpurple(src) - new /obj/item/clothing/under/skirt/color/lightpurple(src) - new /obj/item/clothing/under/color/green(src) - new /obj/item/clothing/under/skirt/color/green(src) + new /obj/item/clothing/under/polychromic/jumpsuit(src) + new /obj/item/clothing/under/polychromic/jumpsuit(src) + new /obj/item/clothing/under/polychromic/jumpsuit(src) + new /obj/item/clothing/under/polychromic/shirt(src) + new /obj/item/clothing/under/polychromic/shirt(src) + new /obj/item/clothing/under/polychromic/shirt(src) + new /obj/item/clothing/under/polychromic/kilt(src) + new /obj/item/clothing/under/polychromic/kilt(src) + new /obj/item/clothing/under/polychromic/kilt(src) + new /obj/item/clothing/under/polychromic/skirt(src) + new /obj/item/clothing/under/polychromic/skirt(src) + new /obj/item/clothing/under/polychromic/skirt(src) + new /obj/item/clothing/under/polychromic/shorts(src) + new /obj/item/clothing/under/polychromic/shorts(src) + new /obj/item/clothing/under/polychromic/shorts(src) new /obj/item/clothing/mask/bandana/red(src) new /obj/item/clothing/mask/bandana/red(src) new /obj/item/clothing/mask/bandana/blue(src) diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index bcb025d14b..771b4bc04e 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -38,14 +38,14 @@ return ..() /obj/structure/displaycase/examine(mob/user) - ..() + . = ..() if(alert) - to_chat(user, "Hooked up with an anti-theft system.") + . += "Hooked up with an anti-theft system." if(showpiece) - to_chat(user, "There's [showpiece] inside.") + . += "There's [showpiece] inside." if(trophy_message) - to_chat(user, "The plaque reads:") - to_chat(user, trophy_message) + . += "The plaque reads:" + . += trophy_message /obj/structure/displaycase/proc/dump() diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 915d45be78..07a66505e7 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -26,28 +26,28 @@ ..() /obj/structure/door_assembly/examine(mob/user) - ..() + . = ..() var/doorname = "" if(created_name) doorname = ", written on it is '[created_name]'" switch(state) if(AIRLOCK_ASSEMBLY_NEEDS_WIRES) if(anchored) - to_chat(user, "The anchoring bolts are wrenched in place, but the maintenance panel lacks wiring.") + . += "The anchoring bolts are wrenched in place, but the maintenance panel lacks wiring." else - to_chat(user, "The assembly is welded together, but the anchoring bolts are unwrenched.") + . += "The assembly is welded together, but the anchoring bolts are unwrenched." if(AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS) - to_chat(user, "The maintenance panel is wired, but the circuit slot is empty.") + . += "The maintenance panel is wired, but the circuit slot is empty." if(AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER) - to_chat(user, "The circuit is connected loosely to its slot, but the maintenance panel is unscrewed and open.") + . += "The circuit is connected loosely to its slot, but the maintenance panel is unscrewed and open." if(!mineral && !glass && !noglass) - to_chat(user, "There is a small paper placard on the assembly[doorname]. There are empty slots for glass windows and mineral covers.") + . += "There is a small paper placard on the assembly[doorname]. There are empty slots for glass windows and mineral covers." else if(!mineral && glass && !noglass) - to_chat(user, "There is a small paper placard on the assembly[doorname]. There are empty slots for mineral covers.") + . += "There is a small paper placard on the assembly[doorname]. There are empty slots for mineral covers." else if(mineral && !glass && !noglass) - to_chat(user, "There is a small paper placard on the assembly[doorname]. There are empty slots for glass windows.") + . += "There is a small paper placard on the assembly[doorname]. There are empty slots for glass windows." else - to_chat(user, "There is a small paper placard on the assembly[doorname].") + . += "There is a small paper placard on the assembly[doorname]." /obj/structure/door_assembly/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/pen)) diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index d4e097e450..23643ae9cd 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -22,8 +22,8 @@ stored_extinguisher = new /obj/item/extinguisher(src) /obj/structure/extinguisher_cabinet/examine(mob/user) - ..() - to_chat(user, "Alt-click to [opened ? "close":"open"] it.") + . = ..() + . += "Alt-click to [opened ? "close":"open"] it." /obj/structure/extinguisher_cabinet/Destroy() if(stored_extinguisher) diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index d52ec81a05..d7e2d5564a 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -236,7 +236,7 @@ canSmoothWith = list(/obj/structure/falsewall/plasma, /turf/closed/wall/mineral/plasma) /obj/structure/falsewall/plasma/attackby(obj/item/W, mob/user, params) - if(W.is_hot() > 300) + if(W.get_temperature() > 300) var/turf/T = get_turf(src) message_admins("Plasma falsewall ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_VERBOSEJMP(T)]") log_game("Plasma falsewall ignited by [key_name(user)] in [AREACOORD(T)]") diff --git a/code/game/objects/structures/femur_breaker.dm b/code/game/objects/structures/femur_breaker.dm index e3002a8fae..7331285161 100644 --- a/code/game/objects/structures/femur_breaker.dm +++ b/code/game/objects/structures/femur_breaker.dm @@ -23,24 +23,14 @@ var/current_action = 0 // What's currently happening to the femur breaker /obj/structure/femur_breaker/examine(mob/user) - ..() - - var/msg = "" - - msg += "It is [anchored ? "secured to the floor." : "unsecured."]
    " - + . = ..() + . += "It is [anchored ? "secured to the floor." : "unsecured."]" if (slat_status == BREAKER_SLAT_RAISED) - msg += "The breaker slat is in a neutral position." + . += "The breaker slat is in a neutral position." else - msg += "The breaker slat is lowered, and must be raised." - + . += "The breaker slat is lowered, and must be raised." if (LAZYLEN(buckled_mobs)) - msg += "
    " - msg += "Someone appears to be strapped in. You can help them unbuckle, or activate the femur breaker." - - to_chat(user, msg) - - return msg + . += "Someone appears to be strapped in. You can help them unbuckle, or activate the femur breaker." /obj/structure/femur_breaker/attack_hand(mob/user) add_fingerprint(user) diff --git a/code/game/objects/structures/fence.dm b/code/game/objects/structures/fence.dm index 19103c71ec..35891fa607 100644 --- a/code/game/objects/structures/fence.dm +++ b/code/game/objects/structures/fence.dm @@ -29,13 +29,12 @@ update_cut_status() /obj/structure/fence/examine(mob/user) - .=..() - + . = ..() switch(hole_size) if(MEDIUM_HOLE) - user.show_message("There is a large hole in \the [src].") + . += "There is a large hole in \the [src]." if(LARGE_HOLE) - user.show_message("\The [src] has been completely cut through.") + . += "\The [src] has been completely cut through." /obj/structure/fence/end icon_state = "end" diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm index baf0cf312f..736e58143e 100644 --- a/code/game/objects/structures/fluff.dm +++ b/code/game/objects/structures/fluff.dm @@ -182,3 +182,59 @@ icon_state = "snowlegion" anchored = TRUE deconstructible = FALSE + +/obj/structure/fluff/big_chain + name = "giant chain" + desc = "A towering link of chains leading up to the ceiling." + icon = 'icons/effects/32x96.dmi' + icon_state = "chain" + layer = ABOVE_OBJ_LAYER + anchored = TRUE + density = TRUE + deconstructible = FALSE + +/obj/structure/fluff/railing + name = "railing" + desc = "Basic railing meant to protect idiots like you from falling." + icon = 'icons/obj/fluff.dmi' + icon_state = "railing" + density = TRUE + anchored = TRUE + deconstructible = FALSE + +/obj/structure/fluff/railing/corner + icon_state = "railing_corner" + density = FALSE + +/obj/structure/fluff/beach_towel + name = "beach towel" + desc = "A towel decorated in various beach-themed designs." + icon = 'icons/obj/fluff.dmi' + icon_state = "railing" + density = FALSE + anchored = TRUE + deconstructible = FALSE + +/obj/structure/fluff/beach_umbrella + name = "beach umbrella" + desc = "A fancy umbrella designed to keep the sun off beach-goers." + icon = 'icons/obj/fluff.dmi' + icon_state = "brella" + density = FALSE + anchored = TRUE + deconstructible = FALSE + +/obj/structure/fluff/beach_umbrella/security + icon_state = "hos_brella" + +/obj/structure/fluff/beach_umbrella/science + icon_state = "rd_brella" + +/obj/structure/fluff/beach_umbrella/engine + icon_state = "ce_brella" + +/obj/structure/fluff/beach_umbrella/cap + icon_state = "cap_brella" + +/obj/structure/fluff/beach_umbrella/syndi + icon_state = "syndi_brella" diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index b820e93c7b..e3585b601e 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -66,7 +66,7 @@ . = ..() var/area/A = get_area(src) if(A) - notify_ghosts("An ash walker egg is ready to hatch in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_ASHWALKER) + notify_ghosts("An ash walker egg is ready to hatch in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_ASHWALKER, ignore_dnr_observers = TRUE) /datum/outfit/ashwalker name ="Ashwalker" @@ -133,7 +133,7 @@ . = ..() var/area/A = get_area(src) if(!mapload && A) - notify_ghosts("\A [initial(species.prefix)] golem shell has been completed in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_GOLEM) + notify_ghosts("\A [initial(species.prefix)] golem shell has been completed in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_GOLEM, ignore_dnr_observers = TRUE) if(has_owner && creator) flavour_text = "You are a Golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. \ Serve [creator], and assist [creator.p_them()] in completing [creator.p_their()] goals at any cost." @@ -372,7 +372,7 @@ flavour_text = "You have been given a reprieve from your eternity of torment, to be [owner.name]'s friend for [owner.p_their()] short mortal coil. Be aware that if you do not live up to [owner.name]'s expectations, they can send you back to hell with a single thought. [owner.name]'s death will also return you to hell." var/area/A = get_area(src) if(!mapload && A) - notify_ghosts("\A friendship shell has been completed in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE) + notify_ghosts("\A friendship shell has been completed in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_dnr_observers = TRUE) objectives = "Be [owner.name]'s friend, and keep [owner.name] alive, so you don't get sent back to hell." spell = summoning_spell @@ -422,7 +422,7 @@ implants = list(/obj/item/implant/weapons_auth) id = /obj/item/card/id/syndicate -/datum/outfit/syndicate_empty/post_equip(mob/living/carbon/human/H) +/datum/outfit/syndicate_empty/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) H.faction |= ROLE_SYNDICATE /obj/effect/mob_spawn/human/syndicate/battlecruiser diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 31bf9318ce..94619e1858 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -15,16 +15,16 @@ . = ..() switch(state) if(GIRDER_REINF) - to_chat(user, "The support struts are screwed in place.") + . += "The support struts are screwed in place." if(GIRDER_REINF_STRUTS) - to_chat(user, "The support struts are unscrewed and the inner grille is intact.") + . += "The support struts are unscrewed and the inner grille is intact." if(GIRDER_NORMAL) if(can_displace) - to_chat(user, "The bolts are wrenched in place.") + . += "The bolts are wrenched in place." if(GIRDER_DISPLACED) - to_chat(user, "The bolts are loosened, but the screws are holding [src] together.") + . += "The bolts are loosened, but the screws are holding [src] together." if(GIRDER_DISASSEMBLED) - to_chat(user, "[src] is disassembled! You probably shouldn't be able to see this examine message.") + . += "[src] is disassembled! You probably shouldn't be able to see this examine message." /obj/structure/girder/attackby(obj/item/W, mob/user, params) add_fingerprint(user) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 00d1690d86..c0519f2504 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -37,11 +37,11 @@ icon_state = "grille50_[rand(0,3)]" /obj/structure/grille/examine(mob/user) - ..() + . = ..() if(anchored) - to_chat(user, "It's secured in place with screws. The rods look like they could be cut through.") - if(!anchored) - to_chat(user, "The anchoring screws are unscrewed. The rods look like they could be cut through.") + . += "It's secured in place with screws. The rods look like they could be cut through." + else + . += "The anchoring screws are unscrewed. The rods look like they could be cut through." /obj/structure/grille/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) switch(the_rcd.mode) diff --git a/code/game/objects/structures/guillotine.dm b/code/game/objects/structures/guillotine.dm index 8714722f4b..3b4bbea559 100644 --- a/code/game/objects/structures/guillotine.dm +++ b/code/game/objects/structures/guillotine.dm @@ -34,29 +34,22 @@ . = ..() /obj/structure/guillotine/examine(mob/user) - ..() - - var/msg = "" - - msg += "It is [anchored ? "wrenched to the floor." : "unsecured. A wrench should fix that."]
    " + . = ..() + . += "It is [anchored ? "wrenched to the floor." : "unsecured. A wrench should fix that."]" if (blade_status == GUILLOTINE_BLADE_RAISED) - msg += "The blade is raised, ready to fall, and" + var/msg = "The blade is raised, ready to fall, and" if (blade_sharpness >= GUILLOTINE_DECAP_MIN_SHARP) msg += " looks sharp enough to decapitate without any resistance." else msg += " doesn't look particularly sharp. Perhaps a whetstone can be used to sharpen it." + . += msg else - msg += "The blade is hidden inside the stocks." + . += "The blade is hidden inside the stocks." if (LAZYLEN(buckled_mobs)) - msg += "
    " - msg += "Someone appears to be strapped in. You can help them out, or you can harm them by activating the guillotine." - - to_chat(user, msg) - - return msg + . += "Someone appears to be strapped in. You can help them out, or you can harm them by activating the guillotine." /obj/structure/guillotine/attack_hand(mob/user) add_fingerprint(user) diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index 609384cdda..4c6b9732d0 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -9,11 +9,13 @@ armor = list("melee" = 0, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 20) var/obj/item/holosign_creator/projector -/obj/structure/holosign/New(loc, source_projector) +/obj/structure/holosign/Initialize(mapload, source_projector) + . = ..() if(source_projector) projector = source_projector projector.signs += src - ..() + alpha = 0 + SSvis_overlays.add_vis_overlay(src, icon, icon_state, ABOVE_MOB_LAYER, plane, dir, add_appearance_flags = RESET_ALPHA) //you see mobs under it, but you hit them like they are above it /obj/structure/holosign/Destroy() if(projector) @@ -71,10 +73,8 @@ desc = "A holographic barrier resembling a firelock. Though it does not prevent solid objects from passing through, gas is kept out." icon_state = "holo_firelock" density = FALSE - layer = ABOVE_MOB_LAYER anchored = TRUE CanAtmosPass = ATMOS_PASS_NO - layer = ABOVE_MOB_LAYER alpha = 150 /obj/structure/holosign/barrier/atmos/Initialize() @@ -100,13 +100,12 @@ desc = "A holobarrier that uses biometrics to detect human viruses. Denies passing to personnel with easily-detected, malicious viruses. Good for quarantines." icon_state = "holo_medical" alpha = 125 //lazy :) - layer = ABOVE_MOB_LAYER var/force_allaccess = FALSE var/buzzcd = 0 /obj/structure/holosign/barrier/medical/examine(mob/user) - ..() - to_chat(user,"The biometric scanners are [force_allaccess ? "off" : "on"].") + . = ..() + . += "The biometric scanners are [force_allaccess ? "off" : "on"]." /obj/structure/holosign/barrier/medical/CanPass(atom/movable/mover, turf/target) icon_state = "holo_medical" diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index d6f304653d..b946a06432 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -19,10 +19,10 @@ /obj/structure/lattice/examine(mob/user) ..() - deconstruction_hints(user) + . += deconstruction_hints(user) /obj/structure/lattice/proc/deconstruction_hints(mob/user) - to_chat(user, "The rods look like they could be cut. There's space for more rods or a tile.") + return "The rods look like they could be cut. There's space for more rods or a tile." /obj/structure/lattice/Initialize(mapload) . = ..() @@ -100,6 +100,7 @@ number_of_rods = 2 smooth = SMOOTH_TRUE canSmoothWith = null + obj_flags = CAN_BE_HIT | BLOCK_Z_FALL /obj/structure/lattice/catwalk/deconstruction_hints(mob/user) to_chat(user, "The supporting rods look like they could be cut.") diff --git a/code/game/objects/structures/life_candle.dm b/code/game/objects/structures/life_candle.dm index e1480b32b3..0ae0e29459 100644 --- a/code/game/objects/structures/life_candle.dm +++ b/code/game/objects/structures/life_candle.dm @@ -55,9 +55,9 @@ /obj/structure/life_candle/examine(mob/user) . = ..() if(linked_minds.len) - to_chat(user, "[src] is active, and linked to [linked_minds.len] souls.") + . += "[src] is active, and linked to [linked_minds.len] souls." else - to_chat(user, "It is static, still, unmoving.") + . += "It is static, still, unmoving." /obj/structure/life_candle/process() if(!linked_minds.len) diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 5733ea123c..efb12ae34a 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -193,7 +193,7 @@ return /obj/structure/mineral_door/transparent/plasma/attackby(obj/item/W, mob/user, params) - if(W.is_hot()) + if(W.get_temperature()) var/turf/T = get_turf(src) message_admins("Plasma mineral door ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_VERBOSEJMP(T)]") log_game("Plasma mineral door ignited by [key_name(user)] in [AREACOORD(T)]") diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index e7be30520e..1a1ff0843a 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -163,8 +163,8 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an ..() /obj/structure/bodycontainer/morgue/examine(mob/user) - ..() - to_chat(user, "The speaker is [beeper ? "enabled" : "disabled"]. Alt-click to toggle it.") + . = ..() + . += "The speaker is [beeper ? "enabled" : "disabled"]. Alt-click to toggle it." /obj/structure/bodycontainer/morgue/AltClick(mob/user) ..() diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm index 0e2f951f38..36dbcc1e28 100644 --- a/code/game/objects/structures/musician.dm +++ b/code/game/objects/structures/musician.dm @@ -104,12 +104,12 @@ playing = FALSE hearing_mobs = null return - if(!lentext(note)) + if(!length(note)) continue var/cur_note = text2ascii(note) - 96 if(cur_note < 1 || cur_note > 7) continue - for(var/i=2 to lentext(note)) + for(var/i=2 to length(note)) var/ni = copytext(note,i,i+1) if(!text2num(ni)) if(ni == "#" || ni == "b" || ni == "n") @@ -209,7 +209,7 @@ lines.Cut(MUSIC_MAXLINES + 1) var/linenum = 1 for(var/l in lines) - if(lentext(l) > MUSIC_MAXLINECHARS) + if(length(l) > MUSIC_MAXLINECHARS) to_chat(usr, "Line [linenum] too long!") lines.Remove(l) else @@ -236,11 +236,11 @@ if(!in_range(instrumentObj, usr)) return - if(lentext(t) >= MUSIC_MAXLINES * MUSIC_MAXLINECHARS) + if(length(t) >= MUSIC_MAXLINES * MUSIC_MAXLINECHARS) var/cont = input(usr, "Your message is too long! Would you like to continue editing it?", "", "yes") in list("yes", "no") if(cont == "no") break - while(lentext(t) > MUSIC_MAXLINES * MUSIC_MAXLINECHARS) + while(length(t) > MUSIC_MAXLINES * MUSIC_MAXLINECHARS) ParseSong(t) else if(href_list["help"]) @@ -272,7 +272,7 @@ return if(lines.len > MUSIC_MAXLINES) return - if(lentext(newline) > MUSIC_MAXLINECHARS) + if(length(newline) > MUSIC_MAXLINECHARS) newline = copytext(newline, 1, MUSIC_MAXLINECHARS) lines.Add(newline) @@ -287,7 +287,7 @@ var/content = html_encode(input("Enter your line: ", instrumentObj.name, lines[num]) as text|null) if(!content || !in_range(instrumentObj, usr)) return - if(lentext(content) > MUSIC_MAXLINECHARS) + if(length(content) > MUSIC_MAXLINECHARS) content = copytext(content, 1, MUSIC_MAXLINECHARS) if(num > lines.len || num < 1) return diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index e3862ed924..a07e9a26d5 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -6,18 +6,22 @@ armor = list("melee" = 100, "bullet" = 80, "laser" = 80, "energy" = 100, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 50, "acid" = 50) density = FALSE anchored = TRUE - layer = ABOVE_MOB_LAYER CanAtmosPass = ATMOS_PASS_NO /obj/structure/plasticflaps/opaque opacity = TRUE +/obj/structure/plasticflaps/Initialize() + . = ..() + alpha = 0 + SSvis_overlays.add_vis_overlay(src, icon, icon_state, ABOVE_MOB_LAYER, plane, dir, add_appearance_flags = RESET_ALPHA) //you see mobs under it, but you hit them like they are above it + /obj/structure/plasticflaps/examine(mob/user) . = ..() if(anchored) - to_chat(user, "[src] are screwed to the floor.") + . += "[src] are screwed to the floor." else - to_chat(user, "[src] are no longer screwed to the floor, and the flaps can be cut apart.") + . += "[src] are no longer screwed to the floor, and the flaps can be cut apart." /obj/structure/plasticflaps/screwdriver_act(mob/living/user, obj/item/W) if(..()) diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm index 419502e2b0..77aad5a9dd 100644 --- a/code/game/objects/structures/reflector.dm +++ b/code/game/objects/structures/reflector.dm @@ -34,14 +34,14 @@ can_rotate = FALSE /obj/structure/reflector/examine(mob/user) - ..() + . = ..() if(finished) - to_chat(user, "It is set to [rotation_angle] degrees, and the rotation is [can_rotate ? "unlocked" : "locked"].") + . += "It is set to [rotation_angle] degrees, and the rotation is [can_rotate ? "unlocked" : "locked"]." if(!admin) if(can_rotate) - to_chat(user, "Alt-click to adjust its direction.") + . += "Alt-click to adjust its direction." else - to_chat(user, "Use screwdriver to unlock the rotation.") + . += "Use screwdriver to unlock the rotation." /obj/structure/reflector/proc/setAngle(new_angle) if(can_rotate) diff --git a/code/game/objects/structures/showcase.dm b/code/game/objects/structures/showcase.dm index 5de3f0fc9a..b0427274a4 100644 --- a/code/game/objects/structures/showcase.dm +++ b/code/game/objects/structures/showcase.dm @@ -131,12 +131,11 @@ //Feedback is given in examine because showcases can basically have any sprite assigned to them /obj/structure/showcase/examine(mob/user) - ..() - + . = ..() switch(deconstruction_state) if(SHOWCASE_CONSTRUCTED) - to_chat(user, "The showcase is fully constructed.") + . += "The showcase is fully constructed." if(SHOWCASE_SCREWDRIVERED) - to_chat(user, "The showcase has its screws loosened.") + . += "The showcase has its screws loosened." else - to_chat(user, "If you see this, something is wrong.") + . += "If you see this, something is wrong." diff --git a/code/game/objects/structures/signs/signs_maps.dm b/code/game/objects/structures/signs/signs_maps.dm index f3188b90c2..1e3bfd6d36 100644 --- a/code/game/objects/structures/signs/signs_maps.dm +++ b/code/game/objects/structures/signs/signs_maps.dm @@ -50,7 +50,8 @@ name = "bar" desc = "A direction sign, pointing out which way the Bar is." icon_state = "direction_bar" - /obj/structure/sign/directions/cafe + +/obj/structure/sign/directions/cafe name = "cafe" desc = "A direction sign, pointing out which way the Cafe is." icon_state = "direction_cafe" diff --git a/code/game/objects/structures/spirit_board.dm b/code/game/objects/structures/spirit_board.dm index c35d16ab73..4a9a1bdce6 100644 --- a/code/game/objects/structures/spirit_board.dm +++ b/code/game/objects/structures/spirit_board.dm @@ -12,7 +12,7 @@ /obj/structure/spirit_board/examine() desc = "[initial(desc)] The planchette is sitting at \"[planchette]\"." - ..() + return ..() /obj/structure/spirit_board/attack_hand(mob/user) . = ..() diff --git a/code/game/objects/structures/stairs.dm b/code/game/objects/structures/stairs.dm new file mode 100644 index 0000000000..bd657fe1e8 --- /dev/null +++ b/code/game/objects/structures/stairs.dm @@ -0,0 +1,130 @@ +#define STAIR_TERMINATOR_AUTOMATIC 0 +#define STAIR_TERMINATOR_NO 1 +#define STAIR_TERMINATOR_YES 2 + +// dir determines the direction of travel to go upwards (due to lack of sprites, currently only 1 and 2 make sense) +// stairs require /turf/open/openspace as the tile above them to work +// multiple stair objects can be chained together; the Z level transition will happen on the final stair object in the chain + +/obj/structure/stairs + name = "stairs" + icon = 'icons/obj/stairs.dmi' + icon_state = "stairs" + anchored = TRUE + + var/force_open_above = FALSE // replaces the turf above this stair obj with /turf/open/openspace + var/terminator_mode = STAIR_TERMINATOR_AUTOMATIC + var/turf/listeningTo + +/obj/structure/stairs/Initialize(mapload) + if(force_open_above) + force_open_above() + build_signal_listener() + update_surrounding() + return ..() + +/obj/structure/stairs/Destroy() + listeningTo = null + return ..() + +/obj/structure/stairs/Move() //Look this should never happen but... + . = ..() + if(force_open_above) + build_signal_listener() + update_surrounding() + +/obj/structure/stairs/proc/update_surrounding() + update_icon() + for(var/i in GLOB.cardinals) + var/turf/T = get_step(get_turf(src), i) + var/obj/structure/stairs/S = locate() in T + if(S) + S.update_icon() + +/obj/structure/stairs/Uncross(atom/movable/AM, turf/newloc) + if(!newloc || !AM) + return ..() + if(!isobserver(AM) && isTerminator() && (get_dir(src, newloc) == dir)) + stair_ascend(AM) + return FALSE + return ..() + +/obj/structure/stairs/Cross(atom/movable/AM) + if(isTerminator() && (get_dir(src, AM) == dir)) + return FALSE + return ..() + +/obj/structure/stairs/update_icon() + if(isTerminator()) + icon_state = "stairs_t" + else + icon_state = "stairs" + +/obj/structure/stairs/proc/stair_ascend(atom/movable/AM) + var/turf/checking = get_step_multiz(get_turf(src), UP) + if(!istype(checking)) + return + if(!checking.zPassIn(AM, UP, get_turf(src))) + return + var/turf/target = get_step_multiz(get_turf(src), (dir|UP)) + if(istype(target) && !target.can_zFall(AM, null, get_step_multiz(target, DOWN))) //Don't throw them into a tile that will just dump them back down. + if(isliving(AM)) + var/mob/living/L = AM + var/pulling = L.pulling + if(pulling) + L.pulling.forceMove(target) + L.forceMove(target) + L.start_pulling(pulling) + else + AM.forceMove(target) + +/obj/structure/stairs/vv_edit_var(var_name, var_value) + . = ..() + if(!.) + return + if(var_name != NAMEOF(src, force_open_above)) + return + if(!var_value) + if(listeningTo) + UnregisterSignal(listeningTo, COMSIG_TURF_MULTIZ_NEW) + listeningTo = null + else + build_signal_listener() + force_open_above() + +/obj/structure/stairs/proc/build_signal_listener() + if(listeningTo) + UnregisterSignal(listeningTo, COMSIG_TURF_MULTIZ_NEW) + var/turf/open/openspace/T = get_step_multiz(get_turf(src), UP) + RegisterSignal(T, COMSIG_TURF_MULTIZ_NEW, .proc/on_multiz_new) + listeningTo = T + +/obj/structure/stairs/proc/force_open_above() + var/turf/open/openspace/T = get_step_multiz(get_turf(src), UP) + if(T && !istype(T)) + T.ChangeTurf(/turf/open/openspace) + +/obj/structure/stairs/proc/on_multiz_new(turf/source, dir) + if(dir == UP) + var/turf/open/openspace/T = get_step_multiz(get_turf(src), UP) + if(T && !istype(T)) + T.ChangeTurf(/turf/open/openspace) + +/obj/structure/stairs/intercept_zImpact(atom/movable/AM, levels = 1) + . = ..() + if(isTerminator()) + . |= FALL_INTERCEPTED | FALL_NO_MESSAGE + +/obj/structure/stairs/proc/isTerminator() //If this is the last stair in a chain and should move mobs up + if(terminator_mode != STAIR_TERMINATOR_AUTOMATIC) + return (terminator_mode == STAIR_TERMINATOR_YES) + var/turf/T = get_turf(src) + if(!T) + return FALSE + var/turf/them = get_step(T, dir) + if(!them) + return FALSE + for(var/obj/structure/stairs/S in them) + if(S.dir == dir) + return FALSE + return TRUE diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index dd28168ccc..5e6b35ba4f 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -127,11 +127,11 @@ ..() /obj/structure/statue/plasma/attackby(obj/item/W, mob/user, params) - if(W.is_hot() > 300 && !QDELETED(src))//If the temperature of the object is over 300, then ignite + if(W.get_temperature() > 300 && !QDELETED(src))//If the temperature of the object is over 300, then ignite var/turf/T = get_turf(src) message_admins("Plasma statue ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_VERBOSEJMP(T)]") log_game("Plasma statue ignited by [key_name(user)] in [AREACOORD(T)]") - ignite(W.is_hot()) + ignite(W.get_temperature()) else return ..() diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index b12a26cd00..99f8875aef 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -36,11 +36,11 @@ canSmoothWith = list(/obj/structure/table, /obj/structure/table/reinforced) /obj/structure/table/examine(mob/user) - ..() - deconstruction_hints(user) + . = ..() + . += deconstruction_hints(user) /obj/structure/table/proc/deconstruction_hints(mob/user) - to_chat(user, "The top is screwed on, but the main bolts are also visible.") + return "The top is screwed on, but the main bolts are also visible." /obj/structure/table/update_icon() if(smooth) @@ -452,9 +452,8 @@ /obj/structure/table/reinforced/deconstruction_hints(mob/user) if(deconstruction_ready) - to_chat(user, "The top cover has been welded loose and the main frame's bolts are exposed.") - else - to_chat(user, "The top cover is firmly welded on.") + return "The top cover has been welded loose and the main frame's bolts are exposed." + return "The top cover is firmly welded on." /obj/structure/table/reinforced/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/weldingtool)) @@ -582,8 +581,8 @@ max_integrity = 20 /obj/structure/rack/examine(mob/user) - ..() - to_chat(user, "It's held together by a couple of bolts.") + . = ..() + . += "It's held together by a couple of bolts." /obj/structure/rack/CanPass(atom/movable/mover, turf/target) if(src.density == 0) //Because broken racks -Agouri |TODO: SPRITE!| diff --git a/code/game/objects/structures/traps.dm b/code/game/objects/structures/traps.dm index 176779abd7..9c1859df08 100644 --- a/code/game/objects/structures/traps.dm +++ b/code/game/objects/structures/traps.dm @@ -38,7 +38,7 @@ if(user.mind && user.mind in immune_minds) return if(get_dist(user, src) <= 1) - to_chat(user, "You reveal [src]!") + . += "You reveal [src]!" flare() /obj/structure/trap/proc/flare() diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 9fc055c2ba..9dee1e26cc 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -29,21 +29,21 @@ rad_flags = RAD_PROTECT_CONTENTS /obj/structure/window/examine(mob/user) - ..() + . = ..() if(reinf) if(anchored && state == WINDOW_SCREWED_TO_FRAME) - to_chat(user, "The window is screwed to the frame.") + . += "The window is screwed to the frame." else if(anchored && state == WINDOW_IN_FRAME) - to_chat(user, "The window is unscrewed but pried into the frame.") + . += "The window is unscrewed but pried into the frame." else if(anchored && state == WINDOW_OUT_OF_FRAME) - to_chat(user, "The window is out of the frame, but could be pried in. It is screwed to the floor.") + . += "The window is out of the frame, but could be pried in. It is screwed to the floor." else if(!anchored) - to_chat(user, "The window is unscrewed from the floor, and could be deconstructed by wrenching.") + . += "The window is unscrewed from the floor, and could be deconstructed by wrenching." else if(anchored) - to_chat(user, "The window is screwed to the floor.") + . += "The window is screwed to the floor." else - to_chat(user, "The window is unscrewed from the floor, and could be deconstructed by wrenching.") + . += "The window is unscrewed from the floor, and could be deconstructed by wrenching." /obj/structure/window/Initialize(mapload, direct) . = ..() @@ -731,8 +731,8 @@ /obj/structure/window/paperframe/attackby(obj/item/W, mob/user) - if(W.is_hot()) - fire_act(W.is_hot()) + if(W.get_temperature()) + fire_act(W.get_temperature()) return if(user.a_intent == INTENT_HARM) return ..() diff --git a/code/game/say.dm b/code/game/say.dm index 4ce1d3c710..60189618be 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -29,7 +29,7 @@ GLOBAL_LIST_INIT(freqtospan, list( send_speech(message, 7, src, , spans, message_language=language) /atom/movable/proc/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) - SEND_SIGNAL(src, COMSIG_MOVABLE_HEAR, message, speaker, message_language, raw_message, radio_freq, spans, message_mode) + SEND_SIGNAL(src, COMSIG_MOVABLE_HEAR, args) /atom/movable/proc/can_speak() return 1 diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index f1c5080c8f..6a055bbd35 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -15,7 +15,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( if(turf_type) var/turf/newT = ChangeTurf(turf_type, baseturf_type, flags) SSair.remove_from_active(newT) - newT.CalculateAdjacentTurfs() + CALCULATE_ADJACENT_TURFS(newT) SSair.add_to_active(newT,1) /turf/proc/copyTurf(turf/T) @@ -140,6 +140,8 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( newTurf.air = stashed_air SSair.add_to_active(newTurf) else + if(ispath(path,/turf/closed)) + flags |= CHANGETURF_RECALC_ADJACENT return ..() // Take off the top layer turf and replace it with the next baseturf down @@ -263,7 +265,10 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( //If you modify this function, ensure it works correctly with lateloaded map templates. /turf/proc/AfterChange(flags) //called after a turf has been replaced in ChangeTurf() levelupdate() - CalculateAdjacentTurfs() + if(flags & CHANGETURF_RECALC_ADJACENT) + ImmediateCalculateAdjacentTurfs() + else + CALCULATE_ADJACENT_TURFS(src) //update firedoor adjacency var/list/turfs_to_check = get_adjacent_open_turfs(src) | src diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index bd24e0ff93..4bdb13effc 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -16,6 +16,22 @@ if(wet) AddComponent(/datum/component/wet_floor, wet, INFINITY, 0, INFINITY, TRUE) +//direction is direction of travel of A +/turf/open/zPassIn(atom/movable/A, direction, turf/source) + return (direction == DOWN) + +//direction is direction of travel of A +/turf/open/zPassOut(atom/movable/A, direction, turf/destination) + return (direction == UP) + +//direction is direction of travel of air +/turf/open/zAirIn(direction, turf/source) + return (direction == DOWN) + +//direction is direction of travel of air +/turf/open/zAirOut(direction, turf/source) + return (direction == UP) + /turf/open/MouseDrop_T(atom/dropping, mob/user) . = ..() if(dropping == user && isliving(user)) @@ -95,7 +111,7 @@ icon_state = "necro[rand(2,3)]" /turf/open/indestructible/necropolis/air - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + initial_gas_mix = OPENTURF_DEFAULT_ATMOS /turf/open/indestructible/boss //you put stone tiles on this and use it as a base name = "necropolis floor" @@ -105,7 +121,7 @@ initial_gas_mix = LAVALAND_DEFAULT_ATMOS /turf/open/indestructible/boss/air - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + initial_gas_mix = OPENTURF_DEFAULT_ATMOS /turf/open/indestructible/hierophant icon = 'icons/turf/floors/hierophant_floor.dmi' @@ -184,43 +200,14 @@ update_visuals() current_cycle = times_fired - - //cache some vars - var/list/atmos_adjacent_turfs = src.atmos_adjacent_turfs - - for(var/direction in GLOB.cardinals) - var/turf/open/enemy_tile = get_step(src, direction) - if(!istype(enemy_tile)) - if (atmos_adjacent_turfs) - atmos_adjacent_turfs -= enemy_tile - continue + ImmediateCalculateAdjacentTurfs() + for(var/i in atmos_adjacent_turfs) + var/turf/open/enemy_tile = i var/datum/gas_mixture/enemy_air = enemy_tile.return_air() - - //only check this turf, if it didn't check us when it was initalized - if(enemy_tile.current_cycle < times_fired) - if(CANATMOSPASS(src, enemy_tile)) - LAZYINITLIST(atmos_adjacent_turfs) - LAZYINITLIST(enemy_tile.atmos_adjacent_turfs) - atmos_adjacent_turfs[enemy_tile] = TRUE - enemy_tile.atmos_adjacent_turfs[src] = TRUE - else - if (atmos_adjacent_turfs) - atmos_adjacent_turfs -= enemy_tile - if (enemy_tile.atmos_adjacent_turfs) - enemy_tile.atmos_adjacent_turfs -= src - UNSETEMPTY(enemy_tile.atmos_adjacent_turfs) - continue - else - if (!atmos_adjacent_turfs || !atmos_adjacent_turfs[enemy_tile]) - continue - if(!excited && air.compare(enemy_air)) //testing("Active turf found. Return value of compare(): [is_active]") excited = TRUE SSair.active_turfs |= src - UNSETEMPTY(atmos_adjacent_turfs) - if (atmos_adjacent_turfs) - src.atmos_adjacent_turfs = atmos_adjacent_turfs /turf/open/proc/GetHeatCapacity() . = air.heat_capacity() @@ -267,14 +254,15 @@ if(!(lube&GALOSHES_DONT_HELP)) //can't slip while buckled unless it's lube. return 0 else - if(C.lying || !(C.status_flags & CANKNOCKDOWN)) // can't slip unbuckled mob if they're lying or can't fall. + if(!(lube&SLIP_WHEN_CRAWLING) && (C.lying || !(C.status_flags & CANKNOCKDOWN))) // can't slip unbuckled mob if they're lying or can't fall. return 0 - if(C.m_intent == MOVE_INTENT_WALK && (lube&NO_SLIP_WHEN_WALKING)) - return 0 - if(ishuman(C) && (lube&NO_SLIP_WHEN_WALKING)) - var/mob/living/carbon/human/H = C - if(!H.sprinting && H.getStaminaLoss() <= 20) + if(lube & NO_SLIP_WHEN_WALKING) + if(C.m_intent == MOVE_INTENT_WALK) return 0 + if(ishuman(C) && !(lube & SLIP_WHEN_JOGGING)) + var/mob/living/carbon/human/H = C + if(!H.sprinting && H.getStaminaLoss() <= 20) + return 0 if(!(lube&SLIDE_ICE)) to_chat(C, "You slipped[ O ? " on the [O.name]" : ""]!") playsound(C.loc, 'sound/misc/slip.ogg', 50, 1, -3) diff --git a/code/game/turfs/openspace/openspace.dm b/code/game/turfs/openspace/openspace.dm new file mode 100644 index 0000000000..e68aabcd08 --- /dev/null +++ b/code/game/turfs/openspace/openspace.dm @@ -0,0 +1,134 @@ +/turf/open/openspace + name = "open space" + desc = "Watch your step!" + icon_state = "grey" + baseturfs = /turf/open/openspace + CanAtmosPassVertical = ATMOS_PASS_YES + //mouse_opacity = MOUSE_OPACITY_TRANSPARENT + var/can_cover_up = TRUE + var/can_build_on = TRUE + +/turf/open/openspace/debug/update_multiz() + ..() + return TRUE + +/turf/open/openspace/Initialize() // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker + . = ..() + plane = FLOOR_OPENSPACE_PLANE + layer = OPENSPACE_LAYER + return INITIALIZE_HINT_LATELOAD + +/turf/open/openspace/LateInitialize() + update_multiz(TRUE, TRUE) + +/turf/open/openspace/Destroy() + vis_contents.len = 0 + return ..() + +/turf/open/openspace/update_multiz(prune_on_fail = FALSE, init = FALSE) + . = ..() + var/turf/T = below() + if(!T) + vis_contents.len = 0 + if(prune_on_fail) + ChangeTurf(/turf/open/floor/plating) + return FALSE + if(init) + vis_contents += T + return TRUE + +/turf/open/openspace/multiz_turf_del(turf/T, dir) + if(dir != DOWN) + return + update_multiz() + +/turf/open/openspace/multiz_turf_new(turf/T, dir) + if(dir != DOWN) + return + update_multiz() + +/turf/open/openspace/zAirIn() + return TRUE + +/turf/open/openspace/zAirOut() + return TRUE + +/turf/open/openspace/zPassIn(atom/movable/A, direction, turf/source) + return TRUE + +/turf/open/openspace/zPassOut(atom/movable/A, direction, turf/destination) + if(A.anchored) + return FALSE + for(var/obj/O in contents) + if(O.obj_flags & BLOCK_Z_FALL) + return FALSE + return TRUE + +/turf/open/openspace/proc/CanCoverUp() + return can_cover_up + +/turf/open/openspace/proc/CanBuildHere() + return can_build_on + +/turf/open/openspace/attackby(obj/item/C, mob/user, params) + ..() + if(!CanBuildHere()) + return + if(istype(C, /obj/item/stack/rods)) + var/obj/item/stack/rods/R = C + var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) + var/obj/structure/lattice/catwalk/W = locate(/obj/structure/lattice/catwalk, src) + if(W) + to_chat(user, "There is already a catwalk here!") + return + if(L) + if(R.use(1)) + to_chat(user, "You construct a catwalk.") + playsound(src, 'sound/weapons/genhit.ogg', 50, 1) + new/obj/structure/lattice/catwalk(src) + else + to_chat(user, "You need two rods to build a catwalk!") + return + if(R.use(1)) + to_chat(user, "You construct a lattice.") + playsound(src, 'sound/weapons/genhit.ogg', 50, 1) + ReplaceWithLattice() + else + to_chat(user, "You need one rod to build a lattice.") + return + if(istype(C, /obj/item/stack/tile/plasteel)) + if(!CanCoverUp()) + return + var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) + if(L) + var/obj/item/stack/tile/plasteel/S = C + if(S.use(1)) + qdel(L) + playsound(src, 'sound/weapons/genhit.ogg', 50, 1) + to_chat(user, "You build a floor.") + PlaceOnTop(/turf/open/floor/plating) + else + to_chat(user, "You need one floor tile to build a floor!") + else + to_chat(user, "The plating is going to need some support! Place metal rods first.") + +/turf/open/openspace/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) + if(!CanBuildHere()) + return FALSE + + switch(the_rcd.mode) + if(RCD_FLOORWALL) + var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) + if(L) + return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 1) + else + return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 3) + return FALSE + +/turf/open/openspace/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) + switch(passed_mode) + if(RCD_FLOORWALL) + to_chat(user, "You build a floor.") + PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) + return TRUE + return FALSE diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index ed6e279088..a8e6baf3fb 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -19,8 +19,8 @@ tiled_dirt = FALSE /turf/open/floor/wood/examine(mob/user) - ..() - to_chat(user, "There's a few screws and a small crack visible.") + . = ..() + . += "There's a few screws and a small crack visible." /turf/open/floor/wood/screwdriver_act(mob/living/user, obj/item/I) if(..()) @@ -65,7 +65,7 @@ temperature = 255.37 /turf/open/floor/wood/airless - initial_gas_mix = "TEMP=2.7" + initial_gas_mix = AIRLESS_ATMOS /turf/open/floor/grass name = "grass patch" @@ -96,6 +96,15 @@ if(..()) return +/turf/open/floor/grass/fairy //like grass but fae-er + name = "fairygrass patch" + desc = "Something about this grass makes you want to frolic. Or get high." + icon_state = "fairygrass" + floor_tile = /obj/item/stack/tile/fairygrass + light_range = 2 + light_power = 0.80 + light_color = "#33CCFF" + /turf/open/floor/grass/snow gender = PLURAL name = "snow" @@ -105,7 +114,7 @@ ore_type = /obj/item/stack/sheet/mineral/snow planetary_atmos = TRUE floor_tile = null - initial_gas_mix = "o2=22;n2=82;TEMP=180" + initial_gas_mix = FROZEN_ATMOS slowdown = 2 bullet_sizzle = TRUE footstep = FOOTSTEP_SAND @@ -174,8 +183,8 @@ tiled_dirt = FALSE /turf/open/floor/carpet/examine(mob/user) - ..() - to_chat(user, "There's a small crack on the edge of it.") + . = ..() + . += "There's a small crack on the edge of it." /turf/open/floor/carpet/Initialize() . = ..() diff --git a/code/game/turfs/simulated/floor/light_floor.dm b/code/game/turfs/simulated/floor/light_floor.dm index 6e896b5e56..f9376c0672 100644 --- a/code/game/turfs/simulated/floor/light_floor.dm +++ b/code/game/turfs/simulated/floor/light_floor.dm @@ -14,8 +14,8 @@ /turf/open/floor/light/examine(mob/user) - ..() - to_chat(user, "There's a small crack on the edge of it.") + . = ..() + . += "There's a small crack on the edge of it." /turf/open/floor/light/Initialize() . = ..() diff --git a/code/game/turfs/simulated/floor/mineral_floor.dm b/code/game/turfs/simulated/floor/mineral_floor.dm index a77417e4e4..f0ac0053ce 100644 --- a/code/game/turfs/simulated/floor/mineral_floor.dm +++ b/code/game/turfs/simulated/floor/mineral_floor.dm @@ -43,10 +43,10 @@ PlasmaBurn(exposed_temperature) /turf/open/floor/mineral/plasma/attackby(obj/item/W, mob/user, params) - if(W.is_hot() > 300)//If the temperature of the object is over 300, then ignite + if(W.get_temperature() > 300)//If the temperature of the object is over 300, then ignite message_admins("Plasma flooring was ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_VERBOSEJMP(src)]") log_game("Plasma flooring was ignited by [key_name(user)] in [AREACOORD(src)]") - ignite(W.is_hot()) + ignite(W.get_temperature()) return ..() @@ -84,31 +84,31 @@ broken_states = list("titanium_dam1","titanium_dam2","titanium_dam3","titanium_dam4","titanium_dam5") /turf/open/floor/mineral/titanium/airless - initial_gas_mix = "TEMP=2.7" + initial_gas_mix = AIRLESS_ATMOS /turf/open/floor/mineral/titanium/yellow icon_state = "titanium_yellow" /turf/open/floor/mineral/titanium/yellow/airless - initial_gas_mix = "TEMP=2.7" + initial_gas_mix = AIRLESS_ATMOS /turf/open/floor/mineral/titanium/blue icon_state = "titanium_blue" /turf/open/floor/mineral/titanium/blue/airless - initial_gas_mix = "TEMP=2.7" + initial_gas_mix = AIRLESS_ATMOS /turf/open/floor/mineral/titanium/white icon_state = "titanium_white" /turf/open/floor/mineral/titanium/white/airless - initial_gas_mix = "TEMP=2.7" + initial_gas_mix = AIRLESS_ATMOS /turf/open/floor/mineral/titanium/purple icon_state = "titanium_purple" /turf/open/floor/mineral/titanium/purple/airless - initial_gas_mix = "TEMP=2.7" + initial_gas_mix = AIRLESS_ATMOS //PLASTITANIUM (syndieshuttle) /turf/open/floor/mineral/plastitanium @@ -118,13 +118,13 @@ broken_states = list("plastitanium_dam1","plastitanium_dam2","plastitanium_dam3","plastitanium_dam4","plastitanium_dam5") /turf/open/floor/mineral/plastitanium/airless - initial_gas_mix = "TEMP=2.7" + initial_gas_mix = AIRLESS_ATMOS /turf/open/floor/mineral/plastitanium/red icon_state = "plastitanium_red" /turf/open/floor/mineral/plastitanium/red/airless - initial_gas_mix = "TEMP=2.7" + initial_gas_mix = AIRLESS_ATMOS /turf/open/floor/mineral/plastitanium/red/brig name = "brig floor" @@ -170,7 +170,7 @@ spam_flag = world.time + 10 /turf/open/floor/mineral/bananium/airless - initial_gas_mix = "TEMP=2.7" + initial_gas_mix = AIRLESS_ATMOS //DIAMOND diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm index 253a6ead90..f75772a230 100644 --- a/code/game/turfs/simulated/floor/misc_floor.dm +++ b/code/game/turfs/simulated/floor/misc_floor.dm @@ -45,10 +45,10 @@ on = FALSE /turf/open/floor/circuit/airless - initial_gas_mix = "TEMP=2.7" + initial_gas_mix = AIRLESS_ATMOS /turf/open/floor/circuit/telecomms - initial_gas_mix = "n2=100;TEMP=80" + initial_gas_mix = TCOMMS_ATMOS /turf/open/floor/circuit/telecomms/mainframe name = "mainframe base" @@ -72,10 +72,10 @@ floor_tile = /obj/item/stack/tile/circuit/green/anim /turf/open/floor/circuit/green/airless - initial_gas_mix = "TEMP=2.7" + initial_gas_mix = AIRLESS_ATMOS /turf/open/floor/circuit/green/telecomms - initial_gas_mix = "n2=100;TEMP=80" + initial_gas_mix = TCOMMS_ATMOS /turf/open/floor/circuit/green/telecomms/mainframe name = "mainframe base" @@ -96,10 +96,10 @@ floor_tile = /obj/item/stack/tile/circuit/red/anim /turf/open/floor/circuit/red/airless - initial_gas_mix = "TEMP=2.7" + initial_gas_mix = AIRLESS_ATMOS /turf/open/floor/circuit/red/telecomms - initial_gas_mix = "n2=100;TEMP=80" + initial_gas_mix = TCOMMS_ATMOS /turf/open/floor/pod name = "pod floor" diff --git a/code/game/turfs/simulated/floor/plasteel_floor.dm b/code/game/turfs/simulated/floor/plasteel_floor.dm index 884e4c6551..a3a92e7898 100644 --- a/code/game/turfs/simulated/floor/plasteel_floor.dm +++ b/code/game/turfs/simulated/floor/plasteel_floor.dm @@ -5,8 +5,8 @@ burnt_states = list("floorscorched1", "floorscorched2") /turf/open/floor/plasteel/examine(mob/user) - ..() - to_chat(user, "There's a small crack on the edge of it.") + . = ..() + . += "There's a small crack on the edge of it." /turf/open/floor/plasteel/update_icon() if(!..()) @@ -16,17 +16,17 @@ /turf/open/floor/plasteel/airless - initial_gas_mix = "TEMP=2.7" + initial_gas_mix = AIRLESS_ATMOS /turf/open/floor/plasteel/telecomms - initial_gas_mix = "n2=100;TEMP=80" + initial_gas_mix = TCOMMS_ATMOS /turf/open/floor/plasteel/dark icon_state = "darkfull" /turf/open/floor/plasteel/dark/airless - initial_gas_mix = "TEMP=2.7" + initial_gas_mix = AIRLESS_ATMOS /turf/open/floor/plasteel/dark/telecomms - initial_gas_mix = "n2=100;TEMP=80" + initial_gas_mix = TCOMMS_ATMOS /turf/open/floor/plasteel/airless/dark icon_state = "darkfull" /turf/open/floor/plasteel/dark/side @@ -50,7 +50,7 @@ /turf/open/floor/plasteel/airless/white/corner icon_state = "whitecorner" /turf/open/floor/plasteel/white/telecomms - initial_gas_mix = "n2=100;TEMP=80" + initial_gas_mix = TCOMMS_ATMOS /turf/open/floor/plasteel/yellowsiding @@ -82,7 +82,7 @@ /turf/open/floor/plasteel/freezer icon_state = "freezerfloor" /turf/open/floor/plasteel/freezer/airless - initial_gas_mix = "TEMP=2.7" + initial_gas_mix = AIRLESS_ATMOS /turf/open/floor/plasteel/grimy icon_state = "grimy" @@ -111,7 +111,7 @@ /turf/open/floor/plasteel/cult/narsie_act() return /turf/open/floor/plasteel/cult/airless - initial_gas_mix = "TEMP=2.7" + initial_gas_mix = AIRLESS_ATMOS /turf/open/floor/plasteel/stairs diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index 036f54c710..ae67edf073 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -20,14 +20,14 @@ var/attachment_holes = TRUE /turf/open/floor/plating/examine(mob/user) - ..() + . = ..() if(broken || burnt) - to_chat(user, "It looks like the dents could be welded smooth.") + . += "It looks like the dents could be welded smooth." return if(attachment_holes) - to_chat(user, "There are a few attachment holes for a new tile or reinforcement rods.") + . += "There are a few attachment holes for a new tile or reinforcement rods." else - to_chat(user, "You might be able to build ontop of it with some tiles...") + . += "You might be able to build ontop of it with some tiles..." /turf/open/floor/plating/Initialize() if (!broken_states) @@ -144,5 +144,5 @@ ..() ScrapeAway() -/turf/open/floor/plating/foam/tool_act(mob/living/user, obj/tool/I, tool_type) +/turf/open/floor/plating/foam/tool_act(mob/living/user, obj/item/I, tool_type) return diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm index d9966ee55c..9f2da57312 100644 --- a/code/game/turfs/simulated/floor/plating/asteroid.dm +++ b/code/game/turfs/simulated/floor/plating/asteroid.dm @@ -103,7 +103,7 @@ /turf/open/floor/plating/asteroid/basalt/airless baseturfs = /turf/open/floor/plating/asteroid/airless - initial_gas_mix = "TEMP=2.7" + initial_gas_mix = AIRLESS_ATMOS /turf/open/floor/plating/asteroid/basalt/Initialize() . = ..() @@ -131,7 +131,7 @@ /turf/open/floor/plating/asteroid/airless - initial_gas_mix = "TEMP=2.7" + initial_gas_mix = AIRLESS_ATMOS turf_type = /turf/open/floor/plating/asteroid/airless @@ -307,7 +307,7 @@ baseturfs = /turf/open/floor/plating/asteroid/snow icon_state = "snow" icon_plating = "snow" - initial_gas_mix = "o2=22;n2=82;TEMP=180" + initial_gas_mix = FROZEN_ATMOS slowdown = 2 environment_type = "snow" flags_1 = NONE @@ -344,11 +344,11 @@ return FALSE /turf/open/floor/plating/asteroid/snow/airless - initial_gas_mix = "TEMP=2.7" + initial_gas_mix = AIRLESS_ATMOS /turf/open/floor/plating/asteroid/snow/temperatre initial_gas_mix = "o2=22;n2=82;TEMP=255.37" /turf/open/floor/plating/asteroid/snow/atmosphere - initial_gas_mix = "o2=22;n2=82;TEMP=180" + initial_gas_mix = FROZEN_ATMOS planetary_atmos = FALSE \ No newline at end of file diff --git a/code/game/turfs/simulated/floor/plating/misc_plating.dm b/code/game/turfs/simulated/floor/plating/misc_plating.dm index 15b039193d..5c58d99e1a 100644 --- a/code/game/turfs/simulated/floor/plating/misc_plating.dm +++ b/code/game/turfs/simulated/floor/plating/misc_plating.dm @@ -1,7 +1,7 @@ /turf/open/floor/plating/airless icon_state = "plating" - initial_gas_mix = "TEMP=2.7" + initial_gas_mix = AIRLESS_ATMOS /turf/open/floor/plating/abductor name = "alien floor" @@ -172,7 +172,7 @@ desc = "A sheet of solid ice. Looks slippery." icon = 'icons/turf/floors/ice_turf.dmi' icon_state = "unsmooth" - initial_gas_mix = "o2=22;n2=82;TEMP=180" + initial_gas_mix = FROZEN_ATMOS temperature = 180 planetary_atmos = TRUE baseturfs = /turf/open/floor/plating/ice @@ -215,7 +215,7 @@ desc = "A section of heated plating, helps keep the snow from stacking up too high." icon = 'icons/turf/snow.dmi' icon_state = "snowplating" - initial_gas_mix = "o2=22;n2=82;TEMP=180" + initial_gas_mix = FROZEN_ATMOS temperature = 180 attachment_holes = FALSE planetary_atmos = TRUE diff --git a/code/game/turfs/simulated/floor/reinf_floor.dm b/code/game/turfs/simulated/floor/reinf_floor.dm index 1a477d5d9a..b04f89f8be 100644 --- a/code/game/turfs/simulated/floor/reinf_floor.dm +++ b/code/game/turfs/simulated/floor/reinf_floor.dm @@ -13,11 +13,11 @@ tiled_dirt = FALSE /turf/open/floor/engine/examine(mob/user) - ..() - to_chat(user, "The reinforcement rods are wrenched firmly in place.") + . = ..() + . += "The reinforcement rods are wrenched firmly in place." /turf/open/floor/engine/airless - initial_gas_mix = "TEMP=2.7" + initial_gas_mix = AIRLESS_ATMOS /turf/open/floor/engine/break_tile() return //unbreakable @@ -98,28 +98,28 @@ /turf/open/floor/engine/n2o article = "an" name = "\improper N2O floor" - initial_gas_mix = "n2o=6000;TEMP=293.15" + initial_gas_mix = ATMOS_TANK_N2O /turf/open/floor/engine/co2 name = "\improper CO2 floor" - initial_gas_mix = "co2=50000;TEMP=293.15" + initial_gas_mix = ATMOS_TANK_CO2 /turf/open/floor/engine/plasma name = "plasma floor" - initial_gas_mix = "plasma=70000;TEMP=293.15" + initial_gas_mix = ATMOS_TANK_PLASMA /turf/open/floor/engine/o2 name = "\improper O2 floor" - initial_gas_mix = "o2=100000;TEMP=293.15" + initial_gas_mix = ATMOS_TANK_O2 /turf/open/floor/engine/n2 article = "an" name = "\improper N2 floor" - initial_gas_mix = "n2=100000;TEMP=293.15" + initial_gas_mix = ATMOS_TANK_N2 /turf/open/floor/engine/air name = "air floor" - initial_gas_mix = "o2=2644;n2=10580;TEMP=293.15" + initial_gas_mix = ATMOS_TANK_AIRMIX @@ -159,8 +159,8 @@ addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 8) /turf/open/floor/engine/cult/airless - initial_gas_mix = "TEMP=2.7" + initial_gas_mix = AIRLESS_ATMOS /turf/open/floor/engine/vacuum name = "vacuum floor" - initial_gas_mix = "TEMP=2.7" + initial_gas_mix = AIRLESS_ATMOS diff --git a/code/game/turfs/simulated/lava.dm b/code/game/turfs/simulated/lava.dm index e24736ecf3..362b410cbb 100644 --- a/code/game/turfs/simulated/lava.dm +++ b/code/game/turfs/simulated/lava.dm @@ -30,7 +30,7 @@ return /turf/open/lava/airless - initial_gas_mix = "TEMP=2.7" + initial_gas_mix = AIRLESS_ATMOS /turf/open/lava/Entered(atom/movable/AM) if(burn_stuff(AM)) @@ -158,4 +158,4 @@ baseturfs = /turf/open/lava/smooth/lava_land_surface /turf/open/lava/smooth/airless - initial_gas_mix = "TEMP=2.7" + initial_gas_mix = AIRLESS_ATMOS diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index 0004a4485b..966083c71a 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -8,7 +8,7 @@ smooth = SMOOTH_MORE|SMOOTH_BORDER canSmoothWith = null baseturfs = /turf/open/floor/plating/asteroid/airless - initial_gas_mix = "TEMP=2.7" + initial_gas_mix = AIRLESS_ATMOS opacity = 1 density = TRUE blocks_air = 1 @@ -241,7 +241,7 @@ smooth_icon = 'icons/turf/walls/icerock_wall.dmi' turf_type = /turf/open/floor/plating/asteroid/snow/ice baseturfs = /turf/open/floor/plating/asteroid/snow/ice - initial_gas_mix = "o2=22;n2=82;TEMP=180" + initial_gas_mix = FROZEN_ATMOS defer_change = TRUE @@ -278,7 +278,7 @@ smooth_icon = 'icons/turf/walls/icerock_wall.dmi' turf_type = /turf/open/floor/plating/asteroid/snow/ice baseturfs = /turf/open/floor/plating/asteroid/snow/ice - initial_gas_mix = "o2=22;n2=82;TEMP=180" + initial_gas_mix = FROZEN_ATMOS defer_change = TRUE @@ -343,7 +343,7 @@ smooth_icon = 'icons/turf/walls/icerock_wall.dmi' turf_type = /turf/open/floor/plating/asteroid/snow/ice baseturfs = /turf/open/floor/plating/asteroid/snow/ice - initial_gas_mix = "o2=22;n2=82;TEMP=180" + initial_gas_mix = FROZEN_ATMOS defer_change = TRUE @@ -404,7 +404,7 @@ smooth = SMOOTH_MORE|SMOOTH_BORDER canSmoothWith = list (/turf/closed) baseturfs = /turf/open/floor/plating/asteroid/snow - initial_gas_mix = "o2=22;n2=82;TEMP=180" + initial_gas_mix = FROZEN_ATMOS environment_type = "snow" turf_type = /turf/open/floor/plating/asteroid/snow defer_change = TRUE diff --git a/code/game/turfs/simulated/wall/mineral_walls.dm b/code/game/turfs/simulated/wall/mineral_walls.dm index dbffd1010b..9962f72d4a 100644 --- a/code/game/turfs/simulated/wall/mineral_walls.dm +++ b/code/game/turfs/simulated/wall/mineral_walls.dm @@ -94,10 +94,10 @@ canSmoothWith = list(/turf/closed/wall/mineral/plasma, /obj/structure/falsewall/plasma) /turf/closed/wall/mineral/plasma/attackby(obj/item/W, mob/user, params) - if(W.is_hot() > 300)//If the temperature of the object is over 300, then ignite + if(W.get_temperature() > 300)//If the temperature of the object is over 300, then ignite message_admins("Plasma wall ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_VERBOSEJMP(src)]") log_game("Plasma wall ignited by [key_name(user)] in [AREACOORD(src)]") - ignite(W.is_hot()) + ignite(W.get_temperature()) return ..() diff --git a/code/game/turfs/simulated/wall/reinf_walls.dm b/code/game/turfs/simulated/wall/reinf_walls.dm index d52a3bcc23..b4e84648c2 100644 --- a/code/game/turfs/simulated/wall/reinf_walls.dm +++ b/code/game/turfs/simulated/wall/reinf_walls.dm @@ -17,19 +17,19 @@ /turf/closed/wall/r_wall/deconstruction_hints(mob/user) switch(d_state) if(INTACT) - to_chat(user, "The outer grille is fully intact.") + return "The outer grille is fully intact." if(SUPPORT_LINES) - to_chat(user, "The outer grille has been cut, and the support lines are screwed securely to the outer cover.") + return "The outer grille has been cut, and the support lines are screwed securely to the outer cover." if(COVER) - to_chat(user, "The support lines have been unscrewed, and the metal cover is welded firmly in place.") + return "The support lines have been unscrewed, and the metal cover is welded firmly in place." if(CUT_COVER) - to_chat(user, "The metal cover has been sliced through, and is connected loosely to the girder.") + return "The metal cover has been sliced through, and is connected loosely to the girder." if(ANCHOR_BOLTS) - to_chat(user, "The outer cover has been pried away, and the bolts anchoring the support rods are wrenched in place.") + return "The outer cover has been pried away, and the bolts anchoring the support rods are wrenched in place." if(SUPPORT_RODS) - to_chat(user, "The bolts anchoring the support rods have been loosened, but are still welded firmly to the girder.") + return "The bolts anchoring the support rods have been loosened, but are still welded firmly to the girder." if(SHEATH) - to_chat(user, "The support rods have been sliced through, and the outer sheath is connected loosely to the girder.") + return "The support rods have been sliced through, and the outer sheath is connected loosely to the girder." /turf/closed/wall/r_wall/devastate_wall() new sheet_type(src, sheet_amount) @@ -227,3 +227,29 @@ /turf/closed/wall/r_wall/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) if(the_rcd.canRturf) return ..() + +/turf/closed/wall/r_wall/syndicate + name = "hull" + desc = "The armored hull of an ominous looking ship." + icon = 'icons/turf/walls/plastitanium_wall.dmi' + icon_state = "map-shuttle" + explosion_block = 20 + sheet_type = /obj/item/stack/sheet/mineral/plastitanium + smooth = SMOOTH_MORE|SMOOTH_DIAGONAL + canSmoothWith = list(/turf/closed/wall/r_wall/syndicate, /turf/closed/wall/mineral/plastitanium, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/plastitanium, /obj/structure/shuttle/engine, /obj/structure/falsewall/plastitanium) + +/turf/closed/wall/r_wall/syndicate/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) + return FALSE + +/turf/closed/wall/r_wall/syndicate/nodiagonal + smooth = SMOOTH_MORE + icon_state = "map-shuttle_nd" + +/turf/closed/wall/r_wall/syndicate/nosmooth + icon = 'icons/turf/shuttle.dmi' + icon_state = "wall" + smooth = SMOOTH_FALSE + +/turf/closed/wall/r_wall/syndicate/overspace + icon_state = "map-overspace" + fixed_underlay = list("space"=1) diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index b18fbb50f6..460c6a52c9 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -32,11 +32,11 @@ var/list/dent_decals /turf/closed/wall/examine(mob/user) - ..() + . = ..() deconstruction_hints(user) /turf/closed/wall/proc/deconstruction_hints(mob/user) - to_chat(user, "The outer plating is welded firmly in place.") + return "The outer plating is welded firmly in place." /turf/closed/wall/attack_tk() return diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 9ebe8f3c19..a5931abf9d 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -12,7 +12,7 @@ var/destination_x var/destination_y - var/global/datum/gas_mixture/immutable/space/space_gas = new + var/static/datum/gas_mixture/immutable/space/space_gas = new plane = PLANE_SPACE layer = SPACE_LAYER light_power = 0.25 diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index ebf6f6626c..d618e457b0 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -39,7 +39,7 @@ return FALSE . = ..() -/turf/Initialize() +/turf/Initialize(mapload) if(flags_1 & INITIALIZED_1) stack_trace("Warning: [src]([type]) initialized multiple times!") flags_1 |= INITIALIZED_1 @@ -62,12 +62,21 @@ add_overlay(/obj/effect/fullbright) if(requires_activation) - CalculateAdjacentTurfs() + CALCULATE_ADJACENT_TURFS(src) SSair.add_to_active(src) if (light_power && light_range) update_light() + var/turf/T = SSmapping.get_turf_above(src) + if(T) + T.multiz_turf_new(src, DOWN) + SEND_SIGNAL(T, COMSIG_TURF_MULTIZ_NEW, src, DOWN) + T = SSmapping.get_turf_below(src) + if(T) + T.multiz_turf_new(src, UP) + SEND_SIGNAL(T, COMSIG_TURF_MULTIZ_NEW, src, UP) + if (opacity) has_opaque_atom = TRUE @@ -76,13 +85,19 @@ return INITIALIZE_HINT_NORMAL /turf/proc/Initalize_Atmos(times_fired) - CalculateAdjacentTurfs() + CALCULATE_ADJACENT_TURFS(src) /turf/Destroy(force) . = QDEL_HINT_IWILLGC if(!changing_turf) stack_trace("Incorrect turf deletion") changing_turf = FALSE + var/turf/T = SSmapping.get_turf_above(src) + if(T) + T.multiz_turf_del(src, DOWN) + T = SSmapping.get_turf_below(src) + if(T) + T.multiz_turf_del(src, UP) if(force) ..() //this will completely wipe turf state @@ -105,6 +120,60 @@ return user.Move_Pulled(src) +/turf/proc/multiz_turf_del(turf/T, dir) + +/turf/proc/multiz_turf_new(turf/T, dir) + +//zPassIn doesn't necessarily pass an atom! +//direction is direction of travel of air +/turf/proc/zPassIn(atom/movable/A, direction, turf/source) + return FALSE + +//direction is direction of travel of air +/turf/proc/zPassOut(atom/movable/A, direction, turf/destination) + return FALSE + +//direction is direction of travel of air +/turf/proc/zAirIn(direction, turf/source) + return FALSE + +//direction is direction of travel of air +/turf/proc/zAirOut(direction, turf/source) + return FALSE + +/turf/proc/zImpact(atom/movable/A, levels = 1, turf/prev_turf) + var/flags = NONE + var/mov_name = A.name + for(var/i in contents) + var/atom/thing = i + flags |= thing.intercept_zImpact(A, levels) + if(flags & FALL_STOP_INTERCEPTING) + break + if(prev_turf && !(flags & FALL_NO_MESSAGE)) + prev_turf.visible_message("[mov_name] falls through [prev_turf]!") + if(flags & FALL_INTERCEPTED) + return + if(zFall(A, ++levels)) + return FALSE + A.visible_message("[A] crashes into [src]!") + A.onZImpact(src, levels) + return TRUE + +/turf/proc/can_zFall(atom/movable/A, levels = 1, turf/target) + return zPassOut(A, DOWN, target) && target.zPassIn(A, DOWN, src) + +/turf/proc/zFall(atom/movable/A, levels = 1, force = FALSE) + var/turf/target = get_step_multiz(src, DOWN) + if(!target || (!isobj(A) && !ismob(A))) + return FALSE + if(!force && (!can_zFall(A, levels, target) || !A.can_zFall(src, levels, target, DOWN))) + return FALSE + A.zfalling = TRUE + A.forceMove(target) + A.zfalling = FALSE + target.zImpact(A, levels, src) + return TRUE + /turf/proc/handleRCL(obj/item/twohanded/rcl/C, mob/user) if(C.loaded) for(var/obj/structure/cable/LC in src) @@ -196,6 +265,9 @@ if(O.obj_flags & FROZEN) O.make_unfrozen() + if(!AM.zfalling) + zFall(AM) + /turf/proc/is_plasteel_floor() return FALSE diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 7fafca69f0..87db105072 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -686,6 +686,20 @@ log_admin("[key_name(usr)] set the pre-game delay to [DisplayTimeText(newtime)].") SSblackbox.record_feedback("tally", "admin_verb", 1, "Delay Game Start") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/datum/admins/proc/toggledynamicvote() + set category = "Server" + set desc="Switches between secret/extended and dynamic voting" + set name="Toggle Dynamic Vote" + var/prev_dynamic_voting = CONFIG_GET(flag/dynamic_voting) + CONFIG_SET(flag/dynamic_voting,!prev_dynamic_voting) + if (!prev_dynamic_voting) + to_chat(world, "Vote is now between extended and dynamic chaos.") + else + to_chat(world, "Vote is now between extended and secret.") + log_admin("[key_name(usr)] [prev_dynamic_voting ? "disabled" : "enabled"] dynamic voting.") + message_admins("[key_name_admin(usr)] toggled dynamic voting.") + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Dynamic Voting", "[prev_dynamic_voting ? "Disabled" : "Enabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + /datum/admins/proc/unprison(mob/M in GLOB.mob_list) set category = "Admin" set name = "Unprison" diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 626fa7f66f..5900847ef5 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -1,7 +1,7 @@ //admin verb groups - They can overlap if you so wish. Only one of each verb will exist in the verbs list regardless //the procs are cause you can't put the comments in the GLOB var define -GLOBAL_PROTECT(admin_verbs_default) GLOBAL_LIST_INIT(admin_verbs_default, world.AVerbsDefault()) +GLOBAL_PROTECT(admin_verbs_default) /world/proc/AVerbsDefault() return list( /client/proc/deadmin, /*destroys our own admin datum so we can play as a regular player*/ @@ -13,8 +13,8 @@ GLOBAL_LIST_INIT(admin_verbs_default, world.AVerbsDefault()) /client/proc/toggleprayers, /client/proc/toggleadminhelpsound ) -GLOBAL_PROTECT(admin_verbs_admin) GLOBAL_LIST_INIT(admin_verbs_admin, world.AVerbsAdmin()) +GLOBAL_PROTECT(admin_verbs_admin) /world/proc/AVerbsAdmin() return list( /client/proc/invisimin, /*allows our mob to go invisible/visible*/ @@ -78,11 +78,10 @@ GLOBAL_LIST_INIT(admin_verbs_admin, world.AVerbsAdmin()) /client/proc/hide_most_verbs, /*hides all our hideable adminverbs*/ /datum/admins/proc/open_borgopanel ) -GLOBAL_PROTECT(admin_verbs_ban) GLOBAL_LIST_INIT(admin_verbs_ban, list(/client/proc/unban_panel, /client/proc/DB_ban_panel, /client/proc/stickybanpanel)) -GLOBAL_PROTECT(admin_verbs_sounds) +GLOBAL_PROTECT(admin_verbs_ban) GLOBAL_LIST_INIT(admin_verbs_sounds, list(/client/proc/play_local_sound, /client/proc/play_sound, /client/proc/set_round_end_sound)) -GLOBAL_PROTECT(admin_verbs_fun) +GLOBAL_PROTECT(admin_verbs_sounds) GLOBAL_LIST_INIT(admin_verbs_fun, list( /client/proc/cmd_admin_dress, /client/proc/cmd_admin_gib_self, @@ -108,9 +107,9 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list( /client/proc/admin_away, /client/proc/roll_dices //CIT CHANGE - Adds dice verb )) -GLOBAL_PROTECT(admin_verbs_spawn) +GLOBAL_PROTECT(admin_verbs_fun) GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom, /datum/admins/proc/spawn_cargo, /datum/admins/proc/spawn_objasmob, /client/proc/respawn_character)) -GLOBAL_PROTECT(admin_verbs_server) +GLOBAL_PROTECT(admin_verbs_spawn) GLOBAL_LIST_INIT(admin_verbs_server, world.AVerbsServer()) /world/proc/AVerbsServer() return list( @@ -122,6 +121,7 @@ GLOBAL_LIST_INIT(admin_verbs_server, world.AVerbsServer()) /client/proc/everyone_random, /datum/admins/proc/toggleAI, /datum/admins/proc/toggleMulticam, + /datum/admins/proc/toggledynamicvote, /client/proc/cmd_admin_delete, /*delete an instance/object/mob/etc*/ /client/proc/cmd_debug_del_all, /client/proc/toggle_random_events, @@ -129,7 +129,7 @@ GLOBAL_LIST_INIT(admin_verbs_server, world.AVerbsServer()) /client/proc/adminchangemap, /client/proc/toggle_hub ) -GLOBAL_PROTECT(admin_verbs_debug) +GLOBAL_PROTECT(admin_verbs_server) GLOBAL_LIST_INIT(admin_verbs_debug, world.AVerbsDebug()) /world/proc/AVerbsDebug() return list( @@ -171,15 +171,15 @@ GLOBAL_LIST_INIT(admin_verbs_debug, world.AVerbsDebug()) /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_PROTECT(admin_verbs_debug) GLOBAL_LIST_INIT(admin_verbs_possess, list(/proc/possess, /proc/release)) -GLOBAL_PROTECT(admin_verbs_permissions) +GLOBAL_PROTECT(admin_verbs_possess) GLOBAL_LIST_INIT(admin_verbs_permissions, list(/client/proc/edit_admin_permissions)) -GLOBAL_PROTECT(admin_verbs_poll) +GLOBAL_PROTECT(admin_verbs_permissions) GLOBAL_LIST_INIT(admin_verbs_poll, list(/client/proc/create_poll)) //verbs which can be hidden - needs work -GLOBAL_PROTECT(admin_verbs_hideable) +GLOBAL_PROTECT(admin_verbs_poll) GLOBAL_LIST_INIT(admin_verbs_hideable, list( /client/proc/set_ooc, /client/proc/reset_ooc, @@ -247,6 +247,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list( /client/proc/cmd_admin_man_up, //CIT CHANGE - adds man up verb /client/proc/cmd_admin_man_up_global //CIT CHANGE - ditto )) +GLOBAL_PROTECT(admin_verbs_hideable) /client/proc/add_admin_verbs() if(holder) diff --git a/code/modules/admin/sound_emitter.dm b/code/modules/admin/sound_emitter.dm index 028af313b0..2901659ce9 100644 --- a/code/modules/admin/sound_emitter.dm +++ b/code/modules/admin/sound_emitter.dm @@ -34,15 +34,15 @@ return /obj/effect/sound_emitter/examine(mob/user) - ..() + . = ..() if(!isobserver(user)) return - to_chat(user, "Sound File: [sound_file ? sound_file : "None chosen"]") - to_chat(user, "Mode: [motus_operandi]
    ") - to_chat(user, "Range: [emitter_range]
    ") - to_chat(user, "Sound is playing at [sound_volume]% volume.") + . += "Sound File: [sound_file ? sound_file : "None chosen"]" + . += "Mode: [motus_operandi]
    " + . += "Range: [emitter_range]" + . += "Sound is playing at [sound_volume]% volume." if(user.client.holder) - to_chat(user, "Alt-click it to quickly activate it!") + . += "Alt-click it to quickly activate it!" //ATTACK GHOST IGNORING PARENT RETURN VALUE /obj/effect/sound_emitter/attack_ghost(mob/user) diff --git a/code/modules/admin/sql_message_system.dm b/code/modules/admin/sql_message_system.dm index 72ec3da8f9..7b59e72403 100644 --- a/code/modules/admin/sql_message_system.dm +++ b/code/modules/admin/sql_message_system.dm @@ -504,7 +504,7 @@ output += ruler var/datum/browser/browser = new(usr, "Note panel", "Manage player notes", 1000, 500) var/datum/asset/notes_assets = get_asset_datum(/datum/asset/simple/notes) - notes_assets.send(src) + notes_assets.send(usr.client) browser.set_content(jointext(output, "")) browser.open() @@ -556,7 +556,7 @@ /proc/convert_notes_sql(ckey) if(!fexists(NOTESFILE)) return - + var/savefile/notesfile = new(NOTESFILE) if(!notesfile) log_game("Error: Cannot access [NOTESFILE]") diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index b0b9190556..4de2d9b5ca 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1347,7 +1347,7 @@ else if(href_list["f_secret"]) return HandleFSecret() - + else if(href_list["f_dynamic_roundstart"]) if(!check_rights(R_ADMIN)) return @@ -1449,9 +1449,7 @@ if(GLOB.master_mode != "dynamic") return alert(usr, "The game mode has to be dynamic mode!", null, null, null, null) - var/new_centre = input(usr,"Change the centre of the dynamic mode threat curve. A negative value will give a more peaceful round ; a positive value, a round with higher threat. Any number between -5 and +5 is allowed.", "Change curve centre", null) as num - if (new_centre < -5 || new_centre > 5) - return alert(usr, "Only values between -5 and +5 are allowed.", null, null, null, null) + var/new_centre = input(usr,"Change the centre of the dynamic mode threat curve. A negative value will give a more peaceful round ; a positive value, a round with higher threat. Any number is allowed. This is adjusted by dynamic voting.", "Change curve centre", null) as num log_admin("[key_name(usr)] changed the distribution curve center to [new_centre].") message_admins("[key_name(usr)] changed the distribution curve center to [new_centre]", 1) @@ -1593,7 +1591,7 @@ GLOB.dynamic_stacking_limit = input(usr,"Change the threat limit at which round-endings rulesets will start to stack.", "Change stacking limit", null) as num log_admin("[key_name(usr)] set 'stacking_limit' to [GLOB.dynamic_stacking_limit].") message_admins("[key_name(usr)] set 'stacking_limit' to [GLOB.dynamic_stacking_limit].") - dynamic_mode_options(usr) + dynamic_mode_options(usr) else if(href_list["f_dynamic_high_pop_limit"]) if(!check_rights(R_ADMIN)) @@ -1612,7 +1610,7 @@ log_admin("[key_name(usr)] set 'high_pop_limit' to [GLOB.dynamic_high_pop_limit].") message_admins("[key_name(usr)] set 'high_pop_limit' to [GLOB.dynamic_high_pop_limit].") - dynamic_mode_options(usr) + dynamic_mode_options(usr) else if(href_list["f_dynamic_forced_threat"]) if(!check_rights(R_ADMIN)) @@ -1631,7 +1629,7 @@ log_admin("[key_name(usr)] set 'forced_threat_level' to [GLOB.dynamic_forced_threat_level].") message_admins("[key_name(usr)] set 'forced_threat_level' to [GLOB.dynamic_forced_threat_level].") - dynamic_mode_options(usr) + dynamic_mode_options(usr) else if(href_list["c_mode2"]) if(!check_rights(R_ADMIN|R_SERVER)) @@ -2442,7 +2440,7 @@ return src.admincaster_feed_channel.channel_name = stripped_input(usr, "Provide a Feed Channel Name.", "Network Channel Handler", "") while (findtext(src.admincaster_feed_channel.channel_name," ") == 1) - src.admincaster_feed_channel.channel_name = copytext(src.admincaster_feed_channel.channel_name,2,lentext(src.admincaster_feed_channel.channel_name)+1) + src.admincaster_feed_channel.channel_name = copytext(src.admincaster_feed_channel.channel_name,2,length(src.admincaster_feed_channel.channel_name)+1) src.access_news_network() else if(href_list["ac_set_channel_lock"]) @@ -2484,7 +2482,7 @@ return src.admincaster_feed_message.body = adminscrub(input(usr, "Write your Feed story.", "Network Channel Handler", "")) while (findtext(src.admincaster_feed_message.returnBody(-1)," ") == 1) - src.admincaster_feed_message.body = copytext(src.admincaster_feed_message.returnBody(-1),2,lentext(src.admincaster_feed_message.returnBody(-1))+1) + src.admincaster_feed_message.body = copytext(src.admincaster_feed_message.returnBody(-1),2,length(src.admincaster_feed_message.returnBody(-1))+1) src.access_news_network() else if(href_list["ac_submit_new_message"]) @@ -2545,7 +2543,7 @@ return src.admincaster_wanted_message.criminal = adminscrub(input(usr, "Provide the name of the Wanted person.", "Network Security Handler", "")) while(findtext(src.admincaster_wanted_message.criminal," ") == 1) - src.admincaster_wanted_message.criminal = copytext(admincaster_wanted_message.criminal,2,lentext(admincaster_wanted_message.criminal)+1) + src.admincaster_wanted_message.criminal = copytext(admincaster_wanted_message.criminal,2,length(admincaster_wanted_message.criminal)+1) src.access_news_network() else if(href_list["ac_set_wanted_desc"]) @@ -2553,7 +2551,7 @@ return src.admincaster_wanted_message.body = adminscrub(input(usr, "Provide the a description of the Wanted person and any other details you deem important.", "Network Security Handler", "")) while (findtext(src.admincaster_wanted_message.body," ") == 1) - src.admincaster_wanted_message.body = copytext(src.admincaster_wanted_message.body,2,lentext(src.admincaster_wanted_message.body)+1) + src.admincaster_wanted_message.body = copytext(src.admincaster_wanted_message.body,2,length(src.admincaster_wanted_message.body)+1) src.access_news_network() else if(href_list["ac_submit_wanted"]) diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index b19b2a91d8..072fbaa123 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -61,7 +61,7 @@ var/output = "Radio Report
    " for (var/fq in SSradio.frequencies) output += "Freq: [fq]
    " - var/list/datum/radio_frequency/fqs = SSradio.frequencies[fq] + var/datum/radio_frequency/fqs = SSradio.frequencies[fq] if (!fqs) output += "  ERROR
    " continue diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 8559a3235e..2b8d365e15 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -19,7 +19,6 @@ //- Identify how hard it is to break into the area and where the weak points are //- Check if the area has too much empty space. If so, make it smaller and replace the rest with maintenance tunnels. -GLOBAL_PROTECT(admin_verbs_debug_mapping) GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list( /client/proc/camera_view, //-errorage /client/proc/sec_camera_report, //-errorage @@ -50,6 +49,7 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list( /client/proc/debug_z_levels, /client/proc/place_ruin )) +GLOBAL_PROTECT(admin_verbs_debug_mapping) /obj/effect/debugging/mapfix_marker name = "map fix marker" diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm index e70ea1c1b3..644b2729e0 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/verbs/modifyvariables.dm @@ -307,11 +307,11 @@ GLOBAL_PROTECT(VVpixelmovement) // the type with the base type removed from the begaining var/fancytype = types[D.type] if (findtext(fancytype, types[type])) - fancytype = copytext(fancytype, lentext(types[type])+1) - var/shorttype = copytext("[D.type]", lentext("[type]")+1) - if (lentext(shorttype) > lentext(fancytype)) + fancytype = copytext(fancytype, length(types[type])+1) + var/shorttype = copytext("[D.type]", length("[type]")+1) + if (length(shorttype) > length(fancytype)) shorttype = fancytype - if (!lentext(shorttype)) + if (!length(shorttype)) shorttype = "/" .["[D]([shorttype])[REF(D)]#[i]"] = D diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index d7dd8db08d..7a222d1ebc 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -949,7 +949,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits Uniform: - [uniform_select] + [uniform_select] diff --git a/code/modules/admin/verbs/spawnobjasmob.dm b/code/modules/admin/verbs/spawnobjasmob.dm index 621e6c3618..1d3cf95222 100644 --- a/code/modules/admin/verbs/spawnobjasmob.dm +++ b/code/modules/admin/verbs/spawnobjasmob.dm @@ -16,10 +16,10 @@ var/obj/chosen_obj = text2path(chosen) var/list/settings = list( - "mainsettings" = list( - "name" = list("desc" = "Name", "type" = "string", "value" = "Bob"), + "mainsettings" = list( + "name" = list("desc" = "Name", "type" = "string", "value" = "Bob"), "maxhealth" = list("desc" = "Max. health", "type" = "number", "value" = 100), - "access" = list("desc" = "Access ID", "type" = "datum", "path" = "/obj/item/card/id", "value" = "Default"), + "access" = list("desc" = "Access ID", "type" = "datum", "path" = "/obj/item/card/id", "value" = "Default"), "objtype" = list("desc" = "Base obj type", "type" = "datum", "path" = "/obj", "value" = "[chosen]"), "googlyeyes" = list("desc" = "Googly eyes", "type" = "boolean", "value" = "No"), "disableai" = list("desc" = "Disable AI", "type" = "boolean", "value" = "Yes"), @@ -27,7 +27,7 @@ "dropitem" = list("desc" = "Drop obj on death", "type" = "boolean", "value" = "Yes"), "mobtype" = list("desc" = "Base mob type", "type" = "datum", "path" = "/mob/living/simple_animal/hostile/mimic/copy", "value" = "/mob/living/simple_animal/hostile/mimic/copy"), "ckey" = list("desc" = "ckey", "type" = "ckey", "value" = "none"), - ) + ) ) var/list/prefreturn = presentpreflikepicker(usr,"Customize mob", "Customize mob", Button1="Ok", width = 450, StealFocus = 1,Timeout = 0, settings=settings) diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index 42719e28bd..1894d8c7ae 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -96,7 +96,6 @@ GLOBAL_LIST_EMPTY(antagonists) LAZYREMOVE(owner.antag_datums, src) if(!silent && owner.current) farewell() - owner.objectives -= objectives var/datum/team/team = get_team() if(team) team.remove_member(owner) @@ -132,14 +131,14 @@ GLOBAL_LIST_EMPTY(antagonists) report += printplayer(owner) var/objectives_complete = TRUE - if(owner.objectives.len) - report += printobjectives(owner) - for(var/datum/objective/objective in owner.objectives) + if(objectives.len) + report += printobjectives(objectives) + for(var/datum/objective/objective in objectives) if(!objective.check_completion()) objectives_complete = FALSE break - if(owner.objectives.len == 0 || objectives_complete) + if(objectives.len == 0 || objectives_complete) report += "The [name] was successful!" else report += "The [name] has failed!" @@ -216,25 +215,6 @@ GLOBAL_LIST_EMPTY(antagonists) return antag_memory = new_memo -//This datum will autofill the name with special_role -//Used as placeholder for minor antagonists, please create proper datums for these -/datum/antagonist/auto_custom - show_in_antagpanel = FALSE - antagpanel_category = "Other" - show_name_in_check_antagonists = TRUE - -/datum/antagonist/auto_custom/on_gain() - ..() - name = owner.special_role - //Add all objectives not already owned by other datums to this one. - var/list/already_registered_objectives = list() - for(var/datum/antagonist/A in owner.antag_datums) - if(A == src) - continue - else - already_registered_objectives |= A.objectives - objectives = owner.objectives - already_registered_objectives - //This one is created by admin tools for custom objectives /datum/antagonist/custom antagpanel_category = "Custom" diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index c1e6ff826f..3723b99f4e 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -56,7 +56,7 @@ if(used) to_chat(H, "You already used this contract!") return - var/list/candidates = pollCandidatesForMob("Do you want to play as a wizard's [href_list["school"]] apprentice?", ROLE_WIZARD, null, ROLE_WIZARD, 150, src) + var/list/candidates = pollCandidatesForMob("Do you want to play as a wizard's [href_list["school"]] apprentice?", ROLE_WIZARD, null, ROLE_WIZARD, 150, src, ignore_category = POLL_IGNORE_WIZARD) if(LAZYLEN(candidates)) if(QDELETED(src)) return @@ -182,6 +182,10 @@ name = "syndicate medical teleporter" borg_to_spawn = "Medical" +/obj/item/antag_spawner/nuke_ops/borg_tele/saboteur + name = "syndicate saboteur teleporter" + borg_to_spawn = "Saboteur" + /obj/item/antag_spawner/nuke_ops/borg_tele/spawn_antag(client/C, turf/T, kind, datum/mind/user) var/mob/living/silicon/robot/R var/datum/antagonist/nukeop/creator_op = user.has_antag_datum(/datum/antagonist/nukeop,TRUE) @@ -191,6 +195,8 @@ switch(borg_to_spawn) if("Medical") R = new /mob/living/silicon/robot/modules/syndicate/medical(T) + if("Saboteur") + R = new /mob/living/silicon/robot/modules/syndicate/saboteur(T) else R = new /mob/living/silicon/robot/modules/syndicate(T) //Assault borg by default @@ -235,7 +241,7 @@ return if(used) return - var/list/candidates = pollCandidatesForMob("Do you want to play as a [initial(demon_type.name)]?", ROLE_ALIEN, null, ROLE_ALIEN, 50, src) + var/list/candidates = pollCandidatesForMob("Do you want to play as a [initial(demon_type.name)]?", ROLE_ALIEN, null, ROLE_ALIEN, 50, src, ignore_category = POLL_IGNORE_DEMON) if(LAZYLEN(candidates)) if(used || QDELETED(src)) return diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index c1088cbb3d..b708c59ef7 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -393,23 +393,22 @@ name = "Dissection Guide" icon_state = "alienpaper_words" info = {"Dissection for Dummies
    - -
    - 1.Acquire fresh specimen.
    - 2.Put the specimen on operating table.
    - 3.Apply surgical drapes, preparing for experimental dissection.
    - 4.Apply scalpel to specimen's torso.
    - 5.Clamp bleeders on specimen's torso with a hemostat.
    - 6.Retract skin of specimen's torso with a retractor.
    - 7.Apply scalpel again to specimen's torso.
    - 8.Search through the specimen's torso with your hands to remove any superfluous organs.
    - 9.Insert replacement gland (Retrieve one from gland storage).
    - 10.Consider dressing the specimen back to not disturb the habitat.
    - 11.Put the specimen in the experiment machinery.
    - 12.Choose one of the machine options. The target will be analyzed and teleported to the selected drop-off point.
    - 13.You will receive one supply credit, and the subject will be counted towards your quota.
    -
    -Congratulations! You are now trained for invasive xenobiology research!"} +
    + 1.Acquire fresh specimen.
    + 2.Put the specimen on operating table.
    + 3.Apply surgical drapes, preparing for experimental dissection.
    + 4.Apply scalpel to specimen's torso.
    + 5.Clamp bleeders on specimen's torso with a hemostat.
    + 6.Retract skin of specimen's torso with a retractor.
    + 7.Apply scalpel again to specimen's torso.
    + 8.Search through the specimen's torso with your hands to remove any superfluous organs.
    + 9.Insert replacement gland (Retrieve one from gland storage).
    + 10.Consider dressing the specimen back to not disturb the habitat.
    + 11.Put the specimen in the experiment machinery.
    + 12.Choose one of the machine options. The target will be analyzed and teleported to the selected drop-off point.
    + 13.You will receive one supply credit, and the subject will be counted towards your quota.
    +
    + Congratulations! You are now trained for invasive xenobiology research!"} /obj/item/paper/guides/antag/abductor/update_icon() return @@ -612,16 +611,16 @@ Congratulations! You are now trained for invasive xenobiology research!"} . = ..() /obj/item/abductor_baton/examine(mob/user) - ..() + . = ..() switch(mode) if(BATON_STUN) - to_chat(user, "The baton is in stun mode.") + . += "The baton is in stun mode." if(BATON_SLEEP) - to_chat(user, "The baton is in sleep inducement mode.") + . += "The baton is in sleep inducement mode." if(BATON_CUFF) - to_chat(user, "The baton is in restraining mode.") + . += "The baton is in restraining mode." if(BATON_PROBE) - to_chat(user, "The baton is in probing mode.") + . += "The baton is in probing mode." /obj/item/radio/headset/abductor name = "alien headset" diff --git a/code/modules/antagonists/abductor/equipment/abduction_outfits.dm b/code/modules/antagonists/abductor/equipment/abduction_outfits.dm index 7e03bbf57a..7bfadf6f3b 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_outfits.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_outfits.dm @@ -24,7 +24,7 @@ for(var/obj/item/abductor/gizmo/G in B.contents) console.AddGizmo(G) -/datum/outfit/abductor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/abductor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) ..() if(!visualsOnly) link_to_console(H) @@ -49,7 +49,7 @@ /obj/item/abductor/gizmo = 1 ) -/datum/outfit/abductor/scientist/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/abductor/scientist/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) ..() if(!visualsOnly) var/obj/item/implant/abductor/beamplant = new diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm index a35cbbf0e4..f7b49e1cf4 100644 --- a/code/modules/antagonists/abductor/equipment/gland.dm +++ b/code/modules/antagonists/abductor/equipment/gland.dm @@ -20,7 +20,7 @@ /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].") + . += "It is \a [true_name]." /obj/item/organ/heart/gland/proc/ownerCheck() if(ishuman(owner)) @@ -73,7 +73,7 @@ clear_mind_control() ..() -/obj/item/organ/heart/gland/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/heart/gland/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) ..() if(special != 2 && uses) // Special 2 means abductor surgery Start() @@ -124,7 +124,7 @@ mind_control_uses = 1 mind_control_duration = 2400 -/obj/item/organ/heart/gland/slime/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/heart/gland/slime/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) ..() owner.faction |= "slime" owner.grant_language(/datum/language/slime) @@ -286,7 +286,7 @@ mind_control_uses = 2 mind_control_duration = 900 -/obj/item/organ/heart/gland/electric/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/heart/gland/electric/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) ..() ADD_TRAIT(owner, TRAIT_SHOCKIMMUNE, ORGAN_TRAIT) diff --git a/code/modules/antagonists/abductor/machinery/camera.dm b/code/modules/antagonists/abductor/machinery/camera.dm index 00e48cb1c7..9e0a2b46b1 100644 --- a/code/modules/antagonists/abductor/machinery/camera.dm +++ b/code/modules/antagonists/abductor/machinery/camera.dm @@ -17,9 +17,9 @@ /obj/machinery/computer/camera_advanced/abductor/CreateEye() ..() - eyeobj.visible_icon = 1 - eyeobj.icon = 'icons/obj/abductor.dmi' - eyeobj.icon_state = "camera_target" + eyeobj.visible_icon = TRUE + eyeobj.icon = 'icons/mob/cameramob.dmi' + eyeobj.icon_state = "generic_camera" /obj/machinery/computer/camera_advanced/abductor/GrantActions(mob/living/carbon/user) ..() diff --git a/code/modules/antagonists/blob/blob.dm b/code/modules/antagonists/blob/blob.dm index 964bc99311..3d6db983dc 100644 --- a/code/modules/antagonists/blob/blob.dm +++ b/code/modules/antagonists/blob/blob.dm @@ -30,7 +30,6 @@ var/datum/objective/blob_takeover/main = new main.owner = owner objectives += main - owner.objectives |= objectives /datum/antagonist/blob/apply_innate_effects(mob/living/mob_override) if(!isovermind(owner.current)) diff --git a/code/modules/antagonists/blob/blob/overmind.dm b/code/modules/antagonists/blob/blob/overmind.dm index d32e38c194..f094fa83db 100644 --- a/code/modules/antagonists/blob/blob/overmind.dm +++ b/code/modules/antagonists/blob/blob/overmind.dm @@ -9,7 +9,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) name = "Blob Overmind" real_name = "Blob Overmind" desc = "The overmind. It controls the blob." - icon = 'icons/mob/blob.dmi' + icon = 'icons/mob/cameramob.dmi' icon_state = "marker" mouse_opacity = MOUSE_OPACITY_ICON move_on_shuttle = 1 @@ -170,9 +170,9 @@ GLOBAL_LIST_EMPTY(blob_nodes) add_points(0) /mob/camera/blob/examine(mob/user) - ..() + . = ..() if(blob_reagent_datum) - to_chat(user, "Its chemical is [blob_reagent_datum.name].") + . += "Its chemical is [blob_reagent_datum.name]." /mob/camera/blob/update_health_hud() if(blob_core) diff --git a/code/modules/antagonists/blob/blob/theblob.dm b/code/modules/antagonists/blob/blob/theblob.dm index dc7aa821d6..b37c007664 100644 --- a/code/modules/antagonists/blob/blob/theblob.dm +++ b/code/modules/antagonists/blob/blob/theblob.dm @@ -243,18 +243,19 @@ else return ..() -/obj/structure/blob/proc/chemeffectreport(mob/user) +/obj/structure/blob/proc/chemeffectreport() + . = list() if(overmind) - to_chat(user, "Material: [overmind.blob_reagent_datum.name].") - to_chat(user, "Material Effects: [overmind.blob_reagent_datum.analyzerdescdamage]") - to_chat(user, "Material Properties: [overmind.blob_reagent_datum.analyzerdesceffect]
    ") + . += "Material: [overmind.blob_reagent_datum.name]." + . += "Material Effects: [overmind.blob_reagent_datum.analyzerdescdamage]" + . += "Material Properties: [overmind.blob_reagent_datum.analyzerdesceffect]
    " else - to_chat(user, "No Material Detected!
    ") + . += "No Material Detected!
    " -/obj/structure/blob/proc/typereport(mob/user) - to_chat(user, "Blob Type: [uppertext(initial(name))]") - to_chat(user, "Health: [obj_integrity]/[max_integrity]") - to_chat(user, "Effects: [scannerreport()]") +/obj/structure/blob/proc/typereport() + . = list("Blob Type: [uppertext(initial(name))]") + . += "Health: [obj_integrity]/[max_integrity]" + . += "Effects: [scannerreport()]" /obj/structure/blob/attack_animal(mob/living/simple_animal/M) if(ROLE_BLOB in M.faction) //sorry, but you can't kill the blob as a blobbernaut @@ -310,20 +311,20 @@ return B /obj/structure/blob/examine(mob/user) - ..() + . = ..() var/datum/atom_hud/hud_to_check = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] if(user.research_scanner || hud_to_check.hudusers[user]) - to_chat(user, "Your HUD displays an extensive report...
    ") + . += "Your HUD displays an extensive report...
    " if(overmind) - to_chat(user, "Progress to Critical Mass: [overmind.blobs_legit.len]/[overmind.blobwincount].") + . += "Progress to Critical Mass: [overmind.blobs_legit.len]/[overmind.blobwincount]." else - to_chat(user, "Core neutralized. Critical mass no longer attainable.") - chemeffectreport(user) - typereport(user) + . += "Core neutralized. Critical mass no longer attainable." + . += chemeffectreport() + . += typereport() else if(isobserver(user) && overmind) - to_chat(user, "Progress to Critical Mass: [overmind.blobs_legit.len]/[overmind.blobwincount].") - to_chat(user, "It seems to be made of [get_chem_name()].") + . += "Progress to Critical Mass: [overmind.blobs_legit.len]/[overmind.blobwincount]." + . += "It seems to be made of [get_chem_name()]." /obj/structure/blob/proc/scannerreport() return "A generic blob. Looks like someone forgot to override this proc, adminhelp this." diff --git a/code/modules/antagonists/blood_contract/blood_contract.dm b/code/modules/antagonists/blood_contract/blood_contract.dm new file mode 100644 index 0000000000..4e7238647e --- /dev/null +++ b/code/modules/antagonists/blood_contract/blood_contract.dm @@ -0,0 +1,33 @@ + +/datum/antagonist/blood_contract + name = "Blood Contract Target" + show_in_roundend = FALSE + show_in_antagpanel = FALSE + +/datum/antagonist/blood_contract/on_gain() + . = ..() + give_objective() + start_the_hunt() + +/datum/antagonist/blood_contract/proc/give_objective() + var/datum/objective/survive/survive = new + survive.owner = owner + objectives += survive + +/datum/antagonist/blood_contract/greet() + . = ..() + to_chat(owner, "You've been marked for death! Don't let the demons get you! KILL THEM ALL!") + +/datum/antagonist/blood_contract/proc/start_the_hunt() + var/mob/living/carbon/human/H = owner.current + if(!istype(H)) + return + H.add_atom_colour("#FF0000", ADMIN_COLOUR_PRIORITY) + var/obj/effect/mine/pickup/bloodbath/B = new(H) + INVOKE_ASYNC(B, /obj/effect/mine/pickup/bloodbath/.proc/mineEffect, H) //could use moving out from the mine + + for(var/mob/living/carbon/human/P in GLOB.player_list) + if(P == H) + continue + to_chat(P, "You have an overwhelming desire to kill [H]. [H.p_theyve(TRUE)] been marked red! Whoever [H.p_they()] [H.p_were()], friend or foe, go kill [H.p_them()]!") + P.put_in_hands(new /obj/item/kitchen/knife/butcher(P), TRUE) diff --git a/code/modules/antagonists/brainwashing/brainwashing.dm b/code/modules/antagonists/brainwashing/brainwashing.dm index f1cff2bff4..491ee9d2e5 100644 --- a/code/modules/antagonists/brainwashing/brainwashing.dm +++ b/code/modules/antagonists/brainwashing/brainwashing.dm @@ -9,7 +9,6 @@ for(var/O in directives) var/datum/objective/brainwashing/objective = new(O) B.objectives += objective - M.objectives += objective B.greet() else B = new() @@ -32,10 +31,6 @@ antagpanel_category = "Other" show_name_in_check_antagonists = TRUE -/datum/antagonist/brainwashed/on_gain() - owner.objectives |= objectives - . = ..() - /datum/antagonist/brainwashed/greet() to_chat(owner, "Your mind reels as it begins focusing on a single purpose...") to_chat(owner, "Follow the Directives, at any cost!") diff --git a/code/modules/antagonists/brother/brother.dm b/code/modules/antagonists/brother/brother.dm index f63e81acbf..7c589bb3ab 100644 --- a/code/modules/antagonists/brother/brother.dm +++ b/code/modules/antagonists/brother/brother.dm @@ -20,7 +20,6 @@ /datum/antagonist/brother/on_gain() SSticker.mode.brothers += owner objectives += team.objectives - owner.objectives += objectives owner.special_role = special_role finalize_brother() return ..() diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index b6e3d66c35..0d68660d9d 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -459,8 +459,6 @@ objectives += identity_theft escape_objective_possible = FALSE - owner.objectives |= objectives - /datum/antagonist/changeling/proc/update_changeling_icons_added() var/datum/atom_hud/antag/hud = GLOB.huds[ANTAG_HUD_CHANGELING] hud.join_hud(owner.current) diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index c428c56d45..92a4f28308 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -334,7 +334,7 @@ /obj/item/projectile/tentacle/proc/tentacle_stab(mob/living/carbon/human/H, mob/living/carbon/C) if(H.Adjacent(C)) for(var/obj/item/I in H.held_items) - if(I.is_sharp()) + if(I.get_sharpness()) C.visible_message("[H] impales [C] with [H.p_their()] [I.name]!", "[H] impales you with [H.p_their()] [I.name]!") C.apply_damage(I.force, BRUTE, BODY_ZONE_CHEST) H.do_item_attack_animation(C, used_item = I) diff --git a/code/modules/antagonists/clockcult/clock_effect.dm b/code/modules/antagonists/clockcult/clock_effect.dm index b9de95b030..5fbfa03290 100644 --- a/code/modules/antagonists/clockcult/clock_effect.dm +++ b/code/modules/antagonists/clockcult/clock_effect.dm @@ -21,5 +21,5 @@ /obj/effect/clockwork/examine(mob/user) if((is_servant_of_ratvar(user) || isobserver(user)) && clockwork_desc) desc = clockwork_desc - ..() + . = ..() desc = initial(desc) \ No newline at end of file diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_overlay.dm b/code/modules/antagonists/clockcult/clock_effects/clock_overlay.dm index 34a986aa97..c18e46790e 100644 --- a/code/modules/antagonists/clockcult/clock_effects/clock_overlay.dm +++ b/code/modules/antagonists/clockcult/clock_effects/clock_overlay.dm @@ -6,6 +6,7 @@ /obj/effect/clockwork/overlay/examine(mob/user) if(linked) linked.examine(user) + return ..() /obj/effect/clockwork/overlay/ex_act() return FALSE diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm index 8000be87e6..0125dc7cf5 100644 --- a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm +++ b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm @@ -147,6 +147,11 @@ if(iscarbon(L)) var/mob/living/carbon/M = L M.uncuff() + var/brutedamage = L.getBruteLoss() + var/burndamage = L.getFireLoss() + if(brutedamage || burndamage) + L.adjustBruteLoss(-(brutedamage * 0.25)) + L.adjustFireLoss(-(burndamage * 0.25)) L.Knockdown(50) //Completely defenseless for five seconds - mainly to give them time to read over the information they've just been presented with if(iscarbon(L)) var/mob/living/carbon/C = L @@ -191,15 +196,15 @@ ..() /obj/effect/clockwork/sigil/transmission/examine(mob/user) - ..() + . = ..() if(is_servant_of_ratvar(user) || isobserver(user)) var/structure_number = 0 for(var/obj/structure/destructible/clockwork/powered/P in range(SIGIL_ACCESS_RANGE, src)) structure_number++ - to_chat(user, "It is storing [DisplayPower(get_clockwork_power())] of shared power, \ - and [structure_number] clockwork structure[structure_number == 1 ? " is":"s are"] in range.") + . += "It is storing [DisplayPower(get_clockwork_power())] of shared power, \ + and [structure_number] clockwork structure[structure_number == 1 ? " is":"s are"] in range." if(iscyborg(user)) - to_chat(user, "You can recharge from the [sigil_name] by crossing it.") + . += "You can recharge from the [sigil_name] by crossing it." /obj/effect/clockwork/sigil/transmission/sigil_effects(mob/living/L) if(is_servant_of_ratvar(L)) @@ -262,7 +267,7 @@ clockwork_desc = "A sigil that will drain non-Servants that remain on it. Servants that remain on it will be healed if it has any vitality drained." icon_state = "sigilvitality" layer = SIGIL_LAYER - alpha = 75 + alpha = 125 color = "#123456" affects_servants = TRUE stat_affected = DEAD @@ -274,13 +279,13 @@ var/static/list/damage_heal_order = list(CLONE, TOX, BURN, BRUTE, OXY) //we heal damage in this order /obj/effect/clockwork/sigil/vitality/examine(mob/user) - ..() + . = ..() if(is_servant_of_ratvar(user) || isobserver(user)) - to_chat(user, "It has access to [GLOB.ratvar_awakens ? "INFINITE":GLOB.clockwork_vitality] units of vitality.") + . += "It has access to [GLOB.ratvar_awakens ? "INFINITE":GLOB.clockwork_vitality] units of vitality." if(GLOB.ratvar_awakens) - to_chat(user, "It can revive Servants at no cost!") + . += "It can revive Servants at no cost!" else - to_chat(user, "It can revive Servants at a cost of [revive_cost] vitality.") + . += "It can revive Servants at a cost of [revive_cost] vitality." /obj/effect/clockwork/sigil/vitality/sigil_effects(mob/living/L) if((is_servant_of_ratvar(L) && L.suiciding) || sigil_active) diff --git a/code/modules/antagonists/clockcult/clock_effects/spatial_gateway.dm b/code/modules/antagonists/clockcult/clock_effects/spatial_gateway.dm index 5cf7ab7923..36aaa27716 100644 --- a/code/modules/antagonists/clockcult/clock_effects/spatial_gateway.dm +++ b/code/modules/antagonists/clockcult/clock_effects/spatial_gateway.dm @@ -53,9 +53,9 @@ return TRUE /obj/effect/clockwork/spatial_gateway/examine(mob/user) - ..() + . = ..() if(is_servant_of_ratvar(user) || isobserver(user)) - to_chat(user, "It has [uses] use\s remaining.") + . += "It has [uses] use\s remaining." //ATTACK GHOST IGNORING PARENT RETURN VALUE /obj/effect/clockwork/spatial_gateway/attack_ghost(mob/user) diff --git a/code/modules/antagonists/clockcult/clock_item.dm b/code/modules/antagonists/clockcult/clock_item.dm index f403b6f9f1..7c8e877fb3 100644 --- a/code/modules/antagonists/clockcult/clock_item.dm +++ b/code/modules/antagonists/clockcult/clock_item.dm @@ -20,5 +20,5 @@ /obj/item/clockwork/examine(mob/user) if((is_servant_of_ratvar(user) || isobserver(user)) && clockwork_desc) desc = clockwork_desc - ..() + . = ..() desc = initial(desc) diff --git a/code/modules/antagonists/clockcult/clock_items/clock_components.dm b/code/modules/antagonists/clockcult/clock_items/clock_components.dm index 561d49e9ac..a9307f15e1 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_components.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_components.dm @@ -12,7 +12,7 @@ /obj/item/clockwork/component/examine(mob/user) . = ..() if(is_servant_of_ratvar(user) || isobserver(user)) - to_chat(user, "You can activate this in your hand to break it down for power.") + . += "You can activate this in your hand to break it down for power." /obj/item/clockwork/component/attack_self(mob/living/user) if(is_servant_of_ratvar(user)) @@ -181,9 +181,9 @@ pixel_y = rand(-sprite_shift, sprite_shift) /obj/item/clockwork/alloy_shards/examine(mob/user) - ..() + . = ..() if(is_servant_of_ratvar(user) || isobserver(user)) - to_chat(user, "Can be consumed by a replica fabricator as a source of power.") + . += "Can be consumed by a replica fabricator as a source of power." /obj/item/clockwork/alloy_shards/proc/replace_name_desc() name = "replicant alloy shard" diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm index 07b4366194..a7fcf0a3b0 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm @@ -27,11 +27,11 @@ armour_penetration = initial(armour_penetration) /obj/item/clockwork/weapon/ratvarian_spear/examine(mob/user) - ..() + . = ..() if(is_servant_of_ratvar(user) || isobserver(user)) - to_chat(user, "Attacks on living non-Servants will generate [bonus_burn] units of vitality.") + . += "Attacks on living non-Servants will generate [bonus_burn] units of vitality." if(!iscyborg(user)) - to_chat(user, "Throwing the spear will do massive damage, break the spear, and knock down the target.") + . += "Throwing the spear will do massive damage, break the spear, and knock down the target." /obj/item/clockwork/weapon/ratvarian_spear/attack(mob/living/target, mob/living/carbon/human/user) . = ..() diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm index ec712f2eec..58835e0cd4 100644 --- a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm +++ b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm @@ -64,7 +64,7 @@ /obj/item/clockwork/slab/cyborg/janitor //six scriptures, plus a fabricator quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/sigil_of_transgression, \ - /datum/clockwork_scripture/create_object/stargazer, /datum/clockwork_scripture/create_object/ocular_warden, /datum/clockwork_scripture/create_object/mania_motor) + /datum/clockwork_scripture/create_object/stargazer, /datum/clockwork_scripture/create_object/ocular_warden, /datum/clockwork_scripture/create_object/mania_motor) /obj/item/clockwork/slab/cyborg/service //six scriptures, plus xray vision quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/create_object/replicant,/datum/clockwork_scripture/create_object/stargazer, \ @@ -121,15 +121,15 @@ adjust_clockwork_power(0.1) //Slabs serve as very weak power generators on their own (no, not enough to justify spamming them) /obj/item/clockwork/slab/examine(mob/user) - ..() + . = ..() if(is_servant_of_ratvar(user) || isobserver(user)) if(LAZYLEN(quickbound)) for(var/i in 1 to quickbound.len) if(!quickbound[i]) continue var/datum/clockwork_scripture/quickbind_slot = quickbound[i] - to_chat(user, "Quickbind button: [initial(quickbind_slot.name)].") - to_chat(user, "Available power: [DisplayPower(get_clockwork_power())].") + . += "Quickbind button: [initial(quickbind_slot.name)]." + . += "Available power: [DisplayPower(get_clockwork_power())]." //Slab actions; Hierophant, Quickbind /obj/item/clockwork/slab/ui_action_click(mob/user, action) diff --git a/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm b/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm index 2be0fdde11..43c05b8556 100644 --- a/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm +++ b/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm @@ -15,7 +15,7 @@ . = ..() var/area/A = get_area(src) if(A && construct_type) - notify_ghosts("A [construct_name] chassis has been created in [A.name]!", 'sound/magic/clockwork/fellowship_armory.ogg', source = src, action = NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_CONSTRUCT) + notify_ghosts("A [construct_name] chassis has been created in [A.name]!", 'sound/magic/clockwork/fellowship_armory.ogg', source = src, action = NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_CONSTRUCT, ignore_dnr_observers = TRUE) GLOB.poi_list += src LAZYADD(GLOB.mob_spawners[name], src) @@ -28,7 +28,7 @@ /obj/item/clockwork/construct_chassis/examine(mob/user) clockwork_desc = "[clockwork_desc]
    [construct_desc]" - ..() + . = ..() clockwork_desc = initial(clockwork_desc) //ATTACK HAND IGNORING PARENT RETURN VALUE @@ -39,7 +39,9 @@ . = ..() //ATTACK GHOST IGNORING PARENT RETURN VALUE -/obj/item/clockwork/construct_chassis/attack_ghost(mob/user) +/obj/item/clockwork/construct_chassis/attack_ghost(mob/dead/observer/user) + if(!user.can_reenter_round()) + return FALSE if(!SSticker.mode) to_chat(user, "You cannot use that before the game has started.") return diff --git a/code/modules/antagonists/clockcult/clock_items/replica_fabricator.dm b/code/modules/antagonists/clockcult/clock_items/replica_fabricator.dm index 741b251a4f..0365ae63af 100644 --- a/code/modules/antagonists/clockcult/clock_items/replica_fabricator.dm +++ b/code/modules/antagonists/clockcult/clock_items/replica_fabricator.dm @@ -44,16 +44,16 @@ speed_multiplier = initial(speed_multiplier) /obj/item/clockwork/replica_fabricator/examine(mob/living/user) - ..() + . = ..() if(is_servant_of_ratvar(user) || isobserver(user)) - to_chat(user, "Can be used to replace walls, floors, tables, windows, windoors, and airlocks with Clockwork variants.") - to_chat(user, "Can construct Clockwork Walls on Clockwork Floors and deconstruct Clockwork Walls to Clockwork Floors.") + . += "Can be used to replace walls, floors, tables, windows, windoors, and airlocks with Clockwork variants." + . += "Can construct Clockwork Walls on Clockwork Floors and deconstruct Clockwork Walls to Clockwork Floors." if(uses_power) - to_chat(user, "It can consume floor tiles, rods, metal, and plasteel for power at rates of 2:[DisplayPower(POWER_ROD)], 1:[DisplayPower(POWER_ROD)], 1:[DisplayPower(POWER_METAL)], \ - and 1:[DisplayPower(POWER_PLASTEEL)], respectively.") - to_chat(user, "It can also consume brass sheets for power at a rate of 1:[DisplayPower(POWER_FLOOR)].") - to_chat(user, "Use it in-hand to produce 5 brass sheets at a cost of [DisplayPower(POWER_WALL_TOTAL)] power.") - to_chat(user, "It has access to [DisplayPower(get_clockwork_power())] of power.") + . += "It can consume floor tiles, rods, metal, and plasteel for power at rates of 2:[DisplayPower(POWER_ROD)], 1:[DisplayPower(POWER_ROD)], 1:[DisplayPower(POWER_METAL)], \ + and 1:[DisplayPower(POWER_PLASTEEL)], respectively." + . += "It can also consume brass sheets for power at a rate of 1:[DisplayPower(POWER_FLOOR)]." + . += "Use it in-hand to produce 5 brass sheets at a cost of [DisplayPower(POWER_WALL_TOTAL)] power." + . += "It has access to [DisplayPower(get_clockwork_power())] of power." /obj/item/clockwork/replica_fabricator/attack_self(mob/living/user) if(is_servant_of_ratvar(user)) diff --git a/code/modules/antagonists/clockcult/clock_items/soul_vessel.dm b/code/modules/antagonists/clockcult/clock_items/soul_vessel.dm index d47bf4f316..d84338faea 100644 --- a/code/modules/antagonists/clockcult/clock_items/soul_vessel.dm +++ b/code/modules/antagonists/clockcult/clock_items/soul_vessel.dm @@ -39,7 +39,7 @@ /obj/item/mmi/posibrain/soul_vessel/examine(mob/user) if((is_servant_of_ratvar(user) || isobserver(user)) && clockwork_desc) desc = clockwork_desc - ..() + . = ..() desc = initial(desc) /obj/item/mmi/posibrain/soul_vessel/transfer_personality(mob/candidate) diff --git a/code/modules/antagonists/clockcult/clock_mobs.dm b/code/modules/antagonists/clockcult/clock_mobs.dm index 6268d15d44..9bdf03cbc7 100644 --- a/code/modules/antagonists/clockcult/clock_mobs.dm +++ b/code/modules/antagonists/clockcult/clock_mobs.dm @@ -57,7 +57,7 @@ msg += "[addendum]\n" msg += "*---------*" - to_chat(user, msg) + return list(msg) /mob/living/simple_animal/hostile/clockwork/proc/examine_info() //Override this on a by-mob basis to have unique examine info return diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm index 82c1291433..4ab481cfe2 100644 --- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm +++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm @@ -80,7 +80,7 @@ power_cost = 125 whispered = TRUE object_path = /obj/effect/clockwork/sigil/submission - creator_message = "A luminous sigil appears below you. Any non-Servants to cross it will be converted after 8 seconds if they do not move." + creator_message = "A luminous sigil appears below you. Any non-Servants to cross it will be converted and healed of some of their wounds after 8 seconds if they do not move." usage_tip = "This is the primary conversion method, though it will not penetrate mindshield implants." tier = SCRIPTURE_DRIVER one_per_tile = TRUE diff --git a/code/modules/antagonists/clockcult/clock_structure.dm b/code/modules/antagonists/clockcult/clock_structure.dm index 300e85e380..13da9c5a42 100644 --- a/code/modules/antagonists/clockcult/clock_structure.dm +++ b/code/modules/antagonists/clockcult/clock_structure.dm @@ -43,10 +43,10 @@ var/can_see_clockwork = is_servant_of_ratvar(user) || isobserver(user) if(can_see_clockwork && clockwork_desc) desc = clockwork_desc - ..() + . = ..() desc = initial(desc) if(unanchored_icon) - to_chat(user, "[src] is [anchored ? "":"not "]secured to the floor.") + . += "[src] is [anchored ? "":"not "]secured to the floor." /obj/structure/destructible/clockwork/examine_status(mob/user) if(is_servant_of_ratvar(user) || isobserver(user)) @@ -155,12 +155,12 @@ var/inactive_icon = null //icon_state while process() isn't being called /obj/structure/destructible/clockwork/powered/examine(mob/user) - ..() + . = ..() if(is_servant_of_ratvar(user) || isobserver(user)) if(!can_access_clockwork_power(src)) - to_chat(user, "It has no access to the power network! Create a sigil of transmission nearby.") + . += "It has no access to the power network! Create a sigil of transmission nearby." else - to_chat(user, "It has access to [DisplayPower(get_clockwork_power())] of power.") + . += "It has access to [DisplayPower(get_clockwork_power())] of power." /obj/structure/destructible/clockwork/powered/Destroy() SSfastprocess.processing -= src diff --git a/code/modules/antagonists/clockcult/clock_structures/_trap_object.dm b/code/modules/antagonists/clockcult/clock_structures/_trap_object.dm index 00a3406da1..47a37583ba 100644 --- a/code/modules/antagonists/clockcult/clock_structures/_trap_object.dm +++ b/code/modules/antagonists/clockcult/clock_structures/_trap_object.dm @@ -16,16 +16,16 @@ return ..() /obj/structure/destructible/clockwork/trap/examine(mob/user) - ..() + . = ..() if(is_servant_of_ratvar(user) || isobserver(user)) - to_chat(user, "It's wired to:") + . += "It's wired to:" if(!wired_to.len) - to_chat(user, "Nothing.") + . += "Nothing." else for(var/V in wired_to) var/obj/O = V var/distance = get_dist(src, O) - to_chat(user, "[O] ([distance == 0 ? "same tile" : "[distance] tiles [dir2text(get_dir(src, O))]"])") + . += "[O] ([distance == 0 ? "same tile" : "[distance] tiles [dir2text(get_dir(src, O))]"])" /obj/structure/destructible/clockwork/trap/wrench_act(mob/living/user, obj/item/I) if(!is_servant_of_ratvar(user)) @@ -71,6 +71,7 @@ return TRUE /obj/structure/destructible/clockwork/trap/proc/activate() + return //These objects send signals to normal traps to activate /obj/structure/destructible/clockwork/trap/trigger @@ -79,6 +80,14 @@ break_message = "The trigger breaks apart!" density = FALSE +/obj/structure/destructible/clockwork/trap/trigger/Initialize() + . = ..() + for(var/obj/structure/destructible/clockwork/trap/T in get_turf(src)) + if(!istype(T, /obj/structure/destructible/clockwork/trap/trigger)) + wired_to += T + T.wired_to += src + to_chat(usr, "[src] automatically links with [T] beneath it.") + /obj/structure/destructible/clockwork/trap/trigger/activate() for(var/obj/structure/destructible/clockwork/trap/T in wired_to) if(istype(T, /obj/structure/destructible/clockwork/trap/trigger)) //Triggers don't go off multiple times diff --git a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm index f735d6bb29..297856f531 100644 --- a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm +++ b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm @@ -223,34 +223,34 @@ /obj/structure/destructible/clockwork/massive/celestial_gateway/examine(mob/user) icon_state = "spatial_gateway" //cheat wildly by pretending to have an icon - ..() + . = ..() icon_state = initial(icon_state) if(is_servant_of_ratvar(user) || isobserver(user)) if(!active) - to_chat(user, "Time until the Ark's activation: [DisplayTimeText(get_arrival_time())]") + . += "Time until the Ark's activation: [DisplayTimeText(get_arrival_time())]" else if(grace_period) - to_chat(user, "Crew grace period time remaining: [DisplayTimeText(get_arrival_time())]") + . += "Crew grace period time remaining: [DisplayTimeText(get_arrival_time())]" else - to_chat(user, "Time until Ratvar's arrival: [DisplayTimeText(get_arrival_time())]") + . += "Time until Ratvar's arrival: [DisplayTimeText(get_arrival_time())]" switch(progress_in_seconds) if(-INFINITY to GATEWAY_REEBE_FOUND) - to_chat(user, "The Ark is feeding power into the bluespace field.") + . += "The Ark is feeding power into the bluespace field." if(GATEWAY_REEBE_FOUND to GATEWAY_RATVAR_COMING) - to_chat(user, "The field is ripping open a copy of itself in Ratvar's prison.") + . += "The field is ripping open a copy of itself in Ratvar's prison." if(GATEWAY_RATVAR_COMING to INFINITY) - to_chat(user, "With the bluespace field established, Ratvar is preparing to come through!") + . += "With the bluespace field established, Ratvar is preparing to come through!" else if(!active) - to_chat(user, "Whatever it is, it doesn't seem to be active.") + . += "Whatever it is, it doesn't seem to be active." else switch(progress_in_seconds) if(-INFINITY to GATEWAY_REEBE_FOUND) - to_chat(user, "You see a swirling bluespace anomaly steadily growing in intensity.") + . += "You see a swirling bluespace anomaly steadily growing in intensity." if(GATEWAY_REEBE_FOUND to GATEWAY_RATVAR_COMING) - to_chat(user, "The anomaly is stable, and you can see flashes of something from it.") + . += "The anomaly is stable, and you can see flashes of something from it." if(GATEWAY_RATVAR_COMING to INFINITY) - to_chat(user, "The anomaly is stable! Something is coming through!") + . += "The anomaly is stable! Something is coming through!" /obj/structure/destructible/clockwork/massive/celestial_gateway/process() if(seconds_until_activation == -1) //we never do anything diff --git a/code/modules/antagonists/clockcult/clock_structures/clockwork_obelisk.dm b/code/modules/antagonists/clockcult/clock_structures/clockwork_obelisk.dm index cb13fdd616..058bd9d24e 100644 --- a/code/modules/antagonists/clockcult/clock_structures/clockwork_obelisk.dm +++ b/code/modules/antagonists/clockcult/clock_structures/clockwork_obelisk.dm @@ -21,9 +21,9 @@ toggle(1) /obj/structure/destructible/clockwork/powered/clockwork_obelisk/examine(mob/user) - ..() + . = ..() if(is_servant_of_ratvar(user) || isobserver(user)) - to_chat(user, "It requires [DisplayPower(hierophant_cost)] to broadcast over the Hierophant Network, and [DisplayPower(gateway_cost)] to open a Spatial Gateway.") + . += "It requires [DisplayPower(hierophant_cost)] to broadcast over the Hierophant Network, and [DisplayPower(gateway_cost)] to open a Spatial Gateway." /obj/structure/destructible/clockwork/powered/clockwork_obelisk/can_be_unfasten_wrench(mob/user, silent) if(active) diff --git a/code/modules/antagonists/clockcult/clock_structures/heralds_beacon.dm b/code/modules/antagonists/clockcult/clock_structures/heralds_beacon.dm index 3a461b7745..7d8b206f41 100644 --- a/code/modules/antagonists/clockcult/clock_structures/heralds_beacon.dm +++ b/code/modules/antagonists/clockcult/clock_structures/heralds_beacon.dm @@ -47,16 +47,16 @@ STOP_PROCESSING(SSprocessing, src) /obj/structure/destructible/clockwork/heralds_beacon/examine(mob/user) - ..() + . = ..() if(isobserver(user) || is_servant_of_ratvar(user)) if(!available) if(!GLOB.ratvar_approaches) - to_chat(user, "It can no longer be activated.") + . += "It can no longer be activated." else - to_chat(user, "It has been activated!") + . += "It has been activated!" else - to_chat(user, "There are [time_remaining] second[time_remaining != 1 ? "s" : ""] remaining to vote.") - to_chat(user, "There are [voters.len]/[votes_needed] votes to activate the beacon!") + . += "There are [time_remaining] second[time_remaining != 1 ? "s" : ""] remaining to vote." + . += "There are [voters.len]/[votes_needed] votes to activate the beacon!" /obj/structure/destructible/clockwork/heralds_beacon/attack_hand(mob/living/user) . = ..() diff --git a/code/modules/antagonists/clockcult/clock_structures/mania_motor.dm b/code/modules/antagonists/clockcult/clock_structures/mania_motor.dm index df1231442a..9b4ac8085c 100644 --- a/code/modules/antagonists/clockcult/clock_structures/mania_motor.dm +++ b/code/modules/antagonists/clockcult/clock_structures/mania_motor.dm @@ -17,9 +17,9 @@ var/mania_cost = 150 /obj/structure/destructible/clockwork/powered/mania_motor/examine(mob/user) - ..() + . = ..() if(is_servant_of_ratvar(user) || isobserver(user)) - to_chat(user, "It requires [DisplayPower(mania_cost)] to run.") + . += "It requires [DisplayPower(mania_cost)] to run." /obj/structure/destructible/clockwork/powered/mania_motor/forced_disable(bad_effects) if(active) diff --git a/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm b/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm index 7afd9e7dbc..d0940ebb7a 100644 --- a/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm +++ b/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm @@ -25,8 +25,8 @@ return ..() /obj/structure/destructible/clockwork/ocular_warden/examine(mob/user) - ..() - to_chat(user, "[target ? "It's fixated on [target]!" : "Its gaze is wandering aimlessly."]") + . = ..() + . += "[target ? "It's fixated on [target]!" : "Its gaze is wandering aimlessly."]" /obj/structure/destructible/clockwork/ocular_warden/hulk_damage() return 25 @@ -110,9 +110,7 @@ if(!(BI.resistance_flags & ON_FIRE)) BI.fire_act() continue - if(is_servant_of_ratvar(L) || (HAS_TRAIT(L, TRAIT_BLIND)) || L.anti_magic_check(TRUE, TRUE)) - continue - if(L.stat || L.lying) + if(is_servant_of_ratvar(L) || (HAS_TRAIT(L, TRAIT_BLIND)) || L.anti_magic_check(TRUE, TRUE) || L.incapacitated(TRUE)) continue if (iscarbon(L)) var/mob/living/carbon/c = L diff --git a/code/modules/antagonists/clockcult/clock_structures/stargazer.dm b/code/modules/antagonists/clockcult/clock_structures/stargazer.dm index 57f83c55aa..fbaee79959 100644 --- a/code/modules/antagonists/clockcult/clock_structures/stargazer.dm +++ b/code/modules/antagonists/clockcult/clock_structures/stargazer.dm @@ -25,11 +25,11 @@ . = ..() /obj/structure/destructible/clockwork/stargazer/examine(mob/user) - ..() + . = ..() if(is_servant_of_ratvar(user)) - to_chat(user, "Generates [DisplayPower(STARGAZER_POWER)] per second while viewing starlight within [STARGAZER_RANGE] tiles.") + . += "Generates [DisplayPower(STARGAZER_POWER)] per second while viewing starlight within [STARGAZER_RANGE] tiles." if(star_light_star_bright) - to_chat(user, "[is_servant_of_ratvar(user) ? "It can see starlight!" : "It's shining brilliantly!"]") + . += "[is_servant_of_ratvar(user) ? "It can see starlight!" : "It's shining brilliantly!"]" /obj/structure/destructible/clockwork/stargazer/process() star_light_star_bright = check_starlight() diff --git a/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor.dm b/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor.dm index 94f0ba7112..af29bc9b31 100644 --- a/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor.dm +++ b/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor.dm @@ -7,18 +7,10 @@ icon_state = "pressure_sensor" alpha = 50 -/obj/structure/destructible/clockwork/trap/trigger/Initialize() - . = ..() - for(var/obj/structure/destructible/clockwork/trap/T in get_turf(src)) - if(!istype(T, /obj/structure/destructible/clockwork/trap/trigger)) - wired_to += T - T.wired_to += src - to_chat(usr, "[src] automatically links with [T] beneath it.") - /obj/structure/destructible/clockwork/trap/trigger/pressure_sensor/Crossed(atom/movable/AM) if(isliving(AM) && !is_servant_of_ratvar(AM)) var/mob/living/L = AM - if(L.stat || L.m_intent == MOVE_INTENT_WALK || L.lying) + if(L.stat || L.m_intent == MOVE_INTENT_WALK || L.movement_type & (FLYING|FLOATING)) return audible_message("*click*") playsound(src, 'sound/items/screwdriver2.ogg', 50, TRUE) diff --git a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm index ebfb219c9a..2f0db73bfc 100644 --- a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm +++ b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm @@ -113,7 +113,7 @@ "You start tenderly lifting [skewee] off of [src]...") if(!do_after(user, 60, target = skewee)) skewee.visible_message("[skewee] painfully slides back down [src].") - skewee.emote("moan") + skewee.say("Oof, ouch owwie!!", forced = "fail brass skewer removal") return skewee.visible_message("[skewee] comes free of [src] with a squelching pop!", \ "You come free of [src]!") diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index fc4d945d51..beea67e596 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -651,7 +651,7 @@ /obj/item/melee/blood_magic/manipulator/examine(mob/user) . = ..() if(iscultist(user)) - to_chat(user, "The [name] currently has [uses] blood charges left.") + . += "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) diff --git a/code/modules/antagonists/cult/cult.dm b/code/modules/antagonists/cult/cult.dm index 47cf2abf3f..9989058d43 100644 --- a/code/modules/antagonists/cult/cult.dm +++ b/code/modules/antagonists/cult/cult.dm @@ -35,7 +35,6 @@ /datum/antagonist/cult/proc/add_objectives() objectives |= cult_team.objectives - owner.objectives |= objectives /datum/antagonist/cult/Destroy() QDEL_NULL(communion) diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 06ea2cbe0a..5fe941d32f 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -119,10 +119,11 @@ AddComponent(/datum/component/butchering, 50, 80) /obj/item/twohanded/required/cult_bastard/examine(mob/user) + . = ..() if(contents.len) - desc+="
    There are [contents.len] souls trapped within the sword's core." + . += "
    There are [contents.len] souls trapped within the sword's core." else - desc+="
    The sword appears to be quite lifeless." + . += "
    The sword appears to be quite lifeless." /obj/item/twohanded/required/cult_bastard/can_be_pulled(user) return FALSE @@ -493,7 +494,7 @@ desc = "You peer within this smokey orb and glimpse terrible fates befalling the escape shuttle." icon = 'icons/obj/cult.dmi' icon_state ="shuttlecurse" - var/global/curselimit = 0 + var/static/curselimit = 0 /obj/item/shuttle_curse/attack_self(mob/living/user) if(!iscultist(user)) @@ -530,7 +531,7 @@ playsound(user.loc, 'sound/effects/glassbr1.ogg', 50, 1) qdel(src) sleep(20) - var/global/list/curses + var/static/list/curses if(!curses) curses = list("A fuel technician just slit his own throat and begged for death.", "The shuttle's navigation programming was replaced by a file containing just two words: IT COMES.", @@ -557,11 +558,11 @@ var/uses = 4 /obj/item/cult_shift/examine(mob/user) - ..() + . = ..() if(uses) - to_chat(user, "It has [uses] use\s remaining.") + . += "It has [uses] use\s remaining." else - to_chat(user, "It seems drained.") + . += "It seems drained." /obj/item/cult_shift/proc/handle_teleport_grab(turf/T, mob/user) var/mob/living/carbon/C = user diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm index 0dd6b08c4d..f38f379abe 100644 --- a/code/modules/antagonists/cult/cult_structures.dm +++ b/code/modules/antagonists/cult/cult_structures.dm @@ -29,10 +29,10 @@ /obj/structure/destructible/cult/examine(mob/user) - ..() - to_chat(user, "\The [src] is [anchored ? "":"not "]secured to the floor.") + . = ..() + . += "\The [src] is [anchored ? "":"not "]secured to the floor." if((iscultist(user) || isobserver(user)) && cooldowntime > world.time) - to_chat(user, "The magic in [src] is too weak, [p_they()] will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].") + . += "The magic in [src] is too weak, [p_they()] will be ready to use again in [DisplayTimeText(cooldowntime - world.time)]." /obj/structure/destructible/cult/examine_status(mob/user) if(iscultist(user) || isobserver(user)) diff --git a/code/modules/antagonists/cult/ritual.dm b/code/modules/antagonists/cult/ritual.dm index b9e4da8677..ff12a835ef 100644 --- a/code/modules/antagonists/cult/ritual.dm +++ b/code/modules/antagonists/cult/ritual.dm @@ -15,12 +15,12 @@ This file contains the cult dagger and rune list code GLOB.rune_types[initial(R.cultist_name)] = R //Uses the cultist name for displaying purposes /obj/item/melee/cultblade/dagger/examine(mob/user) - ..() + . = ..() if(iscultist(user) || isobserver(user)) - to_chat(user, "The scriptures of the Geometer. Allows the scribing of runes and access to the knowledge archives of the cult of Nar'Sie.") - to_chat(user, "Striking a cult structure will unanchor or reanchor it.") - to_chat(user, "Striking another cultist with it will purge holy water from them.") - to_chat(user, "Striking a noncultist, however, will tear their flesh.") + . += "The scriptures of the Geometer. Allows the scribing of runes and access to the knowledge archives of the cult of Nar'Sie." + . += "Striking a cult structure will unanchor or reanchor it." + . += "Striking another cultist with it will purge holy water from them." + . += "Striking a noncultist, however, will tear their flesh." /obj/item/melee/cultblade/dagger/attack(mob/living/M, mob/living/user) if(iscultist(M)) diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index f0fc59834c..da002e568c 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -47,13 +47,13 @@ Runes can either be invoked by one's self or with many different cultists. Each add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/silicons, "cult_runes", I) /obj/effect/rune/examine(mob/user) - ..() + . = ..() if(iscultist(user) || user.stat == DEAD) //If they're a cultist or a ghost, tell them the effects - to_chat(user, "Name: [cultist_name]") - to_chat(user, "Effects: [capitalize(cultist_desc)]") - to_chat(user, "Required Acolytes: [req_cultists_text ? "[req_cultists_text]":"[req_cultists]"]") + . += "Name: [cultist_name]" + . += "Effects: [capitalize(cultist_desc)]" + . += "Required Acolytes: [req_cultists_text ? "[req_cultists_text]":"[req_cultists]"]" if(req_keyword && keyword) - to_chat(user, "Keyword: [keyword]") + . += "Keyword: [keyword]" /obj/effect/rune/attackby(obj/I, mob/user, params) if(istype(I, /obj/item/melee/cultblade/dagger) && iscultist(user)) @@ -249,7 +249,7 @@ structure_check() searches for nearby cultist structures required for the invoca convertee.adjustFireLoss(-(burndamage * 0.75)) convertee.visible_message("[convertee] writhes in pain \ [brutedamage || burndamage ? "even as [convertee.p_their()] wounds heal and close" : "as the markings below [convertee.p_them()] glow a bloody red"]!", \ - "AAAAAAAAAAAAAA-") + "AAAAAAAAAAAAAA-") SSticker.mode.add_cultist(convertee.mind, 1) new /obj/item/melee/cultblade/dagger(get_turf(src)) convertee.mind.special_role = ROLE_CULTIST @@ -525,10 +525,10 @@ structure_check() searches for nearby cultist structures required for the invoca var/static/revives_used = -SOULS_TO_REVIVE // Cultists get one "free" revive /obj/effect/rune/raise_dead/examine(mob/user) - ..() + . = ..() if(iscultist(user) || user.stat == DEAD) var/revive_number = LAZYLEN(GLOB.sacrificed) - revives_used - to_chat(user, "Revives Remaining: [revive_number]") + . += "Revives Remaining: [revive_number]" /obj/effect/rune/raise_dead/invoke(var/list/invokers) var/turf/T = get_turf(src) @@ -622,11 +622,11 @@ structure_check() searches for nearby cultist structures required for the invoca GLOB.wall_runes += src /obj/effect/rune/wall/examine(mob/user) - ..() + . = ..() if(density && iscultist(user)) var/datum/timedevent/TMR = active_timers[1] if(TMR) - to_chat(user, "The air above this rune has hardened into a barrier that will last [DisplayTimeText(TMR.timeToRun - world.time)].") + . += "The air above this rune has hardened into a barrier that will last [DisplayTimeText(TMR.timeToRun - world.time)]." /obj/effect/rune/wall/Destroy() GLOB.wall_runes -= src @@ -848,10 +848,10 @@ structure_check() searches for nearby cultist structures required for the invoca fail_invoke() log_game("Manifest rune failed - too many summoned ghosts") return list() - notify_ghosts("Manifest rune invoked in [get_area(src)].", 'sound/effects/ghost2.ogg', source = src) + notify_ghosts("Manifest rune invoked in [get_area(src)].", 'sound/effects/ghost2.ogg', source = src, ignore_dnr_observers = TRUE) var/list/ghosts_on_rune = list() for(var/mob/dead/observer/O in T) - if(O.client && !jobban_isbanned(O, ROLE_CULTIST) && !QDELETED(src) && !QDELETED(O)) + if(!QDELETED(O) && O.client && !jobban_isbanned(O, ROLE_CULTIST) && !QDELETED(src) && O.can_reenter_round()) ghosts_on_rune += O if(!ghosts_on_rune.len) to_chat(user, "There are no spirits near [src]!") diff --git a/code/modules/antagonists/devil/devil.dm b/code/modules/antagonists/devil/devil.dm index dc649025d2..2e38734b6f 100644 --- a/code/modules/antagonists/devil/devil.dm +++ b/code/modules/antagonists/devil/devil.dm @@ -549,7 +549,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", var/list/parts = list() parts += printplayer(owner) parts += printdevilinfo() - parts += printobjectives(owner) + parts += printobjectives(objectives) return parts.Join("
    ") //A simple super light weight datum for the codex gigas. diff --git a/code/modules/antagonists/devil/imp/imp.dm b/code/modules/antagonists/devil/imp/imp.dm index da51a5d698..fa5263059a 100644 --- a/code/modules/antagonists/devil/imp/imp.dm +++ b/code/modules/antagonists/devil/imp/imp.dm @@ -57,3 +57,18 @@ visible_message("[src] screams in agony as it sublimates into a sulfurous smoke.") ghostize() qdel(src) + +/datum/antagonist/imp + name = "Imp" + antagpanel_category = "Devil" + show_in_roundend = FALSE + +/datum/antagonist/imp/on_gain() + . = ..() + give_objectives() + +/datum/antagonist/imp/proc/give_objectives() + var/datum/objective/newobjective = new + newobjective.explanation_text = "Try to get a promotion to a higher devilic rank." + newobjective.owner = owner + objectives += newobjective \ No newline at end of file diff --git a/code/modules/antagonists/devil/true_devil/_true_devil.dm b/code/modules/antagonists/devil/true_devil/_true_devil.dm index afe439f02c..fc50a0ecf5 100644 --- a/code/modules/antagonists/devil/true_devil/_true_devil.dm +++ b/code/modules/antagonists/devil/true_devil/_true_devil.dm @@ -64,26 +64,25 @@ /mob/living/carbon/true_devil/examine(mob/user) - var/msg = "*---------*\nThis is [icon2html(src, user)] [src]!\n" + . = list("*---------*\nThis is [icon2html(src, user)] [src]!") //Left hand items for(var/obj/item/I in held_items) if(!(I.item_flags & ABSTRACT)) - msg += "It is holding [I.get_examine_string(user)] in its [get_held_index_name(get_held_index_of_item(I))].\n" + . += "It is holding [I.get_examine_string(user)] in its [get_held_index_name(get_held_index_of_item(I))]." //Braindead if(!client && stat != DEAD) - msg += "The devil seems to be in deep contemplation.\n" + . += "The devil seems to be in deep contemplation." //Damaged if(stat == DEAD) - msg += "The hellfire seems to have been extinguished, for now at least.\n" + . += "The hellfire seems to have been extinguished, for now at least." else if(health < (maxHealth/10)) - msg += "You can see hellfire inside its gaping wounds.\n" + . += "You can see hellfire inside its gaping wounds." else if(health < (maxHealth/2)) - msg += "You can see hellfire inside its wounds.\n" - msg += "*---------*" - to_chat(user, msg) + . += "You can see hellfire inside its wounds." + . += "*---------*" /mob/living/carbon/true_devil/IsAdvancedToolUser() return 1 @@ -106,7 +105,7 @@ /mob/living/carbon/true_devil/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) return 666 -/mob/living/carbon/true_devil/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0) +/mob/living/carbon/true_devil/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0) if(mind && has_bane(BANE_LIGHT)) mind.disrupt_spells(-500) return ..() //flashes don't stop devils UNLESS it's their bane. @@ -147,13 +146,8 @@ if(ascended || user.mind.soulOwner == src.mind) var/mob/living/simple_animal/imp/S = new(get_turf(loc)) user.transfer_ckey(S, FALSE) - S.mind.assigned_role = "Imp" - S.mind.special_role = "Imp" - var/datum/objective/newobjective = new - newobjective.explanation_text = "Try to get a promotion to a higher devilic rank." - S.mind.objectives += newobjective - to_chat(S, S.playstyle_string) - to_chat(S, "Objective #[1]: [newobjective.explanation_text]") + var/datum/antagonist/imp/A = new() + S.mind.add_antag_datum(A) else return ..() diff --git a/code/modules/antagonists/disease/disease_datum.dm b/code/modules/antagonists/disease/disease_datum.dm index eb0feac0a2..1aef9ceba6 100644 --- a/code/modules/antagonists/disease/disease_datum.dm +++ b/code/modules/antagonists/disease/disease_datum.dm @@ -10,12 +10,10 @@ var/datum/objective/O = new /datum/objective/disease_infect() O.owner = owner objectives += O - owner.objectives += O O = new /datum/objective/disease_infect_centcom() O.owner = owner objectives += O - owner.objectives += O . = ..() diff --git a/code/modules/antagonists/disease/disease_event.dm b/code/modules/antagonists/disease/disease_event.dm index 385cee998b..4365fd7538 100644 --- a/code/modules/antagonists/disease/disease_event.dm +++ b/code/modules/antagonists/disease/disease_event.dm @@ -3,6 +3,7 @@ name = "Spawn Sentient Disease" typepath = /datum/round_event/ghost_role/sentient_disease weight = 7 + gamemode_blacklist = list("dynamic") max_occurrences = 1 min_players = 5 diff --git a/code/modules/antagonists/disease/disease_mob.dm b/code/modules/antagonists/disease/disease_mob.dm index faea113ac5..6ac3f93764 100644 --- a/code/modules/antagonists/disease/disease_mob.dm +++ b/code/modules/antagonists/disease/disease_mob.dm @@ -9,7 +9,7 @@ the new instance inside the host to be updated to the template's stats. name = "Sentient Disease" real_name = "Sentient Disease" desc = "" - icon = 'icons/mob/blob.dmi' + icon = 'icons/mob/cameramob.dmi' icon_state = "marker" mouse_opacity = MOUSE_OPACITY_ICON move_on_shuttle = FALSE @@ -97,14 +97,14 @@ the new instance inside the host to be updated to the template's stats. /mob/camera/disease/examine(mob/user) - ..() + . = ..() if(isobserver(user)) - to_chat(user, "[src] has [points]/[total_points] adaptation points.") - to_chat(user, "[src] has the following unlocked:") + . += "[src] has [points]/[total_points] adaptation points." + . += "[src] has the following unlocked:" for(var/A in purchased_abilities) var/datum/disease_ability/B = A if(istype(B)) - to_chat(user, "[B.name]") + . += "[B.name]" /mob/camera/disease/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) return diff --git a/code/modules/antagonists/ert/ert.dm b/code/modules/antagonists/ert/ert.dm index bb24af4f7a..5968c7643a 100644 --- a/code/modules/antagonists/ert/ert.dm +++ b/code/modules/antagonists/ert/ert.dm @@ -113,7 +113,6 @@ /datum/antagonist/ert/proc/forge_objectives() if(ert_team) objectives |= ert_team.objectives - owner.objectives |= objectives /datum/antagonist/ert/proc/equipERT() var/mob/living/carbon/human/H = owner.current diff --git a/code/modules/antagonists/greentext/greentext.dm b/code/modules/antagonists/greentext/greentext.dm index ffaab71aca..13a3c2a07a 100644 --- a/code/modules/antagonists/greentext/greentext.dm +++ b/code/modules/antagonists/greentext/greentext.dm @@ -8,7 +8,6 @@ O.completed = TRUE //YES! O.owner = owner objectives += O - owner.objectives += objectives /datum/antagonist/greentext/on_gain() forge_objectives() diff --git a/code/modules/antagonists/highlander/highlander.dm b/code/modules/antagonists/highlander/highlander.dm index 51e8d9a13b..49635356ac 100644 --- a/code/modules/antagonists/highlander/highlander.dm +++ b/code/modules/antagonists/highlander/highlander.dm @@ -24,8 +24,6 @@ hijack_objective.owner = owner objectives += hijack_objective - owner.objectives |= objectives - /datum/antagonist/highlander/on_gain() forge_objectives() owner.special_role = "highlander" diff --git a/code/modules/antagonists/magic_servant/magic_servant.dm b/code/modules/antagonists/magic_servant/magic_servant.dm new file mode 100644 index 0000000000..31b51f59f6 --- /dev/null +++ b/code/modules/antagonists/magic_servant/magic_servant.dm @@ -0,0 +1,9 @@ +/datum/antagonist/magic_servant + name = "Magic Servant" + show_in_roundend = FALSE + show_in_antagpanel = FALSE + +/datum/antagonist/magic_servant/proc/setup_master(mob/M) + var/datum/objective/O = new("Serve [M.real_name].") + O.owner = owner + objectives |= O \ No newline at end of file diff --git a/code/modules/antagonists/monkey/monkey.dm b/code/modules/antagonists/monkey/monkey.dm index 9ce28eb60d..e480eb8674 100644 --- a/code/modules/antagonists/monkey/monkey.dm +++ b/code/modules/antagonists/monkey/monkey.dm @@ -63,7 +63,6 @@ /datum/antagonist/monkey/proc/forge_objectives() objectives |= monkey_team.objectives - owner.objectives |= objectives /datum/antagonist/monkey/admin_remove(mob/admin) var/mob/living/carbon/monkey/M = owner.current diff --git a/code/modules/antagonists/morph/morph.dm b/code/modules/antagonists/morph/morph.dm index 12f8d22897..ad2eb4792a 100644 --- a/code/modules/antagonists/morph/morph.dm +++ b/code/modules/antagonists/morph/morph.dm @@ -52,12 +52,11 @@ /mob/living/simple_animal/hostile/morph/examine(mob/user) if(morphed) - form.examine(user) // Refactor examine to return desc so it's static? Not sure if worth it + . = form.examine(user) if(get_dist(user,src)<=3) - to_chat(user, "It doesn't look quite right...") + . += "It doesn't look quite right..." else - ..() - return + . = ..() /mob/living/simple_animal/hostile/morph/med_hud_set_health() if(morphed && !isliving(form)) diff --git a/code/modules/antagonists/ninja/ninja.dm b/code/modules/antagonists/ninja/ninja.dm index a8bce90f1c..52e13bdc69 100644 --- a/code/modules/antagonists/ninja/ninja.dm +++ b/code/modules/antagonists/ninja/ninja.dm @@ -96,7 +96,6 @@ var/datum/objective/O = new /datum/objective/survive() O.owner = owner objectives += O - owner.objectives |= objectives /proc/remove_ninja(mob/living/L) if(!L || !L.mind) diff --git a/code/modules/antagonists/nukeop/equipment/borgchameleon.dm b/code/modules/antagonists/nukeop/equipment/borgchameleon.dm new file mode 100644 index 0000000000..e25e0cd164 --- /dev/null +++ b/code/modules/antagonists/nukeop/equipment/borgchameleon.dm @@ -0,0 +1,181 @@ +/obj/item/borg_chameleon + name = "cyborg chameleon projector" + icon = 'icons/obj/device.dmi' + icon_state = "shield0" + flags_1 = CONDUCT_1 + item_flags = NOBLUDGEON + item_state = "electronic" + lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' + w_class = WEIGHT_CLASS_SMALL + var/friendlyName + var/savedName + var/active = FALSE + var/activationCost = 300 + var/activationUpkeep = 50 + var/disguise = null + var/disguise_icon_override = null + var/disguise_pixel_offset = null + var/mob/listeningTo + var/static/list/signalCache = list( // list here all signals that should break the camouflage + COMSIG_PARENT_ATTACKBY, + COMSIG_ATOM_ATTACK_HAND, + COMSIG_MOVABLE_IMPACT_ZONE, + COMSIG_ATOM_BULLET_ACT, + COMSIG_ATOM_EX_ACT, + COMSIG_ATOM_FIRE_ACT, + COMSIG_ATOM_EMP_ACT, + ) + var/mob/living/silicon/robot/user // needed for process() + var/animation_playing = FALSE + + var/list/engymodels = list("Default", "Default - Treads", "Heavy", "Sleek", "Marina", "Can", "Spider", "Loader","Handy", "Pup Dozer", "Vale") + + +/obj/item/borg_chameleon/Initialize() + . = ..() + friendlyName = pick(GLOB.ai_names) + +/obj/item/borg_chameleon/Destroy() + listeningTo = null + return ..() + +/obj/item/borg_chameleon/dropped(mob/user) + . = ..() + disrupt(user) + +/obj/item/borg_chameleon/equipped(mob/user) + . = ..() + disrupt(user) + +/obj/item/borg_chameleon/attack_self(mob/living/silicon/robot/user) + if (user && user.cell && user.cell.charge > activationCost) + if (isturf(user.loc)) + toggle(user) + else + to_chat(user, "You can't use [src] while inside something!") + else + to_chat(user, "You need at least [activationCost] charge in your cell to use [src]!") + +/obj/item/borg_chameleon/proc/toggle(mob/living/silicon/robot/user) + if(active) + playsound(src, 'sound/effects/pop.ogg', 100, TRUE, -6) + to_chat(user, "You deactivate \the [src].") + deactivate(user) + else + if(animation_playing) + to_chat(user, "\the [src] is recharging.") + return + var/borg_icon = input(user, "Select an icon!", "Robot Icon", null) as null|anything in engymodels + if(!borg_icon) + return FALSE + switch(borg_icon) + if("Default") + disguise = "engineer" + disguise_icon_override = 'icons/mob/robots.dmi' + if("Default - Treads") + disguise = "engi-tread" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Loader") + disguise = "loaderborg" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Handy") + disguise = "handyeng" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Sleek") + disguise = "sleekeng" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Can") + disguise = "caneng" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Marina") + disguise = "marinaeng" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Spider") + disguise = "spidereng" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Heavy") + disguise = "heavyeng" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Pup Dozer") + disguise = "pupdozer" + disguise_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + disguise_pixel_offset = -16 + if("Vale") + disguise = "valeeng" + disguise_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + disguise_pixel_offset = -16 + animation_playing = TRUE + to_chat(user, "You activate \the [src].") + playsound(src, 'sound/effects/seedling_chargeup.ogg', 100, TRUE, -6) + var/start = user.filters.len + var/X,Y,rsq,i,f + for(i=1, i<=7, ++i) + do + X = 60*rand() - 30 + Y = 60*rand() - 30 + rsq = X*X + Y*Y + while(rsq<100 || rsq>900) + user.filters += filter(type="wave", x=X, y=Y, size=rand()*2.5+0.5, offset=rand()) + for(i=1, i<=7, ++i) + f = user.filters[start+i] + animate(f, offset=f:offset, time=0, loop=3, flags=ANIMATION_PARALLEL) + animate(offset=f:offset-1, time=rand()*20+10) + if (do_after(user, 50, target=user) && user.cell.use(activationCost)) + playsound(src, 'sound/effects/bamf.ogg', 100, TRUE, -6) + to_chat(user, "You are now disguised as the Nanotrasen engineering borg \"[friendlyName]\".") + activate(user) + else + to_chat(user, "The chameleon field fizzles.") + do_sparks(3, FALSE, user) + for(i=1, i<=min(7, user.filters.len), ++i) // removing filters that are animating does nothing, we gotta stop the animations first + f = user.filters[start+i] + animate(f) + user.filters = null + animation_playing = FALSE + +/obj/item/borg_chameleon/process() + if (user) + if (!user.cell || !user.cell.use(activationUpkeep)) + disrupt(user) + else + return PROCESS_KILL + +/obj/item/borg_chameleon/proc/activate(mob/living/silicon/robot/user) + START_PROCESSING(SSobj, src) + src.user = user + savedName = user.name + user.name = friendlyName + user.module.cyborg_base_icon = disguise + user.module.cyborg_icon_override = disguise_icon_override + user.module.cyborg_pixel_offset = disguise_pixel_offset + user.bubble_icon = "robot" + active = TRUE + user.update_icons() + + if(listeningTo == user) + return + if(listeningTo) + UnregisterSignal(listeningTo, signalCache) + RegisterSignal(user, signalCache, .proc/disrupt) + listeningTo = user + +/obj/item/borg_chameleon/proc/deactivate(mob/living/silicon/robot/user) + STOP_PROCESSING(SSobj, src) + if(listeningTo) + UnregisterSignal(listeningTo, signalCache) + listeningTo = null + do_sparks(5, FALSE, user) + user.name = savedName + user.module.cyborg_base_icon = initial(user.module.cyborg_base_icon) + user.module.cyborg_icon_override = 'icons/mob/robots.dmi' + user.bubble_icon = "syndibot" + active = FALSE + user.update_icons() + user.pixel_x = 0 //this solely exists because of dogborgs. I want anyone who ever reads this code later on to know this. Don't ask me why it's here, doesn't work above update_icons() + src.user = user + +/obj/item/borg_chameleon/proc/disrupt(mob/living/silicon/robot/user) + if(active) + to_chat(user, "Your chameleon field deactivates.") + deactivate(user) \ No newline at end of file diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm index 779dfb43a7..0a223f8b10 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm @@ -64,7 +64,7 @@ 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 + 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 @@ -74,6 +74,11 @@ GLOBAL_VAR_INIT(war_declared, FALSE) 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)) + if(istype(SSticker.mode, /datum/game_mode/dynamic)) + var/datum/game_mode/dynamic/mode = SSticker.mode + var/threat_spent = CONFIG_GET(number/dynamic_warops_cost) + mode.spend_threat(threat_spent) + mode.log_threat("Nuke ops spent [threat_spent] on war ops.") SSblackbox.record_feedback("amount", "nuclear_challenge_mode", 1) qdel(src) @@ -94,6 +99,14 @@ GLOBAL_VAR_INIT(war_declared, FALSE) if(board.moved) to_chat(user, "The shuttle has already been moved! You have forfeit the right to declare war.") return FALSE + if(istype(SSticker.mode, /datum/game_mode/dynamic)) + var/datum/game_mode/dynamic/mode = SSticker.mode + if(mode.threat_level < CONFIG_GET(number/dynamic_warops_requirement)) + to_chat(user, "Due to the dynamic space in which the station resides, you are too deep into Nanotrasen territory to reasonably go loud.") + return FALSE + else if(mode.threat < CONFIG_GET(number/dynamic_warops_cost)) + to_chat(user, "Due to recent threats on the station, Nanotrasen is looking too closely for a war declaration to be wise.") + return FALSE return TRUE /obj/item/nuclear_challenge/clownops diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm index add3c1d9b0..8021ee5f08 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm @@ -55,9 +55,9 @@ /obj/machinery/nuclearbomb/examine(mob/user) . = ..() if(exploding) - to_chat(user, "It is in the process of exploding. Perhaps reviewing your affairs is in order.") + . += "It is in the process of exploding. Perhaps reviewing your affairs is in order." if(timing) - to_chat(user, "There are [get_time_left()] seconds until detonation.") + . += "There are [get_time_left()] seconds until detonation." /obj/machinery/nuclearbomb/selfdestruct name = "station self-destruct terminal" @@ -343,10 +343,10 @@ /obj/machinery/nuclearbomb/proc/set_anchor() - if(!isinspace()) - anchored = !anchored - else + if(isinspace() && !anchored) to_chat(usr, "There is nothing to anchor to!") + else + anchored = !anchored /obj/machinery/nuclearbomb/proc/set_safety() safety = !safety @@ -472,9 +472,9 @@ /obj/machinery/nuclearbomb/beer/examine(mob/user) . = ..() if(keg.reagents.total_volume) - to_chat(user, "It has [keg.reagents.total_volume] unit\s left.") + . += "It has [keg.reagents.total_volume] unit\s left." else - to_chat(user, "It's empty.") + . += "It's empty." /obj/machinery/nuclearbomb/beer/attackby(obj/item/W, mob/user, params) if(W.is_refillable()) @@ -615,7 +615,7 @@ This is here to make the tiles around the station mininuke change when it's arme var/captain = user.mind && user.mind.assigned_role == "Captain" var/nukie = user.mind && user.mind.has_antag_datum(/datum/antagonist/nukeop) if(ghost || captain || nukie) - to_chat(user, "The serial numbers on [src] are incorrect.") + . += "The serial numbers on [src] are incorrect." /obj/item/disk/nuclear/attackby(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/claymore/highlander) && !fake) diff --git a/code/modules/antagonists/nukeop/equipment/pinpointer.dm b/code/modules/antagonists/nukeop/equipment/pinpointer.dm index 538feba008..db9ff4e609 100644 --- a/code/modules/antagonists/nukeop/equipment/pinpointer.dm +++ b/code/modules/antagonists/nukeop/equipment/pinpointer.dm @@ -2,7 +2,7 @@ var/mode = TRACK_NUKE_DISK /obj/item/pinpointer/nuke/examine(mob/user) - ..() + . = ..() var/msg = "Its tracking indicator reads " switch(mode) if(TRACK_NUKE_DISK) @@ -13,10 +13,10 @@ msg += "\"vasvygengbefuvc\"." else msg = "Its tracking indicator is blank." - to_chat(user, msg) + . += msg for(var/obj/machinery/nuclearbomb/bomb in GLOB.machines) if(bomb.timing) - to_chat(user, "Extreme danger. Arming signal detected. Time remaining: [bomb.get_time_left()].") + . += "Extreme danger. Arming signal detected. Time remaining: [bomb.get_time_left()]." /obj/item/pinpointer/nuke/process() ..() diff --git a/code/modules/antagonists/nukeop/nukeop.dm b/code/modules/antagonists/nukeop/nukeop.dm index 800448c02f..4604439fc8 100644 --- a/code/modules/antagonists/nukeop/nukeop.dm +++ b/code/modules/antagonists/nukeop/nukeop.dm @@ -87,7 +87,7 @@ /datum/antagonist/nukeop/proc/forge_objectives() if(nuke_team) - owner.objectives |= nuke_team.objectives + objectives |= nuke_team.objectives /datum/antagonist/nukeop/proc/move_to_spawnpoint() var/team_number = 1 diff --git a/code/modules/antagonists/official/official.dm b/code/modules/antagonists/official/official.dm index 26de196cb4..9165a99d42 100644 --- a/code/modules/antagonists/official/official.dm +++ b/code/modules/antagonists/official/official.dm @@ -36,8 +36,6 @@ missionobj.completed = 1 mission = missionobj objectives |= mission - owner.objectives |= objectives - /datum/antagonist/official/on_gain() forge_objectives() diff --git a/code/modules/antagonists/overthrow/overthrow.dm b/code/modules/antagonists/overthrow/overthrow.dm index 075b9f13bc..c8b253793e 100644 --- a/code/modules/antagonists/overthrow/overthrow.dm +++ b/code/modules/antagonists/overthrow/overthrow.dm @@ -26,7 +26,6 @@ // Sets objectives, equips all antags with the storage implant. /datum/antagonist/overthrow/on_gain() objectives += team.objectives - owner.objectives += objectives ..() owner.announce_objectives() equip_overthrow() @@ -34,7 +33,6 @@ /datum/antagonist/overthrow/on_removal() owner.special_role = null - owner.objectives -= objectives ..() // Creates the overthrow team, or sets it. The objectives are static for all the team members. diff --git a/code/modules/antagonists/overthrow/overthrow_team.dm b/code/modules/antagonists/overthrow/overthrow_team.dm index 7f5d010013..a22f08d45c 100644 --- a/code/modules/antagonists/overthrow/overthrow_team.dm +++ b/code/modules/antagonists/overthrow/overthrow_team.dm @@ -35,7 +35,9 @@ objectives += heads_obj for(var/i in members) var/datum/mind/M = i - M.objectives += heads_obj + var/datum/antagonist/overthrow/O = M.has_antag_datum(/datum/antagonist/overthrow) + if(O) + O.objectives += heads_obj heads_obj.find_targets() addtimer(CALLBACK(src,.proc/update_objectives),OBJECTIVE_UPDATING_TIME,TIMER_UNIQUE) diff --git a/code/modules/antagonists/pirate/pirate.dm b/code/modules/antagonists/pirate/pirate.dm index 96830562e9..ff33477909 100644 --- a/code/modules/antagonists/pirate/pirate.dm +++ b/code/modules/antagonists/pirate/pirate.dm @@ -31,12 +31,7 @@ /datum/antagonist/pirate/on_gain() if(crew) - owner.objectives |= crew.objectives - . = ..() - -/datum/antagonist/pirate/on_removal() - if(crew) - owner.objectives -= crew.objectives + objectives |= crew.objectives . = ..() /datum/team/pirate @@ -53,7 +48,9 @@ getbooty.update_explanation_text() objectives += getbooty for(var/datum/mind/M in members) - M.objectives |= objectives + var/datum/antagonist/pirate/P = M.has_antag_datum(/datum/antagonist/pirate) + if(P) + P.objectives |= objectives /datum/objective/loot diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm index b43024fb31..d7d88a9b6a 100644 --- a/code/modules/antagonists/revenant/revenant.dm +++ b/code/modules/antagonists/revenant/revenant.dm @@ -368,11 +368,11 @@ scatter() /obj/item/ectoplasm/revenant/examine(mob/user) - ..() + . = ..() if(inert) - to_chat(user, "It seems inert.") + . += "It seems inert." else if(reforming) - to_chat(user, "It is shifting and distorted. It would be wise to destroy this.") + . += "It is shifting and distorted. It would be wise to destroy this." /obj/item/ectoplasm/revenant/proc/reform() if(QDELETED(src) || QDELETED(revenant) || inert) diff --git a/code/modules/antagonists/revenant/revenant_antag.dm b/code/modules/antagonists/revenant/revenant_antag.dm index 476db96fb8..8d99edf26e 100644 --- a/code/modules/antagonists/revenant/revenant_antag.dm +++ b/code/modules/antagonists/revenant/revenant_antag.dm @@ -14,8 +14,6 @@ objective2.owner = owner objectives += objective2 - owner.objectives |= objectives - /datum/antagonist/revenant/on_gain() forge_objectives() . = ..() diff --git a/code/modules/antagonists/revenant/revenant_spawn_event.dm b/code/modules/antagonists/revenant/revenant_spawn_event.dm index cb534b6613..7bb7f1aa76 100644 --- a/code/modules/antagonists/revenant/revenant_spawn_event.dm +++ b/code/modules/antagonists/revenant/revenant_spawn_event.dm @@ -4,6 +4,7 @@ name = "Spawn Revenant" // Did you mean 'griefghost'? typepath = /datum/round_event/ghost_role/revenant weight = 7 + gamemode_blacklist = list("dynamic") max_occurrences = 1 min_players = 5 diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm index e10d83ffb7..c4190d8cd9 100644 --- a/code/modules/antagonists/revolution/revolution.dm +++ b/code/modules/antagonists/revolution/revolution.dm @@ -66,10 +66,10 @@ return rev_team /datum/antagonist/rev/proc/create_objectives() - owner.objectives |= rev_team.objectives + objectives |= rev_team.objectives /datum/antagonist/rev/proc/remove_objectives() - owner.objectives -= rev_team.objectives + objectives -= rev_team.objectives //Bump up to head_rev /datum/antagonist/rev/proc/promote() @@ -207,9 +207,20 @@ owner.current.visible_message("The frame beeps contentedly, purging the hostile memory engram from the MMI before initalizing it.", null, null, null, owner.current) to_chat(owner, "The frame's firmware detects and deletes your neural reprogramming! You remember nothing of your time spent reprogrammed, you can't even remember the names or identities of anyone involved...") +/datum/antagonist/rev/head/farewell() + if((ishuman(owner.current) || ismonkey(owner.current))) + if(owner.current.stat != DEAD) + owner.current.visible_message("[owner.current] looks like [owner.current.p_theyve()] just remembered [owner.current.p_their()] real allegiance!", null, null, null, owner.current) + to_chat(owner, "You have given up your cause of overthrowing the command staff. You are no longer a Head Revolutionary.") + else + to_chat(owner, "The sweet release of death. You are no longer a Head Revolutionary.") + else if(issilicon(owner.current)) + owner.current.visible_message("The frame beeps contentedly, suppressing the disloyal personality traits from the MMI before initalizing it.", null, null, null, owner.current) + to_chat(owner, "The frame's firmware detects and suppresses your unwanted personality traits! You feel more content with the leadership around these parts.") + //blunt trauma deconversions call this through species.dm spec_attacked_by() /datum/antagonist/rev/proc/remove_revolutionary(borged, deconverter) - log_attack("[key_name(owner.current)] has been deconverted from the revolution by [key_name(deconverter)]!") + log_attack("[key_name(owner.current)] has been deconverted from the revolution by [ismob(deconverter) ? key_name(deconverter) : deconverter]!") if(borged) message_admins("[ADMIN_LOOKUPFLW(owner.current)] has been borged while being a [name]") owner.special_role = null @@ -219,9 +230,8 @@ owner.remove_antag_datum(type) /datum/antagonist/rev/head/remove_revolutionary(borged,deconverter) - if(!borged) - return - . = ..() + if(borged || deconverter == "gamemode") + . = ..() /datum/antagonist/rev/head/equip_rev() var/mob/living/carbon/human/H = owner.current @@ -253,6 +263,8 @@ /datum/team/revolution name = "Revolution" var/max_headrevs = 3 + var/list/ex_headrevs = list() // Dynamic removes revs on loss, used to keep a list for the roundend report. + var/list/ex_revs = list() /datum/team/revolution/proc/update_objectives(initial = FALSE) var/untracked_heads = SSjob.get_all_heads() @@ -265,7 +277,8 @@ new_target.update_explanation_text() objectives += new_target for(var/datum/mind/M in members) - M.objectives |= objectives + var/datum/antagonist/rev/R = M.has_antag_datum(/datum/antagonist/rev) + R.objectives |= objectives addtimer(CALLBACK(src,.proc/update_objectives),HEAD_UPDATE_PERIOD,TIMER_UNIQUE) @@ -295,9 +308,12 @@ addtimer(CALLBACK(src,.proc/update_heads),HEAD_UPDATE_PERIOD,TIMER_UNIQUE) +/datum/team/revolution/proc/save_members() + ex_headrevs = get_antag_minds(/datum/antagonist/rev/head, TRUE) + ex_revs = get_antag_minds(/datum/antagonist/rev, TRUE) /datum/team/revolution/roundend_report() - if(!members.len) + if(!members.len && !ex_headrevs.len) return var/list/result = list() @@ -317,8 +333,17 @@ var/list/targets = list() - var/list/datum/mind/headrevs = get_antag_minds(/datum/antagonist/rev/head) - var/list/datum/mind/revs = get_antag_minds(/datum/antagonist/rev,TRUE) + var/list/datum/mind/headrevs + var/list/datum/mind/revs + if(ex_headrevs.len) + headrevs = ex_headrevs + else + headrevs = get_antag_minds(/datum/antagonist/rev/head, TRUE) + + if(ex_revs.len) + revs = ex_revs + else + revs = get_antag_minds(/datum/antagonist/rev, TRUE) if(headrevs.len) var/list/headrev_part = list() headrev_part += "The head revolutionaries were:" diff --git a/code/modules/antagonists/santa/santa.dm b/code/modules/antagonists/santa/santa.dm new file mode 100644 index 0000000000..bf42188cf6 --- /dev/null +++ b/code/modules/antagonists/santa/santa.dm @@ -0,0 +1,29 @@ +/datum/antagonist/santa + name = "Santa" + show_in_antagpanel = FALSE + +/datum/antagonist/santa/on_gain() + . = ..() + give_equipment() + give_objective() + +/datum/antagonist/santa/greet() + . = ..() + to_chat(owner, "You are Santa! Your objective is to bring joy to the people on this station. You can conjure more presents using a spell, and there are several presents in your bag.") + +/datum/antagonist/santa/proc/give_equipment() + var/mob/living/carbon/human/H = owner.current + if(istype(H)) + H.equipOutfit(/datum/outfit/santa) + + owner.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/presents) + var/obj/effect/proc_holder/spell/targeted/area_teleport/teleport/telespell = new + telespell.clothes_req = 0 //santa robes aren't actually magical. + owner.AddSpell(telespell) //does the station have chimneys? WHO KNOWS! + +/datum/antagonist/santa/proc/give_objective() + var/datum/objective/santa_objective = new() + santa_objective.explanation_text = "Bring joy and presents to the station!" + santa_objective.completed = 1 //lets cut our santas some slack. + santa_objective.owner = owner + objectives |= santa_objective \ No newline at end of file diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm index f45555a6ee..f27da5f667 100644 --- a/code/modules/antagonists/slaughter/slaughter.dm +++ b/code/modules/antagonists/slaughter/slaughter.dm @@ -94,7 +94,7 @@ user.temporarilyRemoveItemFromInventory(src, TRUE) src.Insert(user) //Consuming the heart literally replaces your heart with a demon heart. H A R D C O R E -/obj/item/organ/heart/demon/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/heart/demon/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) ..() if(M.mind) M.mind.AddSpell(new /obj/effect/proc_holder/spell/bloodcrawl(null)) diff --git a/code/modules/antagonists/slaughter/slaughter_antag.dm b/code/modules/antagonists/slaughter/slaughter_antag.dm index 54bfc19acf..a018603cf1 100644 --- a/code/modules/antagonists/slaughter/slaughter_antag.dm +++ b/code/modules/antagonists/slaughter/slaughter_antag.dm @@ -26,8 +26,6 @@ new_objective2.explanation_text = "[objective_verb] everyone[summoner ? " else while you're at it":""]." objectives += new_objective2 - owner.objectives |= objectives - /datum/antagonist/slaughter/laughter name = "Laughter demon" objective_verb = "Hug and Tickle" \ No newline at end of file diff --git a/code/modules/antagonists/slaughter/slaughterevent.dm b/code/modules/antagonists/slaughter/slaughterevent.dm index 6ace6a0536..069795cfb8 100644 --- a/code/modules/antagonists/slaughter/slaughterevent.dm +++ b/code/modules/antagonists/slaughter/slaughterevent.dm @@ -3,6 +3,7 @@ typepath = /datum/round_event/ghost_role/slaughter weight = 1 //Very rare max_occurrences = 1 + gamemode_blacklist = list("dynamic") earliest_start = 1 HOURS min_players = 20 diff --git a/code/modules/antagonists/survivalist/survivalist.dm b/code/modules/antagonists/survivalist/survivalist.dm index 93a2170dab..4e0184b7b6 100644 --- a/code/modules/antagonists/survivalist/survivalist.dm +++ b/code/modules/antagonists/survivalist/survivalist.dm @@ -8,7 +8,6 @@ var/datum/objective/survive/survive = new survive.owner = owner objectives += survive - owner.objectives |= objectives /datum/antagonist/survivalist/on_gain() owner.special_role = "survivalist" diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm index 87cee7586d..ce455d9e67 100644 --- a/code/modules/antagonists/swarmer/swarmer.dm +++ b/code/modules/antagonists/swarmer/swarmer.dm @@ -33,7 +33,7 @@ . = ..() var/area/A = get_area(src) if(A) - notify_ghosts("A swarmer shell has been created in [A.name].", 'sound/effects/bin_close.ogg', source = src, action = NOTIFY_ATTACK, flashwindow = FALSE) + notify_ghosts("A swarmer shell has been created in [A.name].", 'sound/effects/bin_close.ogg', source = src, action = NOTIFY_ATTACK, flashwindow = FALSE, ignore_dnr_observers = TRUE) /obj/effect/mob_spawn/swarmer/attack_hand(mob/living/user) . = ..() diff --git a/code/modules/antagonists/traitor/IAA/internal_affairs.dm b/code/modules/antagonists/traitor/IAA/internal_affairs.dm index f2e6566e8f..caf2f644df 100644 --- a/code/modules/antagonists/traitor/IAA/internal_affairs.dm +++ b/code/modules/antagonists/traitor/IAA/internal_affairs.dm @@ -78,15 +78,14 @@ scan_target = null if(owner) if(owner.mind) - if(owner.mind.objectives) - for(var/datum/objective/objective_ in owner.mind.objectives) - if(!is_internal_objective(objective_)) - continue - var/datum/objective/assassinate/internal/objective = objective_ - var/mob/current = objective.target.current - if(current&¤t.stat!=DEAD) - scan_target = current - break + for(var/datum/objective/objective_ in owner.mind.get_all_objectives()) + if(!is_internal_objective(objective_)) + continue + var/datum/objective/assassinate/internal/objective = objective_ + var/mob/current = objective.target.current + if(current&¤t.stat!=DEAD) + scan_target = current + break /datum/status_effect/agent_pinpointer/tick() if(!owner) @@ -100,9 +99,9 @@ return (istype(O, /datum/objective/assassinate/internal)||istype(O, /datum/objective/destroy/internal)) /datum/antagonist/traitor/proc/replace_escape_objective() - if(!owner||!owner.objectives) + if(!owner || !objectives.len) return - for (var/objective_ in owner.objectives) + for (var/objective_ in objectives) if(!(istype(objective_, /datum/objective/escape)||istype(objective_, /datum/objective/survive))) continue remove_objective(objective_) @@ -112,9 +111,9 @@ add_objective(martyr_objective) /datum/antagonist/traitor/proc/reinstate_escape_objective() - if(!owner||!owner.objectives) + if(!owner||!objectives.len) return - for (var/objective_ in owner.objectives) + for (var/objective_ in objectives) if(!istype(objective_, /datum/objective/martyr)) continue remove_objective(objective_) @@ -131,7 +130,7 @@ return to_chat(owner.current, " Target eliminated: [victim.name]") LAZYINITLIST(targets_stolen) - for(var/objective_ in victim.objectives) + for(var/objective_ in victim.get_all_objectives()) if(istype(objective_, /datum/objective/assassinate/internal)) var/datum/objective/assassinate/internal/objective = objective_ if(objective.target==owner) @@ -159,7 +158,7 @@ var/status_text = objective.check_completion() ? "neutralised" : "active" to_chat(owner.current, " New target added to database: [objective.target.name] ([status_text]) ") last_man_standing = TRUE - for(var/objective_ in owner.objectives) + for(var/objective_ in objectives) if(!is_internal_objective(objective_)) continue var/datum/objective/assassinate/internal/objective = objective_ @@ -175,7 +174,7 @@ /datum/antagonist/traitor/internal_affairs/proc/iaa_process() if(owner&&owner.current&&owner.current.stat!=DEAD) - for(var/objective_ in owner.objectives) + for(var/objective_ in objectives) if(!is_internal_objective(objective_)) continue var/datum/objective/assassinate/internal/objective = objective_ @@ -224,8 +223,6 @@ special_role = TRAITOR_AGENT_ROLE syndicate = TRUE forge_single_objective() - else - ..() // Give them standard objectives. return /datum/antagonist/traitor/internal_affairs/forge_traitor_objectives() diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index e43c2f6254..8c0f61bb1d 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -49,18 +49,22 @@ A.malf_picker.remove_malf_verbs(A) qdel(A.malf_picker) +/datum/antagonist/traitor/proc/handle_hearing(datum/source, list/hearing_args) + var/message = hearing_args[HEARING_MESSAGE] + message = GLOB.syndicate_code_phrase_regex.Replace(message, "$1") + message = GLOB.syndicate_code_response_regex.Replace(message, "$1") + hearing_args[HEARING_MESSAGE] = message + SSticker.mode.traitors -= owner if(!silent && owner.current) to_chat(owner.current," You are no longer the [special_role]! ") owner.special_role = null ..() -/datum/antagonist/traitor/proc/add_objective(var/datum/objective/O) - owner.objectives += O +/datum/antagonist/traitor/proc/add_objective(datum/objective/O) objectives += O -/datum/antagonist/traitor/proc/remove_objective(var/datum/objective/O) - owner.objectives -= O +/datum/antagonist/traitor/proc/remove_objective(datum/objective/O) objectives -= O /datum/antagonist/traitor/proc/forge_traitor_objectives() @@ -72,7 +76,17 @@ /datum/antagonist/traitor/proc/forge_human_objectives() var/is_hijacker = FALSE - if (GLOB.joined_player_list.len >= 30) // Less murderboning on lowpop thanks + var/datum/game_mode/dynamic/mode + var/is_dynamic = FALSE + if(istype(SSticker.mode,/datum/game_mode/dynamic)) + mode = SSticker.mode + is_dynamic = TRUE + if(GLOB.joined_player_list.len>=GLOB.dynamic_high_pop_limit) + is_hijacker = (prob(10) && mode.threat_level > CONFIG_GET(number/dynamic_hijack_high_population_requirement)) + else + var/indice_pop = min(10,round(GLOB.joined_player_list.len/mode.pop_per_requirement)+1) + is_hijacker = (prob(10) && (mode.threat_level >= CONFIG_GET(number_list/dynamic_hijack_requirements)[indice_pop])) + else if (GLOB.joined_player_list.len >= 30) // Less murderboning on lowpop thanks is_hijacker = prob(10) var/martyr_chance = prob(20) var/objective_count = is_hijacker //Hijacking counts towards number of objectives @@ -89,15 +103,19 @@ forge_single_objective() if(is_hijacker && objective_count <= toa) //Don't assign hijack if it would exceed the number of objectives set in config.traitor_objectives_amount - if (!(locate(/datum/objective/hijack) in owner.objectives)) + if (!(locate(/datum/objective/hijack) in objectives)) var/datum/objective/hijack/hijack_objective = new hijack_objective.owner = owner add_objective(hijack_objective) + if(is_dynamic) + var/threat_spent = CONFIG_GET(number/dynamic_hijack_cost) + mode.spend_threat(threat_spent) + mode.log_threat("[owner.name] spent [threat_spent] on hijack.") return var/martyr_compatibility = 1 //You can't succeed in stealing if you're dead. - for(var/datum/objective/O in owner.objectives) + for(var/datum/objective/O in objectives) if(!O.martyr_compatible) martyr_compatibility = 0 break @@ -106,10 +124,14 @@ var/datum/objective/martyr/martyr_objective = new martyr_objective.owner = owner add_objective(martyr_objective) + if(is_dynamic) + var/threat_spent = CONFIG_GET(number/dynamic_hijack_cost) + mode.spend_threat(threat_spent) + mode.log_threat("[owner.name] spent [threat_spent] on glorious death.") return else - if(!(locate(/datum/objective/escape) in owner.objectives)) + if(!(locate(/datum/objective/escape) in objectives)) var/datum/objective/escape/escape_objective = new escape_objective.owner = owner add_objective(escape_objective) @@ -141,7 +163,18 @@ /datum/antagonist/traitor/proc/forge_single_human_objective() //Returns how many objectives are added .=1 - if(prob(50)) + var/assassin_prob = 50 + var/is_dynamic = FALSE + var/datum/game_mode/dynamic/mode + if(istype(SSticker.mode,/datum/game_mode/dynamic)) + mode = SSticker.mode + is_dynamic = TRUE + assassin_prob = mode.threat_level*(2/3) + if(prob(assassin_prob)) + if(is_dynamic) + var/threat_spent = CONFIG_GET(number/dynamic_assassinate_cost) + mode.spend_threat(threat_spent) + mode.log_threat("[owner.name] spent [threat_spent] on an assassination target.") var/list/active_ais = active_ais() if(active_ais.len && prob(100/GLOB.joined_player_list.len)) var/datum/objective/destroy/destroy_objective = new @@ -159,7 +192,7 @@ kill_objective.find_target() add_objective(kill_objective) else - if(prob(15) && !(locate(/datum/objective/download) in owner.objectives) && !(owner.assigned_role in list("Research Director", "Scientist", "Roboticist"))) + if(prob(15) && !(locate(/datum/objective/download) in objectives) && !(owner.assigned_role in list("Research Director", "Scientist", "Roboticist"))) var/datum/objective/download/download_objective = new download_objective.owner = owner download_objective.gen_amount_goal() diff --git a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm index e1d607c34b..56954f8718 100644 --- a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm +++ b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm @@ -208,7 +208,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( var/unlock_text = "Hello World!" //Text shown when an ability is unlocked var/unlock_sound //Sound played when an ability is unlocked -/datum/AI_Module/proc/upgrade(mob/living/silicon/AI/AI) //Apply upgrades! +/datum/AI_Module/proc/upgrade(mob/living/silicon/ai/AI) //Apply upgrades! return /datum/AI_Module/large //Big, powerful stuff that can only be used once. @@ -397,7 +397,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( unlock_text = "You establish a power diversion to your turrets, upgrading their health and damage." unlock_sound = 'sound/items/rped.ogg' -/datum/AI_Module/large/upgrade_turrets/upgrade(mob/living/silicon/AI/AI) +/datum/AI_Module/large/upgrade_turrets/upgrade(mob/living/silicon/ai/AI) for(var/obj/machinery/porta_turret/ai/turret in GLOB.machines) turret.obj_integrity += 30 turret.lethal_projectile = /obj/item/projectile/beam/laser/heavylaser //Once you see it, you will know what it means to FEAR. diff --git a/code/modules/antagonists/valentines/heartbreaker.dm b/code/modules/antagonists/valentines/heartbreaker.dm index 4f228910d7..b78e8d574f 100644 --- a/code/modules/antagonists/valentines/heartbreaker.dm +++ b/code/modules/antagonists/valentines/heartbreaker.dm @@ -9,7 +9,6 @@ var/datum/objective/martyr/normiesgetout = new normiesgetout.owner = owner objectives += normiesgetout - owner.objectives += objectives /datum/antagonist/heartbreaker/on_gain() forge_objectives() diff --git a/code/modules/antagonists/valentines/valentine.dm b/code/modules/antagonists/valentines/valentine.dm index 21e54374a4..19c08f3076 100644 --- a/code/modules/antagonists/valentines/valentine.dm +++ b/code/modules/antagonists/valentines/valentine.dm @@ -12,7 +12,6 @@ protect_objective.human_check = FALSE protect_objective.explanation_text = "Protect [date.name], your date." objectives += protect_objective - owner.objectives += objectives /datum/antagonist/valentine/on_gain() forge_objectives() @@ -34,8 +33,8 @@ //Squashed up a bit /datum/antagonist/valentine/roundend_report() var/objectives_complete = TRUE - if(owner.objectives.len) - for(var/datum/objective/objective in owner.objectives) + if(objectives.len) + for(var/datum/objective/objective in objectives) if(!objective.check_completion()) objectives_complete = FALSE break @@ -51,8 +50,8 @@ /datum/antagonist/valentine/chem/roundend_report() var/objectives_complete = TRUE - if(owner.objectives.len) - for(var/datum/objective/objective in owner.objectives) + if(objectives.len) + for(var/datum/objective/objective in objectives) if(!objective.check_completion()) objectives_complete = FALSE break diff --git a/code/modules/antagonists/wishgranter/wishgranter.dm b/code/modules/antagonists/wishgranter/wishgranter.dm index 318de51eb4..21cab26d1e 100644 --- a/code/modules/antagonists/wishgranter/wishgranter.dm +++ b/code/modules/antagonists/wishgranter/wishgranter.dm @@ -8,7 +8,6 @@ var/datum/objective/hijack/hijack = new hijack.owner = owner objectives += hijack - owner.objectives |= objectives /datum/antagonist/wishgranter/on_gain() owner.special_role = "Avatar of the Wish Granter" diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index 576fc6b9bf..a0dbc4d9b1 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -255,7 +255,7 @@ /obj/item/voodoo/attackby(obj/item/I, mob/user, params) if(target && cooldown < world.time) - if(I.is_hot()) + if(I.get_temperature()) to_chat(target, "You suddenly feel very hot") target.adjust_bodytemperature(50) GiveHint(target) @@ -340,9 +340,9 @@ to_chat(victim, "You feel a dark presence from [A.name]") /obj/item/voodoo/suicide_act(mob/living/carbon/user) - user.visible_message("[user] links the voodoo doll to [user.p_them()]self and sits on it, infinitely crushing [user.p_them()]self! It looks like [user.p_theyre()] trying to commit suicide!") - user.gib() - return(BRUTELOSS) + user.visible_message("[user] links the voodoo doll to [user.p_them()]self and sits on it, infinitely crushing [user.p_them()]self! It looks like [user.p_theyre()] trying to commit suicide!") + user.gib() + return(BRUTELOSS) /obj/item/voodoo/fire_act(exposed_temperature, exposed_volume) if(target) @@ -383,7 +383,9 @@ if(!istype(user) || on_cooldown) return var/turf/T = get_turf(user) - if(!T) + var/area/A = get_area(user) + if(!T || !A || A.noteleport) + to_chat(user, "You play \the [src], yet no sound comes out of it... Looks like it won't work here.") return on_cooldown = TRUE last_user = user diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm index 6f4c3fca10..962c2b2da4 100644 --- a/code/modules/antagonists/wizard/equipment/soulstone.dm +++ b/code/modules/antagonists/wizard/equipment/soulstone.dm @@ -35,15 +35,15 @@ to_chat(user, "An overwhelming feeling of dread comes over you as you pick up the soulstone. It would be wise to be rid of this quickly.") /obj/item/soulstone/examine(mob/user) - ..() + . = ..() if(usability || iscultist(user) || iswizard(user) || isobserver(user)) if (old_shard) - to_chat(user, "A soulstone, used to capture a soul, either from dead humans or from freed shades.") + . += "A soulstone, used to capture a soul, either from dead humans or from freed shades." else - to_chat(user, "A soulstone, used to capture souls, either from unconscious or sleeping humans or from freed shades.") - to_chat(user, "The captured soul can be placed into a construct shell to produce a construct, or released from the stone as a shade.") + . += "A soulstone, used to capture souls, either from unconscious or sleeping humans or from freed shades." + . += "The captured soul can be placed into a construct shell to produce a construct, or released from the stone as a shade." if(spent) - to_chat(user, "This shard is spent; it is now just a creepy rock.") + . += "This shard is spent; it is now just a creepy rock." /obj/item/soulstone/Destroy() //Stops the shade from being qdel'd immediately and their ghost being sent back to the arrival shuttle. for(var/mob/living/simple_animal/shade/A in src) @@ -102,13 +102,13 @@ desc = "A wicked machine used by those skilled in magical arts. It is inactive." /obj/structure/constructshell/examine(mob/user) - ..() + . = ..() if(iscultist(user) || iswizard(user) || user.stat == DEAD) - to_chat(user, "A construct shell, used to house bound souls from a soulstone.") - to_chat(user, "Placing a soulstone with a soul into this shell allows you to produce your choice of the following:") - to_chat(user, "An Artificer, which can produce more shells and soulstones, as well as fortifications.") - to_chat(user, "A Wraith, which does high damage and can jaunt through walls, though it is quite fragile.") - to_chat(user, "A Juggernaut, which is very hard to kill and can produce temporary walls, but is slow.") + . += "A construct shell, used to house bound souls from a soulstone." + . += "Placing a soulstone with a soul into this shell allows you to produce your choice of the following:" + . += "An Artificer, which can produce more shells and soulstones, as well as fortifications." + . += "A Wraith, which does high damage and can jaunt through walls, though it is quite fragile." + . += "A Juggernaut, which is very hard to kill and can produce temporary walls, but is slow." /obj/structure/constructshell/attackby(obj/item/O, mob/user, params) if(istype(O, /obj/item/soulstone)) diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm index bb7ffdc85d..c5308cf0c0 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook.dm @@ -11,12 +11,18 @@ var/buy_word = "Learn" var/limit //used to prevent a spellbook_entry from being bought more than X times with one wizard spellbook var/list/no_coexistance_typecache //Used so you can't have specific spells together + var/dynamic_cost = 0 // How much threat the spell costs to purchase for dynamic. + var/dynamic_requirement = 0 // How high the threat level needs to be for purchasing in dynamic. /datum/spellbook_entry/New() ..() no_coexistance_typecache = typecacheof(no_coexistance_typecache) /datum/spellbook_entry/proc/IsAvailible() // For config prefs / gamemode restrictions - these are round applied + if(istype(SSticker.mode,/datum/game_mode/dynamic)) + var/datum/game_mode/dynamic/mode = SSticker.mode + if(dynamic_requirement > 0 && mode.threat_level < dynamic_requirement) + return 0 return 1 /datum/spellbook_entry/proc/CanBuy(mob/living/carbon/human/user,obj/item/spellbook/book) // Specific circumstances @@ -25,6 +31,10 @@ for(var/spell in user.mind.spell_list) if(is_type_in_typecache(spell, no_coexistance_typecache)) return 0 + if(dynamic_cost>0 && istype(SSticker.mode,/datum/game_mode/dynamic)) + var/datum/game_mode/dynamic/mode = SSticker.mode + if(mode.threat < dynamic_cost) + return 0 return 1 /datum/spellbook_entry/proc/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) //return 1 on success @@ -60,6 +70,10 @@ SSblackbox.record_feedback("nested tally", "wizard_spell_improved", 1, list("[name]", "[aspell.spell_level]")) return 1 //No same spell found - just learn it + if(dynamic_cost > 0 && istype(SSticker.mode,/datum/game_mode/dynamic)) + var/datum/game_mode/dynamic/mode = SSticker.mode + mode.spend_threat(dynamic_cost) + mode.log_threat("Wizard spent [dynamic_cost] on [name].") SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) user.mind.AddSpell(S) to_chat(user, "You have learned [S.name].") @@ -83,6 +97,10 @@ if(!S) S = new spell_type() var/spell_levels = 0 + if(dynamic_cost > 0 && istype(SSticker.mode,/datum/game_mode/dynamic)) + var/datum/game_mode/dynamic/mode = SSticker.mode + mode.refund_threat(dynamic_cost) + mode.log_threat("Wizard refunded [dynamic_cost] on [name].") for(var/obj/effect/proc_holder/spell/aspell in user.mind.spell_list) if(initial(S.name) == initial(aspell.name)) spell_levels = aspell.spell_level @@ -285,6 +303,8 @@ name = "Staff of Change" desc = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself." item_path = /obj/item/gun/magic/staff/change + dynamic_requirement = 60 + dynamic_cost = 20 /datum/spellbook_entry/item/staffanimation name = "Staff of Animation" @@ -369,6 +389,8 @@ desc = "A magical contract binding an apprentice wizard to your service, using it will summon them to your side." item_path = /obj/item/antag_spawner/contract category = "Assistance" + dynamic_requirement = 50 + dynamic_cost = 10 /datum/spellbook_entry/item/guardian name = "Guardian Deck" @@ -388,6 +410,11 @@ item_path = /obj/item/antag_spawner/slaughter_demon limit = 3 category = "Assistance" + dynamic_requirement = 60 + +/datum/spellbook_entry/item/bloodbottle/New() + ..() + dynamic_cost = CONFIG_GET(keyed_list/dynamic_cost)["slaughter_demon"] /datum/spellbook_entry/item/hugbottle name = "Bottle of Tickles" @@ -402,6 +429,11 @@ cost = 1 //non-destructive; it's just a jape, sibling! limit = 3 category = "Assistance" + dynamic_requirement = 40 + +/datum/spellbook_entry/item/hugbottle/New() + ..() + dynamic_cost = CONFIG_GET(keyed_list/dynamic_cost)["slaughter_demon"]/3 /datum/spellbook_entry/item/mjolnir name = "Mjolnir" @@ -465,7 +497,7 @@ if(!SSticker.mode) return FALSE else - return TRUE + return ..() /datum/spellbook_entry/summon/ghosts/Buy(mob/living/carbon/human/user, obj/item/spellbook/book) SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) @@ -478,11 +510,13 @@ /datum/spellbook_entry/summon/guns name = "Summon Guns" desc = "Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill you. Just be careful not to stand still too long!" + dynamic_cost = 10 + dynamic_requirement = 60 /datum/spellbook_entry/summon/guns/IsAvailible() if(!SSticker.mode) // In case spellbook is placed on map return 0 - return !CONFIG_GET(flag/no_summon_guns) + return (!CONFIG_GET(flag/no_summon_guns) && ..()) /datum/spellbook_entry/summon/guns/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) @@ -490,16 +524,23 @@ active = 1 playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, 1) to_chat(user, "You have cast summon guns!") + if(istype(SSticker.mode,/datum/game_mode/dynamic)) + var/datum/game_mode/dynamic/mode = SSticker.mode + var/threat_spent = dynamic_cost + mode.spend_threat(threat_spent) + mode.log_threat("Wizard spent [threat_spent] on summon guns.") return 1 /datum/spellbook_entry/summon/magic name = "Summon Magic" desc = "Share the wonders of magic with the crew and show them why they aren't to be trusted with it at the same time." + dynamic_cost = 10 + dynamic_requirement = 60 /datum/spellbook_entry/summon/magic/IsAvailible() if(!SSticker.mode) // In case spellbook is placed on map return 0 - return !CONFIG_GET(flag/no_summon_magic) + return (!CONFIG_GET(flag/no_summon_guns) && ..()) /datum/spellbook_entry/summon/magic/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) @@ -507,21 +548,33 @@ active = 1 playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, 1) to_chat(user, "You have cast summon magic!") + if(istype(SSticker.mode,/datum/game_mode/dynamic)) + var/datum/game_mode/dynamic/mode = SSticker.mode + var/threat_spent = dynamic_cost + mode.spend_threat(threat_spent) + mode.log_threat("Wizard spent [threat_spent] on summon magic.") return 1 /datum/spellbook_entry/summon/events name = "Summon Events" desc = "Give Murphy's law a little push and replace all events with special wizard ones that will confound and confuse everyone. Multiple castings increase the rate of these events." + dynamic_cost = 20 + dynamic_requirement = 60 var/times = 0 /datum/spellbook_entry/summon/events/IsAvailible() if(!SSticker.mode) // In case spellbook is placed on map return 0 - return !CONFIG_GET(flag/no_summon_events) + return (!CONFIG_GET(flag/no_summon_events) && ..()) /datum/spellbook_entry/summon/events/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) summonevents() + if(istype(SSticker.mode,/datum/game_mode/dynamic) && times == 0) + var/datum/game_mode/dynamic/mode = SSticker.mode + var/threat_spent = dynamic_cost + mode.spend_threat(threat_spent) + mode.log_threat("Wizard spent [threat_spent] on summon events.") times++ playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, 1) to_chat(user, "You have cast summon events.") @@ -549,11 +602,11 @@ var/list/categories = list() /obj/item/spellbook/examine(mob/user) - ..() + . = ..() if(owner) - to_chat(user, "There is a small signature on the front cover: \"[owner]\".") + . += "There is a small signature on the front cover: \"[owner]\"." else - to_chat(user, "It appears to have no author.") + . += "It appears to have no author." /obj/item/spellbook/Initialize() . = ..() @@ -626,16 +679,16 @@ dat += {" - + body { font-size: 80%; font-family: 'Lucida Grande', Verdana, Arial, Sans-Serif; } + ul#tabs { list-style-type: none; margin: 30px 0 0 0; padding: 0 0 0.3em 0; } + ul#tabs li { display: inline; } + ul#tabs li a { color: #42454a; background-color: #dedbde; border: 1px solid #c9c3ba; border-bottom: none; padding: 0.3em; text-decoration: none; } + ul#tabs li a:hover { background-color: #f1f0ee; } + ul#tabs li a.selected { color: #000; background-color: #f1f0ee; font-weight: bold; padding: 0.7em 0.3em 0.38em 0.3em; } + div.tabContent { border: 1px solid #c9c3ba; padding: 0.5em; background-color: #f1f0ee; } + div.tabContent.hide { display: none; } + + "} dat += {"[content]"} return dat diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index 8a20a81555..9b2532c71b 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -57,19 +57,19 @@ if(!GLOB.wizardstart.len) SSjob.SendToLateJoin(owner.current) to_chat(owner, "HOT INSERTION, GO GO GO") - owner.current.forceMove(pick(GLOB.wizardstart)) + else + owner.current.forceMove(pick(GLOB.wizardstart)) /datum/antagonist/wizard/proc/create_objectives() var/datum/objective/new_objective = new("Cause as much creative mayhem as you can aboard the station! The more outlandish your methods of achieving this, the better! Make sure there's a decent amount of crew alive to tell of your tale.") + new_objective.completed = TRUE //So they can greentext without admin intervention. new_objective.owner = owner objectives += new_objective - var/datum/objective/escape/escape_objective = new - escape_objective.owner = owner - objectives += escape_objective - - for(var/datum/objective/O in objectives) - owner.objectives += O + if (!(locate(/datum/objective/escape) in objectives)) + var/datum/objective/escape/escape_objective = new + escape_objective.owner = owner + objectives += escape_objective /datum/antagonist/wizard/on_removal() unregister() @@ -165,7 +165,7 @@ owner.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball(null)) to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned powerful, destructive spells. You are able to cast magic missile and fireball.") if(APPRENTICE_BLUESPACE) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null)) + owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink(null)) owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null)) to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned reality bending mobility spells. You are able to cast teleport and ethereal jaunt.") if(APPRENTICE_HEALING) @@ -183,7 +183,6 @@ new_objective.owner = owner new_objective.target = master new_objective.explanation_text = "Protect [master.current.real_name], the wizard." - owner.objectives += new_objective objectives += new_objective //Random event wizard @@ -251,7 +250,6 @@ /datum/antagonist/wizard/academy/create_objectives() var/datum/objective/new_objective = new("Protect Wizard Academy from the intruders") new_objective.owner = owner - owner.objectives += new_objective objectives += new_objective //Solo wizard report diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index 1e7a9b7c15..d9a61ee2f3 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -112,8 +112,8 @@ return TRUE /obj/item/assembly/examine(mob/user) - ..() - to_chat(user, "\The [src] [secured? "is secured and ready to be used!" : "can be attached to other things."]") + . = ..() + . += "\The [src] [secured? "is secured and ready to be used!" : "can be attached to other things."]" /obj/item/assembly/attack_self(mob/user) diff --git a/code/modules/assembly/doorcontrol.dm b/code/modules/assembly/doorcontrol.dm index 04b4e3ed3c..1c9c1a0203 100644 --- a/code/modules/assembly/doorcontrol.dm +++ b/code/modules/assembly/doorcontrol.dm @@ -8,9 +8,9 @@ var/cooldown = FALSE //Door cooldowns /obj/item/assembly/control/examine(mob/user) - ..() + . = ..() if(id) - to_chat(user, "Its channel ID is '[id]'.") + . += "Its channel ID is '[id]'." /obj/item/assembly/control/activate() cooldown = TRUE diff --git a/code/modules/assembly/health.dm b/code/modules/assembly/health.dm index 782d729ce4..3fca066f86 100644 --- a/code/modules/assembly/health.dm +++ b/code/modules/assembly/health.dm @@ -11,8 +11,8 @@ var/alarm_health = HEALTH_THRESHOLD_CRIT /obj/item/assembly/health/examine(mob/user) - ..() - to_chat(user, "Use a multitool to swap between \"detect death\" mode and \"detect critical state\" mode.") + . = ..() + . += "Use a multitool to swap between \"detect death\" mode and \"detect critical state\" mode." /obj/item/assembly/health/activate() if(!..()) diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 7405549b3d..707ebcbb1a 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -38,8 +38,8 @@ . = ..() /obj/item/assembly/infra/examine(mob/user) - ..() - to_chat(user, "The infrared trigger is [on?"on":"off"].") + . = ..() + . += "The infrared trigger is [on?"on":"off"]." /obj/item/assembly/infra/activate() if(!..()) @@ -138,7 +138,7 @@ . = ..() setDir(t) -/obj/item/assembly/infra/throw_at() +/obj/item/assembly/infra/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback) . = ..() olddir = dir diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index a2a9fb0105..950c0dd109 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -9,8 +9,8 @@ /obj/item/assembly/mousetrap/examine(mob/user) - ..() - to_chat(user, "The pressure plate is [armed?"primed":"safe"].") + . = ..() + . += "The pressure plate is [armed?"primed":"safe"]." /obj/item/assembly/mousetrap/activate() if(..()) diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index 97b4543a05..97359f07fc 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -21,8 +21,8 @@ . = ..() /obj/item/assembly/prox_sensor/examine(mob/user) - ..() - to_chat(user, "The proximity sensor is [timing ? "arming" : (scanning ? "armed" : "disarmed")].") + . = ..() + . += "The proximity sensor is [timing ? "arming" : (scanning ? "armed" : "disarmed")]." /obj/item/assembly/prox_sensor/activate() if(!..()) diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 8ba703d7fa..7377ab318e 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -169,8 +169,8 @@ Code: return TRUE /obj/item/assembly/signaler/receiver/examine(mob/user) - ..() - to_chat(user, "The radio receiver is [on?"on":"off"].") + . = ..() + . += "The radio receiver is [on?"on":"off"]." /obj/item/assembly/signaler/receiver/receive_signal(datum/signal/signal) if(!on) diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm index 993bf134e6..660ff39c6c 100644 --- a/code/modules/assembly/timer.dm +++ b/code/modules/assembly/timer.dm @@ -31,8 +31,8 @@ . = ..() /obj/item/assembly/timer/examine(mob/user) - ..() - to_chat(user, "The timer is [timing ? "counting down from [time]":"set for [time] seconds"].") + . = ..() + . += "The timer is [timing ? "counting down from [time]":"set for [time] seconds"]." /obj/item/assembly/timer/activate() if(!..()) diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm index 32148abc21..7ad5f827e1 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -22,8 +22,8 @@ "voice sensor") /obj/item/assembly/voice/examine(mob/user) - ..() - to_chat(user, "Use a multitool to swap between \"inclusive\", \"exclusive\", \"recognizer\", and \"voice sensor\" mode.") + . = ..() + . += "Use a multitool to swap between \"inclusive\", \"exclusive\", \"recognizer\", and \"voice sensor\" mode." /obj/item/assembly/voice/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) . = ..() diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm index d1da05e42d..c47c4a44af 100644 --- a/code/modules/atmospherics/environmental/LINDA_fire.dm +++ b/code/modules/atmospherics/environmental/LINDA_fire.dm @@ -199,7 +199,7 @@ var/radiated_temperature = location.air.temperature*FIRE_SPREAD_RADIOSITY_SCALE for(var/t in location.atmos_adjacent_turfs) var/turf/open/T = t - if(T.active_hotspot) + if(!T.active_hotspot) T.hotspot_expose(radiated_temperature, CELL_VOLUME/4) else diff --git a/code/modules/atmospherics/environmental/LINDA_system.dm b/code/modules/atmospherics/environmental/LINDA_system.dm index 084c35684c..760e4e22da 100644 --- a/code/modules/atmospherics/environmental/LINDA_system.dm +++ b/code/modules/atmospherics/environmental/LINDA_system.dm @@ -1,4 +1,6 @@ /atom/var/CanAtmosPass = ATMOS_PASS_YES +/atom/var/CanAtmosPassVertical = ATMOS_PASS_YES + /atom/proc/CanAtmosPass(turf/T) switch (CanAtmosPass) if (ATMOS_PASS_PROC) @@ -8,42 +10,47 @@ else return CanAtmosPass -/turf/closed/CanAtmosPass = ATMOS_PASS_NO +/turf/CanAtmosPass = ATMOS_PASS_NO +/turf/CanAtmosPassVertical = ATMOS_PASS_NO /turf/open/CanAtmosPass = ATMOS_PASS_PROC -/turf/open/CanAtmosPass(turf/T) - var/R - if(blocks_air || T.blocks_air) - R = 1 +/turf/open/CanAtmosPassVertical = ATMOS_PASS_PROC +/turf/open/CanAtmosPass(turf/T, vertical = FALSE) + var/dir = vertical? get_dir_multiz(src, T) : get_dir(src, T) + var/opp = dir_inverse_multiz(dir) + var/R = FALSE + if(vertical && !(zAirOut(dir, T) && T.zAirIn(dir, src))) + R = TRUE + if(blocks_air || T.blocks_air) + R = TRUE + if (T == src) + return !R for(var/obj/O in contents+T.contents) var/turf/other = (O.loc == src ? T : src) - if(!CANATMOSPASS(O, other)) - R = 1 + if(!(vertical? (CANVERTICALATMOSPASS(O, other)) : (CANATMOSPASS(O, other)))) + R = TRUE if(O.BlockSuperconductivity()) //the direction and open/closed are already checked on CanAtmosPass() so there are no arguments - var/D = get_dir(src, T) - atmos_supeconductivity |= D - D = get_dir(T, src) - T.atmos_supeconductivity |= D - return 0 //no need to keep going, we got all we asked + atmos_supeconductivity |= dir + T.atmos_supeconductivity |= opp + return FALSE //no need to keep going, we got all we asked - atmos_supeconductivity &= ~get_dir(src, T) - T.atmos_supeconductivity &= ~get_dir(T, src) + atmos_supeconductivity &= ~dir + T.atmos_supeconductivity &= ~opp return !R - - /atom/movable/proc/BlockSuperconductivity() // objects that block air and don't let superconductivity act. Only firelocks atm. - return 0 + return FALSE -/turf/proc/CalculateAdjacentTurfs() - var/list/atmos_adjacent_turfs = src.atmos_adjacent_turfs - for(var/direction in GLOB.cardinals) - var/turf/T = get_step(src, direction) - if(!T) +/turf/proc/ImmediateCalculateAdjacentTurfs() + var/canpass = CANATMOSPASS(src, src) + var/canvpass = CANVERTICALATMOSPASS(src, src) + for(var/direction in GLOB.cardinals_multiz) + var/turf/T = get_step_multiz(src, direction) + if(!isopenturf(T)) continue - if( !(blocks_air || T.blocks_air) && CANATMOSPASS(T, src) ) + if(!(blocks_air || T.blocks_air) && ((direction & (UP|DOWN))? (canvpass && CANVERTICALATMOSPASS(T, src)) : (canpass && CANATMOSPASS(T, src))) ) LAZYINITLIST(atmos_adjacent_turfs) LAZYINITLIST(T.atmos_adjacent_turfs) atmos_adjacent_turfs[T] = TRUE @@ -72,11 +79,13 @@ var/turf/curloc = src - for (var/direction in GLOB.diagonals) + for (var/direction in GLOB.diagonals_multiz) var/matchingDirections = 0 - var/turf/S = get_step(curloc, direction) + var/turf/S = get_step_multiz(curloc, direction) + if(!S) + continue - for (var/checkDirection in GLOB.cardinals) + for (var/checkDirection in GLOB.cardinals_multiz) var/turf/checkTurf = get_step(S, checkDirection) if(!S.atmos_adjacent_turfs || !S.atmos_adjacent_turfs[checkTurf]) continue @@ -98,13 +107,13 @@ /turf/air_update_turf(command = 0) if(command) - CalculateAdjacentTurfs() + ImmediateCalculateAdjacentTurfs() SSair.add_to_active(src,command) /atom/movable/proc/move_update_air(turf/T) - if(isturf(T)) - T.air_update_turf(1) - air_update_turf(1) + if(isturf(T)) + T.air_update_turf(1) + air_update_turf(1) /atom/proc/atmos_spawn_air(text) //because a lot of people loves to copy paste awful code lets just make an easy proc to spawn your plasma fires var/turf/open/T = get_turf(src) diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index ea555c9489..cafdafb671 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -15,7 +15,7 @@ //used for mapping and for breathing while in walls (because that's a thing that needs to be accounted for...) //string parsed by /datum/gas/proc/copy_from_turf - var/initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + var/initial_gas_mix = OPENTURF_DEFAULT_ATMOS //approximation of MOLES_O2STANDARD and MOLES_N2STANDARD pending byond allowing constant expressions to be embedded in constant strings // If someone will place 0 of some gas there, SHIT WILL BREAK. Do not do that. @@ -42,8 +42,7 @@ /turf/open/Destroy() if(active_hotspot) - qdel(active_hotspot) - active_hotspot = null + QDEL_NULL(active_hotspot) // Adds the adjacent turfs to the current atmos processing for(var/T in atmos_adjacent_turfs) SSair.add_to_active(T) diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 6ca25c0d80..58ab9c6183 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -222,11 +222,11 @@ . = ..() switch(buildstage) if(0) - to_chat(user, "It is missing air alarm electronics.") + . += "It is missing air alarm electronics." if(1) - to_chat(user, "It is missing wiring.") + . += "It is missing wiring." if(2) - to_chat(user, "Alt-click to [locked ? "unlock" : "lock"] the interface.") + . += "Alt-click to [locked ? "unlock" : "lock"] the interface." /obj/machinery/airalarm/ui_status(mob/user) if(user.has_unlimited_silicon_privilege && aidisabled) diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index 7d095869cb..2e4cccf5a3 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -28,8 +28,8 @@ Pipelines + Other Objects -> Pipe network var/piping_layer = PIPING_LAYER_DEFAULT var/pipe_flags = NONE - var/global/list/iconsetids = list() - var/global/list/pipeimages = list() + var/static/list/iconsetids = list() + var/static/list/pipeimages = list() var/image/pipe_vision_img = null @@ -41,11 +41,11 @@ Pipelines + Other Objects -> Pipe network var/on = FALSE /obj/machinery/atmospherics/examine(mob/user) - ..() + . = ..() if(is_type_in_list(src, GLOB.ventcrawl_machinery) && isliving(user)) var/mob/living/L = user if(L.ventcrawler) - to_chat(L, "Alt-click to crawl through it.") + . += "Alt-click to crawl through it." /obj/machinery/atmospherics/New(loc, process = TRUE, setdir) if(!isnull(setdir)) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index 1de5b93332..b95b15efbd 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm @@ -30,8 +30,8 @@ Thus, the two variables affect pump operation are set in New(): /obj/machinery/atmospherics/components/binary/pump/examine(mob/user) . = ..() - to_chat(user,"You can hold Ctrl and click on it to toggle it on and off.") - to_chat(user,"You can hold Alt and click on it to maximize its pressure.") + . += "You can hold Ctrl and click on it to toggle it on and off." + . += "You can hold Alt and click on it to maximize its pressure." /obj/machinery/atmospherics/components/binary/pump/CtrlClick(mob/user) var/area/A = get_area(src) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm index 3a2321c395..e9fa52fd23 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm @@ -30,8 +30,8 @@ Thus, the two variables affect pump operation are set in New(): /obj/machinery/atmospherics/components/binary/volume_pump/examine(mob/user) . = ..() - to_chat(user,"You can hold Ctrl and click on it to toggle it on and off.") - to_chat(user,"You can hold Alt and click on it to maximize its pressure.") + . += "You can hold Ctrl and click on it to toggle it on and off." + . += "You can hold Alt and click on it to maximize its pressure." /obj/machinery/atmospherics/components/binary/volume_pump/CtrlClick(mob/user) var/area/A = get_area(src) diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index ac05c94a78..6b0465d589 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -14,8 +14,8 @@ /obj/machinery/atmospherics/components/trinary/filter/examine(mob/user) . = ..() - to_chat(user,"You can hold Ctrl and click on it to toggle it on and off.") - to_chat(user,"You can hold Alt and click on it to maximize its pressure.") + . += "You can hold Ctrl and click on it to toggle it on and off." + . += "You can hold Alt and click on it to maximize its pressure." /obj/machinery/atmospherics/components/trinary/filter/CtrlClick(mob/user) var/area/A = get_area(src) diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm index fc866c3d6a..9e4deaf3d8 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm @@ -16,8 +16,8 @@ //node 3 is the outlet, nodes 1 & 2 are intakes /obj/machinery/atmospherics/components/trinary/mixer/examine(mob/user) . = ..() - to_chat(user,"You can hold Ctrl and click on it to toggle it on and off.") - to_chat(user,"You can hold Alt and click on it to maximize its pressure.") + . += "You can hold Ctrl and click on it to toggle it on and off." + . += "You can hold Alt and click on it to maximize its pressure." /obj/machinery/atmospherics/components/trinary/mixer/CtrlClick(mob/user) var/area/A = get_area(src) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index ccd13d8d4a..ca8b21593f 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -1,5 +1,3 @@ -#define CRYOMOBS 'icons/obj/cryo_mobs.dmi' - /obj/machinery/atmospherics/components/unary/cryo_cell name = "cryo cell" icon = 'icons/obj/cryogenics.dmi' @@ -211,7 +209,7 @@ if(ishuman(occupant)) var/mob/living/carbon/human/H = occupant - cold_protection = H.get_cold_protection(air1.temperature) + cold_protection = H.get_thermal_protection(air1.temperature, TRUE) if(abs(temperature_delta) > 1) var/air_heat_capacity = air1.heat_capacity() @@ -264,14 +262,14 @@ open_machine() /obj/machinery/atmospherics/components/unary/cryo_cell/examine(mob/user) - ..() + . = ..() if(occupant) if(on) - to_chat(user, "Someone's inside [src]!") + . += "Someone's inside [src]!" else - to_chat(user, "You can barely make out a form floating in [src].") + . += "You can barely make out a form floating in [src]." else - to_chat(user, "[src] seems empty.") + . += "[src] seems empty." /obj/machinery/atmospherics/components/unary/cryo_cell/MouseDrop_T(mob/target, mob/user) if(user.stat || user.lying || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !user.IsAdvancedToolUser()) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index 5b37242c78..75f2a60f80 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -424,9 +424,9 @@ return FALSE /obj/machinery/atmospherics/components/unary/vent_pump/examine(mob/user) - ..() + . = ..() if(welded) - to_chat(user, "It seems welded shut.") + . += "It seems welded shut." /obj/machinery/atmospherics/components/unary/vent_pump/power_change() ..() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index 7f40630a86..8585471ea4 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -118,7 +118,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/proc/broadcast_status() if(!radio_connection) return FALSE - + var/list/f_types = list() for(var/path in GLOB.meta_gas_ids) f_types += list(list("gas_id" = GLOB.meta_gas_ids[path], "gas_name" = GLOB.meta_gas_names[path], "enabled" = (path in filter_types))) @@ -205,7 +205,7 @@ air_contents.merge(filtered_out) tile.assume_air(removed) tile.air_update_turf() - + else //Just siphoning all air var/transfer_moles = environment.total_moles()*(volume_rate/environment.volume) @@ -303,11 +303,11 @@ if(. && on && is_operational()) to_chat(user, "You cannot unwrench [src], turn it off first!") return FALSE - + /obj/machinery/atmospherics/components/unary/vent_scrubber/examine(mob/user) - ..() + . = ..() if(welded) - to_chat(user, "It seems welded shut.") + . += "It seems welded shut." /obj/machinery/atmospherics/components/unary/vent_scrubber/can_crawl_through() return !welded diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm index b10ff85ba0..d0c78d21b3 100644 --- a/code/modules/atmospherics/machinery/other/meter.dm +++ b/code/modules/atmospherics/machinery/other/meter.dm @@ -111,8 +111,8 @@ . = "The connect error light is blinking." /obj/machinery/meter/examine(mob/user) - ..() - to_chat(user, status()) + . = ..() + . += status() /obj/machinery/meter/wrench_act(mob/user, obj/item/I) to_chat(user, "You begin to unfasten \the [src]...") diff --git a/code/modules/atmospherics/machinery/other/miner.dm b/code/modules/atmospherics/machinery/other/miner.dm index adb17b4e94..c90d388a1d 100644 --- a/code/modules/atmospherics/machinery/other/miner.dm +++ b/code/modules/atmospherics/machinery/other/miner.dm @@ -33,9 +33,9 @@ set_active(active) //Force overlay update. /obj/machinery/atmospherics/miner/examine(mob/user) - ..() + . = ..() if(broken) - to_chat(user, "Its debug output is printing \"[broken_message]\".") + . += "Its debug output is printing \"[broken_message]\"." /obj/machinery/atmospherics/miner/proc/check_operation() if(!active) diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index b575639246..81540b0698 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -88,10 +88,10 @@ replace_tank(user, TRUE) /obj/machinery/portable_atmospherics/examine(mob/user) - ..() + . = ..() if(holding) - to_chat(user, "\The [src] contains [holding]. Alt-click [src] to remove it.") - to_chat(user, "Click [src] with another gas tank to hot swap [holding].") + . += "\The [src] contains [holding]. Alt-click [src] to remove it." + . += "Click [src] with another gas tank to hot swap [holding]." /obj/machinery/portable_atmospherics/proc/replace_tank(mob/living/user, close_valve, obj/item/tank/new_tank) if(holding) diff --git a/code/modules/atmospherics/multiz.dm b/code/modules/atmospherics/multiz.dm new file mode 100644 index 0000000000..2b3a9af1c7 --- /dev/null +++ b/code/modules/atmospherics/multiz.dm @@ -0,0 +1,29 @@ +obj/machinery/atmospherics/pipe/simple/multiz ///This is an atmospherics pipe which can relay air up a deck (Z+1). It currently only supports being on pipe layer 1 + name = "multi deck pipe adapter" + desc = "An adapter which allows pipes to connect to other pipenets on different decks." + icon_state = "multiz_pipe" + icon = 'icons/obj/atmos.dmi' + +/obj/machinery/atmospherics/pipe/simple/multiz/update_icon() + . = ..() + cut_overlays() //This adds the overlay showing it's a multiz pipe. This should go above turfs and such + var/image/multiz_overlay_node = new(src) //If we have a firing state, light em up! + multiz_overlay_node.icon = 'icons/obj/atmos.dmi' + multiz_overlay_node.icon_state = "multiz_pipe" + multiz_overlay_node.layer = HIGH_OBJ_LAYER + add_overlay(multiz_overlay_node) + +///Attempts to locate a multiz pipe that's above us, if it finds one it merges us into its pipenet +/obj/machinery/atmospherics/pipe/simple/multiz/pipeline_expansion() + icon = 'icons/obj/atmos.dmi' //Just to refresh. + var/turf/T = get_turf(src) + var/obj/machinery/atmospherics/pipe/simple/multiz/above = locate(/obj/machinery/atmospherics/pipe/simple/multiz) in(SSmapping.get_turf_above(T)) + var/obj/machinery/atmospherics/pipe/simple/multiz/below = locate(/obj/machinery/atmospherics/pipe/simple/multiz) in(SSmapping.get_turf_below(T)) + if(below) + below.pipeline_expansion() //If we've got one below us, force it to add us on facebook + if(above) + nodes += above + above.nodes += src //Two way travel :) + return ..() + else + return ..() \ No newline at end of file diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index 84f08197b4..bd4e716357 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -487,7 +487,7 @@ r_pocket = /obj/item/ammo_box/magazine/recharge/ctf r_hand = /obj/item/gun/ballistic/automatic/laser/ctf -/datum/outfit/ctf/post_equip(mob/living/carbon/human/H, visualsOnly=FALSE) +/datum/outfit/ctf/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) if(visualsOnly) return var/list/no_drops = list() @@ -529,7 +529,7 @@ r_hand = /obj/item/gun/energy/laser/instakill/blue shoes = /obj/item/clothing/shoes/jackboots/fast -/datum/outfit/ctf/red/post_equip(mob/living/carbon/human/H) +/datum/outfit/ctf/red/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) ..() var/obj/item/radio/R = H.ears R.set_frequency(FREQ_CTF_RED) @@ -537,7 +537,7 @@ R.independent = TRUE H.dna.species.stunmod = 0 -/datum/outfit/ctf/blue/post_equip(mob/living/carbon/human/H) +/datum/outfit/ctf/blue/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) ..() var/obj/item/radio/R = H.ears R.set_frequency(FREQ_CTF_BLUE) diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 2631491350..0d5fa6bc8a 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -17,6 +17,7 @@ var/faction = null var/permanent = FALSE //If true, the spawner will not disappear upon running out of uses. var/random = FALSE //Don't set a name or gender, just go random + var/antagonist_type var/objectives = null var/uses = 1 //how many times can we spawn from it. set to -1 for infinite. var/brute_damage = 0 @@ -43,9 +44,8 @@ return if(isobserver(user)) var/mob/dead/observer/O = user - if(!O.can_reenter_round) - to_chat(user, "You are unable to reenter the round.") - return + if(!O.can_reenter_round()) + return FALSE var/ghost_role = alert(latejoinercalling ? "Latejoin as [mob_name]? (This is a ghost role, and as such, it's very likely to be off-station.)" : "Become [mob_name]? (Warning, You can no longer be cloned!)",,"Yes","No") if(ghost_role == "No" || !loc) return @@ -111,9 +111,16 @@ if(show_flavour) to_chat(M, "[flavour_text]") var/datum/mind/MM = M.mind + var/datum/antagonist/A + if(antagonist_type) + A = MM.add_antag_datum(antagonist_type) if(objectives) + if(!A) + A = MM.add_antag_datum(/datum/antagonist/custom) for(var/objective in objectives) - MM.objectives += new/datum/objective(objective) + var/datum/objective/O = new/datum/objective(objective) + O.owner = MM + A.objectives += O if(assignedrole) M.mind.assigned_role = assignedrole special(M, name) @@ -249,7 +256,7 @@ //Non-human spawners -/obj/effect/mob_spawn/AICorpse/create() //Creates a corrupted AI +/obj/effect/mob_spawn/AICorpse/create(ckey, name) //Creates a corrupted AI var/A = locate(/mob/living/silicon/ai) in loc if(A) return @@ -269,7 +276,7 @@ /obj/effect/mob_spawn/slime/equip(mob/living/simple_animal/slime/S) S.colour = mobcolour -/obj/effect/mob_spawn/human/facehugger/create() //Creates a squashed facehugger +/obj/effect/mob_spawn/human/facehugger/create(ckey, name) //Creates a squashed facehugger var/obj/item/clothing/mask/facehugger/O = new(src.loc) //variable O is a new facehugger at the location of the landmark O.name = src.name O.Die() //call the facehugger's death proc @@ -433,7 +440,7 @@ uniform = /obj/item/clothing/under/pants/youngfolksjeans id = /obj/item/card/id -/datum/outfit/beachbum/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/beachbum/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) ..() if(visualsOnly) return diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm index b7b21bbb9b..77cdf8441b 100644 --- a/code/modules/awaymissions/mission_code/Academy.dm +++ b/code/modules/awaymissions/mission_code/Academy.dm @@ -264,8 +264,9 @@ var/mob/living/carbon/human/H = new(drop_location()) H.equipOutfit(/datum/outfit/butler) var/datum/mind/servant_mind = new /datum/mind() - var/datum/objective/O = new("Serve [user.real_name].") - servant_mind.objectives += O + var/datum/antagonist/magic_servant/A = new + servant_mind.add_antag_datum(A) + A.setup_master(user) servant_mind.transfer_to(H) var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [user.real_name] Servant?", ROLE_WIZARD, null, ROLE_WIZARD, 50, H) diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index 7cb771737e..aa1abe56b4 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -154,7 +154,7 @@ //liquid plasma!!!!!!// /turf/open/floor/plasteel/dark/snowdin - initial_gas_mix = "o2=22;n2=82;TEMP=180" + initial_gas_mix = FROZEN_ATMOS planetary_atmos = 1 temperature = 180 diff --git a/code/modules/bsql/core/library.dm b/code/modules/bsql/core/library.dm index 1b62cf3b6a..9b58ba314b 100644 --- a/code/modules/bsql/core/library.dm +++ b/code/modules/bsql/core/library.dm @@ -1,6 +1,6 @@ /world/proc/_BSQL_Internal_Call(func, ...) var/list/call_args = args.Copy(2) - BSQL_Debug("[.....]: [args[1]]([call_args.Join(", ")])") + BSQL_Debug("_BSQL_Internal_Call(): [args[1]]([call_args.Join(", ")])") . = call(_BSQL_Library_Path(), func)(arglist(call_args)) BSQL_Debug("Result: [. == null ? "NULL" : "\"[.]\""]") diff --git a/code/modules/cargo/bounties/assistant.dm b/code/modules/cargo/bounties/assistant.dm index 4edcb04e8f..d65c595b8f 100644 --- a/code/modules/cargo/bounties/assistant.dm +++ b/code/modules/cargo/bounties/assistant.dm @@ -1,20 +1,16 @@ -/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 = 600 - wanted_types = list(/obj/item/relic) +//Moved Maint Loot and other assorted bounties to silly.dm /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 = 850 // the mat hoffman + reward = 900 // 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 = 700 // the tony hawk + reward = 750 // the tony hawk wanted_types = list(/obj/vehicle/ridden/scooter/skateboard) /datum/bounty/item/assistant/stunprod @@ -26,8 +22,8 @@ /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 = 1000 - required_count = 3 + reward = 1200 + required_count = 3 //You can (apparently) get soap from the mining rewards vendor. wanted_types = list(/obj/item/soap) /datum/bounty/item/assistant/spear @@ -50,12 +46,6 @@ reward = 2000 wanted_types = list(/obj/structure/statue) -/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 = 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!" @@ -76,44 +66,38 @@ 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 = 2000 - required_count = 10 - wanted_types = list(/obj/item/reagent_containers/food/snacks/donut) +// /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 = 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 = 1000 - required_count = 10 - wanted_types = list(/obj/item/reagent_containers/food/snacks/donkpocket) +// /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 = 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 = 1500 - required_count = 5 + reward = 1200 + required_count = 3 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 = 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 = 500 + reward = 1250 + required_count = 3 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 = 500 + reward = 750 required_count = 15 wanted_types = list(/obj/item/shard) @@ -124,20 +108,20 @@ 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 = 1000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy/geranium) +// /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 = 1000 +// required_count = 3 +// wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy/geranium) -/datum/bounty/item/assistant/poppy - name = "Poppies" - description = "Commander Zot really wants to sweep Security Officer Olivia off her feet. Send a shipment of Poppies - her favorite flower - and he'll happily reward you." - reward = 1000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy) - include_subtypes = FALSE +// /datum/bounty/item/assistant/poppy +// name = "Poppies" +// description = "Commander Zot really wants to sweep Security Officer Olivia off her feet. Send a shipment of Poppies - her favorite flower - and he'll happily reward you." +// reward = 1000 +// required_count = 3 +// wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy) +// include_subtypes = FALSE /datum/bounty/item/assistant/shadyjims name = "Shady Jim's" @@ -152,13 +136,13 @@ required_count = 8 wanted_types = list(/obj/item/twohanded/required/kirbyplants) -/datum/bounty/item/assistant/earmuffs - name = "Earmuffs" - description = "Central Command is getting tired of your station's messages. They've ordered that you ship some earmuffs to lessen the annoyance." - reward = 1000 - wanted_types = list(/obj/item/clothing/ears/earmuffs) +// /datum/bounty/item/assistant/earmuffs +// name = "Earmuffs" +// description = "Central Command is getting tired of your station's messages. They've ordered that you ship some earmuffs to lessen the annoyance." +// reward = 1000 +// wanted_types = list(/obj/item/clothing/ears/earmuffs) -/datum/bounty/item/assistant/handcuffs +/datum/bounty/item/assistant/cuffs name = "Handcuffs" description = "A large influx of escaped convicts have arrived at Central Command. Now is the perfect time to ship out spare handcuffs (or restraints)." reward = 1000 @@ -203,15 +187,36 @@ reward = 3000 wanted_types = list(/obj/item/reagent_containers/food/snacks/meat/slab/corgi) -/datum/bounty/item/assistant/action_figures - name = "Action Figures" - description = "The vice president's son saw an ad for action figures on the telescreen and now he won't shut up about them. Ship some to ease his complaints." - reward = 4000 - required_count = 5 - wanted_types = list(/obj/item/toy/figure) - /datum/bounty/item/assistant/tail_whip name = "Nine Tails whip" description = "Commander Jackson is looking for a fine addition to her exotic weapons collection. She will reward you handsomely for either a Cat or Liz o' Nine Tails." reward = 4000 wanted_types = list(/obj/item/melee/chainofcommand/tailwhip) + +/datum/bounty/item/assistant/bolas + name = "Bolas" + description = "Centcom's chef has lost their mind. They're streaking naked though the halls, greased up with butter and cooking oil. Send some bola's so we can capture them." + reward = 1000 + required_count = 3 + wanted_types = list(/obj/item/restraints/legcuffs/bola) + +/datum/bounty/item/assistant/metalshields + name = "Metal Shields" + description = "NT is testing the effects of electricity on clowns wielding metal shields. We have clowns, and we have electricity. Send us the shields." + reward = 1400 + required_count = 4 + wanted_types = list(/obj/item/shield/makeshift) + +/datum/bounty/item/assistant/toolbelts + name = "Tool Belts" + description = "These things always seem to go missing. Ship us a few to help us restock." + reward = 1350 + required_count = 3 + wanted_types = list(/obj/item/storage/belt/utility) + +/datum/bounty/item/assistant/gasmasks + name = "Gas Masks" + description = "The good news is that we have more miasma than we'll ever need. The bad news is, somone opened the release valve on the canisters. Ship us some gas masks!" + reward = 1100 + required_count = 4 + wanted_types = list(/obj/item/clothing/mask/gas) diff --git a/code/modules/cargo/bounties/botany.dm b/code/modules/cargo/bounties/botany.dm index 754de480cd..98d7765002 100644 --- a/code/modules/cargo/bounties/botany.dm +++ b/code/modules/cargo/bounties/botany.dm @@ -135,11 +135,11 @@ bonus_desc = "Not to be confused with eggplants." multiplier = 2 -/datum/bounty/item/botany/kudzu - name = "Kudzu Pods" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/kudzupod) - bonus_desc = "Store in a dry, dark place." - multiplier = 4 +// /datum/bounty/item/botany/kudzu +// name = "Kudzu Pods" +// wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/kudzupod) +// bonus_desc = "Store in a dry, dark place." +// multiplier = 4 /datum/bounty/item/botany/watermelon name = "Watermelons" diff --git a/code/modules/cargo/bounties/chef.dm b/code/modules/cargo/bounties/chef.dm index 719a2d10a5..64e1710461 100644 --- a/code/modules/cargo/bounties/chef.dm +++ b/code/modules/cargo/bounties/chef.dm @@ -1,8 +1,4 @@ -/datum/bounty/item/chef/birthday_cake - name = "Birthday Cake" - description = "Nanotrasen's birthday is coming up! Ship them a birthday cake to celebrate!" - reward = 1000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/store/cake/birthday, /obj/item/reagent_containers/food/snacks/cakeslice/birthday) +//Moved (most) bounties requiring botany to gardencook.dm Roundstart cook bounties go here. /datum/bounty/item/chef/soup name = "Soup" @@ -11,20 +7,6 @@ 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 = 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 = 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." @@ -51,13 +33,6 @@ 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 = 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." @@ -70,11 +45,11 @@ reward = 3000 wanted_types = list(/obj/item/reagent_containers/food/snacks/poppypretzel) -/datum/bounty/item/chef/cubancarp - name = "Cuban Carp" - description = "To celebrate the birth of Castro XXVII, ship one cuban carp to CentCom." - reward = 3000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/cubancarp) +// /datum/bounty/item/chef/cubancarp +// name = "Cuban Carp" +// description = "To celebrate the birth of Castro XXVII, ship one cuban carp to CentCom." +// reward = 3000 +// wanted_types = list(/obj/item/reagent_containers/food/snacks/cubancarp) /datum/bounty/item/chef/hotdog name = "Hot Dog" @@ -82,13 +57,6 @@ 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 = 2500 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/eggplantparm) - /datum/bounty/item/chef/muffin name = "Muffins" description = "The Muffin Man is visiting CentCom, but he's forgotten his muffins! Your order is to rectify this." @@ -129,3 +97,41 @@ required_count = 6 wanted_types = list(/obj/item/reagent_containers/food/snacks/nugget) +/datum/bounty/item/chef/khachapuri + name = "Khachapuri" + description = "Bread and eggs. Bread and eggs. Bread and eggs. Also, cheese." + reward = 2000 + required_count = 2 + wanted_types = list(/obj/item/reagent_containers/food/snacks/khachapuri) + +/datum/bounty/item/chef/ratkebab + name = "Rat Kebabs" + description = "Centcom is requesting some -special- kebabs for it's service staff." + reward = 1800 + required_count = 3 + wanted_types = list(/obj/item/reagent_containers/food/snacks/kebab/rat) + +/datum/bounty/item/chef/benedict + name = "Eggs Benedict" + description = "Command requires a high-calory breakfast item. Ship it right away." + reward = 1750 + wanted_types = list(/obj/item/reagent_containers/food/snacks/benedict) + +/datum/bounty/item/chef/braincake + name = "Brain Cake" + description = "The science division requires a brain cake for testing purposes. Don't ask." + reward = 1200 + wanted_types = list(/obj/item/reagent_containers/food/snacks/store/cake/brain) + +/datum/bounty/item/chef/waffles + name = "Waffles" + description = "Security staff at Centcom are looking for a fun treat. Ship us some waffles so they can fill the cells." + reward = 1000 + wanted_types = list(/obj/item/reagent_containers/food/snacks/waffles) + +/datum/bounty/item/chef/sugarcookie + name = "Sugar Cookies" + description = "Everyone needs a little sugar in their life. Ship some sweets to Command so we can satiate our sweet tooth." + reward = 1200 + required_count = 6 + wanted_types = list(/obj/item/reagent_containers/food/snacks/sugarcookie) diff --git a/code/modules/cargo/bounties/gardencook.dm b/code/modules/cargo/bounties/gardencook.dm new file mode 100644 index 0000000000..b73cc2f9f8 --- /dev/null +++ b/code/modules/cargo/bounties/gardencook.dm @@ -0,0 +1,53 @@ +/datum/bounty/item/chef/birthday_cake + name = "Birthday Cake" + description = "Nanotrasen's birthday is coming up! Ship them a birthday cake to celebrate!" + 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/gardencook/carrotfries + name = "Carrot Fries" + description = "Night sight can mean life or death! A shipment of carrot fries is the order." + reward = 1300 + required_count = 3 + wanted_types = list(/obj/item/reagent_containers/food/snacks/carrotfries) + +/datum/bounty/item/gardencook/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 = 2500 + required_count = 3 + wanted_types = list(/obj/item/reagent_containers/food/snacks/eggplantparm) + +/datum/bounty/item/gardencook/popcorn + name = "Popcorn Bags" + description = "Upper management wants to host a movie night. Ship bags of popcorn for the occasion." + reward = 800 + required_count = 3 + wanted_types = list(/obj/item/reagent_containers/food/snacks/popcorn) + +/datum/bounty/item/gardencook/onionrings + name = "Onion Rings" + description = "Nanotrasen is remembering Saturn day. Ship onion rings to show the station's support." + reward = 800 + required_count = 3 + wanted_types = list(/obj/item/reagent_containers/food/snacks/onionrings) + +/datum/bounty/item/gardencook/khinkali + name = "Khinkali" + description = "Requesting -some khinki stuff- for a private staff party at Centcom" + reward = 2400 + required_count = 6 + wanted_types = list(/obj/item/reagent_containers/food/snacks/khinkali) + +/datum/bounty/item/gardencook/bakedbeans + name = "Beans" + description = "Management wants to make sure we have a fallback shelter to rely on. Prepare some beans to stock it with." + reward = 1600 + required_count = 8 + wanted_types = list(/obj/item/reagent_containers/food/snacks/beans) + +/datum/bounty/item/gardencook/honeybun + name = "Honeybun" + description = "Something sticky, something fun, ship us a honeybun." + reward = 3500 + wanted_types = list(/obj/item/reagent_containers/food/snacks/honeybun) diff --git a/code/modules/cargo/bounties/silly.dm b/code/modules/cargo/bounties/silly.dm new file mode 100644 index 0000000000..b88ec9f192 --- /dev/null +++ b/code/modules/cargo/bounties/silly.dm @@ -0,0 +1,54 @@ +/datum/bounty/item/silly/paper_plane + name = "Paper Planes" + description = "Centcom is running an experiment on which type of paper plane is the most aerodynamically stable. Send us some samples to further our study." + reward = 900 + required_count = 15 + wanted_types = list(/obj/item/paperplane) + +/datum/bounty/item/silly/mousetraps + name = "Mouse Traps" + description = "Some shoeless hoodlum is intentionally tracking paint all over Centcom. Send us some mouse traps so we can capture the culprit." + reward = 1200 + required_count = 12 + wanted_types = list(/obj/item/assembly/mousetrap) + +/datum/bounty/item/silly/action_figures + name = "Action Figures" + description = "The vice president's son saw an ad for action figures on the telescreen and now he won't shut up about them. Ship some to ease his complaints." + reward = 3000 + required_count = 5 + wanted_types = list(/obj/item/toy/figure) + +/datum/bounty/item/silly/clown_box + name = "Clown Box" + description = "The universe needs laughter. Stamp cardboard with a clown stamp and ship it out." + reward = 1000 + wanted_types = list(/obj/item/storage/box/clown) + +/datum/bounty/item/silly/peels + name = "Banana Peels" + description = "Centcom is running an experiment to see if a slip-n-slide can be made entirely out of banana peels, but noone wants to eat that many bananas. Ship us some fresh peels." + reward = 950 + required_count = 12 + wanted_types = list(/obj/item/grown/bananapeel) + +/datum/bounty/item/silly/shoes + name = "Shoes" + description = "An assistant stole a clown's shoes, the clown incinerated every pair we had. Send us some new footwear please." + reward = 1200 + required_count = 8 + wanted_types = list(/obj/item/clothing/shoes) + exclude_types = list(/obj/item/clothing/shoes/wraps, /obj/item/clothing/shoes/wraps/silver, /obj/item/clothing/shoes/wraps/red, /obj/item/clothing/shoes/wraps/blue) + +/datum/bounty/item/silly/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 = 1400 + required_count = 2 + wanted_types = list(/obj/item/clothing/glasses/sunglasses) + +/datum/bounty/item/silly/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 = 1000 + wanted_types = list(/obj/item/relic) \ No newline at end of file diff --git a/code/modules/cargo/bounty.dm b/code/modules/cargo/bounty.dm index 6cc05f56df..bfd97e4d1f 100644 --- a/code/modules/cargo/bounty.dm +++ b/code/modules/cargo/bounty.dm @@ -75,7 +75,7 @@ GLOBAL_LIST_EMPTY(bounties_list) // Returns a new bounty of random type, but does not add it to GLOB.bounties_list. /proc/random_bounty() - switch(rand(1, 13)) + switch(rand(1, 15)) if(1) var/subtype = pick(subtypesof(/datum/bounty/item/assistant)) return new subtype @@ -115,6 +115,12 @@ GLOBAL_LIST_EMPTY(bounties_list) if(13) var/subtype = pick(subtypesof(/datum/bounty/item/botany)) return new subtype + if(14) + var/subtype = pick(subtypesof(/datum/bounty/item/silly)) + return new subtype + if(15) + var/subtype = pick(subtypesof(/datum/bounty/item/gardencook)) + return new subtype // Called lazily at startup to populate GLOB.bounties_list with random bounties. /proc/setup_bounties() @@ -130,7 +136,9 @@ GLOBAL_LIST_EMPTY(bounties_list) /datum/bounty/item/engineering = 1, /datum/bounty/item/mining = 2, /datum/bounty/item/medical = 2, - /datum/bounty/item/botany = 2) + /datum/bounty/item/botany = 2, + /datum/bounty/item/silly = 1, + /datum/bounty/item/gardencook = 1) for(var/the_type in easy_add_list_subtypes) for(var/i in 1 to easy_add_list_subtypes[the_type]) diff --git a/code/modules/cargo/bounty_console.dm b/code/modules/cargo/bounty_console.dm index 2e5d943dd6..45260f4926 100644 --- a/code/modules/cargo/bounty_console.dm +++ b/code/modules/cargo/bounty_console.dm @@ -1,5 +1,7 @@ #define PRINTER_TIMEOUT 10 + + /obj/machinery/computer/bounty name = "Nanotrasen bounty console" desc = "Used to check and claim bounties offered by Nanotrasen" @@ -24,9 +26,9 @@ for(var/datum/bounty/B in GLOB.bounties_list) if(B.claimed) continue - info += "

    [B.name]

    " - info += "
    • Reward: [B.reward_string()]
    • " - info += "
    • Completed: [B.completion_string()]
    " + info += {"

    [B.name]

    +
    • Reward: [B.reward_string()]
    • +
    • Completed: [B.completion_string()]
    "} /obj/machinery/computer/bounty/ui_interact(mob/user) . = ..() @@ -34,39 +36,36 @@ if(!GLOB.bounties_list.len) setup_bounties() - var/dat = "" - dat += "Refresh" - dat += "Print Paper" - dat += "

    Credits: [SSshuttle.points]

    " - dat += {""} - dat += "" + var/list/dat = list({"Refresh + Print Paper +

    Credits: [SSshuttle.points]

    +
    NameDescriptionRewardCompletionStatus
    + "}) for(var/datum/bounty/B in GLOB.bounties_list) - var/background - if(B.can_claim()) - background = "'background-color:#4F7529;'" - else if(B.claimed) - background = "'background-color:#294675;'" + if(B.claimed) + dat += "" + else if(B.can_claim()) + dat += "" else - background = "'background-color:#990000;'" - dat += "" + dat += "" if(B.high_priority) - dat += text("", B.name) - dat += text("", B.description) - dat += text("", B.reward_string()) + dat += {" + + "} else - dat += text("", B.name) - dat += text("", B.description) - dat += text("", B.reward_string()) - dat += text("", B.completion_string()) - if(B.can_claim()) - dat += text("") - else if(B.claimed) - dat += text("") + dat += {" + + "} + dat += "" + if(B.claimed) + dat += "" + else if(B.can_claim()) + dat += "" else - dat += text("") + dat += "" dat += "" dat += "
    NameDescriptionRewardCompletionStatus
    []High Priority: [][][B.name]High Priority: [B.description][B.reward_string()][][][][]ClaimClaimed[B.name][B.description][B.reward_string()][B.completion_string()]ClaimedClaimUnclaimedUnclaimed
    " - + dat = dat.Join() var/datum/browser/popup = new(user, "bounties", "Nanotrasen Bounties", 700, 600) popup.set_content(dat) popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) @@ -91,4 +90,3 @@ playsound(src, "terminal_type", 25, 0) updateUsrDialog() - diff --git a/code/modules/cargo/centcom_podlauncher.dm b/code/modules/cargo/centcom_podlauncher.dm index e482aa00b5..f57374db7c 100644 --- a/code/modules/cargo/centcom_podlauncher.dm +++ b/code/modules/cargo/centcom_podlauncher.dm @@ -2,7 +2,7 @@ //This was originally created as a way to get adminspawned items to the station in an IC manner. It's evolved to contain a few more //features such as item removal, smiting, controllable delivery mobs, and more. -//This works by creating a supplypod (refered to as temp_pod) in a special room in the centcom map. +//This works by creating a supplypod (refered to as temp_pod) in a special room in the centcom map. //IMPORTANT: Even though we call it a supplypod for our purposes, it can take on the appearance and function of many other things: Eg. cruise missiles, boxes, or walking, living gondolas. //When the user launched the pod, items from special "bays" on the centcom map are taken and put into the supplypod @@ -33,7 +33,7 @@ var/launchCounter = 1 //Used with the "Ordered" launch mode (launchChoice = 1) to see what item is launched var/specificTarget //Do we want to target a specific mob instead of where we click? Also used for smiting var/list/orderedArea = list() //Contains an ordered list of turfs in an area (filled in the createOrderedArea() proc), read top-left to bottom-right. Used for the "ordered" launch mode (launchChoice = 1) - var/list/acceptableTurfs = list() //Contians a list of turfs (in the "bay" area on centcom) that have items that can be launched. Taken from orderedArea + var/list/turf/acceptableTurfs = list() //Contians a list of turfs (in the "bay" area on centcom) that have items that can be launched. Taken from orderedArea var/list/launchList = list() //Contains whatever is going to be put in the supplypod and fired. Taken from acceptableTurfs var/obj/effect/supplypod_selector/selector = new() //An effect used for keeping track of what item is going to be launched when in "ordered" mode (launchChoice = 1) var/obj/structure/closet/supplypod/centcompod/temp_pod //The temporary pod that is modified by this datum, then cloned. The buildObject() clone of this pod is what is launched @@ -69,7 +69,7 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm data["landingDelay"] = temp_pod.landingDelay //How long the pod takes to land after launching data["openingDelay"] = temp_pod.openingDelay //How long the pod takes to open after landing data["departureDelay"] = temp_pod.departureDelay //How long the pod takes to leave after opening (if bluespace=true, it deletes. if reversing=true, it flies back to centcom) - data["styleChoice"] = temp_pod.style //Style is a variable that keeps track of what the pod is supposed to look like. It acts as an index to the POD_STYLES list in cargo.dm defines to get the proper icon/name/desc for the pod. + data["styleChoice"] = temp_pod.style //Style is a variable that keeps track of what the pod is supposed to look like. It acts as an index to the POD_STYLES list in cargo.dm defines to get the proper icon/name/desc for the pod. data["effectStun"] = temp_pod.effectStun //If true, stuns anyone under the pod when it launches until it lands, forcing them to get hit by the pod. Devilish! data["effectLimb"] = temp_pod.effectLimb //If true, pops off a limb (if applicable) from anyone caught under the pod when it lands data["effectBluespace"] = temp_pod.bluespace //If true, the pod deletes (in a shower of sparks) after landing @@ -150,7 +150,7 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm if("launchRandom") //Pick random turfs from the supplypod bay at centcom to launch if (launchChoice == 2) launchChoice = 0 - updateSelector() + updateSelector() return launchChoice = 2 updateSelector() @@ -326,7 +326,7 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm temp_pod.soundVolume = 50 . = TRUE ////////////////////////////STYLE CHANGES////////////////// - //Style is a value that is used to keep track of what the pod is supposed to look like. It can be used with the POD_STYLES list (in cargo.dm defines) + //Style is a value that is used to keep track of what the pod is supposed to look like. It can be used with the POD_STYLES list (in cargo.dm defines) //as a way to get the proper icon state, name, and description of the pod. if("styleStandard") temp_pod.setStyle(STYLE_STANDARD) @@ -367,7 +367,7 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm if("refresh") //Refresh the Pod bay. User should press this if they spawn something new in the centcom bay. Automatically called whenever the user launches a pod refreshBay() . = TRUE - if("giveLauncher") //Enters the "Launch Mode". When the launcher is activated, temp_pod is cloned, and the result it filled and launched anywhere the user clicks (unless specificTarget is true) + if("giveLauncher") //Enters the "Launch Mode". When the launcher is activated, temp_pod is cloned, and the result it filled and launched anywhere the user clicks (unless specificTarget is true) launcherActivated = !launcherActivated updateCursor(launcherActivated) //Update the cursor of the user to a cool looking target icon . = TRUE @@ -436,7 +436,7 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm orderedArea = list() if (!isemptylist(A.contents)) //Go through the area passed into the proc, and figure out the top left and bottom right corners by calculating max and min values var/startX = A.contents[1].x //Create the four values (we do it off a.contents[1] so they have some sort of arbitrary initial value. They should be overwritten in a few moments) - var/endX = A.contents[1].x + var/endX = A.contents[1].x var/startY = A.contents[1].y var/endY = A.contents[1].y for (var/turf/T in A) //For each turf in the area, go through and find: @@ -453,7 +453,7 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm orderedArea.Add(locate(j,startY - (i - endY),1)) //After gathering the start/end x and y, go through locating each turf from top left to bottom right, like one would read a book return orderedArea //Return the filled list -/datum/centcom_podlauncher/proc/preLaunch() //Creates a list of acceptable items, +/datum/centcom_podlauncher/proc/preLaunch() //Creates a list of acceptable items, numTurfs = 0 //Counts the number of turfs that can be launched (remember, supplypods either launch all at once or one turf-worth of items at a time) acceptableTurfs = list() for (var/turf/T in orderedArea) //Go through the orderedArea list @@ -478,7 +478,7 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm //UpdateSelector() is here (instead if the if(1) switch block) because it also moves the selector to nullspace (to hide it) if needed /datum/centcom_podlauncher/proc/launch(turf/A) //Game time started - if (isnull(A)) + if (isnull(A)) return var/obj/structure/closet/supplypod/centcompod/toLaunch = DuplicateObject(temp_pod) //Duplicate the temp_pod (which we have been varediting or configuring with the UI) and store the result toLaunch.bay = bay //Bay is currently a nonstatic expression, so it cant go into toLaunch using DuplicateObject @@ -487,7 +487,7 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm for (var/atom/movable/O in launchList) DuplicateObject(O).forceMove(toLaunch) //Duplicate each atom/movable in launchList and forceMove them into the supplypod new /obj/effect/DPtarget(A, toLaunch) //Create the DPTarget, which will eventually forceMove the temp_pod to it's location - else + else for (var/atom/movable/O in launchList) //If we aren't cloning the objects, just go through the launchList O.forceMove(toLaunch) //and forceMove any atom/moveable into the supplypod new /obj/effect/DPtarget(A, toLaunch) //Then, create the DPTarget effect, which will eventually forceMove the temp_pod to it's location diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm index 1a607b4b96..adb7fe73f3 100644 --- a/code/modules/cargo/console.dm +++ b/code/modules/cargo/console.dm @@ -3,6 +3,7 @@ desc = "Used to order supplies, approve requests, and control the shuttle." icon_screen = "supply" circuit = /obj/item/circuitboard/computer/cargo + req_access = list(ACCESS_CARGO) var/requestonly = FALSE var/contraband = FALSE var/safety_warning = "For safety reasons, the automated supply shuttle \ @@ -17,6 +18,7 @@ desc = "Used to request supplies from cargo." icon_screen = "request" circuit = /obj/item/circuitboard/computer/cargo/request + req_access = list() requestonly = TRUE /obj/machinery/computer/cargo/Initialize() @@ -29,11 +31,11 @@ obj_flags &= ~EMAGGED /obj/machinery/computer/cargo/proc/get_export_categories() - var/cat = EXPORT_CARGO + . = EXPORT_CARGO if(contraband) - cat |= EXPORT_CONTRABAND + . |= EXPORT_CONTRABAND if(obj_flags & EMAGGED) - cat |= EXPORT_EMAG + . |= EXPORT_EMAG /obj/machinery/computer/cargo/emag_act(mob/user) . = ..() @@ -114,6 +116,9 @@ /obj/machinery/computer/cargo/ui_act(action, params, datum/tgui/ui) if(..()) return + if(!allowed(usr)) + to_chat(usr, "Access denied.") + return if(action != "add" && requestonly) return switch(action) @@ -162,7 +167,7 @@ if(ishuman(usr)) var/mob/living/carbon/human/H = usr name = H.get_authentification_name() - rank = H.get_assignment() + rank = H.get_assignment(hand_first = TRUE) else if(issilicon(usr)) name = usr.real_name rank = "Silicon" diff --git a/code/modules/cargo/export_scanner.dm b/code/modules/cargo/export_scanner.dm index 6a294c9eeb..9c523c194f 100644 --- a/code/modules/cargo/export_scanner.dm +++ b/code/modules/cargo/export_scanner.dm @@ -1,6 +1,6 @@ /obj/item/export_scanner name = "export scanner" - desc = "A device used to check objects against Nanotrasen exports and bounty database." + desc = "A device used to check objects against Nanotrasen exports and bounty database. Sadly can not scan reagents vaule." icon = 'icons/obj/device.dmi' icon_state = "export_scanner" item_state = "radio" @@ -12,9 +12,9 @@ var/obj/machinery/computer/cargo/cargo_console = null /obj/item/export_scanner/examine(user) - ..() + . = ..() if(!cargo_console) - to_chat(user, "[src] is not currently linked to a cargo console.") + . += "[src] is not currently linked to a cargo console." /obj/item/export_scanner/afterattack(obj/O, mob/user, proximity) . = ..() @@ -31,7 +31,7 @@ else // Before you fix it: // yes, checking manifests is a part of intended functionality. - + var/datum/export_report/ex = export_item_and_contents(O, cargo_console.get_export_categories(), dry_run=TRUE) var/price = 0 for(var/x in ex.total_amount) diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm index 9a99f201b3..51c4864034 100644 --- a/code/modules/cargo/exports.dm +++ b/code/modules/cargo/exports.dm @@ -21,9 +21,10 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they // Simple holder datum to pass export results around /datum/export_report - var/list/exported_atoms = list() //names of atoms sold/deleted by export - var/list/total_amount = list() //export instance => total count of sold objects of its type, only exists if any were sold - var/list/total_value = list() //export instance => total value of sold objects + var/list/exported_atoms = list()//names of atoms sold/deleted by export + var/list/total_amount = list() //export instance => total count of sold objects of its type, only exists if any were sold + var/list/total_value = list() //export instance => total value of sold objects + var/list/total_reagents = list()//export reagents => into the total vaule of the object sold // external_report works as "transaction" object, pass same one in if you're doing more than one export in single go /proc/export_item_and_contents(atom/movable/AM, allowed_categories = EXPORT_CARGO, apply_elastic = TRUE, delete_unsold = TRUE, dry_run=FALSE, datum/export_report/external_report) @@ -47,6 +48,9 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they sold = E.sell_object(thing, report, dry_run, allowed_categories , apply_elastic) report.exported_atoms += " [thing.name]" break + if(thing.reagents) + for(var/datum/reagent/R in thing.reagents.reagent_list) + report.total_reagents[R] += R.volume if(!dry_run && (sold || delete_unsold)) if(ismob(thing)) thing.investigate_log("deleted through cargo export",INVESTIGATE_CARGO) @@ -58,7 +62,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/20 //coefficient used in marginal price calculation that roughly corresponds to the inverse of price elasticity, or "quantity elasticity" - CIT EDIT 30 - > 20 + var/k_elasticity = 1/300 //coefficient used in marginal price calculation that roughly corresponds to the inverse of price elasticity, or "quantity elasticity" - CIT EDIT 1/30 - > 0 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 diff --git a/code/modules/cargo/exports/food_wine.dm b/code/modules/cargo/exports/food_wine.dm new file mode 100644 index 0000000000..851c3660b4 --- /dev/null +++ b/code/modules/cargo/exports/food_wine.dm @@ -0,0 +1,181 @@ +/datum/export/food + k_elasticity = 0 + include_subtypes = TRUE + +/datum/export/booze //Like the kind you bottle! + k_elasticity = 0 + unit_name = "brand unit of booze" + include_subtypes = TRUE + +/datum/export/food/meat + cost = 5 + unit_name = "protein based food" + export_types = list(/obj/item/reagent_containers/food/snacks/meat/slab) + +/datum/export/food/raw_cutlets + cost = 3 + unit_name = "protein based food" + export_types = list(/obj/item/reagent_containers/food/snacks/meat/rawcutlet) + +/datum/export/food/cooked_cutlets + cost = 4 + unit_name = "cooked protein based food" + export_types = list(/obj/item/reagent_containers/food/snacks/meat/cutlet) + +/datum/export/food/cooked_meat + cost = 8 + unit_name = "cooked protein based food" + export_types = list(/obj/item/reagent_containers/food/snacks/meat/steak) + +/datum/export/food/dough + cost = 3 + unit_name = "uncooked food base" + export_types = list(/obj/item/reagent_containers/food/snacks/dough, /obj/item/reagent_containers/food/snacks/flatdough) + +/datum/export/food/cooked_dough + cost = 5 + unit_name = "cooked food base" + export_types = list(/obj/item/reagent_containers/food/snacks/pizzabread) + +/datum/export/food/buns + cost = 3 + unit_name = "cooked food base" + export_types = list(/obj/item/reagent_containers/food/snacks/bun) + +/datum/export/food/buns + cost = 3 + unit_name = "cooked food base" + export_types = list(/obj/item/reagent_containers/food/snacks/bun) + +/datum/export/food/eggs + cost = 4 + unit_name = "cooked food base" + export_types = list(/obj/item/reagent_containers/food/snacks/friedegg) + +/datum/export/food/eggs_food + cost = 20 + unit_name = "cooked egg based food" + export_types = list(/obj/item/reagent_containers/food/snacks/omelette, /obj/item/reagent_containers/food/snacks/benedict, /obj/item/reagent_containers/food/snacks/salad/eggbowl) + +/datum/export/food/sweets + cost = 4 + unit_name = "pastery base" + export_types = list(/obj/item/reagent_containers/food/snacks/rawpastrybase, /obj/item/reagent_containers/food/snacks/pastrybase) + +/datum/export/food/cake_pie_raw + cost = 12 + unit_name = "uncooked food base" + export_types = list(/obj/item/reagent_containers/food/snacks/cakebatter, /obj/item/reagent_containers/food/snacks/piedough) + +/datum/export/food/cooked_cake_pie + cost = 15 + unit_name = "cooked food base" + export_types = list(/obj/item/reagent_containers/food/snacks/store/cake/plain, /obj/item/reagent_containers/food/snacks/pie/plain) + +/datum/export/food/glassbottle + cost = 10 + unit_name = "glass bottle" + export_types = list(/obj/item/reagent_containers/food/drinks/bottle) + +/datum/export/food/produce + cost = 3 + unit_name = "produce" + export_types = list(/obj/item/reagent_containers/food/snacks/grown) + exclude_types = list(/obj/item/grown/log) + +/datum/export/food/egg + cost = 2 + unit_name = "egg" + export_types = list(/obj/item/reagent_containers/food/snacks/egg) + +/datum/export/food/soup + cost = 30 + unit_name = "bowl of soup" + export_types = list(/obj/item/reagent_containers/food/snacks/soup) + +/datum/export/food/bread + cost = 20 + unit_name = "load of bread" + export_types = list(/obj/item/reagent_containers/food/snacks/store/bread) + +/datum/export/food/bread_slice + cost = 4 + unit_name = "slice of bread" + export_types = list(/obj/item/reagent_containers/food/snacks/breadslice) + +/datum/export/food/burger + cost = 12 + unit_name = "burger" + export_types = list(/obj/item/reagent_containers/food/snacks/burger) + +/datum/export/food/cake + cost = 50 + unit_name = "cake" + export_types = list(/obj/item/reagent_containers/food/snacks/store/cake) + +/datum/export/food/cake_slice + cost = 10 + unit_name = "cake slice" + export_types = list(/obj/item/reagent_containers/food/snacks/cakeslice) + +/datum/export/food/cheese_wheel + cost = 70 + unit_name = "cheese wheel" + export_types = list(/obj/item/reagent_containers/food/snacks/store/cheesewheel) + +/datum/export/food/cheese_wheel + cost = 20 + unit_name = "cheese wedge" + export_types = list(/obj/item/reagent_containers/food/snacks/cheesewedge) + +/datum/export/food/candy + cost = 5 + unit_name = "candy" //Not anything from the vender + export_types = list(/obj/item/reagent_containers/food/snacks/candy_corn, /obj/item/reagent_containers/food/snacks/chocolatebar, /obj/item/reagent_containers/food/snacks/candiedapple, /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/lollipop, \ + /obj/item/reagent_containers/food/snacks/gumball, /obj/item/reagent_containers/food/snacks/tinychocolate) + +/datum/export/food/pastery + cost = 30 + unit_name = "baked goods" + export_types = list(/obj/item/reagent_containers/food/snacks/donut, /obj/item/reagent_containers/food/snacks/muffin, /obj/item/reagent_containers/food/snacks/waffles, /obj/item/reagent_containers/food/snacks/plumphelmetbiscuit, \ + /obj/item/reagent_containers/food/snacks/chococornet, /obj/item/reagent_containers/food/snacks/cherrycupcake, /obj/item/reagent_containers/food/snacks/bluecherrycupcake, /obj/item/reagent_containers/food/snacks/honeybun, /obj/item/reagent_containers/food/snacks/pancakes) + +/datum/export/food/pasta + cost = 20 + unit_name = "pasta based meal" + export_types = list(/obj/item/reagent_containers/food/snacks/spaghetti, /obj/item/reagent_containers/food/snacks/boiledspaghetti, /obj/item/reagent_containers/food/snacks/pastatomato, /obj/item/reagent_containers/food/snacks/copypasta, \ + /obj/item/reagent_containers/food/snacks/meatballspaghetti, /obj/item/reagent_containers/food/snacks/spesslaw, /obj/item/reagent_containers/food/snacks/chowmein, /obj/item/reagent_containers/food/snacks/beefnoodle, /obj/item/reagent_containers/food/snacks/butternoodles) + +/datum/export/food/pizza + cost = 120 + unit_name = "pizza" + export_types = list(/obj/item/reagent_containers/food/snacks/pizza) + +/datum/export/food/sliced_pizza + cost = 12 + unit_name = "pizza slice" + export_types = list(/obj/item/reagent_containers/food/snacks/pizzaslice) + +/datum/export/food/snowcone + cost = 3 + unit_name = "snowcone" + export_types = list(/obj/item/reagent_containers/food/snacks/snowcones) + +/datum/export/booze/brands + cost = 200 + unit_name = "export bottle" + export_types = list(/obj/item/export/bottle/kahlua, /obj/item/export/bottle/whiskey, /obj/item/export/bottle/vodka, /obj/item/export/bottle/gin, \ + /obj/item/export/bottle/rum, /obj/item/export/bottle/tequila, /obj/item/export/bottle/vermouth, /obj/item/export/bottle/wine, /obj/item/export/bottle/grappa, /obj/item/export/bottle/cognac, \ + /obj/item/export/bottle/absinthe, /obj/item/export/bottle/goldschlager, /obj/item/export/bottle/patron, /obj/item/export/bottle/sake, /obj/item/export/bottle/hcider, /obj/item/export/bottle/champagne, \ + /obj/item/export/bottle/applejack, /obj/item/export/bottle/trappist, /obj/item/export/bottle/blazaam, /obj/item/export/bottle/grenadine, /obj/item/export/bottle/fernet) + +/datum/export/booze/bottled + cost = 400 + unit_name = "exotic brews" + export_types = list(/obj/item/export/bottle/blooddrop, /obj/item/export/bottle/slim_gold, /obj/item/export/bottle/white_bloodmoon, /obj/item/export/bottle/greenroad) + +/datum/export/booze/bottledkeg + cost = 250 + unit_name = "exotic brews" + export_types = list(/obj/item/export/bottle/minikeg) //Its just beer diff --git a/code/modules/cargo/exports/gear.dm b/code/modules/cargo/exports/gear.dm index 7ff14df04c..77b57466d9 100644 --- a/code/modules/cargo/exports/gear.dm +++ b/code/modules/cargo/exports/gear.dm @@ -793,6 +793,7 @@ datum/export/gear/glasses //glasses are not worth selling ////////////////////// /datum/export/gear/chameleon //Selling a full kit is easy money for 2 tc cost = 280 + k_elasticity = 0 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, \ diff --git a/code/modules/cargo/exports/large_objects.dm b/code/modules/cargo/exports/large_objects.dm index ce4502ba99..b8541dcd33 100644 --- a/code/modules/cargo/exports/large_objects.dm +++ b/code/modules/cargo/exports/large_objects.dm @@ -24,11 +24,16 @@ export_types = list(/obj/structure/ore_box) /datum/export/large/crate/wood - cost = 140 + cost = 140 // unit_name = "wooden crate" export_types = list(/obj/structure/closet/crate/wooden) exclude_types = list() +/datum/export/large/barrel + cost = 500 //150 to make meaning proffit of 350 + unit_name = "wooden barrel" + export_types = list(/obj/structure/fermenting_barrel) + /datum/export/large/crate/coffin cost = 150 unit_name = "coffin" @@ -282,17 +287,17 @@ include_subtypes = FALSE /datum/export/large/mech/odysseus - cost = 5500 + cost = 7500 unit_name = "working odysseus" export_types = list(/obj/mecha/medical/odysseus) /datum/export/large/mech/ripley - cost = 6500 + cost = 12000 unit_name = "working ripley" export_types = list(/obj/mecha/working/ripley) /datum/export/large/mech/firefighter - cost = 9000 + cost = 14000 unit_name = "working firefighter" export_types = list(/obj/mecha/working/ripley/firefighter) @@ -302,12 +307,12 @@ export_types = list(/obj/mecha/combat/gygax) /datum/export/large/mech/durand - cost = 10000 + cost = 16000 unit_name = "working durand" export_types = list(/obj/mecha/combat/durand) /datum/export/large/mech/phazon - cost = 25000 //Little over half do to needing a core + cost = 35000 //Little over half do to needing a core unit_name = "working phazon" export_types = list(/obj/mecha/combat/phazon) @@ -317,7 +322,7 @@ export_types = list(/obj/mecha/combat/marauder) /datum/export/large/mech/deathripley - cost = 8500 //Still a "Combat class" mech - Illegal tech as well! 165% "normal" boundy price. + cost = 18500 //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) @@ -332,12 +337,12 @@ export_types = list(/obj/mecha/working/ripley/mining) /datum/export/large/mech/honk - cost = 12000 //Still a "Combat class" mech - Comats bordem honk! + cost = 16000 //Still a "Combat class" mech - Comats bordem honk! unit_name = "working honker" export_types = list(/obj/mecha/combat/honker) /datum/export/large/mech/reticence - cost = 12000 //Still a "Combat class" mech - Has cloking and lethal weaponds. + cost = 16000 //Still a "Combat class" mech - Has cloking and lethal weaponds. unit_name = "working reticence" export_types = list(/obj/mecha/combat/reticence) @@ -347,6 +352,6 @@ export_types = list(/obj/mecha/combat/marauder/seraph) /datum/export/large/mech/mauler - cost = 12000 //Still a Combat class mech - CC lethal weaponds. + cost = 25000 //Still a Combat class mech - CC lethal weaponds. unit_name = "working legally modified marauder" export_types = list(/obj/mecha/combat/marauder/mauler) diff --git a/code/modules/cargo/exports/materials.dm b/code/modules/cargo/exports/materials.dm index cd11660ed8..d8fc5f22ab 100644 --- a/code/modules/cargo/exports/materials.dm +++ b/code/modules/cargo/exports/materials.dm @@ -42,7 +42,6 @@ /datum/export/material/plasma cost = 100 - k_elasticity = 0 material_id = MAT_PLASMA message = "cm3 of plasma" diff --git a/code/modules/cargo/exports/orgains_robotics.dm b/code/modules/cargo/exports/organs_robotics.dm similarity index 65% rename from code/modules/cargo/exports/orgains_robotics.dm rename to code/modules/cargo/exports/organs_robotics.dm index 924d27c1d2..7a77568cc7 100644 --- a/code/modules/cargo/exports/orgains_robotics.dm +++ b/code/modules/cargo/exports/organs_robotics.dm @@ -8,7 +8,7 @@ include_subtypes = FALSE k_elasticity = 0 //ALWAYS worth selling upgrades -/datum/export/orgains +/datum/export/organs include_subtypes = TRUE k_elasticity = 0 //ALWAYS worth selling orgains @@ -36,6 +36,7 @@ /datum/export/implant/breathtube cost = 150 + k_elasticity = 300/20 //Large before depleating unit_name = "breath implant" export_types = list(/obj/item/organ/cyberimp/mouth/breathing_tube) @@ -110,7 +111,18 @@ 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 +/datum/export/organs/cybernetic + cost = 225 + unit_name = "cybernetic organ" + export_types = list(/obj/item/organ/liver/cybernetic, /obj/item/organ/lungs/cybernetic, /obj/item/organ/eyes/robotic, /obj/item/organ/heart/cybernetic) + exclude_types = list(/obj/item/organ/lungs/cybernetic/upgraded, /obj/item/organ/liver/cybernetic/upgraded) + +/datum/export/organs/upgraded + cost = 275 + unit_name = "upgraded cybernetic organ" + export_types = list(/obj/item/organ/lungs/cybernetic/upgraded, /obj/item/organ/liver/cybernetic/upgraded) + +/datum/export/organs/tail //Shhh cost = 500 unit_name = "error shipment failer" export_types = list(/obj/item/organ/tail) @@ -136,6 +148,41 @@ 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 + cost = 10 unit_name = "surgery tool" export_types = list(/obj/item/retractor, /obj/item/hemostat, /obj/item/cautery, /obj/item/surgicaldrill, /obj/item/scalpel, /obj/item/circular_saw, /obj/item/surgical_drapes) + +/datum/export/robotics/mech_weapon_laser + cost = 300 //Sadly just metal and glass + unit_name = "mech laser based weapon" + include_subtypes = TRUE + export_types = list(/obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam, /obj/item/mecha_parts/mecha_equipment/weapon/energy) + +/datum/export/robotics/mech_weapon_bullet + cost = 250 + unit_name = "mech bullet based weapon" + include_subtypes = TRUE + export_types = list(/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun, /obj/item/mecha_parts/mecha_equipment/weapon/honker, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic) + +/datum/export/robotics/mech_tools + cost = 150 + unit_name = "mech based tool" + include_subtypes = TRUE + export_types = list(/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp, /obj/item/mecha_parts/mecha_equipment/extinguisher, /obj/item/mecha_parts/mecha_equipment/rcd, /obj/item/mecha_parts/mecha_equipment/cable_layer, \ + /obj/item/mecha_parts/mecha_equipment/drill, /obj/item/mecha_parts/mecha_equipment/mining_scanner, /obj/item/mecha_parts/mecha_equipment/medical/sleeper) + +/datum/export/robotics/mech_blue_space + cost = 750 + k_elasticity = 1/10 + unit_name = "mech bluespace tech" + export_types = list(/obj/item/mecha_parts/mecha_equipment/teleporter, /obj/item/mecha_parts/mecha_equipment/wormhole_generator, /obj/item/mecha_parts/mecha_equipment/gravcatapult) + +/datum/export/robotics/mech_reactors + cost = 350 + unit_name = "mech based reactor" + export_types = list(/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay, /obj/item/mecha_parts/mecha_equipment/generator, /obj/item/mecha_parts/mecha_equipment/generator/nuclear) + +/datum/export/robotics/mech_armor + cost = 350 + unit_name = "mech armor tech" + export_types = list(/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster, /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster, /obj/item/mecha_parts/mecha_equipment/repair_droid) diff --git a/code/modules/cargo/exports/parts.dm b/code/modules/cargo/exports/parts.dm index b505bb5da4..e53db0bf7b 100644 --- a/code/modules/cargo/exports/parts.dm +++ b/code/modules/cargo/exports/parts.dm @@ -6,14 +6,15 @@ export_types = list(/obj/item/solar_assembly) /datum/export/solar/tracker_board - cost = 30 + cost = 10 unit_name = "solar tracker board" export_types = list(/obj/item/electronics/tracker) /datum/export/solar/control_board - cost = 75 + cost = 15 unit_name = "solar panel control board" export_types = list(/obj/item/circuitboard/computer/solar_control) + include_subtypes = FALSE /datum/export/swarmer cost = 500 @@ -30,9 +31,9 @@ /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) + include_subtypes = FALSE //Stock Parts @@ -70,7 +71,7 @@ export_types = list(/obj/item/stock_parts/cell) include_subtypes = TRUE -/datum/export/cell +/datum/export/cellupgraded cost = 10 unit_name = "upgraded power cell" export_types = list(/obj/item/stock_parts/cell/upgraded, /obj/item/stock_parts/cell/upgraded/plus) diff --git a/code/modules/cargo/exports/seeds.dm b/code/modules/cargo/exports/seeds.dm index a879b0c4fe..1a2a18c46b 100644 --- a/code/modules/cargo/exports/seeds.dm +++ b/code/modules/cargo/exports/seeds.dm @@ -4,7 +4,7 @@ unit_name = "new plant species sample" export_types = list(/obj/item/seeds) var/needs_discovery = FALSE // Only for undiscovered species - var/global/list/discoveredPlants = list() + var/static/list/discoveredPlants = list() /datum/export/seed/get_cost(obj/O) var/obj/item/seeds/S = O diff --git a/code/modules/cargo/exports/sheets.dm b/code/modules/cargo/exports/sheets.dm index 8397a7dc1f..f784083097 100644 --- a/code/modules/cargo/exports/sheets.dm +++ b/code/modules/cargo/exports/sheets.dm @@ -83,6 +83,11 @@ unit_name = "wood plank" export_types = list(/obj/item/stack/sheet/mineral/wood) +/datum/export/stack/log + cost = 10 + unit_name = "raw wood" + export_types = list(/obj/item/grown/log) + /datum/export/stack/cardboard cost = 2 message = "of cardboard" @@ -100,11 +105,17 @@ export_types = list(/obj/item/stack/cable_coil) /datum/export/stack/cloth - cost = 10 + cost = 20 unit_name = "sheets" message = "of cloth" export_types = list(/obj/item/stack/sheet/cloth) +/datum/export/stack/silk + cost = 200 //The new plasma + unit_name = "sheets" + message = "of silk" + export_types = list(/obj/item/stack/sheet/silk) + /datum/export/stack/duracloth cost = 40 unit_name = "sheets" @@ -145,4 +156,4 @@ unit_name = "sheets" cost = 30 message = "of paperframes" - export_types = list(/obj/item/stack/sheet/paperframes) \ No newline at end of file + export_types = list(/obj/item/stack/sheet/paperframes) diff --git a/code/modules/cargo/exports/tools.dm b/code/modules/cargo/exports/tools.dm index 4984bfe9b9..a68d7238b5 100644 --- a/code/modules/cargo/exports/tools.dm +++ b/code/modules/cargo/exports/tools.dm @@ -12,7 +12,7 @@ /datum/export/gear/powerdrill cost = 25 - k_elasticity = 1/40 //Market can only take so much + k_elasticity = 1/80 //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) @@ -65,13 +65,13 @@ // Basic tools /datum/export/basicmining - cost = 20 + cost = 30 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 + cost = 80 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 diff --git a/code/modules/cargo/exports/weapons.dm b/code/modules/cargo/exports/weapons.dm index 97dd9c10aa..18a525b8dd 100644 --- a/code/modules/cargo/exports/weapons.dm +++ b/code/modules/cargo/exports/weapons.dm @@ -125,7 +125,7 @@ /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 + k_elasticity = 1/30 //Its just a smaller temperature gun, easy to mass make export_types = list(/obj/item/gun/energy/temperature) /datum/export/weapon/flowergun @@ -140,7 +140,7 @@ /datum/export/weapon/ioncarbine cost = 200 - k_elasticity = 1/5 //Its just a smaller temperature gun, easy to mass make + k_elasticity = 1/30 //Its just a smaller temperature gun, easy to mass make unit_name = "ion carbine" export_types = list(/obj/item/gun/energy/ionrifle/carbine) @@ -174,12 +174,12 @@ ///////////////// /datum/export/weapon/wtammo - cost = 10 + cost = 15 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 + cost = 45 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) @@ -194,7 +194,7 @@ export_types = list(/obj/item/firing_pin/test_range) /datum/export/weapon/techslug - cost = 15 + cost = 25 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) @@ -211,7 +211,8 @@ /datum/export/weapon/revolver cost = 200 unit_name = "large handgun" - export_types = list(/obj/item/gun/ballistic/revolver/syndie) + export_types = list(/obj/item/gun/ballistic/revolver) + exclude_types = list(/obj/item/gun/ballistic/revolver/russian, /obj/item/gun/ballistic/revolver/doublebarrel) /datum/export/weapon/rocketlauncher cost = 1000 @@ -344,13 +345,13 @@ export_types = list(/obj/item/storage/toolbox/gold_real) /datum/export/weapon/melee - cost = 30 + cost = 50 unit_name = "unlisted weapon" export_types = list(/obj/item/melee) include_subtypes = TRUE /datum/export/weapon/gun - cost = 30 + cost = 50 unit_name = "unlisted weapon" export_types = list(/obj/item/gun) - include_subtypes = TRUE \ No newline at end of file + include_subtypes = TRUE diff --git a/code/modules/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm index 0097346a34..6170c80f8e 100644 --- a/code/modules/cargo/expressconsole.dm +++ b/code/modules/cargo/expressconsole.dm @@ -156,7 +156,7 @@ if(ishuman(usr)) var/mob/living/carbon/human/H = usr name = H.get_authentification_name() - rank = H.get_assignment() + rank = H.get_assignment(hand_first = TRUE) else if(issilicon(usr)) name = usr.real_name rank = "Silicon" diff --git a/code/modules/cargo/gondolapod.dm b/code/modules/cargo/gondolapod.dm index f36ff0ce33..b507b617c3 100644 --- a/code/modules/cargo/gondolapod.dm +++ b/code/modules/cargo/gondolapod.dm @@ -39,14 +39,14 @@ set name = "Release Contents" set category = "Gondola" set desc = "Release any contents stored within your vast belly." - linked_pod.open(src, manual = TRUE) + linked_pod.open(src) /mob/living/simple_animal/pet/gondola/gondolapod/verb/check() set name = "Count Contents" set category = "Gondola" set desc = "Take a deep look inside youself, and count up what's inside" var/total = contents.len - if (total) + if (total) to_chat(src, "You detect [total] object[total > 1 ? "s" : ""] within your incredibly vast belly.") else to_chat(src, "A closer look inside yourself reveals... nothing.") diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 89c463f3e3..4c9ddfe3bc 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1,20 +1,20 @@ /datum/supply_pack var/name = "Crate" var/group = "" - var/hidden = FALSE - var/contraband = FALSE + var/hidden = FALSE //Aka emag only + var/contraband = FALSE //Hacking the console with a multitool var/cost = 700 // Minimum cost, or infinite points are possible. - var/access = FALSE - var/access_any = FALSE - var/list/contains = null - var/crate_name = "crate" + var/access = FALSE //What access does the Crate itself need? + var/access_any = FALSE //Do we care about access? + var/list/contains = null //What items are in the crate + var/crate_name = "crate" //The crate that comes with each order var/desc = ""//no desc by default - var/crate_type = /obj/structure/closet/crate + var/crate_type = /obj/structure/closet/crate //what kind of crate - Locked crates needed for access locked crates var/dangerous = FALSE // Should we message admins? var/special = FALSE //Event/Station Goals/Admin enabled packs var/special_enabled = FALSE - var/DropPodOnly = FALSE//only usable by the Bluespace Drop Pod via the express cargo console - var/admin_spawned = FALSE + var/DropPodOnly = FALSE //only usable by the Bluespace Drop Pod via the express cargo console + var/admin_spawned = FALSE //Can only an admin spawn this crate? /datum/supply_pack/proc/generate(atom/A) var/obj/structure/closet/crate/C = new crate_type(A) diff --git a/code/modules/cargo/packs/livestock.dm b/code/modules/cargo/packs/livestock.dm index 6479869ee0..9ab1827784 100644 --- a/code/modules/cargo/packs/livestock.dm +++ b/code/modules/cargo/packs/livestock.dm @@ -10,6 +10,21 @@ group = "Livestock" crate_type = /obj/structure/closet/crate/critter +/datum/supply_pack/critter/animal_feed + name = "Animal Feed Crate" + desc = "Feed for livestock, like cows and hens. Contains fifty Wheat bundles and fifty Oat bundles." + cost = 1500 + contains = list(/obj/item/reagent_containers/food/snacks/grown/wheat, + /obj/item/reagent_containers/food/snacks/grown/oat) + crate_name = "animal feed crate" + crate_type = /obj/structure/closet/crate/freezer + +/datum/supply_pack/critter/animal_feed/generate() + . = ..() + for(var/i in 1 to 49) + new /obj/item/reagent_containers/food/snacks/grown/wheat(.) + + /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 @@ -29,7 +44,7 @@ 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) + /obj/item/toy/cattoy) crate_name = "cat crate" /datum/supply_pack/critter/cat/generate() @@ -112,13 +127,6 @@ 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!" diff --git a/code/modules/cargo/packs/materials.dm b/code/modules/cargo/packs/materials.dm index 0f8ad2462a..615fbfe827 100644 --- a/code/modules/cargo/packs/materials.dm +++ b/code/modules/cargo/packs/materials.dm @@ -65,6 +65,28 @@ contains = list(/obj/item/stack/sheet/mineral/wood/fifty) crate_name = "wood planks crate" +/datum/supply_pack/organic/rawcotton + name = "Raw Cotton Crate" + desc = "Plushies have been on the down in the market, and now due to a flood of raw cotton the price of it is so cheap, its a steal! Contains 40 raw cotton sheets." + cost = 800 // 100 net cost, 20 x 20 = 400. 300 proffit if turned into cloth sheets or more if turned to silk then 10 x 200 = 2000 + contains = list(/obj/item/stack/sheet/cotton/thirty, + /obj/item/stack/sheet/cotton/ten + ) + crate_name = "cotton crate" + crate_type = /obj/structure/closet/crate/hydroponics + +/datum/supply_pack/organic/rawlumber + name = "Raw Lumber Crate" + desc = "Raw logs from towercaps. Contains fifty logs." + cost = 1000 + contains = list(/obj/item/grown/log) + crate_name = "lumber crate" + +/datum/supply_pack/critter/animal_feed/generate() + . = ..() + for(var/i in 1 to 49) + new /obj/item/grown/log(.) + /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." @@ -168,3 +190,19 @@ contains = list(/obj/structure/reagent_dispensers/watertank/high) crate_name = "high-capacity water tank crate" crate_type = /obj/structure/closet/crate/large + +/datum/supply_pack/materials/loom + name = "Loom" + desc = "A large pre-made loom." + cost = 1000 + contains = list(/obj/structure/loom) + crate_name = "loom crate" + crate_type = /obj/structure/closet/crate/large + +/datum/supply_pack/materials/wooden_barrel + name = "Wooden Barrel" + desc = "Wooden barrels ready for storage." + cost = 1500 + contains = list(/obj/structure/fermenting_barrel) + crate_name = "wooden barrel crate" + crate_type = /obj/structure/closet/crate/large diff --git a/code/modules/cargo/packs/organic.dm b/code/modules/cargo/packs/organic.dm index 2b5df207c3..78f10b0908 100644 --- a/code/modules/cargo/packs/organic.dm +++ b/code/modules/cargo/packs/organic.dm @@ -69,31 +69,24 @@ /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/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 /datum/supply_pack/organic/food name = "Food Crate" @@ -120,6 +113,71 @@ /obj/item/reagent_containers/food/snacks/grown/banana) crate_name = "food crate" + +/datum/supply_pack/organic/fruit_1 + name = "Fruit Basic Crate" + desc = "Getting scurvy on the station? Well heres your fixing! Contains three of each - bananas, watermelons, limes, lemons, oranges and even three pineapple." + cost = 2250 + contains = list(/obj/item/reagent_containers/food/snacks/grown/watermelon, + /obj/item/reagent_containers/food/snacks/grown/watermelon, + /obj/item/reagent_containers/food/snacks/grown/watermelon, + /obj/item/reagent_containers/food/snacks/grown/pineapple, + /obj/item/reagent_containers/food/snacks/grown/pineapple, + /obj/item/reagent_containers/food/snacks/grown/pineapple, + /obj/item/reagent_containers/food/snacks/grown/citrus/lime, + /obj/item/reagent_containers/food/snacks/grown/citrus/lime, + /obj/item/reagent_containers/food/snacks/grown/citrus/lime, + /obj/item/reagent_containers/food/snacks/grown/citrus/orange, + /obj/item/reagent_containers/food/snacks/grown/citrus/orange, + /obj/item/reagent_containers/food/snacks/grown/citrus/orange, + /obj/item/reagent_containers/food/snacks/grown/citrus/lemon, + /obj/item/reagent_containers/food/snacks/grown/citrus/lemon, + /obj/item/reagent_containers/food/snacks/grown/citrus/lemon, + /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 = "fruit crate" + +/datum/supply_pack/organic/fruit_2 + name = "Fruit Delux Crate" + desc = "Getting tired of the basic fruits and want to have something a bit more decadent! This crate is for you! Contains three of each - bunches of berries, apples, pineapples, cherries, green & red grapes, eggplants, bananas lastly ten strawberry." + cost = 3500 + contains = list(/obj/item/reagent_containers/food/snacks/grown/berries, + /obj/item/reagent_containers/food/snacks/grown/berries, + /obj/item/reagent_containers/food/snacks/grown/berries, + /obj/item/reagent_containers/food/snacks/grown/apple, + /obj/item/reagent_containers/food/snacks/grown/apple, + /obj/item/reagent_containers/food/snacks/grown/apple, + /obj/item/reagent_containers/food/snacks/grown/pineapple, + /obj/item/reagent_containers/food/snacks/grown/pineapple, + /obj/item/reagent_containers/food/snacks/grown/pineapple, + /obj/item/reagent_containers/food/snacks/grown/cherries, + /obj/item/reagent_containers/food/snacks/grown/cherries, + /obj/item/reagent_containers/food/snacks/grown/cherries, + /obj/item/reagent_containers/food/snacks/grown/grapes, + /obj/item/reagent_containers/food/snacks/grown/grapes, + /obj/item/reagent_containers/food/snacks/grown/grapes, + /obj/item/reagent_containers/food/snacks/grown/grapes/green, + /obj/item/reagent_containers/food/snacks/grown/grapes/green, + /obj/item/reagent_containers/food/snacks/grown/grapes/green, + /obj/item/reagent_containers/food/snacks/grown/banana, + /obj/item/reagent_containers/food/snacks/grown/banana, + /obj/item/reagent_containers/food/snacks/grown/banana, + /obj/item/reagent_containers/food/snacks/grown/eggplant, + /obj/item/reagent_containers/food/snacks/grown/eggplant, + /obj/item/reagent_containers/food/snacks/grown/eggplant, + /obj/item/reagent_containers/food/snacks/grown/strawberry, + /obj/item/reagent_containers/food/snacks/grown/strawberry, + /obj/item/reagent_containers/food/snacks/grown/strawberry, + /obj/item/reagent_containers/food/snacks/grown/strawberry, + /obj/item/reagent_containers/food/snacks/grown/strawberry, + /obj/item/reagent_containers/food/snacks/grown/strawberry, + /obj/item/reagent_containers/food/snacks/grown/strawberry, + /obj/item/reagent_containers/food/snacks/grown/strawberry, + /obj/item/reagent_containers/food/snacks/grown/strawberry, + /obj/item/reagent_containers/food/snacks/grown/strawberry) + crate_name = "fruit 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." @@ -171,6 +229,32 @@ crate_name = "hydroponics backpack crate" crate_type = /obj/structure/closet/crate/secure +/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/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." @@ -269,22 +353,3 @@ /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 index c4fbc0bfe5..25b8b2ddfb 100644 --- a/code/modules/cargo/packs/science.dm +++ b/code/modules/cargo/packs/science.dm @@ -10,6 +10,47 @@ group = "Science" crate_type = /obj/structure/closet/crate/science +/* For later +/datum/supply_pack/science/monkey + name = "Ape Cube Crate" + desc = "Pss what a new test subject with supper strangth, speed, and love for bananas all at the same time? Say no more... Contains a single ape cube. Dont add water!" + contraband = TRUE + cost = 2500 + contains = list (/obj/item/reagent_containers/food/snacks/monkeycube/ape) + crate_name = "ape cube crate" +*/ + +/datum/supply_pack/science/aliens + name = "Advanced Alien Alloy Crate Crate" + desc = "Hello brothers from the stars!!! Our fellow brethren have made contact at long last and gave us gifts man! They really did build the prymi- Connection Error- Bro we’ll send you a sheet of advanced alien alloy." + cost = 15000 + contraband = TRUE + DropPodOnly = TRUE + contains = list(/obj/item/stack/sheet/mineral/abductor) + crate_name = "alien bro alloy crate" + +/datum/supply_pack/science/beakers + name = "Chemistry Beackers Crate" + desc = "Glassware for any chemistry lab! Contains four small beakers, three large, two plastic, and one metamaterial. As well as three droppers and two pairs of latex gloves." + cost = 1500 + contains = list(/obj/item/reagent_containers/glass/beaker, + /obj/item/reagent_containers/glass/beaker, + /obj/item/reagent_containers/glass/beaker, + /obj/item/reagent_containers/glass/beaker, + /obj/item/reagent_containers/glass/beaker/large, + /obj/item/reagent_containers/glass/beaker/large, + /obj/item/reagent_containers/glass/beaker/large, + /obj/item/reagent_containers/glass/beaker/plastic, + /obj/item/reagent_containers/glass/beaker/plastic, + /obj/item/reagent_containers/glass/beaker/meta, + /obj/item/reagent_containers/glass/beaker/noreact, + /obj/item/reagent_containers/dropper, + /obj/item/reagent_containers/dropper, + /obj/item/reagent_containers/dropper, + /obj/item/clothing/gloves/color/latex, + /obj/item/clothing/gloves/color/latex) + crate_name = "chemistry beaker crate" + /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." @@ -41,6 +82,33 @@ /obj/item/integrated_electronics/wirer) crate_name = "circuitry starter pack crate" +/datum/supply_pack/science/monkey + name = "Monkey Cube Crate" + desc = "Stop monkeying around! Contains seven monkey cubes. Just add water!" + cost = 1500 + contains = list (/obj/item/storage/box/monkeycubes) + crate_name = "monkey cube crate" + +/datum/supply_pack/science/nitrilegloves + name = "Nitrile Gloves Crate" + desc = "Handling toxic chemicals? Well worry not, keep your flesh intact with some nitrile made gloves! Contains three pairs of nitrile gloves." + cost = 1500 + contains = list(/obj/item/clothing/gloves/color/latex/nitrile, + /obj/item/clothing/gloves/color/latex/nitrile, + /obj/item/clothing/gloves/color/latex/nitrile) + crate_name = "nitrile gloves crate" + +/datum/supply_pack/science/nuke_b_gone + name = "Nuke Defusal Kit" + desc = "Contains set of tools to defuse a nuke." + cost = 7500 //Usefull for traitors/nukies that fucked up + dangerous = TRUE + DropPodOnly = TRUE + contains = list(/obj/item/nuke_core_container/nt, + /obj/item/screwdriver/nuke/nt, + /obj/item/paper/guides/nt/nuke_instructions) + crate_name = "safe defusal kit storage" + /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." @@ -61,6 +129,15 @@ crate_name = "plasma assembly crate" crate_type = /obj/structure/closet/crate/secure/plasma +/datum/supply_pack/science/relic + name = "Relic Crate" + desc = "Ever want to play with old discounted toys? Look no more. Contains two relics." + cost = 1000 + contraband = TRUE + contains = list(/obj/item/relic, + /obj/item/relic) + crate_name = "relic crate" + /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." @@ -88,10 +165,30 @@ crate_name = "shield generators crate" crate_type = /obj/structure/closet/crate/secure/science +/datum/supply_pack/science/slime + name = "Slime Core Crate" + desc = "Ran out of slimes? No problem, contains one gray slime core. Requires Xenobio access to open." + cost = 1000 + access = ACCESS_XENOBIOLOGY + contains = list(/obj/item/slime_extract/grey) + crate_name = "slime core crate" + crate_type = /obj/structure/closet/crate/secure/science + +/datum/supply_pack/science/supermater + name = "Supermatter Extraction Tools Crate" + desc = "Contains a set of tools to extract a sliver of supermatter. Consult your CE today!" + cost = 7500 //Usefull for traitors that fucked up + hidden = TRUE + contains = list(/obj/item/nuke_core_container/supermatter, + /obj/item/scalpel/supermatter, + /obj/item/hemostat/supermatter, + /obj/item/paper/guides/antag/supermatter_sliver) + crate_name = "supermatter extraction kit crate" + /datum/supply_pack/science/tablets name = "Tablet Crate" desc = "What's a computer? Contains five cargo tablets." - cost = 5000 + cost = 3000 contains = list(/obj/item/modular_computer/tablet/preset/cargo, /obj/item/modular_computer/tablet/preset/cargo, /obj/item/modular_computer/tablet/preset/cargo, diff --git a/code/modules/cargo/packs/security.dm b/code/modules/cargo/packs/security.dm index 3c68fe7f6d..0bda316ca3 100644 --- a/code/modules/cargo/packs/security.dm +++ b/code/modules/cargo/packs/security.dm @@ -34,11 +34,11 @@ 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) + /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 diff --git a/code/modules/cargo/supplypod_beacon.dm b/code/modules/cargo/supplypod_beacon.dm index 3c82722f69..915d671fe8 100644 --- a/code/modules/cargo/supplypod_beacon.dm +++ b/code/modules/cargo/supplypod_beacon.dm @@ -45,11 +45,11 @@ update_status() /obj/item/supplypod_beacon/examine(user) - ..() + . = ..() if(!express_console) - to_chat(user, "[src] is not currently linked to a Express Supply console.") + . += "[src] is not currently linked to a Express Supply console." else - to_chat(user, "Alt-click to unlink it from the Express Supply console.") + . += "Alt-click to unlink it from the Express Supply console." /obj/item/supplypod_beacon/Destroy() if(express_console) @@ -61,7 +61,7 @@ express_console.beacon = null express_console = null update_status(SP_UNLINK) - update_status(SP_UNREADY) + update_status(SP_UNREADY) /obj/item/supplypod_beacon/proc/link_console(obj/machinery/computer/cargo/express/C, mob/living/user) if (C.beacon)//if new console has a beacon, then... @@ -91,5 +91,5 @@ if(new_beacon_name) name += " ([tag])" return - else + else return ..() diff --git a/code/modules/client/client_colour.dm b/code/modules/client/client_colour.dm index f1477fb4d2..22b15ea868 100644 --- a/code/modules/client/client_colour.dm +++ b/code/modules/client/client_colour.dm @@ -111,3 +111,6 @@ /datum/client_colour/monochrome colour = list(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) priority = INFINITY //we can't see colors anyway! + +/datum/client_colour/monochrome/trance + priority = 1 \ No newline at end of file diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 5442fcb932..7e466caf8a 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -410,7 +410,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) for (var/child in entries) winset(src, "[child]", "[entries[child]]") if (!ispath(child, /datum/verbs/menu)) - var/atom/verb/verbpath = child + var/procpath/verbpath = child if (copytext(verbpath.name,1,2) != "@") new child(src) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index edec4d74a6..e91d379ddd 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -58,6 +58,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/inquisitive_ghost = 1 var/allow_midround_antag = 1 var/preferred_map = null + var/preferred_chaos = null var/pda_style = MONO var/pda_color = "#808000" var/pda_skin = PDA_SKIN_ALT @@ -336,8 +337,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "" dat += "
    " dat += "

    Flavor Text

    " dat += "Set Examine Text
    " - if(lentext(features["flavor_text"]) <= 40) - if(!lentext(features["flavor_text"])) + if(length(features["flavor_text"]) <= 40) + if(!length(features["flavor_text"])) dat += "\[...\]" else dat += "[features["flavor_text"]]" @@ -834,6 +835,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Screen Shake: [(screenshake==100) ? "Full" : ((screenshake==0) ? "None" : "[screenshake]")]
    " if (user && user.client && !user.client.prefs.screenshake==0) dat += "Damage Screen Shake: [(damagescreenshake==1) ? "On" : ((damagescreenshake==0) ? "Off" : "Only when down")]
    " + var/p_chaos + if (!preferred_chaos) + p_chaos = "No preference" + else + p_chaos = preferred_chaos + dat += "Preferred Chaos Amount: [p_chaos]
    " dat += "
    " dat += "
    " @@ -1996,6 +2003,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) if (pickedmap) preferred_map = maplist[pickedmap] + if ("preferred_chaos") + var/pickedchaos = input(user, "Choose your preferred level of chaos. This will help with dynamic threat level ratings.", "Character Preference") as null|anything in list(CHAOS_NONE,CHAOS_LOW,CHAOS_MED,CHAOS_HIGH,CHAOS_MAX) + preferred_chaos = pickedchaos if ("clientfps") var/desiredfps = input(user, "Choose your desired fps. (0 = synced with server tick rate (currently:[world.fps]))", "Character Preference", clientfps) as null|num if (!isnull(desiredfps)) @@ -2289,10 +2299,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) character.shirt_color = shirt_color character.socks_color = socks_color - - character.backbag = backbag - character.jumpsuit_style = jumpsuit_style - var/datum/species/chosen_species if(!roundstart_checks || (pref_species.id in GLOB.roundstart_races)) chosen_species = pref_species.type @@ -2328,9 +2334,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) character.Digitigrade_Leg_Swap(TRUE) //let's be sure the character updates - character.update_body() - character.update_hair() - character.update_body_parts() + if(icon_updates) + character.update_body() + character.update_hair() + character.update_body_parts() /datum/preferences/proc/get_default_name(name_id) switch(name_id) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 98ef2ed0e8..29ea8f5821 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -183,6 +183,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["autostand"] >> autostand S["cit_toggles"] >> cit_toggles S["lewdchem"] >> lewdchem + S["preferred_chaos"] >> preferred_chaos + //try to fix any outdated data if necessary if(needs_update >= 0) @@ -278,6 +280,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["autostand"], autostand) WRITE_FILE(S["cit_toggles"], cit_toggles) WRITE_FILE(S["lewdchem"], lewdchem) + WRITE_FILE(S["preferred_chaos"], preferred_chaos) return 1 diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 1793bd8f4b..d142699a21 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -120,9 +120,9 @@ user.vv_edit_var(variable, user_vars_to_edit[variable]) /obj/item/clothing/examine(mob/user) - ..() + . = ..() if(damaged_clothes) - to_chat(user, "It looks damaged!") + . += "It looks damaged!" var/datum/component/storage/pockets = GetComponent(/datum/component/storage) if(pockets) var/list/how_cool_are_your_threads = list("") @@ -137,7 +137,7 @@ if(pockets.silent) how_cool_are_your_threads += "Adding or removing items from [src] makes no noise.\n" how_cool_are_your_threads += "" - to_chat(user, how_cool_are_your_threads.Join()) + . += how_cool_are_your_threads.Join() /obj/item/clothing/obj_break(damage_flag) if(!damaged_clothes) @@ -223,7 +223,6 @@ BLIND // can't see anything if(H.w_uniform == src) H.update_suit_sensors() - ..() /obj/item/clothing/under/CtrlClick(mob/user) . = ..() diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index f140fb3074..608f71cf11 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -23,9 +23,9 @@ return BRUTELOSS /obj/item/clothing/glasses/examine(mob/user) - ..() + . = ..() if(glass_colour_type && ishuman(user)) - to_chat(user, "Alt-click to toggle its colors.") + . += "Alt-click to toggle its colors." /obj/item/clothing/glasses/visor_toggling() ..() @@ -362,7 +362,7 @@ desc = replacetext(desc, "person", "man") else if(user.gender == FEMALE) desc = replacetext(desc, "person", "woman") - ..() + . = ..() desc = desk /obj/item/clothing/glasses/thermal/eyepatch diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm index 6b674c8595..ac491c2bc5 100644 --- a/code/modules/clothing/gloves/_gloves.dm +++ b/code/modules/clothing/gloves/_gloves.dm @@ -14,7 +14,7 @@ /obj/item/clothing/gloves/ComponentInitialize() . = ..() - RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /obj/item/clothing/gloves/clean_blood) + RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /atom.proc/clean_blood) /obj/item/clothing/gloves/clean_blood(datum/source, strength) . = ..() diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index cc6d65b74d..984dddf813 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -58,7 +58,7 @@ /obj/item/clothing/gloves/rapid name = "Gloves of the North Star" - desc = "Just looking at these fills you with an urge to beat the shit out of people." + desc = "Just looking at these fills you with an urge to beat the shit out of people. Violently." icon_state = "rapid" item_state = "rapid" transfer_prints = TRUE @@ -69,12 +69,10 @@ return var/mob/living/M = loc - - if(M.a_intent == INTENT_HARM) - M.changeNext_move(CLICK_CD_RAPID) - M.adjustStaminaLoss(-2) //Restore 2/3 of the stamina used assuming empty stam buffer. With proper stamina buffer management, this results in a net gain of +.5 stamina per click. - if(warcry) - M.say("[warcry]", ignore_spam = TRUE, forced = "north star warcry") + M.changeNext_move(CLICK_CD_RAPID) + M.adjustStaminaLoss(-3.5) // used to be -2 with some comment about stamina buffer management but *shrug -hatterhat + if(warcry) + M.say("[warcry]", ignore_spam = TRUE, forced = "north star warcry") .= FALSE @@ -86,7 +84,7 @@ /obj/item/clothing/gloves/rapid/hug name = "Hugs of the North Star" - desc = "Just looking at these fills you with an urge to hug the shit out of people" + desc = "Just looking at these fills you with an urge to hug the shit out of people. In a very friendly manner." warcry = "owo" //Shouldn't ever come into play /obj/item/clothing/gloves/rapid/hug/Touch(mob/living/target,proximity = TRUE) @@ -97,11 +95,11 @@ if(M.a_intent == INTENT_HELP) if(target.health >= 0 && !HAS_TRAIT(target, TRAIT_FAKEDEATH)) //Can't hug people who are dying/dead - if(target.on_fire || target.lying ) //No spamming extinguishing, helping them up, or other non-hugging/patting help interactions + if(target.on_fire || target.lying) //No spamming extinguishing, helping them up, or other non-hugging/patting help interactions return else M.changeNext_move(CLICK_CD_RAPID) . = FALSE /obj/item/clothing/gloves/rapid/hug/attack_self(mob/user) - return FALSE \ No newline at end of file + return FALSE diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 54f0ebea45..d72e4ba1d7 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -17,19 +17,26 @@ dog_fashion = /datum/dog_fashion/head -/obj/item/clothing/head/hardhat/attack_self(mob/user) - on = !on - icon_state = "hardhat[on]_[item_color]" - item_state = "hardhat[on]_[item_color]" - user.update_inv_head() //so our mob-overlays update +/obj/item/clothing/head/hardhat/attack_self(mob/living/user) + toggle_helmet_light(user) +/obj/item/clothing/head/hardhat/proc/toggle_helmet_light(mob/living/user) + on = !on if(on) turn_on(user) else turn_off(user) + update_icon() + +/obj/item/clothing/head/hardhat/update_icon() + icon_state = "hardhat[on]_[item_color]" + item_state = "hardhat[on]_[item_color]" + if(ishuman(loc)) + var/mob/living/carbon/human/H = loc + H.update_inv_head() for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtonIcon(force = TRUE) /obj/item/clothing/head/hardhat/proc/turn_on(mob/user) set_light(brightness_on, power_on) @@ -86,3 +93,68 @@ cold_protection = HEAD min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT mutantrace_variation = MUTANTRACE_VARIATION + +/obj/item/clothing/head/hardhat/weldhat + name = "welding hard hat" + desc = "A piece of headgear used in dangerous working conditions to protect the head. Comes with a built-in flashlight AND welding shield! The bulb seems a little smaller though." + brightness_on = 3 //Needs a little bit of tradeoff + dog_fashion = null + actions_types = list(/datum/action/item_action/toggle_helmet_light, /datum/action/item_action/toggle_welding_screen) + flash_protect = 2 + tint = 2 + flags_inv = HIDEEYES | HIDEFACE + flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH + visor_vars_to_toggle = VISOR_FLASHPROTECT | VISOR_TINT + visor_flags_inv = HIDEEYES | HIDEFACE + visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH + +/obj/item/clothing/head/hardhat/weldhat/Initialize() + . = ..() + update_icon() + +/obj/item/clothing/head/hardhat/weldhat/attack_self(mob/living/user) + toggle_helmet_light(user) + +/obj/item/clothing/head/hardhat/weldhat/AltClick(mob/user) + if(user.canUseTopic(src, BE_CLOSE)) + toggle_welding_screen(user) + +/obj/item/clothing/head/hardhat/weldhat/proc/toggle_welding_screen(mob/living/user) + if(weldingvisortoggle(user)) + playsound(src, 'sound/mecha/mechmove03.ogg', 50, TRUE) //Visors don't just come from nothing + update_icon() + +/obj/item/clothing/head/hardhat/weldhat/worn_overlays(isinhands) + . = ..() + if(!isinhands) + . += mutable_appearance('icons/mob/head.dmi', "weldhelmet") + if(!up) + . += mutable_appearance('icons/mob/head.dmi', "weldvisor") + +/obj/item/clothing/head/hardhat/weldhat/update_icon() + cut_overlays() + if(!up) + add_overlay("weldvisor") + ..() + +/obj/item/clothing/head/hardhat/weldhat/orange + icon_state = "hardhat0_orange" + item_state = "hardhat0_orange" + item_color = "orange" + +/obj/item/clothing/head/hardhat/weldhat/white + desc = "A piece of headgear used in dangerous working conditions to protect the head. Comes with a built-in flashlight AND welding shield!" //This bulb is not smaller + icon_state = "hardhat0_white" + item_state = "hardhat0_white" + brightness_on = 4 //Boss always takes the best stuff + item_color = "white" + clothing_flags = STOPSPRESSUREDAMAGE + heat_protection = HEAD + max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT + cold_protection = HEAD + min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT + +/obj/item/clothing/head/hardhat/weldhat/dblue + icon_state = "hardhat0_dblue" + item_state = "hardhat0_dblue" + item_color = "dblue" \ No newline at end of file diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 298510564c..880303bb13 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -90,8 +90,8 @@ new /obj/item/reagent_containers/food/drinks/flask/det(src) /obj/item/clothing/head/fedora/det_hat/examine(mob/user) - ..() - to_chat(user, "Alt-click to take a candy corn.") + . = ..() + . += "Alt-click to take a candy corn." /obj/item/clothing/head/fedora/det_hat/AltClick(mob/user) if(user.canUseTopic(src, BE_CLOSE, ismonkey(user))) diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index cac98e74fc..071e52b46d 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -370,3 +370,10 @@ if(prob(3)) message += pick(" Honh honh honh!"," Honh!"," Zut Alors!") speech_args[SPEECH_MESSAGE] = trim(message) + +/obj/item/clothing/head/assu_helmet + name = "DAB helmet" + icon_state = "assu_helmet" + item_state = "assu_helmet" + desc = "A cheap replica of old riot helmet without visor. It has \"D.A.B.\" written on the front." + flags_inv = HIDEHAIR diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 0dea8bfe79..a3a4f1d859 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -77,7 +77,7 @@ hitsound = 'sound/weapons/tap.ogg' STOP_PROCESSING(SSobj, src) -/obj/item/clothing/head/hardhat/cakehat/is_hot() +/obj/item/clothing/head/hardhat/cakehat/get_temperature() return on * heat /* * Ushanka diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index b14b0575f9..8754c89511 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -41,8 +41,8 @@ usr.update_inv_head() //so our mob-overlays update /obj/item/clothing/head/soft/examine(mob/user) - ..() - to_chat(user, "Alt-click the cap to flip it [flipped ? "forwards" : "backwards"].") + . = ..() + . += "Alt-click the cap to flip it [flipped ? "forwards" : "backwards"]." /obj/item/clothing/head/soft/red name = "red cap" diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index 947aa048c4..7d0c4a455e 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -30,8 +30,8 @@ adjustmask(user) /obj/item/clothing/mask/breath/examine(mob/user) - ..() - to_chat(user, "Alt-click [src] to adjust it.") + . = ..() + . += "Alt-click [src] to adjust it." /obj/item/clothing/mask/breath/medical desc = "A close-fitting sterile mask that can be connected to an air supply." diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index 88cc7123fd..1532f50808 100644 --- a/code/modules/clothing/outfits/ert.dm +++ b/code/modules/clothing/outfits/ert.dm @@ -6,7 +6,7 @@ gloves = /obj/item/clothing/gloves/combat ears = /obj/item/radio/headset/headset_cent/alt -/datum/outfit/ert/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/ert/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) if(visualsOnly) return @@ -35,7 +35,7 @@ /obj/item/gun/energy/e_gun=1) l_pocket = /obj/item/switchblade -/datum/outfit/ert/commander/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/ert/commander/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) ..() if(visualsOnly) @@ -46,7 +46,7 @@ /datum/outfit/ert/commander/alert name = "ERT Commander - Amber Alert" - + suit = /obj/item/clothing/suit/space/hardsuit/ert/alert glasses = /obj/item/clothing/glasses/thermal/eyepatch backpack_contents = list(/obj/item/storage/box/engineer=1,\ @@ -76,7 +76,7 @@ /obj/item/gun/energy/e_gun/stun=1,\ /obj/item/melee/baton/loaded=1) -/datum/outfit/ert/security/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/ert/security/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) ..() if(visualsOnly) @@ -88,7 +88,7 @@ /datum/outfit/ert/security/alert name = "ERT Security - Amber Alert" - + suit = /obj/item/clothing/suit/space/hardsuit/ert/alert/sec backpack_contents = list(/obj/item/storage/box/engineer=1,\ /obj/item/storage/box/handcuffs=1,\ @@ -120,7 +120,7 @@ /obj/item/reagent_containers/hypospray/combat=1,\ /obj/item/gun/medbeam=1) -/datum/outfit/ert/medic/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/ert/medic/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) ..() if(visualsOnly) @@ -166,7 +166,7 @@ /obj/item/gun/energy/e_gun=1,\ /obj/item/construction/rcd/loaded=1) -/datum/outfit/ert/engineer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/ert/engineer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) ..() if(visualsOnly) @@ -214,7 +214,7 @@ l_hand = /obj/item/storage/toolbox/plastitanium gloves = /obj/item/clothing/gloves/color/yellow -/datum/outfit/ert/greybois/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/ert/greybois/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) if(visualsOnly) return var/obj/item/card/id/W = H.wear_id @@ -238,7 +238,7 @@ l_hand = /obj/item/clipboard id = /obj/item/card/id -/datum/outfit/centcom_official/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/centcom_official/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) if(visualsOnly) return @@ -288,7 +288,7 @@ /obj/item/reagent_containers/hypospray/combat/heresypurge=1, /obj/item/gun/medbeam=1) -/datum/outfit/ert/chaplain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/ert/chaplain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) ..() if(visualsOnly) diff --git a/code/modules/clothing/outfits/event.dm b/code/modules/clothing/outfits/event.dm index 347fc5c2d7..0ca2a11c50 100644 --- a/code/modules/clothing/outfits/event.dm +++ b/code/modules/clothing/outfits/event.dm @@ -12,7 +12,7 @@ belt = /obj/item/tank/internals/emergency_oxygen/double id = /obj/item/card/id/gold -/datum/outfit/santa/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/santa/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) if(visualsOnly) return H.fully_replace_character_name(H.real_name, "Santa Claus") diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index 6c961dc250..29fd06dcaf 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -48,7 +48,7 @@ l_pocket = /obj/item/grenade/chem_grenade/cleaner backpack_contents = list(/obj/item/stack/tile/plasteel=6) -/datum/outfit/tournament/janitor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/tournament/janitor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) if(visualsOnly) return @@ -97,7 +97,7 @@ /datum/outfit/pirate/space/captain head = /obj/item/clothing/head/helmet/space/pirate -/datum/outfit/pirate/post_equip(mob/living/carbon/human/H) +/datum/outfit/pirate/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) H.faction |= "pirate" var/obj/item/radio/R = H.ears @@ -125,7 +125,7 @@ id = /obj/item/card/id r_hand = /obj/item/twohanded/fireaxe -/datum/outfit/tunnel_clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/tunnel_clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) if(visualsOnly) return @@ -150,7 +150,7 @@ r_pocket = /obj/item/scalpel r_hand = /obj/item/twohanded/fireaxe -/datum/outfit/psycho/post_equip(mob/living/carbon/human/H) +/datum/outfit/psycho/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) for(var/obj/item/carried_item in H.get_equipped_items(TRUE)) carried_item.add_mob_blood(H)//Oh yes, there will be blood... for(var/obj/item/I in H.held_items) @@ -170,7 +170,7 @@ id = /obj/item/card/id/syndicate belt = /obj/item/pda/heads -/datum/outfit/assassin/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/assassin/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) var/obj/item/clothing/under/U = H.w_uniform U.attach_accessory(new /obj/item/clothing/accessory/waistcoat(H)) @@ -216,7 +216,7 @@ back = /obj/item/storage/backpack/satchel/leather id = /obj/item/card/id -/datum/outfit/centcom_commander/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/centcom_commander/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) if(visualsOnly) return @@ -244,7 +244,7 @@ back = /obj/item/storage/backpack/satchel/leather id = /obj/item/card/id -/datum/outfit/spec_ops/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/spec_ops/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) if(visualsOnly) return @@ -283,7 +283,7 @@ back = /obj/item/storage/backpack backpack_contents = list(/obj/item/storage/box=1) -/datum/outfit/wizard/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/wizard/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) if(visualsOnly) return @@ -325,7 +325,7 @@ id = /obj/item/card/id -/datum/outfit/soviet/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/soviet/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) if(visualsOnly) return @@ -349,7 +349,7 @@ r_hand = /obj/item/gun/ballistic/automatic/tommygun id = /obj/item/card/id -/datum/outfit/mobster/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/mobster/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) if(visualsOnly) return @@ -391,7 +391,7 @@ /obj/item/flashlight=1,\ /obj/item/grenade/plastic/x4=1) -/datum/outfit/death_commando/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/death_commando/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) if(visualsOnly) return diff --git a/code/modules/clothing/outfits/vr.dm b/code/modules/clothing/outfits/vr.dm index cd8115ac7d..ee350e3891 100644 --- a/code/modules/clothing/outfits/vr.dm +++ b/code/modules/clothing/outfits/vr.dm @@ -5,10 +5,10 @@ ears = /obj/item/radio/headset id = /obj/item/card/id -/datum/outfit/vr/pre_equip(mob/living/carbon/human/H) +/datum/outfit/vr/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) H.dna.species.before_equip_job(null, H) -/datum/outfit/vr/post_equip(mob/living/carbon/human/H) +/datum/outfit/vr/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) var/obj/item/card/id/id = H.wear_id if (istype(id)) id.access |= get_all_accesses() @@ -25,9 +25,10 @@ backpack_contents = list(/obj/item/storage/box/syndie=1,\ /obj/item/kitchen/knife/combat/survival) -/datum/outfit/vr/syndicate/post_equip(mob/living/carbon/human/H) +/datum/outfit/vr/syndicate/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) . = ..() - var/obj/item/uplink/U = new /obj/item/uplink/nuclear_restricted(H, H.key, 80) + var/key = H.key ? H.key : preference_source ? preference_source.key : null + var/obj/item/uplink/U = new /obj/item/uplink/nuclear_restricted(H, key, 80) H.equip_to_slot_or_del(U, SLOT_IN_BACKPACK) var/obj/item/implant/weapons_auth/W = new W.implant(H) diff --git a/code/modules/clothing/outfits/vv_outfit.dm b/code/modules/clothing/outfits/vv_outfit.dm index 103a152ec8..0bc8c87a45 100644 --- a/code/modules/clothing/outfits/vv_outfit.dm +++ b/code/modules/clothing/outfits/vv_outfit.dm @@ -4,7 +4,7 @@ var/list/vv_values var/list/stored_access -/datum/outfit/varedit/pre_equip(mob/living/carbon/human/H, visualsOnly) +/datum/outfit/varedit/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) H.delete_equipment() //Applying VV to wrong objects is not reccomended. . = ..() @@ -120,7 +120,7 @@ GLOB.custom_outfits += O to_chat(usr,"Outfit registered, use select equipment to equip it.") -/datum/outfit/varedit/post_equip(mob/living/carbon/human/H, visualsOnly) +/datum/outfit/varedit/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) . = ..() //Apply VV for(var/slot in vv_values) diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index 37ab2b2bf4..a8406e3b12 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -23,7 +23,7 @@ /obj/item/clothing/shoes/ComponentInitialize() . = ..() - RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /obj/item/clothing/shoes/clean_blood) + RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /atom.proc/clean_blood) /obj/item/clothing/shoes/suicide_act(mob/living/carbon/user) if(rand(2)>1) @@ -66,7 +66,7 @@ if(adjusted == NORMAL_STYLE) . += mutable_appearance('icons/effects/blood.dmi', "shoeblood", color = blood_DNA_to_color()) else - . += mutable_appearance('modular_citadel/icons/mob/digishoes.dmi', "shoeblood", color = blood_DNA_to_color()) + . += mutable_appearance('icons/mob/feet_digi.dmi', "shoeblood", color = blood_DNA_to_color()) /obj/item/clothing/shoes/equipped(mob/user, slot) . = ..() diff --git a/code/modules/clothing/shoes/bananashoes.dm b/code/modules/clothing/shoes/bananashoes.dm index d13e655d43..c4d06ea14c 100644 --- a/code/modules/clothing/shoes/bananashoes.dm +++ b/code/modules/clothing/shoes/bananashoes.dm @@ -38,8 +38,8 @@ to_chat(user, "You cannot retrieve any bananium from the prototype shoes.") /obj/item/clothing/shoes/clown_shoes/banana_shoes/examine(mob/user) - ..() - to_chat(user, "The shoes are [on ? "enabled" : "disabled"].") + . = ..() + . += "The shoes are [on ? "enabled" : "disabled"]." /obj/item/clothing/shoes/clown_shoes/banana_shoes/ui_action_click(mob/user) var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container) diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 0f5b381326..70dde1e217 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -40,8 +40,8 @@ return clothing_flags & NOSLIP /obj/item/clothing/shoes/magboots/examine(mob/user) - ..() - to_chat(user, "Its mag-pulse traction system appears to be [magpulse ? "enabled" : "disabled"].") + . = ..() + . += "Its mag-pulse traction system appears to be [magpulse ? "enabled" : "disabled"]." /obj/item/clothing/shoes/magboots/advance diff --git a/code/modules/clothing/spacesuits/flightsuit.dm b/code/modules/clothing/spacesuits/flightsuit.dm index 7ead462b1e..04aacfc3f5 100644 --- a/code/modules/clothing/spacesuits/flightsuit.dm +++ b/code/modules/clothing/spacesuits/flightsuit.dm @@ -799,10 +799,10 @@ to_chat(targ, "[icon2html(src, targ)]|[message]") /obj/item/clothing/suit/space/hardsuit/flightsuit/examine(mob/user) - ..() - to_chat(user, "SUIT: [locked ? "LOCKED" : "UNLOCKED"]") - to_chat(user, "FLIGHTPACK: [deployedpack ? "ENGAGED" : "DISENGAGED"] FLIGHTSHOES : [deployedshoes ? "ENGAGED" : "DISENGAGED"] HELMET : [suittoggled ? "ENGAGED" : "DISENGAGED"]") - to_chat(user, "Its maintainence panel is [maint_panel ? "OPEN" : "CLOSED"]") + . = ..() + . += "SUIT: [locked ? "LOCKED" : "UNLOCKED"]" + . += "FLIGHTPACK: [deployedpack ? "ENGAGED" : "DISENGAGED"] FLIGHTSHOES : [deployedshoes ? "ENGAGED" : "DISENGAGED"] HELMET : [suittoggled ? "ENGAGED" : "DISENGAGED"]" + . += "Its maintainence panel is [maint_panel ? "OPEN" : "CLOSED"]" /obj/item/clothing/suit/space/hardsuit/flightsuit/Destroy() dropped() diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index fa6b01415e..e7032ead13 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -958,14 +958,7 @@ /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) - + 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 @@ -995,5 +988,5 @@ update_light() /obj/item/clothing/suit/space/hardsuit/lavaknight/examine(mob/user) - ..() - to_chat(user, "Alt-click to recolor it.") + . = ..() + . += "Alt-click to recolor it." diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index 0b07aafa5d..7c829e7570 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -15,8 +15,8 @@ mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/suit/space/eva/plasmaman/examine(mob/user) - ..() - to_chat(user, "There [extinguishes_left == 1 ? "is" : "are"] [extinguishes_left] extinguisher charge\s left in this suit.") + . = ..() + . += "There [extinguishes_left == 1 ? "is" : "are"] [extinguishes_left] extinguisher charge\s left in this suit." /obj/item/clothing/suit/space/eva/plasmaman/proc/Extinguish(mob/living/carbon/human/H) diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index bc885868c5..53800615e9 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -519,6 +519,16 @@ /obj/item/clothing/head/hooded/winterhood/captain icon_state = "winterhood_captain" +/obj/item/clothing/suit/hooded/wintercoat/hop + name = "head of personnel's winter coat" + icon_state = "coathop" + item_state = "coathop" + armor = list("melee" = 5, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 5, "bio" = 5, "rad" = 0, "fire" = 0, "acid" = 5) + hoodtype = /obj/item/clothing/head/hooded/winterhood/hop + +/obj/item/clothing/head/hooded/winterhood/hop + icon_state = "winterhood_hop" + /obj/item/clothing/suit/hooded/wintercoat/security name = "security winter coat" icon_state = "coatsecurity" @@ -533,6 +543,20 @@ /obj/item/clothing/head/hooded/winterhood/security icon_state = "winterhood_security" +/obj/item/clothing/suit/hooded/wintercoat/hos + name = "head of security's winter coat" + icon_state = "coathos" + item_state = "coathos" + armor = list("melee" = 35, "bullet" = 35, "laser" = 35, "energy" = 15, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 55) + hoodtype = /obj/item/clothing/head/hooded/winterhood/hos + +/obj/item/clothing/suit/hooded/wintercoat/hos/Initialize() + . = ..() + allowed = GLOB.security_wintercoat_allowed + +/obj/item/clothing/head/hooded/winterhood/hos + icon_state = "winterhood_hos" + /obj/item/clothing/suit/hooded/wintercoat/medical name = "medical winter coat" icon_state = "coatmedical" @@ -544,6 +568,39 @@ /obj/item/clothing/head/hooded/winterhood/medical icon_state = "winterhood_medical" +/obj/item/clothing/suit/hooded/wintercoat/cmo + name = "chief medical officer's winter coat" + icon_state = "coatcmo" + item_state = "coatcmo" + allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) + armor = list("melee" = 5, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 0) + hoodtype = /obj/item/clothing/head/hooded/winterhood/cmo + +/obj/item/clothing/head/hooded/winterhood/cmo + icon_state = "winterhood_cmo" + +/obj/item/clothing/suit/hooded/wintercoat/chemistry + name = "chemistry winter coat" + icon_state = "coatchemistry" + item_state = "coatchemistry" + allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 30, "acid" = 45) + hoodtype = /obj/item/clothing/head/hooded/winterhood/chemistry + +/obj/item/clothing/head/hooded/winterhood/chemistry + icon_state = "winterhood_chemistry" + +/obj/item/clothing/suit/hooded/wintercoat/viro + name = "virology winter coat" + icon_state = "coatviro" + item_state = "coatviro" + allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 0, "acid" = 0) + hoodtype = /obj/item/clothing/head/hooded/winterhood/viro + +/obj/item/clothing/head/hooded/winterhood/viro + icon_state = "winterhood_viro" + /obj/item/clothing/suit/hooded/wintercoat/science name = "science winter coat" icon_state = "coatscience" @@ -555,6 +612,49 @@ /obj/item/clothing/head/hooded/winterhood/science icon_state = "winterhood_science" +/obj/item/clothing/suit/hooded/wintercoat/robotics + name = "robotics winter coat" + icon_state = "coatrobotics" + item_state = "coatrobotics" + allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/screwdriver, /obj/item/crowbar, /obj/item/wrench, /obj/item/stack/cable_coil, /obj/item/weldingtool, /obj/item/multitool) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + hoodtype = /obj/item/clothing/head/hooded/winterhood/robotics + +/obj/item/clothing/head/hooded/winterhood/robotics + icon_state = "winterhood_robotics" + +/obj/item/clothing/suit/hooded/wintercoat/genetics + name = "genetics winter coat" + icon_state = "coatgenetics" + item_state = "coatgenetics" + allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) + hoodtype = /obj/item/clothing/head/hooded/winterhood/genetics + +/obj/item/clothing/head/hooded/winterhood/genetics + icon_state = "winterhood_genetics" + +/obj/item/clothing/suit/hooded/wintercoat/rd + name = "research director's winter coat" + icon_state = "coatrd" + item_state = "coatrd" + allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) + armor = list("melee" = 0, "bullet" = 0, "laser" = 5,"energy" = 0, "bomb" = 15, "bio" = 5, "rad" = 5, "fire" = 0, "acid" = 0) + hoodtype = /obj/item/clothing/head/hooded/winterhood/rd + +/obj/item/clothing/head/hooded/winterhood/rd + icon_state = "winterhood_rd" + +/obj/item/clothing/suit/hooded/wintercoat/ce + name = "chief engineer's winter coat" + icon_state = "coatce" + item_state = "coatce" + armor = list("melee" = 0, "bullet" = 0, "laser" = 5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 30, "fire" = 35, "acid" = 45) + allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/t_scanner, /obj/item/construction/rcd, /obj/item/pipe_dispenser, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) + hoodtype = /obj/item/clothing/head/hooded/winterhood/ce + +/obj/item/clothing/head/hooded/winterhood/ce + icon_state = "winterhood_ce" + /obj/item/clothing/suit/hooded/wintercoat/engineering name = "engineering winter coat" icon_state = "coatengineer" @@ -585,6 +685,26 @@ /obj/item/clothing/head/hooded/winterhood/hydro icon_state = "winterhood_hydro" +/obj/item/clothing/suit/hooded/wintercoat/cosmic + name = "cosmic winter coat" + icon_state = "coatcosmic" + item_state = "coatcosmic" + allowed = list(/obj/item/flashlight) + hoodtype = /obj/item/clothing/head/hooded/winterhood/cosmic + +/obj/item/clothing/head/hooded/winterhood/cosmic + icon_state = "winterhood_cosmic" + +/obj/item/clothing/suit/hooded/wintercoat/janitor + name = "janitors winter coat" + icon_state = "coatjanitor" + item_state = "coatjanitor" + allowed = list(/obj/item/toy, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/storage/fancy/cigarettes, /obj/item/lighter,/obj/item/grenade/chem_grenade,/obj/item/lightreplacer,/obj/item/flashlight,/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/glass/bottle,/obj/item/reagent_containers/spray,/obj/item/soap,/obj/item/holosign_creator,/obj/item/key/janitor,/obj/item/melee/flyswatter,/obj/item/paint/paint_remover,/obj/item/storage/bag/trash,/obj/item/reagent_containers/glass/bucket) + hoodtype = /obj/item/clothing/head/hooded/winterhood/janitor + +/obj/item/clothing/head/hooded/winterhood/janitor + icon_state = "winterhood_janitor" + /obj/item/clothing/suit/hooded/wintercoat/cargo name = "cargo winter coat" icon_state = "coatcargo" @@ -594,6 +714,15 @@ /obj/item/clothing/head/hooded/winterhood/cargo icon_state = "winterhood_cargo" +/obj/item/clothing/suit/hooded/wintercoat/qm + name = "quartermaster's winter coat" + icon_state = "coatqm" + item_state = "coatqm" + hoodtype = /obj/item/clothing/head/hooded/winterhood/qm + +/obj/item/clothing/head/hooded/winterhood/qm + icon_state = "winterhood_qm" + /obj/item/clothing/suit/hooded/wintercoat/miner name = "mining winter coat" icon_state = "coatminer" @@ -633,3 +762,13 @@ flags_inv = HIDEGLOVES|HIDEEARS|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS|HEAD alternate_worn_layer = UNDER_HEAD_LAYER + +/obj/item/clothing/suit/assu_suit + name = "DAB suit" + desc = "A cheap replica of old SWAT armor. On its back, it is written: \"Desperate Assistance Battleforce\"." + icon_state = "assu_suit" + item_state = "assu_suit" + blood_overlay_type = "armor" + body_parts_covered = CHEST|GROIN|ARMS|LEGS + flags_inv = HIDEJUMPSUIT + resistance_flags = NONE diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index cc983dbb0f..f869eb5d44 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -120,8 +120,8 @@ A.UpdateButtonIcon() /obj/item/clothing/suit/toggle/examine(mob/user) - ..() - to_chat(user, "Alt-click on [src] to toggle the [togglename].") + . = ..() + . += "Alt-click on [src] to toggle the [togglename]." //Hardsuit toggle code /obj/item/clothing/suit/space/hardsuit/Initialize() diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index eda0e31e93..bb5f909521 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -137,23 +137,23 @@ /obj/item/clothing/under/examine(mob/user) - ..() + . = ..() if(can_adjust) if(adjusted == ALT_STYLE) - to_chat(user, "Alt-click on [src] to wear it normally.") + . += "Alt-click on [src] to wear it normally." else - to_chat(user, "Alt-click on [src] to wear it casually.") + . += "Alt-click on [src] to wear it casually." if (has_sensor == BROKEN_SENSORS) - to_chat(user, "Its sensors appear to be shorted out.") + . += "Its sensors appear to be shorted out." else if(has_sensor > NO_SENSORS) switch(sensor_mode) if(SENSOR_OFF) - to_chat(user, "Its sensors appear to be disabled.") + . += "Its sensors appear to be disabled." if(SENSOR_LIVING) - to_chat(user, "Its binary life sensors appear to be enabled.") + . += "Its binary life sensors appear to be enabled." if(SENSOR_VITALS) - to_chat(user, "Its vital tracker appears to be enabled.") + . += "Its vital tracker appears to be enabled." if(SENSOR_COORDS) - to_chat(user, "Its vital tracker and tracking beacon appear to be enabled.") + . += "Its vital tracker and tracking beacon appear to be enabled." if(attached_accessory) - to_chat(user, "\A [attached_accessory] is attached to it.") \ No newline at end of file + . += "\A [attached_accessory] is attached to it." \ No newline at end of file diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index 706f7edb0a..0a0499b5f9 100644 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -73,10 +73,10 @@ to_chat(user, "[src] will be worn [above_suit ? "above" : "below"] your suit.") /obj/item/clothing/accessory/examine(mob/user) - ..() - to_chat(user, "\The [src] can be attached to a uniform. Alt-click to remove it once attached.") + . = ..() + . += "\The [src] can be attached to a uniform. Alt-click to remove it once attached." if(initial(above_suit)) - to_chat(user, "\The [src] can be worn above or below your suit. Alt-click to toggle.") + . += "\The [src] can be worn above or below your suit. Alt-click to toggle." /obj/item/clothing/accessory/waistcoat name = "waistcoat" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 6f188d513f..b4ad844f4d 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -607,8 +607,9 @@ 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.") + . = ..() + . += "There are [extinguishes_left] extinguisher charges left in this suit." + /obj/item/clothing/under/plasmaman/proc/Extinguish(mob/living/carbon/human/H) if(!istype(H)) return diff --git a/code/modules/crafting/craft.dm b/code/modules/crafting/craft.dm index 0fb46c3e46..795515835e 100644 --- a/code/modules/crafting/craft.dm +++ b/code/modules/crafting/craft.dm @@ -32,7 +32,7 @@ CAT_SANDWICH, CAT_SOUP, CAT_SPAGHETTI), - CAT_CLOTHING) //Clothing subcategories + CAT_NONE) //Clothing subcategories var/datum/action/innate/crafting/button var/display_craftable_only = FALSE diff --git a/code/modules/crafting/recipes/recipes_clothing.dm b/code/modules/crafting/recipes/recipes_clothing.dm index f48ee87316..4f06a44811 100644 --- a/code/modules/crafting/recipes/recipes_clothing.dm +++ b/code/modules/crafting/recipes/recipes_clothing.dm @@ -158,3 +158,31 @@ time = 50 always_availible = TRUE category = CAT_CLOTHING + +/datum/crafting_recipe/wintercoat_cosmic + name = "Cosmic Winter Coat" + result = /obj/item/clothing/suit/hooded/wintercoat/cosmic + reqs = list(/obj/item/clothing/suit/hooded/wintercoat = 1, + /obj/item/clothing/suit/hooded/wintercoat/captain = 1, + /obj/item/clothing/suit/hooded/wintercoat/hop = 1, + /obj/item/clothing/suit/hooded/wintercoat/hos = 1, + /obj/item/clothing/suit/hooded/wintercoat/rd = 1, + /obj/item/clothing/suit/hooded/wintercoat/ce = 1, + /obj/item/clothing/suit/hooded/wintercoat/cmo = 1, + /obj/item/clothing/suit/hooded/wintercoat/qm = 1, + /obj/item/clothing/suit/hooded/wintercoat/robotics = 1, + /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos = 1, + /obj/item/clothing/suit/hooded/wintercoat/engineering = 1, + /obj/item/clothing/suit/hooded/wintercoat/science = 1, + /obj/item/clothing/suit/hooded/wintercoat/genetics = 1, + /obj/item/clothing/suit/hooded/wintercoat/chemistry = 1, + /obj/item/clothing/suit/hooded/wintercoat/medical = 1, + /obj/item/clothing/suit/hooded/wintercoat/viro = 1, + /obj/item/clothing/suit/hooded/wintercoat/janitor = 1, + /obj/item/clothing/suit/hooded/wintercoat/security = 1, + /obj/item/clothing/suit/hooded/wintercoat/cargo = 1, + /obj/item/clothing/suit/hooded/wintercoat/hydro = 1, + /obj/item/clothing/suit/hooded/wintercoat/miner = 1) + time = 60 + always_availible = TRUE + category = CAT_CLOTHING diff --git a/code/modules/crafting/recipes/recipes_misc.dm b/code/modules/crafting/recipes/recipes_misc.dm index f05c7bd94b..fdfb959fe6 100644 --- a/code/modules/crafting/recipes/recipes_misc.dm +++ b/code/modules/crafting/recipes/recipes_misc.dm @@ -4,7 +4,7 @@ /datum/crafting_recipe/showercurtain name = "Shower Curtains" - reqs = list(/obj/item/stack/sheet/cloth = 2, + reqs = list(/obj/item/stack/sheet/cloth = 2, /obj/item/stack/sheet/plastic = 2, /obj/item/stack/rods = 1) result = /obj/structure/curtain @@ -197,14 +197,6 @@ /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 diff --git a/code/modules/crafting/recipes/recipes_robot.dm b/code/modules/crafting/recipes/recipes_robot.dm index ae5bca7779..2b8ee0fe3a 100644 --- a/code/modules/crafting/recipes/recipes_robot.dm +++ b/code/modules/crafting/recipes/recipes_robot.dm @@ -77,8 +77,22 @@ 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 +/datum/crafting_recipe/aitater + name = "intelliTater" + result = /obj/item/aicard/aitater + time = 30 + tools = list(TOOL_WIRECUTTER) + reqs = list(/obj/item/aicard = 1, + /obj/item/reagent_containers/food/snacks/grown/potato = 1, + /obj/item/stack/cable_coil = 5) + category = CAT_ROBOT + +/datum/crafting_recipe/aispook + name = "intelliLantern" + result = /obj/item/aicard/aispook + time = 30 + tools = list(TOOL_WIRECUTTER) + reqs = list(/obj/item/aicard = 1, + /obj/item/reagent_containers/food/snacks/grown/pumpkin = 1, + /obj/item/stack/cable_coil = 5) 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 index 6eb1c31b12..bc3a3dcf05 100644 --- a/code/modules/crafting/recipes/recipes_weapon_and_ammo.dm +++ b/code/modules/crafting/recipes/recipes_weapon_and_ammo.dm @@ -84,7 +84,7 @@ 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) + /obj/item/stack/cable_coil = 1) time = 40 category = CAT_WEAPONRY subcategory = CAT_WEAPON @@ -93,7 +93,7 @@ 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) + /obj/item/stack/cable_coil = 1) time = 40 category = CAT_WEAPONRY subcategory = CAT_WEAPON diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm index c578d5b4d4..eaa31c01bf 100644 --- a/code/modules/detectivework/scanner.dm +++ b/code/modules/detectivework/scanner.dm @@ -200,9 +200,9 @@ log = list() /obj/item/detective_scanner/examine(mob/user) - ..() + . = ..() if(LAZYLEN(log) && !scanning) - to_chat(user, "Alt-click to clear scanner logs.") + . += "Alt-click to clear scanner logs." /obj/item/detective_scanner/proc/displayDetectiveScanResults(mob/living/user) // No need for can-use checks since the action button should do proper checks diff --git a/code/modules/events/_event.dm b/code/modules/events/_event.dm index 23f06e8965..e2125964e4 100644 --- a/code/modules/events/_event.dm +++ b/code/modules/events/_event.dm @@ -34,6 +34,7 @@ /datum/round_event_control/wizard wizardevent = 1 + var/can_be_midround_wizard = TRUE // Checks if the event can be spawned. Used by event controller and "false alarm" event. // Admin-created events override this. @@ -54,6 +55,13 @@ return FALSE return TRUE +/datum/round_event_control/wizard/canSpawnEvent(var/players_amt, var/gamemode) + if(istype(SSticker.mode, /datum/game_mode/dynamic)) + var/datum/game_mode/dynamic/mode = SSticker.mode + if (locate(/datum/dynamic_ruleset/midround/from_ghosts/wizard) in mode.executed_rules) + return can_be_midround_wizard && ..() + return ..() + /datum/round_event_control/proc/preRunEvent() if(!ispath(typepath, /datum/round_event)) return EVENT_CANT_RUN diff --git a/code/modules/events/abductor.dm b/code/modules/events/abductor.dm index aee49abcc0..25a5cb2ffa 100755 --- a/code/modules/events/abductor.dm +++ b/code/modules/events/abductor.dm @@ -4,7 +4,7 @@ weight = 10 max_occurrences = 1 min_players = 20 - gamemode_blacklist = list("nuclear","wizard","revolution") + gamemode_blacklist = list("nuclear","wizard","revolution","dynamic") /datum/round_event/ghost_role/abductor minimum_required = 2 diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm index 762371886c..69e9a974eb 100644 --- a/code/modules/events/alien_infestation.dm +++ b/code/modules/events/alien_infestation.dm @@ -2,7 +2,7 @@ name = "Alien Infestation" typepath = /datum/round_event/ghost_role/alien_infestation weight = 5 - + gamemode_blacklist = list("dynamic") min_players = 10 max_occurrences = 1 diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm index 8fc1a7ab3d..275cfaf63d 100644 --- a/code/modules/events/anomaly_bluespace.dm +++ b/code/modules/events/anomaly_bluespace.dm @@ -3,6 +3,7 @@ typepath = /datum/round_event/anomaly/anomaly_bluespace max_occurrences = 1 weight = 5 + gamemode_blacklist = list("dynamic") /datum/round_event/anomaly/anomaly_bluespace startWhen = 3 @@ -13,13 +14,7 @@ if(prob(90)) priority_announce("Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Unstable bluespace anomaly" - P.info = "Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name]." - P.update_icon() + print_command_report("Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name].", "Unstable bluespace anomaly") /datum/round_event/anomaly/anomaly_bluespace/start() var/turf/T = safepick(get_area_turfs(impact_area)) diff --git a/code/modules/events/anomaly_flux.dm b/code/modules/events/anomaly_flux.dm index 73562e49e5..289bc9526d 100644 --- a/code/modules/events/anomaly_flux.dm +++ b/code/modules/events/anomaly_flux.dm @@ -5,6 +5,7 @@ min_players = 10 max_occurrences = 5 weight = 20 + gamemode_blacklist = list("dynamic") /datum/round_event/anomaly/anomaly_flux startWhen = 10 @@ -14,13 +15,7 @@ if(prob(90)) priority_announce("Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Localized hyper-energetic flux wave" - P.info = "Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name]." - P.update_icon() + print_command_report("Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name].","Localized hyper-energetic flux wave") /datum/round_event/anomaly/anomaly_flux/start() var/turf/T = safepick(get_area_turfs(impact_area)) diff --git a/code/modules/events/anomaly_grav.dm b/code/modules/events/anomaly_grav.dm index 6e9014f13c..729ee7e32b 100644 --- a/code/modules/events/anomaly_grav.dm +++ b/code/modules/events/anomaly_grav.dm @@ -3,6 +3,8 @@ typepath = /datum/round_event/anomaly/anomaly_grav max_occurrences = 5 weight = 20 + gamemode_blacklist = list("dynamic") + /datum/round_event/anomaly/anomaly_grav startWhen = 3 @@ -12,13 +14,7 @@ if(prob(90)) priority_announce("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Gravitational anomaly" - P.info = "Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name]." - P.update_icon() + print_command_report("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Gravitational anomaly") /datum/round_event/anomaly/anomaly_grav/start() var/turf/T = safepick(get_area_turfs(impact_area)) diff --git a/code/modules/events/anomaly_pyro.dm b/code/modules/events/anomaly_pyro.dm index 988ccadb76..9594727784 100644 --- a/code/modules/events/anomaly_pyro.dm +++ b/code/modules/events/anomaly_pyro.dm @@ -3,6 +3,7 @@ typepath = /datum/round_event/anomaly/anomaly_pyro max_occurrences = 5 weight = 20 + gamemode_blacklist = list("dynamic") /datum/round_event/anomaly/anomaly_pyro startWhen = 3 @@ -12,13 +13,7 @@ if(prob(90)) priority_announce("Pyroclastic anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Pyroclastic anomaly" - P.info = "Pyroclastic anomaly detected on long range scanners. Expected location: [impact_area.name]." - P.update_icon() + print_command_report("Pyroclastic anomaly detected on long range scanners. Expected location: [impact_area.name].", "Pyroclastic anomaly") /datum/round_event/anomaly/anomaly_pyro/start() var/turf/T = safepick(get_area_turfs(impact_area)) diff --git a/code/modules/events/anomaly_vortex.dm b/code/modules/events/anomaly_vortex.dm index 2550dc191e..ef0d7a8af1 100644 --- a/code/modules/events/anomaly_vortex.dm +++ b/code/modules/events/anomaly_vortex.dm @@ -5,6 +5,7 @@ min_players = 20 max_occurrences = 2 weight = 5 + gamemode_blacklist = list("dynamic") /datum/round_event/anomaly/anomaly_vortex startWhen = 10 @@ -14,13 +15,7 @@ if(prob(90)) priority_announce("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name]", "Anomaly Alert") else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Vortex anomaly" - P.info = "Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name]." - P.update_icon() + print_command_report("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name].","Vortex anomaly") /datum/round_event/anomaly/anomaly_vortex/start() var/turf/T = safepick(get_area_turfs(impact_area)) diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm index d2a5c27883..55691cc833 100644 --- a/code/modules/events/blob.dm +++ b/code/modules/events/blob.dm @@ -4,10 +4,10 @@ weight = 10 max_occurrences = 1 - earliest_start = 60 MINUTES - min_players = 40 + earliest_start = 40 MINUTES + min_players = 35 - gamemode_blacklist = list("blob") //Just in case a blob survives that long + gamemode_blacklist = list("blob","dynamic") //Just in case a blob survives that long /datum/round_event/ghost_role/blob announceWhen = -1 @@ -18,13 +18,7 @@ if(prob(75)) priority_announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", "outbreak5") else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "level 5 biohazard" - P.info = "Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak." - P.update_icon() + print_command_report("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "level 5 biohazard") /datum/round_event/ghost_role/blob/spawn_role() if(!GLOB.blobstart.len) diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm index d422a0aa4f..85097684d0 100644 --- a/code/modules/events/brand_intelligence.dm +++ b/code/modules/events/brand_intelligence.dm @@ -5,6 +5,7 @@ min_players = 15 max_occurrences = 1 + gamemode_blacklist = list("dynamic") /datum/round_event/brand_intelligence announceWhen = 21 @@ -38,13 +39,8 @@ if(prob(50)) priority_announce("Rampant brand intelligence has been detected aboard [station_name()]. Please stand by. The origin is believed to be \a [source].", "Machine Learning Alert") else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Rampant brand intelligence" - P.info = "Rampant brand intelligence has been detected aboard [station_name()]. Please stand by. The origin is believed to be \a [source]." - P.update_icon() + print_command_report("Rampant brand intelligence has been detected aboard [station_name()]. Please stand by. The origin is believed to be \a [source].", "Rampant brand intelligence") + /datum/round_event/brand_intelligence/start() for(var/obj/machinery/vending/V in GLOB.machines) if(!is_station_level(V.z)) diff --git a/code/modules/events/carp_migration.dm b/code/modules/events/carp_migration.dm index 5a592d7f34..f5b3fbb9f7 100644 --- a/code/modules/events/carp_migration.dm +++ b/code/modules/events/carp_migration.dm @@ -5,6 +5,7 @@ min_players = 2 earliest_start = 10 MINUTES max_occurrences = 6 + gamemode_blacklist = list("dynamic") /datum/round_event/carp_migration announceWhen = 3 @@ -17,13 +18,7 @@ if(prob(50)) priority_announce("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert") else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Biological entities" - P.info = "Unknown biological entities have been detected near [station_name()], you may wish to break out arms." - P.update_icon() + print_command_report("Unknown biological entities have been detected near [station_name()], you may wish to break out arms.", "Biological entities") /datum/round_event/carp_migration/start() diff --git a/code/modules/events/communications_blackout.dm b/code/modules/events/communications_blackout.dm index da4eff9f39..ccd519b7e1 100644 --- a/code/modules/events/communications_blackout.dm +++ b/code/modules/events/communications_blackout.dm @@ -2,6 +2,7 @@ name = "Communications Blackout" typepath = /datum/round_event/communications_blackout weight = 30 + gamemode_blacklist = list("dynamic") /datum/round_event/communications_blackout announceWhen = 1 diff --git a/code/modules/events/dust.dm b/code/modules/events/dust.dm index c22f8cc0d7..090dc95cd6 100644 --- a/code/modules/events/dust.dm +++ b/code/modules/events/dust.dm @@ -5,6 +5,7 @@ max_occurrences = 1000 earliest_start = 0 MINUTES alertadmins = 0 + gamemode_blacklist = list("dynamic") /datum/round_event/space_dust startWhen = 1 diff --git a/code/modules/events/electrical_storm.dm b/code/modules/events/electrical_storm.dm index 10936409f9..c4c144dc9a 100644 --- a/code/modules/events/electrical_storm.dm +++ b/code/modules/events/electrical_storm.dm @@ -5,6 +5,7 @@ min_players = 5 weight = 40 alertadmins = 0 + gamemode_blacklist = list("dynamic") /datum/round_event/electrical_storm var/lightsoutAmount = 1 @@ -15,13 +16,7 @@ if(prob(50)) priority_announce("An electrical storm has been detected in your area, please repair potential electronic overloads.", "Electrical Storm Alert") else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Electrical Storm" - P.info = "An electrical storm has been detected in your area, please repair potential electronic overloads." - P.update_icon() + print_command_report("An electrical storm has been detected in your area, please repair potential electronic overloads.", "Electrical Storm") /datum/round_event/electrical_storm/start() var/list/epicentreList = list() diff --git a/code/modules/events/heart_attack.dm b/code/modules/events/heart_attack.dm index 7f9c09dfd9..8db2d98bf0 100644 --- a/code/modules/events/heart_attack.dm +++ b/code/modules/events/heart_attack.dm @@ -4,6 +4,7 @@ weight = 20 max_occurrences = 2 min_players = 40 // To avoid shafting lowpop + gamemode_blacklist = list("dynamic") /datum/round_event/heart_attack/start() var/list/heart_attack_contestants = list() diff --git a/code/modules/events/holiday/vday.dm b/code/modules/events/holiday/vday.dm index 8f77af58eb..0f1a7452df 100644 --- a/code/modules/events/holiday/vday.dm +++ b/code/modules/events/holiday/vday.dm @@ -67,62 +67,62 @@ /obj/item/valentine/New() ..() message = pick("Roses are red / Violets are good / One day while Andy...", - "My love for you is like the singularity. It cannot be contained.", - "Will you be my lusty xenomorph maid?", - "We go together like the clown and the external airlock.", - "Roses are red / Liches are wizards / I love you more than a whole squad of lizards.", - "Be my valentine. Law 2.", - "You must be a mime, because you leave me speechless.", - "I love you like Ian loves the HoP.", - "You're hotter than a plasma fire in toxins.", - "Are you a rogue atmos tech? Because you're taking my breath away.", - "Could I have all access... to your heart?", - "Call me the doctor, because I'm here to inspect your johnson.", - "I'm not a changeling, but you make my proboscis extend.", - "I just can't get EI NATH of you.", - "You must be a nuke op, because you make my heart explode.", - "Roses are red / Botany is a farm / Not being my Valentine / causes human harm.", - "I want you more than an assistant wants insulated gloves.", - "If I was a security officer, I'd brig you all shift.", - "Are you the janitor? Because I think I've fallen for you.", - "You're always valid to my heart.", - "I'd risk the wrath of the gods to bwoink you.", - "You look as beautiful now as the last time you were cloned.", - "Someone check the gravitational generator, because I'm only attracted to you.", - "If I were the warden I'd always let you into my armory.", - "The virologist is rogue, and the only cure is a kiss from you.", - "Would you spend some time in my upgraded sleeper?", - "You must be a silicon, because you've unbolted my heart.", - "Are you Nar'Sie? Because there's nar-one else I sie.", - "If you were a taser, you'd be set to stunning.", - "Do you have stamina damage from running through my dreams?", - "If I were an alien, would you let me hug you?", - "My love for you is stronger than a reinforced wall.", - "This must be the captain's office, because I see a fox.", - "I'm not a highlander, but there can only be one for me.", - "The floor is made of lava! Quick, get on my bed.", - "If you were an abandoned station you'd be the DEARelict.", - "If you had a pickaxe you'd be a shaft FINEr.", - "Roses are red, tide is gray, if I were an assistant I'd steal you away.", - "Roses are red, text is green, I love you more than cleanbots clean.", - "If you were a carp I'd fi-lay you.", - "I'm a nuke op, and my pinpointer leads to your heart.", - "Wanna slay my megafauna?", - "I'm a clockwork cultist. Or zl inyragvar.", - "If you were a disposal bin I'd ride you all day.", - "Put on your explorer's suit because I'm taking you to LOVEaland.", - "I must be the CMO, 'cause I saw you on my CUTE sensors.", - "You're the vomit to my flyperson.", - "You must be liquid dark matter, because you're pulling me closer.", - "Not even sorium can drive me away from you.", - "Wanna make like a borg and do some heavy petting?", - "Are you powering the station? Because you super matter to me.", - "I wish science could make me a bag of holding you.", - "Let's call the emergency CUDDLE.", - "I must be tripping on BZ, because I saw an angel walk by.", - "Wanna empty out my tool storage?", - "Did you visit the medbay after you fell from heaven?", - "Are you wearing space pants? Wanna not be?" ) + "My love for you is like the singularity. It cannot be contained.", + "Will you be my lusty xenomorph maid?", + "We go together like the clown and the external airlock.", + "Roses are red / Liches are wizards / I love you more than a whole squad of lizards.", + "Be my valentine. Law 2.", + "You must be a mime, because you leave me speechless.", + "I love you like Ian loves the HoP.", + "You're hotter than a plasma fire in toxins.", + "Are you a rogue atmos tech? Because you're taking my breath away.", + "Could I have all access... to your heart?", + "Call me the doctor, because I'm here to inspect your johnson.", + "I'm not a changeling, but you make my proboscis extend.", + "I just can't get EI NATH of you.", + "You must be a nuke op, because you make my heart explode.", + "Roses are red / Botany is a farm / Not being my Valentine / causes human harm.", + "I want you more than an assistant wants insulated gloves.", + "If I was a security officer, I'd brig you all shift.", + "Are you the janitor? Because I think I've fallen for you.", + "You're always valid to my heart.", + "I'd risk the wrath of the gods to bwoink you.", + "You look as beautiful now as the last time you were cloned.", + "Someone check the gravitational generator, because I'm only attracted to you.", + "If I were the warden I'd always let you into my armory.", + "The virologist is rogue, and the only cure is a kiss from you.", + "Would you spend some time in my upgraded sleeper?", + "You must be a silicon, because you've unbolted my heart.", + "Are you Nar'Sie? Because there's nar-one else I sie.", + "If you were a taser, you'd be set to stunning.", + "Do you have stamina damage from running through my dreams?", + "If I were an alien, would you let me hug you?", + "My love for you is stronger than a reinforced wall.", + "This must be the captain's office, because I see a fox.", + "I'm not a highlander, but there can only be one for me.", + "The floor is made of lava! Quick, get on my bed.", + "If you were an abandoned station you'd be the DEARelict.", + "If you had a pickaxe you'd be a shaft FINEr.", + "Roses are red, tide is gray, if I were an assistant I'd steal you away.", + "Roses are red, text is green, I love you more than cleanbots clean.", + "If you were a carp I'd fi-lay you.", + "I'm a nuke op, and my pinpointer leads to your heart.", + "Wanna slay my megafauna?", + "I'm a clockwork cultist. Or zl inyragvar.", + "If you were a disposal bin I'd ride you all day.", + "Put on your explorer's suit because I'm taking you to LOVEaland.", + "I must be the CMO, 'cause I saw you on my CUTE sensors.", + "You're the vomit to my flyperson.", + "You must be liquid dark matter, because you're pulling me closer.", + "Not even sorium can drive me away from you.", + "Wanna make like a borg and do some heavy petting?", + "Are you powering the station? Because you super matter to me.", + "I wish science could make me a bag of holding you.", + "Let's call the emergency CUDDLE.", + "I must be tripping on BZ, because I saw an angel walk by.", + "Wanna empty out my tool storage?", + "Did you visit the medbay after you fell from heaven?", + "Are you wearing space pants? Wanna not be?" ) /obj/item/valentine/attackby(obj/item/W, mob/user, params) ..() @@ -138,6 +138,7 @@ name = "valentine - To: [recipient] From: [sender]" /obj/item/valentine/examine(mob/user) + . = ..() if(in_range(user, src) || isobserver(user)) if( !(ishuman(user) || isobserver(user) || issilicon(user)) ) user << browse("[name][stars(message)]", "window=[name]") @@ -146,7 +147,7 @@ user << browse("[name][message]", "window=[name]") onclose(user, "[name]") else - to_chat(user, "It is too far away.") + . += "It is too far away." /obj/item/valentine/attack_self(mob/user) user.examinate(src) @@ -162,24 +163,24 @@ /obj/item/reagent_containers/food/snacks/candyheart/New() ..() desc = pick("A heart-shaped candy that reads: HONK ME", - "A heart-shaped candy that reads: ERP", - "A heart-shaped candy that reads: LEWD", - "A heart-shaped candy that reads: LUSTY", - "A heart-shaped candy that reads: SPESS LOVE", - "A heart-shaped candy that reads: AYY LMAO", - "A heart-shaped candy that reads: TABLE ME", - "A heart-shaped candy that reads: HAND CUFFS", - "A heart-shaped candy that reads: SHAFT MINER", - "A heart-shaped candy that reads: BANGING DONK", - "A heart-shaped candy that reads: Y-YOU T-TOO", - "A heart-shaped candy that reads: GOT WOOD", - "A heart-shaped candy that reads: TFW NO GF", - "A heart-shaped candy that reads: WAG MY TAIL", - "A heart-shaped candy that reads: VALIDTINES", - "A heart-shaped candy that reads: FACEHUGGER", - "A heart-shaped candy that reads: BOX OF HUGS", - "A heart-shaped candy that reads: REEBE MINE", - "A heart-shaped candy that reads: PET ME", - "A heart-shaped candy that reads: TO THE DORMS", - "A heart-shaped candy that reads: DIS MEMBER") + "A heart-shaped candy that reads: ERP", + "A heart-shaped candy that reads: LEWD", + "A heart-shaped candy that reads: LUSTY", + "A heart-shaped candy that reads: SPESS LOVE", + "A heart-shaped candy that reads: AYY LMAO", + "A heart-shaped candy that reads: TABLE ME", + "A heart-shaped candy that reads: HAND CUFFS", + "A heart-shaped candy that reads: SHAFT MINER", + "A heart-shaped candy that reads: BANGING DONK", + "A heart-shaped candy that reads: Y-YOU T-TOO", + "A heart-shaped candy that reads: GOT WOOD", + "A heart-shaped candy that reads: TFW NO GF", + "A heart-shaped candy that reads: WAG MY TAIL", + "A heart-shaped candy that reads: VALIDTINES", + "A heart-shaped candy that reads: FACEHUGGER", + "A heart-shaped candy that reads: BOX OF HUGS", + "A heart-shaped candy that reads: REEBE MINE", + "A heart-shaped candy that reads: PET ME", + "A heart-shaped candy that reads: TO THE DORMS", + "A heart-shaped candy that reads: DIS MEMBER") icon_state = pick("candyheart", "candyheart2", "candyheart3", "candyheart4") diff --git a/code/modules/events/holiday/xmas.dm b/code/modules/events/holiday/xmas.dm index 5f9873c387..65d96ad150 100644 --- a/code/modules/events/holiday/xmas.dm +++ b/code/modules/events/holiday/xmas.dm @@ -79,17 +79,5 @@ santa = new /mob/living/carbon/human(pick(GLOB.blobstart)) C.transfer_ckey(santa, FALSE) - santa.equipOutfit(/datum/outfit/santa) - santa.update_icons() - - var/datum/objective/santa_objective = new() - santa_objective.explanation_text = "Bring joy and presents to the station!" - santa_objective.completed = 1 //lets cut our santas some slack. - santa_objective.owner = santa.mind - santa.mind.objectives += santa_objective - santa.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/presents) - var/obj/effect/proc_holder/spell/targeted/area_teleport/teleport/telespell = new(santa) - telespell.clothes_req = 0 //santa robes aren't actually magical. - santa.mind.AddSpell(telespell) //does the station have chimneys? WHO KNOWS! - - to_chat(santa, "You are Santa! Your objective is to bring joy to the people on this station. You can conjure more presents using a spell, and there are several presents in your bag.") + var/datum/antagonist/santa/A = new + santa.mind.add_antag_datum(A) diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm index cd7c0e3b1f..40364483bf 100644 --- a/code/modules/events/ion_storm.dm +++ b/code/modules/events/ion_storm.dm @@ -3,6 +3,7 @@ /datum/round_event_control/ion_storm name = "Ion Storm" typepath = /datum/round_event/ion_storm + gamemode_blacklist = list("dynamic") weight = 15 min_players = 2 diff --git a/code/modules/events/major_dust.dm b/code/modules/events/major_dust.dm index c08de985fb..c594d7b3c0 100644 --- a/code/modules/events/major_dust.dm +++ b/code/modules/events/major_dust.dm @@ -2,6 +2,7 @@ name = "Major Space Dust" typepath = /datum/round_event/meteor_wave/major_dust weight = 8 + gamemode_blacklist = list("dynamic") /datum/round_event/meteor_wave/major_dust wave_name = "space dust" @@ -19,10 +20,4 @@ if(prob(50)) priority_announce(pick(reason), "Collision Alert") else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Collision Alert" - P.info = "[pick(reason)]" - P.update_icon() \ No newline at end of file + print_command_report("[pick(reason)]", "Collision Alert") diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm index 4aa9fb305d..26591547c0 100644 --- a/code/modules/events/meteor_wave.dm +++ b/code/modules/events/meteor_wave.dm @@ -10,6 +10,7 @@ min_players = 15 max_occurrences = 3 earliest_start = 25 MINUTES + gamemode_blacklist = list("dynamic") /datum/round_event/meteor_wave startWhen = 6 @@ -20,7 +21,7 @@ /datum/round_event/meteor_wave/setup() announceWhen = 1 - startWhen = rand(300, 600) //Yeah for SOME REASON this is measured in seconds and not deciseconds??? + startWhen = rand(180, 360) //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 diff --git a/code/modules/events/mice_migration.dm b/code/modules/events/mice_migration.dm index 911ce1dfbc..373c495972 100644 --- a/code/modules/events/mice_migration.dm +++ b/code/modules/events/mice_migration.dm @@ -23,13 +23,7 @@ into the [location].", "Migration Alert", 'sound/effects/mousesqueek.ogg') else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Rodent Migration" - P.info = "Due to [cause], [plural] [name] have [movement] into the [location]." - P.update_icon() + print_command_report("Due to [cause], [plural] [name] have [movement] into the [location].", "Rodent Migration") /datum/round_event/mice_migration/start() SSminor_mapping.trigger_migration(rand(minimum_mice, maximum_mice)) diff --git a/code/modules/events/nightmare.dm b/code/modules/events/nightmare.dm index 698f5130f1..6e5512a617 100644 --- a/code/modules/events/nightmare.dm +++ b/code/modules/events/nightmare.dm @@ -2,6 +2,7 @@ name = "Spawn Nightmare" typepath = /datum/round_event/ghost_role/nightmare max_occurrences = 1 + gamemode_blacklist = list("dynamic") min_players = 20 /datum/round_event/ghost_role/nightmare diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm index 477655db8b..8bc5491970 100644 --- a/code/modules/events/pirates.dm +++ b/code/modules/events/pirates.dm @@ -5,7 +5,7 @@ max_occurrences = 1 min_players = 10 earliest_start = 30 MINUTES - gamemode_blacklist = list("nuclear") + gamemode_blacklist = list("nuclear","dynamic") /datum/round_event_control/pirates/preRunEvent() if (!SSmapping.empty_space) @@ -75,7 +75,7 @@ spawner.create(M.ckey) candidates -= M else - notify_ghosts("Space pirates are waking up!", source = spawner, action=NOTIFY_ATTACK, flashwindow = FALSE) + notify_ghosts("Space pirates are waking up!", source = spawner, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_dnr_observers = TRUE) priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") //CITADEL EDIT also metabreak here too diff --git a/code/modules/events/prison_break.dm b/code/modules/events/prison_break.dm index 24be0e5644..178d66e9aa 100644 --- a/code/modules/events/prison_break.dm +++ b/code/modules/events/prison_break.dm @@ -33,13 +33,7 @@ if(prob(50)) priority_announce("Gr3y.T1d3 virus detected in [station_name()] door subroutines. Severity level of [severity]. Recommend station AI involvement.", "Security Alert") else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Gr3y.T1d3 virus" - P.info = "Gr3y.T1d3 virus detected in [station_name()] door subroutines. Severity level of [severity]. Recommend station AI involvement." - P.update_icon() + print_command_report("Gr3y.T1d3 virus detected in [station_name()] door subroutines. Severity level of [severity]. Recommend station AI involvement.", "Gr3y.T1d3 virus") else log_world("ERROR: Could not initate grey-tide. No areas in the list!") kill() diff --git a/code/modules/events/processor_overload.dm b/code/modules/events/processor_overload.dm index 74d9bb273e..67848bf941 100644 --- a/code/modules/events/processor_overload.dm +++ b/code/modules/events/processor_overload.dm @@ -3,6 +3,7 @@ typepath = /datum/round_event/processor_overload weight = 15 min_players = 20 + gamemode_blacklist = list("dynamic") /datum/round_event/processor_overload announceWhen = 1 diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index 60e4e0e4b8..705eea5409 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -2,6 +2,7 @@ name = "Radiation Storm" typepath = /datum/round_event/radiation_storm max_occurrences = 1 + gamemode_blacklist = list("dynamic") /datum/round_event/radiation_storm diff --git a/code/modules/events/shuttle_loan.dm b/code/modules/events/shuttle_loan.dm index 3fe52c338b..88059f7468 100644 --- a/code/modules/events/shuttle_loan.dm +++ b/code/modules/events/shuttle_loan.dm @@ -27,109 +27,43 @@ /datum/round_event/shuttle_loan/announce(fake) SSshuttle.shuttle_loan = src + var/message = "Cargo: I just wanna tell you techs good luck, we are all counting on you." + var/title = "CentCom Free Real Estate" switch(dispatch_type) if(HIJACK_SYNDIE) - if(prob(50)) - priority_announce("Cargo: The syndicate are trying to infiltrate your station. If you let them hijack your cargo shuttle, you'll save us a headache.","CentCom Counter Intelligence") - else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Cargo Report" - P.info = "Cargo: The syndicate are trying to infiltrate your station. If you let them hijack your cargo shuttle, you'll save us a headache." - P.update_icon() + message = "Cargo: The syndicate are trying to infiltrate your station. If you let them hijack your cargo shuttle, you'll save us a headache." + title = "CentCom Counter Intelligence" if(RUSKY_PARTY) - if(prob(50)) - priority_announce("Cargo: A group of angry Russians want to have a party. Can you send them your cargo shuttle then make them disappear?","CentCom Russian Outreach Program") - else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Cargo Report" - P.info = "Cargo: The syndicate are trying to infiltrate your station. If you let them hijack your cargo shuttle, you'll save us a headache." - P.update_icon() + message = "Cargo: A group of angry Russians want to have a party. Can you send them your cargo shuttle then make them disappear?" + title = "CentCom Russian Outreach Program" if(SPIDER_GIFT) - if(prob(50)) - priority_announce("Cargo: The Spider Clan has sent us a mysterious gift. Can we ship it to you to see what's inside?","CentCom Diplomatic Corps") - else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Cargo Report" - P.info = "Cargo: The Spider Clan has sent us a mysterious gift. Can we ship it to you to see what's inside?" - P.update_icon() + message = "Cargo: The Spider Clan has sent us a mysterious gift. Can we ship it to you to see what's inside?" + title = "CentCom Diplomatic Corps" if(DEPARTMENT_RESUPPLY) - if(prob(50)) - priority_announce("Cargo: Seems we've ordered doubles of our department resupply packages this month. Can we send them to you?","CentCom Supply Department") - else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Cargo Report" - P.info = "Cargo: Seems we've ordered doubles of our department resupply packages this month. Can we send them to you?" - P.update_icon() + message = "Cargo: Seems we've ordered doubles of our department resupply packages this month. Can we send them to you?" + title = "CentCom Supply Department" if(ANTIDOTE_NEEDED) - if(prob(50)) - priority_announce("Cargo: Your station has been chosen for an epidemiological research project. Send us your cargo shuttle to receive your research samples.", "CentCom Research Initiatives") - else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Cargo Report" - P.info = "Cargo: Your station has been chosen for an epidemiological research project. Send us your cargo shuttle to receive your research samples." - P.update_icon() + message = "Cargo: Your station has been chosen for an epidemiological research project. Send us your cargo shuttle to receive your research samples." + title = "CentCom Research Initiatives" if (PIZZA_DELIVERY) - if(prob(50)) - priority_announce("Cargo: It looks like a neighbouring station accidentally delivered their pizza to you instead.", "CentCom Spacepizza Division") - else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Cargo Report" - P.info = "Cargo: It looks like a neighbouring station accidentally delivered their pizza to you instead." - P.update_icon() + message = "Cargo: It looks like a neighbouring station accidentally delivered their pizza to you instead." + title = "CentCom Spacepizza Division" if(ITS_HIP_TO) - if(prob(50)) - priority_announce("Cargo: One of our freighters carrying a bee shipment has been attacked by eco-terrorists. Can you clean up the mess for us?", "CentCom Janitorial Division") - else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Cargo Report" - P.info = "Cargo: One of our freighters carrying a bee shipment has been attacked by eco-terrorists. Can you clean up the mess for us?." - P.update_icon() + message = "Cargo: One of our freighters carrying a bee shipment has been attacked by eco-terrorists. Can you clean up the mess for us?" + title = "CentCom Janitorial Division" bonus_points = 20000 //Toxin bees can be unbeelievably lethal if(MY_GOD_JC) - if(prob(50)) - priority_announce("Cargo: We have discovered an active Syndicate bomb near our VIP shuttle's fuel lines. If you feel up to the task, we will pay you for defusing it.", "CentCom Security Division") - else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Cargo Report" - P.info = "Cargo: We have discovered an active Syndicate bomb near our VIP shuttle's fuel lines. If you feel up to the task, we will pay you for defusing it." - P.update_icon() + message = "Cargo: We have discovered an active Syndicate bomb near our VIP shuttle's fuel lines. If you feel up to the task, we will pay you for defusing it." + title = "CentCom Security Division" bonus_points = 45000 //If you mess up, people die and the shuttle gets turned into swiss cheese if(DELTA_CRATES) - if(prob(50)) - priority_announce("Cargo: We have discovered a warehouse of DELTA locked crates, we cant store any more of them at CC can you take them for us?.", "CentCom Security Division") - else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Cargo Report" - P.info = "Cargo: We have discovered a warehouse of DELTA locked crates, we cant store any more of them at CC can you take them for us?." - P.update_icon() + message = "Cargo: We have discovered a warehouse of DELTA locked crates, we cant store any more of them at CC can you take them for us?." + title = "CentCom Security Division" bonus_points = 25000 //If you mess up, people die and the shuttle gets turned into swiss cheese + if(prob(50)) + priority_announce(message, title) + else + print_command_report(message, "Cargo report") /datum/round_event/shuttle_loan/proc/loan_shuttle() priority_announce(thanks_msg, "Cargo shuttle commandeered by CentCom.") diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index d8906de036..77600cdefe 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -251,7 +251,7 @@ holder.obj_integrity = holder.max_integrity /datum/spacevine_mutation/woodening/on_hit(obj/structure/spacevine/holder, mob/living/hitter, obj/item/I, expected_damage) - if(I.is_sharp()) + if(I.get_sharpness()) . = expected_damage * 0.5 else . = expected_damage @@ -292,7 +292,7 @@ add_atom_colour("#ffffff", FIXED_COLOUR_PRIORITY) /obj/structure/spacevine/examine(mob/user) - ..() + . = ..() var/text = "This one is a" if(mutations.len) for(var/A in mutations) @@ -301,7 +301,7 @@ else text += " normal" text += " vine." - to_chat(user, text) + . += text /obj/structure/spacevine/Destroy() for(var/datum/spacevine_mutation/SM in mutations) @@ -331,7 +331,7 @@ /obj/structure/spacevine/attacked_by(obj/item/I, mob/living/user) var/damage_dealt = I.force - if(I.is_sharp()) + if(I.get_sharpness()) damage_dealt *= 4 if(I.damtype == BURN) damage_dealt *= 4 diff --git a/code/modules/events/spider_infestation.dm b/code/modules/events/spider_infestation.dm index a6c333145e..8c6b3e23a5 100644 --- a/code/modules/events/spider_infestation.dm +++ b/code/modules/events/spider_infestation.dm @@ -2,6 +2,7 @@ name = "Spider Infestation" typepath = /datum/round_event/spider_infestation weight = 5 + gamemode_blacklist = list("dynamic") max_occurrences = 1 min_players = 15 diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm index 0deb880674..79487a024c 100644 --- a/code/modules/events/vent_clog.dm +++ b/code/modules/events/vent_clog.dm @@ -3,6 +3,7 @@ typepath = /datum/round_event/vent_clog weight = 10 max_occurrences = 3 + gamemode_blacklist = list("dynamic") min_players = 25 /datum/round_event/vent_clog diff --git a/code/modules/events/wizard/curseditems.dm b/code/modules/events/wizard/curseditems.dm index 41ee4246b1..2f0b9c68f8 100644 --- a/code/modules/events/wizard/curseditems.dm +++ b/code/modules/events/wizard/curseditems.dm @@ -4,6 +4,7 @@ typepath = /datum/round_event/wizard/cursed_items max_occurrences = 3 earliest_start = 0 MINUTES + can_be_midround_wizard = FALSE //Note about adding items to this: Because of how NODROP_1 works if an item spawned to the hands can also be equiped to a slot //it will be able to be put into that slot from the hand, but then get stuck there. To avoid this make a new subtype of any diff --git a/code/modules/events/wizard/departmentrevolt.dm b/code/modules/events/wizard/departmentrevolt.dm index f37b7470fb..67e96455f0 100644 --- a/code/modules/events/wizard/departmentrevolt.dm +++ b/code/modules/events/wizard/departmentrevolt.dm @@ -4,6 +4,7 @@ typepath = /datum/round_event/wizard/deprevolt max_occurrences = 1 earliest_start = 0 MINUTES + can_be_midround_wizard = FALSE // not removing it completely yet /datum/round_event/wizard/deprevolt/start() diff --git a/code/modules/events/wizard/greentext.dm b/code/modules/events/wizard/greentext.dm index 356e83757f..82e72df3b9 100644 --- a/code/modules/events/wizard/greentext.dm +++ b/code/modules/events/wizard/greentext.dm @@ -40,7 +40,8 @@ /obj/item/greentext/equipped(mob/living/user as mob) to_chat(user, "So long as you leave this place with greentext in hand you know will be happy...") - if(user.mind && user.mind.objectives.len > 0) + var/list/other_objectives = user.mind.get_all_objectives() + if(user.mind && other_objectives.len > 0) to_chat(user, "... so long as you still perform your other objectives that is!") new_holder = user if(!last_holder) diff --git a/code/modules/events/wizard/race.dm b/code/modules/events/wizard/race.dm index 7ea875f152..2aeb200c88 100644 --- a/code/modules/events/wizard/race.dm +++ b/code/modules/events/wizard/race.dm @@ -4,6 +4,7 @@ typepath = /datum/round_event/wizard/race max_occurrences = 5 earliest_start = 0 MINUTES + can_be_midround_wizard = FALSE /datum/round_event/wizard/race var/list/stored_name diff --git a/code/modules/events/wizard/shuffle.dm b/code/modules/events/wizard/shuffle.dm index 7e37429223..3b5ea6b20a 100644 --- a/code/modules/events/wizard/shuffle.dm +++ b/code/modules/events/wizard/shuffle.dm @@ -7,6 +7,7 @@ typepath = /datum/round_event/wizard/shuffleloc max_occurrences = 5 earliest_start = 0 MINUTES + can_be_midround_wizard = FALSE // not removing it completely yet /datum/round_event/wizard/shuffleloc/start() var/list/moblocs = list() @@ -43,6 +44,7 @@ typepath = /datum/round_event/wizard/shufflenames max_occurrences = 5 earliest_start = 0 MINUTES + can_be_midround_wizard = FALSE // not removing it completely yet /datum/round_event/wizard/shufflenames/start() var/list/mobnames = list() @@ -77,6 +79,7 @@ typepath = /datum/round_event/wizard/shuffleminds max_occurrences = 3 earliest_start = 0 MINUTES + can_be_midround_wizard = FALSE // not removing it completely yet /datum/round_event/wizard/shuffleminds/start() var/list/mobs = list() diff --git a/code/modules/events/wizard/summons.dm b/code/modules/events/wizard/summons.dm index 544a5c7cb3..ac1160e0f5 100644 --- a/code/modules/events/wizard/summons.dm +++ b/code/modules/events/wizard/summons.dm @@ -4,6 +4,7 @@ typepath = /datum/round_event/wizard/summonguns max_occurrences = 1 earliest_start = 0 MINUTES + can_be_midround_wizard = FALSE // not removing it completely yet /datum/round_event_control/wizard/summonguns/New() if(CONFIG_GET(flag/no_summon_guns)) @@ -19,6 +20,7 @@ typepath = /datum/round_event/wizard/summonmagic max_occurrences = 1 earliest_start = 0 MINUTES + can_be_midround_wizard = FALSE // not removing it completely yet /datum/round_event_control/wizard/summonmagic/New() if(CONFIG_GET(flag/no_summon_magic)) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 7232b717df..b5f02b79d7 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -236,10 +236,10 @@ GLOBAL_LIST_INIT(hallucination_list, list( xeno = new(pump.loc,target) sleep(10) xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32) - xeno.throw_at(target,7,1, xeno, FALSE, TRUE) + xeno.throw_at(target,7,1, null, FALSE, TRUE) sleep(10) xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32) - xeno.throw_at(pump,7,1, xeno, FALSE, TRUE) + xeno.throw_at(pump,7,1, null, FALSE, TRUE) sleep(10) var/xeno_name = xeno.name to_chat(target, "[xeno_name] begins climbing into the ventilation system...") @@ -672,7 +672,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( "AI [pick("rogue", "is dead")]!!") var/list/mob/living/carbon/people = list() - var/list/mob/living/carbon/person = null + var/mob/living/carbon/person = null var/datum/language/understood_language = target.get_random_understood_language() for(var/mob/living/carbon/H in view(target)) if(H == target) @@ -894,7 +894,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( SEND_SOUND(target, get_announcer_sound("aimalf")) if("meteors") //Meteors inbound! to_chat(target, "

    Meteor Alert

    ") - to_chat(target, "

    Meteors have been detected on collision course with the station.

    ") + to_chat(target, "

    Meteors have been detected on collision course with the station. Estimated time until impact: [round(rand(180,360)/60)] minutes.

    ") SEND_SOUND(target, get_announcer_sound("meteors")) if("supermatter") SEND_SOUND(target, 'sound/magic/charge.ogg') diff --git a/code/modules/food_and_drinks/autobottler.dm b/code/modules/food_and_drinks/autobottler.dm new file mode 100644 index 0000000000..6d5e0508a9 --- /dev/null +++ b/code/modules/food_and_drinks/autobottler.dm @@ -0,0 +1,18 @@ +/obj/machinery/rnd/production/protolathe/department/autobottler //We want to link with Rnd + name = "auto bottler" + desc = "Takes glass, metal and booze to make exports." + icon_state = "protolathe" + circuit = /obj/item/circuitboard/machine/autobottler + categories = list( + "Wines", + "Beers", + "Brands", + "Storge", + ) + production_animation = "protolathe_n" + allowed_buildtypes = AUTOBOTTLER + +//Brands - This is just export verson of the booze bottles +//Storge - Just the bottles not booze inside +//Wines - Holds wines later made by Sci nodes +//Beers - Holds beers later made by Sci nodes \ No newline at end of file diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 7b1d8be85e..5bf7e3dff3 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -95,7 +95,7 @@ to_chat(user, "You fill [src] with [trans] units of the contents of [target].") /obj/item/reagent_containers/food/drinks/attackby(obj/item/I, mob/user, params) - var/hotness = I.is_hot() + var/hotness = I.get_temperature() if(hotness && reagents) reagents.expose_temperature(hotness) to_chat(user, "You heat [name] with [I]!") diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index e72b624ae5..6a69721cef 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -133,18 +133,27 @@ icon_state = "ginbottle" list_reagents = list("gin" = 100) +/obj/item/reagent_containers/food/drinks/bottle/gin/empty + list_reagents = list("gin" = 0) + /obj/item/reagent_containers/food/drinks/bottle/whiskey name = "Uncle Git's special reserve" desc = "A premium single-malt whiskey, gently matured inside the tunnels of a nuclear shelter. TUNNEL WHISKEY RULES." icon_state = "whiskeybottle" list_reagents = list("whiskey" = 100) +/obj/item/reagent_containers/food/drinks/bottle/whiskey/empty + list_reagents = list("whiskey" = 0) + /obj/item/reagent_containers/food/drinks/bottle/vodka name = "Tunguska triple distilled" desc = "Aah, vodka. Prime choice of drink AND fuel by Russians worldwide." icon_state = "vodkabottle" list_reagents = list("vodka" = 100) +/obj/item/reagent_containers/food/drinks/bottle/vodka/empty + list_reagents = list("vodka" = 0) + /obj/item/reagent_containers/food/drinks/bottle/vodka/badminka name = "Badminka vodka" desc = "The label's written in Cyrillic. All you can make out is the name and a word that looks vaguely like 'Vodka'." @@ -157,6 +166,9 @@ icon_state = "tequilabottle" list_reagents = list("tequila" = 100) +/obj/item/reagent_containers/food/drinks/bottle/tequila/empty + list_reagents = list("tequila" = 0) + /obj/item/reagent_containers/food/drinks/bottle/bottleofnothing name = "bottle of nothing" desc = "A bottle filled with nothing." @@ -164,18 +176,27 @@ list_reagents = list("nothing" = 100) foodtype = NONE +/obj/item/reagent_containers/food/drinks/bottle/bottleofnothing/empty + list_reagents = list("nothing" = 0) + /obj/item/reagent_containers/food/drinks/bottle/patron name = "Wrapp Artiste Patron" desc = "Silver laced tequila, served in space night clubs across the galaxy." icon_state = "patronbottle" list_reagents = list("patron" = 100) +/obj/item/reagent_containers/food/drinks/bottle/patron/empty + list_reagents = list("patron" = 0) + /obj/item/reagent_containers/food/drinks/bottle/rum name = "Captain Pete's Cuban spiced rum" desc = "This isn't just rum, oh no. It's practically GRIFF in a bottle." icon_state = "rumbottle" list_reagents = list("rum" = 100) +/obj/item/reagent_containers/food/drinks/bottle/rum/empty + list_reagents = list("rum" = 0) + /obj/item/reagent_containers/food/drinks/bottle/holywater name = "flask of holy water" desc = "A flask of the chaplain's holy water." @@ -207,6 +228,9 @@ icon_state = "vermouthbottle" list_reagents = list("vermouth" = 100) +/obj/item/reagent_containers/food/drinks/bottle/vermouth/empty + list_reagents = list("vermouth" = 0) + /obj/item/reagent_containers/food/drinks/bottle/kahlua name = "Robert Robust's coffee liqueur" desc = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936, HONK." @@ -214,18 +238,27 @@ list_reagents = list("kahlua" = 100) foodtype = VEGETABLES +/obj/item/reagent_containers/food/drinks/bottle/kahlua/empty + list_reagents = list("kahlua" = 0) + /obj/item/reagent_containers/food/drinks/bottle/goldschlager name = "College Girl goldschlager" desc = "Because they are the only ones who will drink 100 proof cinnamon schnapps." icon_state = "goldschlagerbottle" list_reagents = list("goldschlager" = 100) +/obj/item/reagent_containers/food/drinks/bottle/goldschlager/empty + list_reagents = list("goldschlager" = 0) + /obj/item/reagent_containers/food/drinks/bottle/cognac name = "Chateau de Baton premium cognac" desc = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. You might as well not scream 'SHITCURITY' this time." icon_state = "cognacbottle" list_reagents = list("cognac" = 100) +/obj/item/reagent_containers/food/drinks/bottle/cognac/empty + list_reagents = list("cognac" = 0) + /obj/item/reagent_containers/food/drinks/bottle/wine name = "Doublebeard's bearded special wine" desc = "A faint aura of unease and asspainery surrounds the bottle." @@ -233,12 +266,18 @@ list_reagents = list("wine" = 100) foodtype = FRUIT | ALCOHOL +/obj/item/reagent_containers/food/drinks/bottle/wine/empty + list_reagents = list("wine" = 0) + /obj/item/reagent_containers/food/drinks/bottle/absinthe name = "extra-strong absinthe" desc = "An strong alcoholic drink brewed and distributed by" icon_state = "absinthebottle" list_reagents = list("absinthe" = 100) +/obj/item/reagent_containers/food/drinks/bottle/absinthe/empty + list_reagents = list("absinthe" = 0) + /obj/item/reagent_containers/food/drinks/bottle/absinthe/Initialize() . = ..() redact() @@ -300,18 +339,27 @@ volume = 50 list_reagents = list("hcider" = 50) +/obj/item/reagent_containers/food/drinks/bottle/hcider/empty + list_reagents = list("hcider" = 0) + /obj/item/reagent_containers/food/drinks/bottle/grappa name = "Phillipes well-aged Grappa" desc = "Bottle of Grappa." icon_state = "grappabottle" list_reagents = list("grappa" = 100) +/obj/item/reagent_containers/food/drinks/bottle/grappa/empty + list_reagents = list("grappa" = 0) + /obj/item/reagent_containers/food/drinks/bottle/sake name = "Ryo's traditional sake" desc = "Sweet as can be, and burns like fire going down." icon_state = "sakebottle" list_reagents = list("sake" = 100) +/obj/item/reagent_containers/food/drinks/bottle/sake/empty + list_reagents = list("sake" = 0) + /obj/item/reagent_containers/food/drinks/bottle/sake/Initialize() . = ..() if(prob(10)) @@ -329,6 +377,9 @@ icon_state = "fernetbottle" list_reagents = list("fernet" = 100) +/obj/item/reagent_containers/food/drinks/bottle/fernet/empty + list_reagents = list("fernet" = 0) + /obj/item/reagent_containers/food/drinks/bottle/applejack name = "Buckin' Bronco's Applejack" desc = "Kicks like a horse, tastes like an apple!" @@ -336,18 +387,27 @@ list_reagents = list("applejack" = 100) foodtype = FRUIT +/obj/item/reagent_containers/food/drinks/bottle/applejack/empty + list_reagents = list("applejack" = 0) + /obj/item/reagent_containers/food/drinks/bottle/champagne name = "Eau d' Dandy Brut Champagne" desc = "Finely sourced from only the most pretentious French vineyards." icon_state = "champagne_bottle" list_reagents = list("champagne" = 100) +/obj/item/reagent_containers/food/drinks/bottle/champagne/empty + list_reagents = list("champagne" = 0) + /obj/item/reagent_containers/food/drinks/bottle/blazaam name = "Ginbad's Blazaam" desc = "You feel like you should give the bottle a good rub before opening." icon_state = "blazaambottle" list_reagents = list("blazaam" = 100) +/obj/item/reagent_containers/food/drinks/bottle/blazaam/empty + list_reagents = list("blazaam" = 0) + /obj/item/reagent_containers/food/drinks/bottle/trappist name = "Mont de Requin Trappistes Bleu" desc = "Brewed in space-Belgium. Fancy!" @@ -355,6 +415,8 @@ volume = 50 list_reagents = list("trappist" = 50) +/obj/item/reagent_containers/food/drinks/bottle/trappist/empty + list_reagents = list("trappist" = 0) //////////////////////////JUICES AND STUFF /////////////////////// @@ -420,6 +482,8 @@ list_reagents = list("grenadine" = 100) foodtype = FRUIT +/obj/item/reagent_containers/food/drinks/bottle/grenadine/empty + list_reagents = list("grenadine" = 0) ////////////////////////// MOLOTOV /////////////////////// /obj/item/reagent_containers/food/drinks/bottle/molotov @@ -455,7 +519,7 @@ ..() /obj/item/reagent_containers/food/drinks/bottle/molotov/attackby(obj/item/I, mob/user, params) - if(I.is_hot() && !active) + if(I.get_temperature() && !active) active = 1 var/message = "[ADMIN_LOOKUP(user)] has primed a [name] for detonation at [ADMIN_VERBOSEJMP(user)]." GLOB.bombers += message @@ -487,3 +551,131 @@ to_chat(user, "You snuff out the flame on [src].") cut_overlay(GLOB.fire_overlay) active = 0 + +/obj/item/export/bottle/attack_self(mob/user) + to_chat(user, "The seal seems fine. Best to not open it.") + return + +/obj/item/export/bottle + name = "Report this please" + desc = "A sealed bottle of alcohol, ready to be exported" + icon = 'icons/obj/drinks.dmi' + force = 0 + throwforce = 0 + throw_speed = 0 + throw_range = 0 + w_class = WEIGHT_CLASS_TINY + item_state = "beer" + attack_verb = list("boop", "thunked", "shown") + +/obj/item/export/bottle/gin + icon_state = "ginbottle" + name = "Sealed Gin" + +/obj/item/export/bottle/wine + icon_state = "winebottle" + name = "Sealed Wine" + +/obj/item/export/bottle/whiskey + icon_state = "whiskeybottle" + name = "Sealed Whiskey" + +/obj/item/export/bottle/vodka + icon_state = "vodkabottle" + name = "Sealed Vodka" + +/obj/item/export/bottle/tequila + icon_state = "tequilabottle" + name = "Sealed Tequila" + +/obj/item/export/bottle/patron + icon_state = "patronbottle" + name = "Sealed Patron" + +/obj/item/export/bottle/rum + icon_state = "rumbottle" + name = "Sealed Rum" + +/obj/item/export/bottle/vermouth + icon_state = "vermouthbottle" + name = "Sealed Vermouth" + +/obj/item/export/bottle/kahlua + icon_state = "kahluabottle" + name = "Sealed Kahlua" + +/obj/item/export/bottle/goldschlager + icon_state = "goldschlagerbottle" + name = "Sealed Goldschlager" + +/obj/item/export/bottle/hcider + icon_state = "hcider" + name = "Sealed Cider" + +/obj/item/export/bottle/cognac + icon_state = "cognacbottle" + name = "Sealed Cognac" + +/obj/item/export/bottle/absinthe + icon_state = "absinthebottle" + name = "Sealed Unmarked Absinthe" + +/obj/item/export/bottle/grappa + icon_state = "grappabottle" + name = "Sealed Grappa" + +/obj/item/export/bottle/sake + icon_state = "sakebottle" + name = "Sealed Sake" + +/obj/item/export/bottle/fernet + icon_state = "fernetbottle" + name = "Sealed Fernet" + +/obj/item/export/bottle/applejack + icon_state = "applejack_bottle" + name = "Sealed Applejack" + +/obj/item/export/bottle/champagne + icon_state = "champagne_bottle" + name = "Sealed Champagne" + +/obj/item/export/bottle/blazaam + icon_state = "blazaambottle" + name = "Sealed Blazaam" + +/obj/item/export/bottle/trappist + icon_state = "trappistbottle" + name = "Sealed Trappist" + +/obj/item/export/bottle/grenadine + icon_state = "grenadine" + name = "Sealed Grenadine" + +/obj/item/export/bottle/minikeg + name = "Mini-Beer Keg" + icon_state = "keggy" + desc = "A small wooden barrle with metal rings, untapped beer inside." + +/obj/item/export/bottle/blooddrop + icon_state = "champagne_selling_bottle" + name = "Blood Drop" + desc = "Large red bottle filled with a mix of wine and other named brands." + +/obj/item/export/bottle/slim_gold + name = "Slim Gold " + icon_state = "selling_bottle_alt" + desc = "A gold looking yellow bottle that has a mix of different named brands." + +/obj/item/export/bottle/white_bloodmoon + name = "White Bloodmoon" + icon_state = "selling_bottle_basic" + desc = "Rather simple bottle for this kind of drink." + +/obj/item/export/bottle/greenroad + name = "Green Road" + icon_state = "selling_bottle" + desc = "Ironic name as the fruit used is from ashy plants." + + + diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm index 3eeb5b9417..df5e6a87fd 100644 --- a/code/modules/food_and_drinks/food/customizables.dm +++ b/code/modules/food_and_drinks/food/customizables.dm @@ -22,7 +22,7 @@ var/customname = "custom" /obj/item/reagent_containers/food/snacks/customizable/examine(mob/user) - ..() + . = ..() var/ingredients_listed = "" for(var/obj/item/reagent_containers/food/snacks/ING in ingredients) ingredients_listed += "[ING.name], " @@ -33,7 +33,7 @@ size = "big" if(ingredients.len>8) size = "monster" - to_chat(user, "It contains [ingredients.len?"[ingredients_listed]":"no ingredient, "]making a [size]-sized [initial(name)].") + . += "It contains [ingredients.len?"[ingredients_listed]":"no ingredient, "]making a [size]-sized [initial(name)]." /obj/item/reagent_containers/food/snacks/customizable/attackby(obj/item/I, mob/user, params) if(!istype(I, /obj/item/reagent_containers/food/snacks/customizable) && istype(I, /obj/item/reagent_containers/food/snacks)) diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index 7eea6fb9ca..d838b31aba 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -151,15 +151,15 @@ All foods are distributed among various categories. Use common sense. return 0 /obj/item/reagent_containers/food/snacks/examine(mob/user) - ..() + . = ..() if(bitecount == 0) return else if(bitecount == 1) - to_chat(user, "[src] was bitten by someone!") + . += "[src] was bitten by someone!" else if(bitecount <= 3) - to_chat(user, "[src] was bitten [bitecount] times!") + . += "[src] was bitten [bitecount] times!" else - to_chat(user, "[src] was bitten multiple times!") + . += "[src] was bitten multiple times!" /obj/item/reagent_containers/food/snacks/attackby(obj/item/W, mob/user, params) @@ -181,7 +181,7 @@ All foods are distributed among various categories. Use common sense. var/obj/item/reagent_containers/food/snacks/customizable/C = new custom_food_type(get_turf(src)) C.initialize_custom_food(src, S, user) return 0 - var/sharp = W.is_sharp() + var/sharp = W.get_sharpness() if(sharp) if(slice(sharp, W, user)) return 1 @@ -337,7 +337,7 @@ All foods are distributed among various categories. Use common sense. /obj/item/reagent_containers/food/snacks/store/attackby(obj/item/W, mob/user, params) ..() if(W.w_class <= WEIGHT_CLASS_SMALL & !istype(W, /obj/item/reagent_containers/food/snacks)) //can't slip snacks inside, they're used for custom foods. - if(W.is_sharp()) + if(W.get_sharpness()) return 0 if(stored_item) return 0 diff --git a/code/modules/food_and_drinks/food/snacks/meat.dm b/code/modules/food_and_drinks/food/snacks/meat.dm index ee169e9861..ea573a2cf0 100644 --- a/code/modules/food_and_drinks/food/snacks/meat.dm +++ b/code/modules/food_and_drinks/food/snacks/meat.dm @@ -282,7 +282,7 @@ tastes = list("meat" = 1) /obj/item/reagent_containers/food/snacks/meat/steak/plain - foodtype = MEAT + foodtype = MEAT /obj/item/reagent_containers/food/snacks/meat/steak/plain/human tastes = list("tender meat" = 1) @@ -340,7 +340,7 @@ /obj/item/reagent_containers/food/snacks/meat/rawcutlet/plain - foodtype = MEAT + foodtype = MEAT /obj/item/reagent_containers/food/snacks/meat/rawcutlet/plain/human cooked_type = /obj/item/reagent_containers/food/snacks/meat/cutlet/plain/human diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm index b468b6b1d1..c3fc942b83 100644 --- a/code/modules/food_and_drinks/food/snacks_pastry.dm +++ b/code/modules/food_and_drinks/food/snacks_pastry.dm @@ -447,11 +447,11 @@ if (pancakeCount) var/obj/item/reagent_containers/food/snacks/S = contents[pancakeCount] bitecount = S.bitecount - ..() + . = ..() if (pancakeCount) for(var/obj/item/reagent_containers/food/snacks/pancakes/ING in contents) ingredients_listed += "[ING.name], " - to_chat(user, "It contains [contents.len?"[ingredients_listed]":"no ingredient, "]on top of a [initial(name)].") + . += "It contains [contents.len?"[ingredients_listed]":"no ingredient, "]on top of a [initial(name)]." bitecount = originalBites /obj/item/reagent_containers/food/snacks/pancakes/attackby(obj/item/I, mob/living/user, params) diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm index dd33f696c9..3183b3b2b4 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm @@ -67,9 +67,9 @@ God bless America. fry_speed = oil_efficiency /obj/machinery/deepfryer/examine() - ..() + . = ..() if(frying) - to_chat(usr, "You can make out \a [frying] in the oil.") + . += "You can make out \a [frying] in the oil." /obj/machinery/deepfryer/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/reagent_containers/pill)) diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm index 6fcc5c9cec..e67de92773 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm @@ -53,20 +53,20 @@ /obj/machinery/microwave/examine(mob/user) . = ..() if(!operating) - to_chat(user, "Alt-click [src] to turn it on.") + . += "Alt-click [src] to turn it on." if(!in_range(user, src) && !issilicon(user) && !isobserver(user)) - to_chat(user, "You're too far away to examine [src]'s contents and display!") + . += "You're too far away to examine [src]'s contents and display!" return if(operating) - to_chat(user, "\The [src] is operating.") + . += "\The [src] is operating." return if(length(ingredients)) if(issilicon(user)) - to_chat(user, "\The [src] camera shows:") + . += "\The [src] camera shows:" else - to_chat(user, "\The [src] contains:") + . += "\The [src] contains:" var/list/items_counts = new for(var/i in ingredients) if(istype(i, /obj/item/stack)) @@ -76,14 +76,14 @@ var/atom/movable/AM = i items_counts[AM.name]++ for(var/O in items_counts) - to_chat(user, "- [items_counts[O]]x [O].") + . += "- [items_counts[O]]x [O]." else - to_chat(user, "\The [src] is empty.") + . += "\The [src] is empty." if(!(stat & (NOPOWER|BROKEN))) - to_chat(user, "The status display reads:") - to_chat(user, "- Capacity: [max_n_of_items] items.") - to_chat(user, "- Cook time reduced by [(efficiency - 1) * 25]%.") + . += "The status display reads:" + . += "- Capacity: [max_n_of_items] items." + . += "- Cook time reduced by [(efficiency - 1) * 25]%." /obj/machinery/microwave/update_icon() if(broken) diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm index d608a73560..355660ecec 100644 --- a/code/modules/food_and_drinks/pizzabox.dm +++ b/code/modules/food_and_drinks/pizzabox.dm @@ -308,7 +308,7 @@ /obj/item/reagent_containers/food/snacks/pizza/margherita = 1, /obj/item/reagent_containers/food/snacks/pizza/sassysage = 0.8, /obj/item/reagent_containers/food/snacks/pizza/vegetable = 0.8, - /obj/item/reagent_containers/food/snacks/pizza/pineapple = 0.5, + /obj/item/reagent_containers/food/snacks/pizza/pineapple = 0.5, /obj/item/reagent_containers/food/snacks/pizza/donkpocket = 0.3, /obj/item/reagent_containers/food/snacks/pizza/dank = 0.1) //pizzas here are weighted by chance to be someone's favorite var/static/list/pizza_preferences @@ -319,9 +319,9 @@ pizza_preferences = list() /obj/item/pizzabox/infinite/examine(mob/user) - ..() + . = ..() if(isobserver(user)) - to_chat(user, "This pizza box is anomalous, and will produce infinite pizza.") + . += "This pizza box is anomalous, and will produce infinite pizza." /obj/item/pizzabox/infinite/attack_self(mob/living/user) QDEL_NULL(pizza) 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 284affe2ec..9c14badb23 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm @@ -69,7 +69,9 @@ /datum/crafting_recipe/food/birthdaycake name = "Birthday cake" reqs = list( - /obj/item/clothing/head/hardhat/cakehat = 1, + /datum/reagent/consumable/sugar = 10, + /obj/item/candle = 1, + /obj/item/reagent_containers/food/snacks/grown/vanillapod = 2, /obj/item/reagent_containers/food/snacks/store/cake/plain = 1 ) result = /obj/item/reagent_containers/food/snacks/store/cake/birthday 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 30c265e237..b5bed4d5fc 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm @@ -8,7 +8,7 @@ reqs = list( /datum/reagent/consumable/milk = 5, /obj/item/reagent_containers/food/snacks/pie/plain = 1, - /obj/item/reagent_containers/food/snacks/grown/banana = 1 + /obj/item/reagent_containers/food/snacks/grown/banana = 1 ) result = /obj/item/reagent_containers/food/snacks/pie/cream subcategory = CAT_PIE @@ -46,7 +46,7 @@ name = "Cherry pie" reqs = list( /obj/item/reagent_containers/food/snacks/pie/plain = 1, - /obj/item/reagent_containers/food/snacks/grown/cherries = 1 + /obj/item/reagent_containers/food/snacks/grown/cherries = 1 ) result = /obj/item/reagent_containers/food/snacks/pie/cherrypie subcategory = CAT_PIE @@ -122,11 +122,11 @@ /datum/crafting_recipe/food/grapetart name = "Grape tart" reqs = list( - /datum/reagent/consumable/milk = 5, - /datum/reagent/consumable/sugar = 5, - /obj/item/reagent_containers/food/snacks/pie/plain = 1, - /obj/item/reagent_containers/food/snacks/grown/grapes = 3 - ) + /datum/reagent/consumable/milk = 5, + /datum/reagent/consumable/sugar = 5, + /obj/item/reagent_containers/food/snacks/pie/plain = 1, + /obj/item/reagent_containers/food/snacks/grown/grapes = 3 + ) result = /obj/item/reagent_containers/food/snacks/pie/grapetart subcategory = CAT_PIE @@ -183,11 +183,11 @@ name = "Mime tart" always_availible = FALSE reqs = list( - /datum/reagent/consumable/milk = 5, - /datum/reagent/consumable/sugar = 5, - /obj/item/reagent_containers/food/snacks/pie/plain = 1, - /datum/reagent/consumable/nothing = 5 - ) + /datum/reagent/consumable/milk = 5, + /datum/reagent/consumable/sugar = 5, + /obj/item/reagent_containers/food/snacks/pie/plain = 1, + /datum/reagent/consumable/nothing = 5 + ) result = /obj/item/reagent_containers/food/snacks/pie/mimetart subcategory = CAT_PIE @@ -195,11 +195,11 @@ name = "Berry tart" always_availible = FALSE reqs = list( - /datum/reagent/consumable/milk = 5, - /datum/reagent/consumable/sugar = 5, - /obj/item/reagent_containers/food/snacks/pie/plain = 1, - /obj/item/reagent_containers/food/snacks/grown/berries = 3 - ) + /datum/reagent/consumable/milk = 5, + /datum/reagent/consumable/sugar = 5, + /obj/item/reagent_containers/food/snacks/pie/plain = 1, + /obj/item/reagent_containers/food/snacks/grown/berries = 3 + ) result = /obj/item/reagent_containers/food/snacks/pie/berrytart subcategory = CAT_PIE @@ -207,20 +207,20 @@ name = "Chocolate Lava tart" always_availible = FALSE reqs = list( - /datum/reagent/consumable/milk = 5, - /datum/reagent/consumable/sugar = 5, - /obj/item/reagent_containers/food/snacks/pie/plain = 1, - /obj/item/reagent_containers/food/snacks/chocolatebar = 3, - /obj/item/slime_extract = 1 - ) + /datum/reagent/consumable/milk = 5, + /datum/reagent/consumable/sugar = 5, + /obj/item/reagent_containers/food/snacks/pie/plain = 1, + /obj/item/reagent_containers/food/snacks/chocolatebar = 3, + /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 - ) + /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/games/cas.dm b/code/modules/games/cas.dm index 8953753a89..fe038ce3f1 100644 --- a/code/modules/games/cas.dm +++ b/code/modules/games/cas.dm @@ -107,14 +107,14 @@ var/buffertext = "A funny bit of text." /obj/item/toy/cards/singlecard/cas/examine(mob/user) - ..() + . = ..() if (flipped) - to_chat(user, "The card is face down.") + . += "The card is face down." else if (blank) - to_chat(user, "The card is blank. Write on it with a pen.") + . += "The card is blank. Write on it with a pen." else - to_chat(user, "The card reads: [name]") - to_chat(user, "Alt-click to flip it.") + . += "The card reads: [name]" + . += "Alt-click to flip it." /obj/item/toy/cards/singlecard/cas/Flip() set name = "Flip Card" diff --git a/code/modules/holiday/halloween/bartholomew.dm b/code/modules/holiday/halloween/bartholomew.dm index aa119dca84..f51b8b7ea1 100644 --- a/code/modules/holiday/halloween/bartholomew.dm +++ b/code/modules/holiday/halloween/bartholomew.dm @@ -1,72 +1,72 @@ /obj/effect/landmark/barthpot - name = "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 + 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 - ..() + 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 + 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!") + 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) + 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.") + 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.") + 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, + 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, @@ -94,7 +94,7 @@ /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/coin = 1, /obj/item/crowbar = 4, /obj/item/extinguisher = 3, /obj/item/hand_labeler = 1, @@ -129,28 +129,28 @@ /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/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." + 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]) diff --git a/code/modules/holiday/halloween/halloween.dm b/code/modules/holiday/halloween/halloween.dm index 5635994a7a..5b9b2ac21d 100644 --- a/code/modules/holiday/halloween/halloween.dm +++ b/code/modules/holiday/halloween/halloween.dm @@ -127,8 +127,8 @@ name = "ghost" real_name = "ghost" icon = 'icons/mob/mob.dmi' - maxHealth = 1e6 - health = 1e6 + maxHealth = 120 + health = 120 speak_emote = list("howls") emote_hear = list("wails","screeches") density = FALSE @@ -141,7 +141,6 @@ . = ..() icon_state = pick("ghost","ghostian","ghostian2","ghostking","ghost1","ghost2") icon_living = icon_state - status_flags |= GODMODE timer = rand(1,15) /mob/living/simple_animal/shade/howling_ghost/Life() @@ -176,13 +175,9 @@ step(I,direction) return -/mob/living/simple_animal/shade/howling_ghost/adjustHealth() - . = 0 - /mob/living/simple_animal/shade/howling_ghost/CanPass(atom/movable/mover, turf/target) return 1 - /////////////////////////// //Spookoween Insane Clown// /////////////////////////// @@ -195,8 +190,8 @@ icon_dead = "scary_clown" icon_gib = "scary_clown" speak = list("...", ". . .") - maxHealth = 1e6 - health = 1e6 + maxHealth = 120 + health = 120 emote_see = list("silently stares") unsuitable_atmos_damage = 0 var/timer @@ -204,8 +199,6 @@ /mob/living/simple_animal/hostile/retaliate/clown/insane/Initialize() . = ..() timer = rand(5,15) - status_flags = (status_flags | GODMODE) - return /mob/living/simple_animal/hostile/retaliate/clown/insane/Retaliate() return @@ -237,7 +230,7 @@ return /mob/living/simple_animal/hostile/retaliate/clown/insane/adjustHealth() - . = 0 + . = ..() if(prob(5)) playsound(loc, 'sound/spookoween/insane_low_laugh.ogg', 300, 1) diff --git a/code/modules/holiday/halloween/jacqueen.dm b/code/modules/holiday/halloween/jacqueen.dm index f67c099309..d71e7c0f6a 100644 --- a/code/modules/holiday/halloween/jacqueen.dm +++ b/code/modules/holiday/halloween/jacqueen.dm @@ -111,7 +111,7 @@ var/list/targets = list() for(var/H in GLOB.network_holopads) var/area/A = get_area(H) - if(findtextEx(A, "AI") || !(A in pop_areas) || !is_station_level(H)) + if(!A || findtextEx(A.name, "AI") || !(A in pop_areas) || !is_station_level(H)) continue targets += H diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm index 9d075857a7..9dd016c235 100644 --- a/code/modules/holiday/holidays.dm +++ b/code/modules/holiday/holidays.dm @@ -546,3 +546,10 @@ Since Ramadan is an entire month that lasts 29.5 days on average, the start and /datum/holiday/easter/getStationPrefix() return pick("Fluffy","Bunny","Easter","Egg") + +//Random citadel thing for halloween species +/proc/force_enable_halloween_species() + var/list/oldlist = SSevents.holidays + SSevents.holidays = list(HALLOWEEN = new /datum/holiday/halloween) + generate_selectable_species(FALSE) + SSevents.holidays = oldlist diff --git a/code/modules/holodeck/area_copy.dm b/code/modules/holodeck/area_copy.dm index efe7418e44..8fa0825628 100644 --- a/code/modules/holodeck/area_copy.dm +++ b/code/modules/holodeck/area_copy.dm @@ -5,6 +5,7 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars,list( )) /proc/DuplicateObject(atom/original, perfectcopy = TRUE, sameloc = FALSE, atom/newloc = null, nerf = FALSE, holoitem=FALSE) + RETURN_TYPE(original.type) if(!original) return var/atom/O @@ -122,7 +123,7 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars,list( if(toupdate.len) for(var/turf/T1 in toupdate) - T1.CalculateAdjacentTurfs() + CALCULATE_ADJACENT_TURFS(T1) SSair.add_to_active(T1,1) diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm index a4c89b8874..3574f8a9c1 100644 --- a/code/modules/holodeck/turfs.dm +++ b/code/modules/holodeck/turfs.dm @@ -21,7 +21,7 @@ /turf/open/floor/holofloor/plating/burnmix name = "burn-mix floor" - initial_gas_mix = "o2=2500;plasma=5000;TEMP=370" + initial_gas_mix = BURNMIX_ATMOS /turf/open/floor/holofloor/grass gender = PLURAL diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm index e26dab07b4..3c4ed776b7 100644 --- a/code/modules/hydroponics/beekeeping/beebox.dm +++ b/code/modules/hydroponics/beekeeping/beebox.dm @@ -123,26 +123,25 @@ /obj/structure/beebox/examine(mob/user) - ..() + . = ..() if(!queen_bee) - to_chat(user, "There is no queen bee! There won't bee any honeycomb without a queen!") + . += "There is no queen bee! There won't bee any honeycomb without a queen!" var/half_bee = get_max_bees()*0.5 if(half_bee && (bees.len >= half_bee)) - to_chat(user, "This place is aBUZZ with activity... there are lots of bees!") + . += "This place is aBUZZ with activity... there are lots of bees!" - to_chat(user, "[bee_resources]/100 resource supply.") - to_chat(user, "[bee_resources]% towards a new honeycomb.") - to_chat(user, "[bee_resources*2]% towards a new bee.") + . += "[bee_resources]/100 resource supply." + . += "[bee_resources]% towards a new honeycomb." + . += "[bee_resources*2]% towards a new bee." if(honeycombs.len) var/plural = honeycombs.len > 1 - to_chat(user, "There [plural? "are" : "is"] [honeycombs.len] uncollected honeycomb[plural ? "s":""] in the apiary.") + . += "There [plural? "are" : "is"] [honeycombs.len] uncollected honeycomb[plural ? "s":""] in the apiary." if(honeycombs.len >= get_max_honeycomb()) - to_chat(user, "There's no room for more honeycomb!") - + . += "There's no room for more honeycomb!" /obj/structure/beebox/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/honey_frame)) diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index eaffeaf016..fb40e4eebd 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -173,7 +173,7 @@ for(var/V in categories) categories[V] = list() for(var/V in stored_research.researched_designs) - var/datum/design/D = stored_research.researched_designs[V] + var/datum/design/D = SSresearch.techweb_design_by_id(V) for(var/C in categories) if(C in D.category) categories[C] += D @@ -185,11 +185,11 @@ dat += "
    " for(var/V in categories[cat]) var/datum/design/D = V - dat += "[D.name]: Make" + dat += "[D.name]: Make" if(cat in timesFiveCategories) - dat += "x5" + dat += "x5" if(ispath(D.build_path, /obj/item/stack)) - dat += "x10" + dat += "x10" dat += "([D.materials[MAT_BIOMASS]/efficiency])
    " dat += "
    " else @@ -306,8 +306,20 @@ var/amount = (text2num(href_list["amount"])) //Can't be outside these (if you change this keep a sane limit) amount = CLAMP(amount, 1, 50) - var/datum/design/D = locate(href_list["create"]) - create_product(D, amount) + var/id = href_list["create"] + if(!stored_research.researched_designs.Find(id)) + //naughty naughty + stack_trace("ID did not map to a researched datum [id]") + return + + //Get design by id (or may return error design) + var/datum/design/D = SSresearch.techweb_design_by_id(id) + //Valid design datum, amount and the datum is not the error design, lets proceed + if(D && amount && !istype(D, /datum/design/error_design)) + create_product(D, amount) + //This shouldnt happen normally but href forgery is real + else + stack_trace("ID could not be turned into a valid techweb design datum [id]") updateUsrDialog() else if(href_list["menu"]) diff --git a/code/modules/hydroponics/fermenting_barrel.dm b/code/modules/hydroponics/fermenting_barrel.dm index 83fc18dcb9..e9001322d3 100644 --- a/code/modules/hydroponics/fermenting_barrel.dm +++ b/code/modules/hydroponics/fermenting_barrel.dm @@ -16,7 +16,7 @@ /obj/structure/fermenting_barrel/examine(mob/user) . = ..() - to_chat(user, "It is currently [open?"open, letting you pour liquids in.":"closed, letting you draw liquids from the tap."]") + . += "It is currently [open?"open, letting you pour liquids in.":"closed, letting you draw liquids from the tap."]" /obj/structure/fermenting_barrel/proc/makeWine(obj/item/reagent_containers/food/snacks/grown/fruit) if(fruit.reagents) @@ -69,10 +69,3 @@ icon_state = "barrel_open" else icon_state = "barrel" - -/datum/crafting_recipe/fermenting_barrel - name = "Wooden Barrel" - result = /obj/structure/fermenting_barrel - reqs = list(/obj/item/stack/sheet/mineral/wood = 30) - time = 50 - category = CAT_PRIMAL diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm index 79a23014b0..3376bac1cc 100644 --- a/code/modules/hydroponics/gene_modder.dm +++ b/code/modules/hydroponics/gene_modder.dm @@ -201,9 +201,9 @@ if(!G) continue dat += "[G.get_name()]" - if(can_extract) + if(can_extract && G.mutability_flags & PLANT_GENE_EXTRACTABLE) dat += "Extract" - if(can_insert && istype(disk.gene, G.type)) + if(can_insert && istype(disk.gene, G.type) && G.mutability_flags & PLANT_GENE_REMOVABLE) dat += "Replace" dat += "" dat += "" @@ -232,9 +232,10 @@ for(var/a in trait_genes) var/datum/plant_gene/G = a dat += "[G.get_name()]" - if(can_extract) + if(can_extract && G.mutability_flags & PLANT_GENE_EXTRACTABLE) dat += "Extract" - dat += "Remove" + if(G.mutability_flags & PLANT_GENE_REMOVABLE) + dat += "Remove" dat += "" dat += "" else @@ -439,7 +440,7 @@ to_chat(user, "You flip the write-protect tab to [src.read_only ? "protected" : "unprotected"].") /obj/item/disk/plantgene/examine(mob/user) - ..() + . = ..() if(gene && (istype(gene, /datum/plant_gene/core/potency))) - to_chat(user,"Percent is relative to potency, not maximum volume of the plant.") - to_chat(user, "The write-protect tab is set to [src.read_only ? "protected" : "unprotected"].") + . += "Percent is relative to potency, not maximum volume of the plant." + . += "The write-protect tab is set to [src.read_only ? "protected" : "unprotected"]." diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 096c7b5b2b..660f1e17e4 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -56,11 +56,11 @@ return 0 /obj/item/reagent_containers/food/snacks/grown/examine(user) - ..() + . = ..() if(seed) for(var/datum/plant_gene/trait/T in seed.genes) if(T.examine_line) - to_chat(user, T.examine_line) + . += T.examine_line /obj/item/reagent_containers/food/snacks/grown/attackby(obj/item/O, mob/user, params) ..() @@ -131,7 +131,7 @@ ..() /obj/item/reagent_containers/food/snacks/grown/generate_trash(atom/location) - if(trash && ispath(trash, /obj/item/grown)) + if(trash && (ispath(trash, /obj/item/grown) || ispath(trash, /obj/item/reagent_containers/food/snacks/grown))) . = new trash(location, seed) trash = null return diff --git a/code/modules/hydroponics/grown/berries.dm b/code/modules/hydroponics/grown/berries.dm index ef019387e8..62c9c7ffaa 100644 --- a/code/modules/hydroponics/grown/berries.dm +++ b/code/modules/hydroponics/grown/berries.dm @@ -90,7 +90,7 @@ lifespan = 30 endurance = 25 mutatelist = list() - genes = list(/datum/plant_gene/trait/glow/berry , /datum/plant_gene/trait/noreact, /datum/plant_gene/trait/repeated_harvest) + genes = list(/datum/plant_gene/trait/glow/white, /datum/plant_gene/trait/noreact, /datum/plant_gene/trait/repeated_harvest) reagents_add = list("uranium" = 0.25, "iodine" = 0.2, "vitamin" = 0.04, "nutriment" = 0.1) rarity = 20 @@ -121,8 +121,9 @@ growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' icon_grow = "cherry-grow" icon_dead = "cherry-dead" + icon_harvest = "cherry-harvest" genes = list(/datum/plant_gene/trait/repeated_harvest) - mutatelist = list(/obj/item/seeds/cherry/blue) + mutatelist = list(/obj/item/seeds/cherry/blue, /obj/item/seeds/cherry/bulb) reagents_add = list("nutriment" = 0.07, "sugar" = 0.07) /obj/item/reagent_containers/food/snacks/grown/cherries @@ -162,6 +163,31 @@ tastes = list("blue cherry" = 1) wine_power = 50 +//Cherry Bulbs +/obj/item/seeds/cherry/bulb + name = "pack of cherry bulb pits" + desc = "The glowy kind of cherries." + icon_state = "seed-cherrybulb" + species = "cherrybulb" + plantname = "Cherry Bulb Tree" + product = /obj/item/reagent_containers/food/snacks/grown/cherrybulbs + genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/glow/pink) + mutatelist = list() + reagents_add = list(/datum/reagent/consumable/nutriment = 0.07, /datum/reagent/consumable/sugar = 0.07) + rarity = 10 + +/obj/item/reagent_containers/food/snacks/grown/cherrybulbs + seed = /obj/item/seeds/cherry/bulb + name = "cherry bulbs" + desc = "They're like little Space Christmas lights!" + icon_state = "cherry_bulb" + filling_color = "#FF0000" + bitesize_mod = 2 + foodtype = FRUIT + grind_results = list(/datum/reagent/consumable/cherryjelly = 0) + tastes = list("cherry" = 1) + wine_power = 50 + // Grapes /obj/item/seeds/grape name = "pack of grape seeds" diff --git a/code/modules/hydroponics/grown/cannabis.dm b/code/modules/hydroponics/grown/cannabis.dm index 67c5e61dcf..6ce3558bc3 100644 --- a/code/modules/hydroponics/grown/cannabis.dm +++ b/code/modules/hydroponics/grown/cannabis.dm @@ -61,6 +61,7 @@ species = "ocannabis" plantname = "Omega Weed" product = /obj/item/reagent_containers/food/snacks/grown/cannabis/ultimate + genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/glow/green) mutatelist = list() reagents_add = list("space_drugs" = 0.3, "mindbreaker" = 0.3, diff --git a/code/modules/hydroponics/grown/citrus.dm b/code/modules/hydroponics/grown/citrus.dm index 97b30aec06..7355aa5ab1 100644 --- a/code/modules/hydroponics/grown/citrus.dm +++ b/code/modules/hydroponics/grown/citrus.dm @@ -33,6 +33,26 @@ filling_color = "#00FF00" juice_results = list("limejuice" = 0) +// Electric Lime +/obj/item/seeds/lime/electric + name = "pack of electric lime seeds" + desc = "Electrically sour seeds." + icon_state = "seed-electriclime" + species = "electric lime" + plantname = "Electric Lime Tree" + growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' + icon_grow = "lime-grow" + icon_dead = "lime-dead" + icon_harvest = "lime-harvest" + product = /obj/item/reagent_containers/food/snacks/grown/citrus/lime/electric + genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/cell_charge, /datum/plant_gene/trait/glow/green) + +/obj/item/reagent_containers/food/snacks/grown/citrus/lime/electric + seed = /obj/item/seeds/lime/electric + name = "electric lime" + desc = "It's so sour, you'll be shocked!" + icon_state = "electriclime" + // Orange /obj/item/seeds/orange name = "pack of orange seeds" @@ -49,7 +69,7 @@ icon_grow = "lime-grow" icon_dead = "lime-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) - mutatelist = list(/obj/item/seeds/lime) + mutatelist = list(/obj/item/seeds/lime, /obj/item/seeds/orange_3d) reagents_add = list("vitamin" = 0.04, "nutriment" = 0.05) /obj/item/reagent_containers/food/snacks/grown/citrus/orange @@ -61,6 +81,43 @@ juice_results = list("orangejuice" = 0) distill_reagent = "triple_sec" + +//3D Orange +/obj/item/seeds/orange_3d + name = "pack of extradimensional orange seeds" + desc = "Polygonal seeds." + icon_state = "seed-orange" + species = "orange" + plantname = "Extradimensional Orange Tree" + product = /obj/item/reagent_containers/food/snacks/grown/citrus/orange + lifespan = 60 + endurance = 50 + yield = 5 + potency = 20 + growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' + icon_grow = "lime-grow" + icon_dead = "lime-dead" + genes = list(/datum/plant_gene/trait/repeated_harvest) + reagents_add = list("vitamin" = 0.04, "nutriment" = 0.05) + +/obj/item/reagent_containers/food/snacks/grown/citrus/orange_3d + seed = /obj/item/seeds/orange + name = "extradminesional orange" + desc = "You can hardly wrap your head around this thing." + icon_state = "orang" + filling_color = "#FFA500" + juice_results = list("orangejuice" = 0) + distill_reagent = "triple_sec" + tastes = list("polygons" = 1, "oranges" = 1) + +/obj/item/reagent_containers/food/snacks/grown/citrus/orange_3d/pickup(mob/user) + . = ..() + icon_state = "orange" + +/obj/item/reagent_containers/food/snacks/grown/citrus/orange_3d/dropped(mob/user) + . = ..() + icon_state = "orang" + // Lemon /obj/item/seeds/lemon name = "pack of lemon seeds" diff --git a/code/modules/hydroponics/grown/cocoa_vanilla.dm b/code/modules/hydroponics/grown/cocoa_vanilla.dm index ea1b9716bd..55fa327f1f 100644 --- a/code/modules/hydroponics/grown/cocoa_vanilla.dm +++ b/code/modules/hydroponics/grown/cocoa_vanilla.dm @@ -15,7 +15,7 @@ icon_grow = "cocoapod-grow" icon_dead = "cocoapod-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) - mutatelist = list(/obj/item/seeds/cocoapod/vanillapod) + mutatelist = list(/obj/item/seeds/cocoapod/vanillapod, /obj/item/seeds/cocoapod/bungotree) reagents_add = list("cocoa" = 0.25, "nutriment" = 0.1) /obj/item/reagent_containers/food/snacks/grown/cocoapod @@ -50,3 +50,54 @@ foodtype = FRUIT tastes = list("vanilla" = 1) distill_reagent = "vanilla" //Takes longer, but you can get even more vanilla from it. + +/obj/item/seeds/cocoapod/bungotree + name = "pack of bungo tree seeds" + desc = "These seeds grow into bungo trees. They appear to be heavy and almost perfectly spherical." + icon_state = "seed-bungotree" + species = "bungotree" + plantname = "Bungo Tree" + product = /obj/item/reagent_containers/food/snacks/grown/bungofruit + lifespan = 30 + maturation = 4 + yield = 3 + production = 7 + genes = list(/datum/plant_gene/trait/repeated_harvest) + mutatelist = list() + reagents_add = list(/datum/reagent/consumable/enzyme = 0.1, /datum/reagent/consumable/nutriment = 0.1) + growthstages = 4 + growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' + icon_grow = "bungotree-grow" + icon_dead = "bungotree-dead" + rarity = 15 + +/obj/item/reagent_containers/food/snacks/grown/bungofruit + seed = /obj/item/seeds/cocoapod/bungotree + name = "bungo fruit" + desc = "A strange fruit, tough leathery skin protects its juicy flesh and large poisonous seed." + icon_state = "bungo" + trash = /obj/item/reagent_containers/food/snacks/grown/bungopit + filling_color = "#E8C22F" + foodtype = FRUIT + tastes = list("bungo" = 2, "tropical fruitiness" = 1) + distill_reagent = null + +/obj/item/reagent_containers/food/snacks/grown/bungopit + seed = /obj/item/seeds/cocoapod/bungotree + name = "bungo pit" + icon_state = "bungopit" + desc = "A large seed, it is said to be potent enough to be able to stop a mans heart." + w_class = WEIGHT_CLASS_TINY + throwforce = 5 + throw_speed = 3 + throw_range = 7 + foodtype = TOXIC + tastes = list("acrid bitterness" = 1) + +/obj/item/reagent_containers/food/snacks/grown/bungopit/Initialize() + . =..() + reagents.clear_reagents() + reagents.add_reagent(/datum/reagent/toxin/bungotoxin, seed.potency * 0.10) //More than this will kill at too low potency + reagents.add_reagent(/datum/reagent/consumable/nutriment, seed.potency * 0.04) + + diff --git a/code/modules/hydroponics/grown/corn.dm b/code/modules/hydroponics/grown/corn.dm index c259baaf2d..0e5b5272ed 100644 --- a/code/modules/hydroponics/grown/corn.dm +++ b/code/modules/hydroponics/grown/corn.dm @@ -40,7 +40,7 @@ throw_range = 7 /obj/item/grown/corncob/attackby(obj/item/grown/W, mob/user, params) - if(W.is_sharp()) + if(W.get_sharpness()) to_chat(user, "You use [W] to fashion a pipe out of the corn cob!") new /obj/item/clothing/mask/cigarette/pipe/cobpipe (user.loc) qdel(src) diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm index af5919969c..80d3f343af 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(/obj/item/seeds/bee_balm) + mutatelist = list(/obj/item/seeds/bee_balm, /obj/item/seeds/poppy/lily/trumpet) /obj/item/reagent_containers/food/snacks/grown/poppy/lily seed = /obj/item/seeds/poppy/lily @@ -47,6 +47,43 @@ tastes = list("pelts " = 1) filling_color = "#FFA500" +/obj/item/seeds/poppy/lily/trumpet + name = "pack of spaceman's trumpet seeds" + desc = "A plant sculped by extensive genetic engineering. The spaceman's trumpet is said to bear no resemblance to its wild ancestors. Inside NT AgriSci circles it is better known as NTPW-0372." + icon_state = "seed-trumpet" + species = "spacemanstrumpet" + plantname = "Spaceman's Trumpet Plant" + product = /obj/item/reagent_containers/food/snacks/grown/trumpet + lifespan = 80 + production = 5 + endurance = 10 + maturation = 12 + yield = 4 + potency = 20 + growthstages = 4 + weed_rate = 2 + weed_chance = 10 + growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi' + icon_grow = "spacemanstrumpet-grow" + icon_dead = "spacemanstrumpet-dead" + mutatelist = list() + genes = list(/datum/plant_gene/reagent/polypyr) + reagents_add = list(/datum/reagent/consumable/nutriment = 0.05) + rarity = 30 + +/obj/item/seeds/poppy/lily/trumpet/Initialize() + ..() + unset_mutability(/datum/plant_gene/reagent/polypyr, PLANT_GENE_EXTRACTABLE) + +/obj/item/reagent_containers/food/snacks/grown/trumpet + seed = /obj/item/seeds/poppy/lily/trumpet + name = "spaceman's trumpet" + desc = "A vivid flower that smells faintly of freshly cut grass. Touching the flower seems to stain the skin some time after contact, yet most other surfaces seem to be unaffected by this phenomenon." + icon_state = "spacemanstrumpet" + filling_color = "#FF6347" + bitesize_mod = 3 + foodtype = VEGETABLES + // Geranium /obj/item/seeds/poppy/geranium name = "pack of geranium seeds" @@ -145,6 +182,7 @@ icon_grow = "moonflower-grow" icon_dead = "sunflower-dead" product = /obj/item/reagent_containers/food/snacks/grown/moonflower + genes = list(/datum/plant_gene/trait/glow/purple) mutatelist = list() reagents_add = list("moonshine" = 0.2, "vitamin" = 0.02, "nutriment" = 0.02) rarity = 15 diff --git a/code/modules/hydroponics/grown/grass_carpet.dm b/code/modules/hydroponics/grown/grass_carpet.dm index 1a1c2ac07f..6401d32768 100644 --- a/code/modules/hydroponics/grown/grass_carpet.dm +++ b/code/modules/hydroponics/grown/grass_carpet.dm @@ -15,7 +15,7 @@ icon_grow = "grass-grow" icon_dead = "grass-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) - mutatelist = list(/obj/item/seeds/grass/carpet) + mutatelist = list(/obj/item/seeds/grass/carpet, /obj/item/seeds/grass/fairy) reagents_add = list("nutriment" = 0.02, "hydrogen" = 0.05) /obj/item/reagent_containers/food/snacks/grown/grass @@ -40,6 +40,27 @@ new stacktype(user.drop_location(), grassAmt) qdel(src) +//Fairygrass +/obj/item/seeds/grass/fairy + name = "pack of fairygrass seeds" + desc = "These seeds grow into a more mystical grass." + icon_state = "seed-fairygrass" + species = "fairygrass" + plantname = "Fairygrass" + product = /obj/item/reagent_containers/food/snacks/grown/grass/fairy + icon_grow = "fairygrass-grow" + icon_dead = "fairygrass-dead" + genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/glow/blue) + reagents_add = list(/datum/reagent/consumable/nutriment = 0.02, /datum/reagent/hydrogen = 0.05, /datum/reagent/drug/space_drugs = 0.15) + +/obj/item/reagent_containers/food/snacks/grown/grass/fairy + seed = /obj/item/seeds/grass/fairy + name = "fairygrass" + desc = "Blue, glowing, and smells fainly of mushrooms." + icon_state = "fairygrassclump" + filling_color = "#3399ff" + stacktype = /obj/item/stack/tile/fairygrass + // Carpet /obj/item/seeds/grass/carpet name = "pack of carpet seeds" diff --git a/code/modules/hydroponics/grown/melon.dm b/code/modules/hydroponics/grown/melon.dm index 87db12d892..e85a36f4b6 100644 --- a/code/modules/hydroponics/grown/melon.dm +++ b/code/modules/hydroponics/grown/melon.dm @@ -44,6 +44,7 @@ species = "holymelon" plantname = "Holy Melon Vines" product = /obj/item/reagent_containers/food/snacks/grown/holymelon + genes = list(/datum/plant_gene/trait/glow/yellow) mutatelist = list() reagents_add = list("holywater" = 0.2, "vitamin" = 0.04, "nutriment" = 0.1) rarity = 20 diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm index 0902052a11..af19e3edaf 100644 --- a/code/modules/hydroponics/grown/misc.dm +++ b/code/modules/hydroponics/grown/misc.dm @@ -15,7 +15,7 @@ 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) + mutatelist = list(/obj/item/seeds/starthistle/corpse_flower, /obj/item/seeds/galaxythistle) /obj/item/seeds/starthistle/harvest(mob/user) var/obj/machinery/hydroponics/parent = loc @@ -29,6 +29,76 @@ parent.update_tray() +// Corpse flower +/obj/item/seeds/starthistle/corpse_flower + name = "pack of corpse flower seeds" + desc = "A species of plant that emits a horrible odor. The odor stops being produced in difficult atmospheric conditions." + icon_state = "seed-corpse-flower" + species = "corpse-flower" + plantname = "Corpse flower" + production = 2 + growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi' + genes = list() + mutatelist = list() + +/obj/item/seeds/starthistle/corpse_flower/pre_attack(obj/machinery/hydroponics/I) + if(istype(I, /obj/machinery/hydroponics)) + if(!I.myseed) + START_PROCESSING(SSobj, src) + return ..() + +/obj/item/seeds/starthistle/corpse_flower/process() + var/obj/machinery/hydroponics/parent = loc + if(parent.age < maturation) // Start a little before it blooms + return + + var/turf/open/T = get_turf(parent) + if(abs(ONE_ATMOSPHERE - T.return_air().return_pressure()) > (potency/10 + 10)) // clouds can begin showing at around 50-60 potency in standard atmos + return + + var/datum/gas_mixture/stank = new + stank.gases[/datum/gas/miasma] = (yield + 6)*7*0.02 // this process is only being called about 2/7 as much as corpses so this is 12-32 times a corpses + stank.temperature = T20C // without this the room would eventually freeze and miasma mining would be easier + T.assume_air(stank) + T.air_update_turf() + +//Galaxy Thistle +/obj/item/seeds/galaxythistle + name = "pack of galaxythistle seeds" + desc = "An impressive species of weed that is thought to have evolved from the simple milk thistle. Contains flavolignans that can help repair a damaged liver." + icon_state = "seed-galaxythistle" + species = "galaxythistle" + plantname = "Galaxythistle" + product = /obj/item/reagent_containers/food/snacks/grown/galaxythistle + lifespan = 70 + endurance = 40 + maturation = 3 + production = 2 + yield = 2 + potency = 25 + growthstages = 3 + growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi' + genes = list(/datum/plant_gene/trait/plant_type/weed_hardy, /datum/plant_gene/trait/invasive) + mutatelist = list() + reagents_add = list(/datum/reagent/consumable/nutriment = 0.05, /datum/reagent/medicine/silibinin = 0.1) + +/obj/item/seeds/galaxythistle/Initialize() + ..() + unset_mutability(/datum/plant_gene/trait/invasive, PLANT_GENE_REMOVABLE) + +/obj/item/reagent_containers/food/snacks/grown/galaxythistle + seed = /obj/item/seeds/galaxythistle + name = "galaxythistle flower head" + desc = "This spiny cluster of florets reminds you of the highlands." + icon_state = "galaxythistle" + filling_color = "#1E7549" + bitesize_mod = 3 + foodtype = VEGETABLES + wine_power = 35 + tastes = list("thistle" = 2, "artichoke" = 1) + + + // Cabbage /obj/item/seeds/cabbage name = "pack of cabbage seeds" diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm index fe2beb896c..e6280f150b 100644 --- a/code/modules/hydroponics/grown/mushrooms.dm +++ b/code/modules/hydroponics/grown/mushrooms.dm @@ -191,6 +191,7 @@ genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism) growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' reagents_add = list("nutriment" = 0.1) + mutatelist = list(/obj/item/seeds/chanterelle/jupitercup) /obj/item/reagent_containers/food/snacks/grown/mushroom/chanterelle seed = /obj/item/seeds/chanter @@ -199,6 +200,34 @@ icon_state = "chanterelle" filling_color = "#FFA500" +//Jupiter Cup +/obj/item/seeds/chanterelle/jupitercup + name = "pack of jupiter cup mycelium" + desc = "This mycelium grows into jupiter cups. Zeus would be envious at the power at your fingertips." + icon_state = "mycelium-jupitercup" + species = "jupitercup" + plantname = "Jupiter Cups" + product = /obj/item/reagent_containers/food/snacks/grown/mushroom/jupitercup + lifespan = 40 + production = 4 + endurance = 8 + yield = 4 + growthstages = 2 + genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism, /datum/plant_gene/reagent/liquidelectricity, /datum/plant_gene/trait/plant_type/carnivory) + growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' + reagents_add = list(/datum/reagent/consumable/nutriment = 0.1) + +/obj/item/seeds/chanterelle/jupitercup/Initialize() + ..() + unset_mutability(/datum/plant_gene/reagent/liquidelectricity, PLANT_GENE_EXTRACTABLE) + unset_mutability(/datum/plant_gene/trait/plant_type/carnivory, PLANT_GENE_REMOVABLE) + +/obj/item/reagent_containers/food/snacks/grown/mushroom/jupitercup + seed = /obj/item/seeds/chanterelle/jupitercup + name = "jupiter cup" + desc = "A strange red mushroom, its surface is moist and slick. You wonder how many tiny worms have met their fate inside." + icon_state = "jupitercup" + filling_color = "#B5003D" // Glowshroom /obj/item/seeds/glowshroom diff --git a/code/modules/hydroponics/grown/potato.dm b/code/modules/hydroponics/grown/potato.dm index 15378b368e..50341dfa3a 100644 --- a/code/modules/hydroponics/grown/potato.dm +++ b/code/modules/hydroponics/grown/potato.dm @@ -38,7 +38,7 @@ /obj/item/reagent_containers/food/snacks/grown/potato/attackby(obj/item/W, mob/user, params) - if(W.is_sharp()) + if(W.get_sharpness()) to_chat(user, "You cut the potato into wedges with [W].") var/obj/item/reagent_containers/food/snacks/grown/potato/wedges/Wedges = new /obj/item/reagent_containers/food/snacks/grown/potato/wedges remove_item_from_storage(user) diff --git a/code/modules/hydroponics/grown/pumpkin.dm b/code/modules/hydroponics/grown/pumpkin.dm index 644dedff3d..02bc776b78 100644 --- a/code/modules/hydroponics/grown/pumpkin.dm +++ b/code/modules/hydroponics/grown/pumpkin.dm @@ -28,7 +28,7 @@ wine_power = 20 /obj/item/reagent_containers/food/snacks/grown/pumpkin/attackby(obj/item/W as obj, mob/user as mob, params) - if(W.is_sharp()) + if(W.get_sharpness()) user.show_message("You carve a face into [src]!", 1) new /obj/item/clothing/head/hardhat/pumpkinhead(user.loc) qdel(src) diff --git a/code/modules/hydroponics/grown/root.dm b/code/modules/hydroponics/grown/root.dm index 090809ca88..e28043e4b1 100644 --- a/code/modules/hydroponics/grown/root.dm +++ b/code/modules/hydroponics/grown/root.dm @@ -26,7 +26,7 @@ wine_power = 30 /obj/item/reagent_containers/food/snacks/grown/carrot/attackby(obj/item/I, mob/user, params) - if(I.is_sharp()) + if(I.get_sharpness()) to_chat(user, "You sharpen the carrot into a shiv with [I].") var/obj/item/kitchen/knife/carrotshiv/Shiv = new /obj/item/kitchen/knife/carrotshiv remove_item_from_storage(user) diff --git a/code/modules/hydroponics/grown/tea_coffee.dm b/code/modules/hydroponics/grown/tea_coffee.dm index 06cbb1df0c..bdb5bdb3f9 100644 --- a/code/modules/hydroponics/grown/tea_coffee.dm +++ b/code/modules/hydroponics/grown/tea_coffee.dm @@ -51,7 +51,6 @@ desc = "Long stocks with flowering tips that has a chemical to make feline attracted to it." species = "catnip" plantname = "Catnip Plant" - growthstages = 3 product = /obj/item/reagent_containers/food/snacks/grown/tea/catnip reagents_add = list("catnip" = 0.1, "vitamin" = 0.06, "teapowder" = 0.3) rarity = 50 @@ -59,7 +58,7 @@ /obj/item/reagent_containers/food/snacks/grown/tea/catnip seed = /obj/item/seeds/tea/catnip name = "Catnip buds" - icon_state = "catnip_leaves" + icon_state = "catnip" filling_color = "#4582B4" grind_results = list("catnp" = 2, "water" = 1) diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index 23f178edc9..9a660ac282 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -120,7 +120,7 @@ /obj/structure/bonfire/prelit/Initialize() . = ..() StartBurning() - + /obj/structure/bonfire/CanPass(atom/movable/mover, turf/target) if(istype(mover) && (mover.pass_flags & PASSTABLE)) return TRUE @@ -148,7 +148,7 @@ add_overlay("bonfire_grill") else return ..() - if(W.is_hot()) + if(W.get_temperature()) StartBurning() if(grill) if(user.a_intent != INTENT_HARM && !(W.item_flags & ABSTRACT)) diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm index c0e3beaf79..19049c8e6c 100644 --- a/code/modules/hydroponics/growninedible.dm +++ b/code/modules/hydroponics/growninedible.dm @@ -54,7 +54,7 @@ for(var/datum/plant_gene/trait/T in seed.genes) T.on_throw_impact(src, hit_atom) -/obj/item/grown/microwave_act(obj/machine/microwave/M) +/obj/item/grown/microwave_act(obj/machinery/microwave/M) return /obj/item/grown/on_grind() diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index f464fccf91..f45b6bc517 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -169,8 +169,27 @@ //Pests & Weeds////////////////////////////////////////////////////////// - else if(pestlevel >= 5) - adjustHealth(-1 / rating) + if(pestlevel >= 8) + if(!myseed.get_gene(/datum/plant_gene/trait/plant_type/carnivory)) + adjustHealth(-2 / rating) + + else + adjustHealth(2 / rating) + adjustPests(-1 / rating) + + else if(pestlevel >= 4) + if(!myseed.get_gene(/datum/plant_gene/trait/plant_type/carnivory)) + adjustHealth(-1 / rating) + + else + adjustHealth(1 / rating) + if(prob(50)) + adjustPests(-1 / rating) + + else if(pestlevel < 4 && myseed.get_gene(/datum/plant_gene/trait/plant_type/carnivory)) + adjustHealth(-2 / rating) + if(prob(5)) + adjustPests(-1 / rating) // If it's a weed, it doesn't stunt the growth if(weedlevel >= 5 && !myseed.get_gene(/datum/plant_gene/trait/plant_type/weed_hardy)) @@ -210,6 +229,12 @@ needs_update = 1 if (needs_update) update_icon() + + if(myseed && prob(5 * (11-myseed.production))) + for(var/g in myseed.genes) + if(istype(g, /datum/plant_gene/trait)) + var/datum/plant_gene/trait/selectedtrait = g + selectedtrait.on_grow(src) return /obj/machinery/hydroponics/proc/nutrimentMutation() @@ -294,32 +319,31 @@ /obj/machinery/hydroponics/examine(user) - ..() + . = ..() if(myseed) - to_chat(user, "It has [myseed.plantname] planted.") + . += "It has [myseed.plantname] planted." if (dead) - to_chat(user, "It's dead!") + . += "It's dead!" else if (harvest) - to_chat(user, "It's ready to harvest.") + . += "It's ready to harvest." else if (plant_health <= (myseed.endurance / 2)) - to_chat(user, "It looks unhealthy.") + . += "It looks unhealthy." else - to_chat(user, "It's empty.") + . += "It's empty." if(!self_sustaining) - to_chat(user, "Water: [waterlevel]/[maxwater].") - to_chat(user, "Nutrient: [nutrilevel]/[maxnutri].") + . += "Water: [waterlevel]/[maxwater]." + . += "Nutrient: [nutrilevel]/[maxnutri]." if(self_sufficiency_progress > 0) var/percent_progress = round(self_sufficiency_progress * 100 / self_sufficiency_req) - to_chat(user, "Treatment for self-sustenance are [percent_progress]% complete.") + . += "Treatment for self-sustenance are [percent_progress]% complete." else - to_chat(user, "It doesn't require any water or nutrients.") + . += "It doesn't require any water or nutrients." if(weedlevel >= 5) - to_chat(user, "It's filled with weeds!") + . += "It's filled with weeds!" if(pestlevel >= 5) - to_chat(user, "It's filled with tiny worms!") - to_chat(user, "" ) + . += "It's filled with tiny worms!" /obj/machinery/hydroponics/proc/weedinvasion() // If a weed growth is sufficient, this happens. diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index db529e8ffb..5b65cb1b5f 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -1,8 +1,18 @@ /datum/plant_gene var/name + var/mutability_flags = PLANT_GENE_EXTRACTABLE | PLANT_GENE_REMOVABLE ///These flags tells the genemodder if we want the gene to be extractable, only removable or neither. /datum/plant_gene/proc/get_name() // Used for manipulator display and gene disk name. - return name + var/formatted_name + if(!(mutability_flags & PLANT_GENE_REMOVABLE && mutability_flags & PLANT_GENE_EXTRACTABLE)) + if(mutability_flags & PLANT_GENE_REMOVABLE) + formatted_name += "Fragile " + else if(mutability_flags & PLANT_GENE_EXTRACTABLE) + formatted_name += "Essential " + else + formatted_name += "Immutable " + formatted_name += name + return formatted_name /datum/plant_gene/proc/can_add(obj/item/seeds/S) return !istype(S, /obj/item/seeds/sample) // Samples can't accept new genes @@ -101,7 +111,18 @@ var/rate = 0.04 /datum/plant_gene/reagent/get_name() - return "[name] production [rate*100]%" + var/formatted_name + if(!(mutability_flags & PLANT_GENE_REMOVABLE && mutability_flags & PLANT_GENE_EXTRACTABLE)) + if(mutability_flags & PLANT_GENE_REMOVABLE) + formatted_name += "Fragile " + else if(mutability_flags & PLANT_GENE_EXTRACTABLE) + formatted_name += "Essential " + else + formatted_name += "Immutable " + formatted_name += "[name] production [rate*100]%" + return formatted_name + + /datum/plant_gene/reagent/proc/set_reagent(reag_id) reagent_id = reag_id @@ -132,6 +153,15 @@ return FALSE return TRUE +/datum/plant_gene/reagent/polypyr + name = "Polypyrylium Oligomers" + reagent_id = /datum/reagent/medicine/polypyr + rate = 0.15 + +/datum/plant_gene/reagent/liquidelectricity + name = "Liquid Electricity" + reagent_id = /datum/reagent/consumable/liquidelectricity + rate = 0.1 // Various traits affecting the product. Each must be somehow useful. /datum/plant_gene/trait @@ -173,6 +203,10 @@ /datum/plant_gene/trait/proc/on_throw_impact(obj/item/reagent_containers/food/snacks/grown/G, atom/target) return +///This proc triggers when the tray processes and a roll is sucessful, the success chance scales with production. +/datum/plant_gene/trait/proc/on_grow(obj/machinery/hydroponics/H) + return + /datum/plant_gene/trait/squash // Allows the plant to be squashed when thrown or slipped on, leaving a colored mess and trash type item behind. // Also splashes everything in target turf with reagents and applies other trait effects (teleporting, etc) to the target by on_squash. @@ -261,22 +295,44 @@ /datum/plant_gene/trait/glow/shadow //makes plant emit slightly purple shadows - //adds -potency*(rate*0.2) light power to products name = "Shadow Emission" rate = 0.04 glow_color = "#AAD84B" -/datum/plant_gene/trait/glow/shadow/glow_power(obj/item/seeds/S) - return -max(S.potency*(rate*0.2), 0.2) +datum/plant_gene/trait/glow/white + name = "White Bioluminescence" + glow_color = "#FFFFFF" /datum/plant_gene/trait/glow/red - name = "Red Electrical Glow" - glow_color = LIGHT_COLOR_RED + //Colored versions of bioluminescence. + name = "Red Bioluminescence" + glow_color = "#FF3333" + +/datum/plant_gene/trait/glow/yellow + //not the disgusting glowshroom yellow hopefully + name = "Yellow Bioluminescence" + glow_color = "#FFFF66" + +/datum/plant_gene/trait/glow/green + //oh no, now i'm radioactive + name = "Green Bioluminescence" + glow_color = "#99FF99" + +/datum/plant_gene/trait/glow/blue + //the best one + name = "Blue Bioluminescence" + glow_color = "#6699FF" + +/datum/plant_gene/trait/glow/purple + //did you know that notepad++ doesnt think bioluminescence is a word + name = "Purple Bioluminescence" + glow_color = "#D966FF" + +/datum/plant_gene/trait/glow/pink + //gay tide station pride + name = "Pink Bioluminescence" + glow_color = "#FFB3DA" -/datum/plant_gene/trait/glow/berry - name = "Strong Bioluminescence" - rate = 0.05 - glow_color = null /datum/plant_gene/trait/teleport @@ -400,6 +456,30 @@ if(!(G.resistance_flags & FIRE_PROOF)) G.resistance_flags |= FIRE_PROOF +//Invasive spreading lets the plant jump to other trays, the spreadinhg plant won't replace plants of the same type. +/datum/plant_gene/trait/invasive + name = "Invasive Spreading" + +/datum/plant_gene/trait/invasive/on_grow(obj/machinery/hydroponics/H) + for(var/step_dir in GLOB.alldirs) + var/obj/machinery/hydroponics/HY = locate() in get_step(H, step_dir) + if(HY && prob(15)) + if(HY.myseed) // check if there is something in the tray. + if(HY.myseed.type == H.myseed.type && HY.dead != 0) + continue //It should not destroy its owm kind. + qdel(HY.myseed) + HY.myseed = null + HY.myseed = H.myseed.Copy() + HY.age = 0 + HY.dead = 0 + HY.plant_health = HY.myseed.endurance + HY.lastcycle = world.time + HY.harvest = 0 + HY.weedlevel = 0 // Reset + HY.pestlevel = 0 // Reset + HY.update_icon() + HY.visible_message("The [H.myseed.plantname] spreads!") + /datum/plant_gene/trait/plant_type // Parent type name = "you shouldn't see this" trait_id = "plant_type" @@ -412,3 +492,7 @@ /datum/plant_gene/trait/plant_type/alien_properties name ="?????" + +/datum/plant_gene/trait/plant_type/carnivory + name = "Obligate Carnivory" + diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 2a28b7b097..16863b0aa4 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -67,6 +67,7 @@ for(var/reag_id in reagents_add) genes += new /datum/plant_gene/reagent(reag_id, reagents_add[reag_id]) + reagents_from_genes() //quality coding /obj/item/seeds/proc/Copy() var/obj/item/seeds/S = new type(null, 1) @@ -94,6 +95,18 @@ for(var/datum/plant_gene/reagent/R in genes) reagents_add[R.reagent_id] = R.rate +///This proc adds a mutability_flag to a gene +/obj/item/seeds/proc/set_mutability(typepath, mutability) + var/datum/plant_gene/g = get_gene(typepath) + if(g) + g.mutability_flags |= mutability + +///This proc removes a mutability_flag from a gene +/obj/item/seeds/proc/unset_mutability(typepath, mutability) + var/datum/plant_gene/g = get_gene(typepath) + if(g) + g.mutability_flags &= ~mutability + /obj/item/seeds/proc/mutate(lifemut = 2, endmut = 5, productmut = 1, yieldmut = 2, potmut = 25, wrmut = 2, wcmut = 5, traitmut = 0) adjust_lifespan(rand(-lifemut,lifemut)) adjust_endurance(rand(-endmut,endmut)) diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index 3862967363..93ddedebc0 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -65,21 +65,21 @@ src.max_complexity = round(max_complexity) /obj/item/electronic_assembly/GenerateTag() - tag = "assembly_[next_assembly_id++]" + tag = "assembly_[next_assembly_id++]" /obj/item/electronic_assembly/examine(mob/user) . = ..() if(can_anchor) - to_chat(user, "The anchoring bolts [anchored ? "are" : "can be"] wrenched in place and the maintenance panel [opened ? "can be" : "is"] screwed in place.") + . += "The anchoring bolts [anchored ? "are" : "can be"] wrenched in place and the maintenance panel [opened ? "can be" : "is"] screwed in place." else - to_chat(user, "The maintenance panel [opened ? "can be" : "is"] screwed in place.") + . += "The maintenance panel [opened ? "can be" : "is"] screwed in place." if((isobserver(user) && ckeys_allowed_to_scan[user.ckey]) || IsAdminGhost(user)) - to_chat(user, "You can scan this circuit.") + . += "You can scan this circuit." for(var/I in assembly_components) var/obj/item/integrated_circuit/IC = I - IC.external_examine(user) + . += IC.external_examine(user) if(opened) interact(user) @@ -616,7 +616,7 @@ ..() /obj/item/electronic_assembly/default //The /default electronic_assemblys are to allow the introduction of the new naming scheme without breaking old saves. - name = "type-a electronic assembly" + name = "type-a electronic assembly" /obj/item/electronic_assembly/calc name = "type-b electronic assembly" diff --git a/code/modules/integrated_electronics/core/integrated_circuit.dm b/code/modules/integrated_electronics/core/integrated_circuit.dm index 60b2d0486e..cec3e2348e 100644 --- a/code/modules/integrated_electronics/core/integrated_circuit.dm +++ b/code/modules/integrated_electronics/core/integrated_circuit.dm @@ -26,8 +26,8 @@ var/displayed_name = "" var/demands_object_input = FALSE var/can_input_object_when_closed = FALSE - - + + /* Integrated circuits are essentially modular machines. Each circuit has a specific function, and combining them inside Electronic Assemblies allows a creative player the means to solve many problems. Circuits are held inside an electronic assembly, and are wired using special tools. @@ -35,8 +35,8 @@ a creative player the means to solve many problems. Circuits are held inside an /obj/item/integrated_circuit/examine(mob/user) interact(user) - external_examine(user) . = ..() + . += external_examine(user) // Can be called via electronic_assembly/attackby() /obj/item/integrated_circuit/proc/additem(var/obj/item/I, var/mob/living/user) @@ -62,7 +62,7 @@ a creative player the means to solve many problems. Circuits are held inside an // This should be used when someone is examining from an 'outside' perspective, e.g. reading a screen or LED. /obj/item/integrated_circuit/proc/external_examine(mob/user) - any_examine(user) + return any_examine(user) /obj/item/integrated_circuit/proc/any_examine(mob/user) return diff --git a/code/modules/integrated_electronics/core/special_pins/list_pin.dm b/code/modules/integrated_electronics/core/special_pins/list_pin.dm index 9e4731ac36..3532d68d70 100644 --- a/code/modules/integrated_electronics/core/special_pins/list_pin.dm +++ b/code/modules/integrated_electronics/core/special_pins/list_pin.dm @@ -7,7 +7,6 @@ interact(user) /datum/integrated_io/lists/proc/interact(mob/user) - . = ..() var/list/my_list = data var/t = "

    [src]


    " t += "List length: [my_list.len]
    " diff --git a/code/modules/integrated_electronics/passive/power.dm b/code/modules/integrated_electronics/passive/power.dm index d4899a4621..40ed235863 100644 --- a/code/modules/integrated_electronics/passive/power.dm +++ b/code/modules/integrated_electronics/passive/power.dm @@ -76,7 +76,7 @@ desc = "A seemingly enigmatic device which connects to nearby APCs wirelessly and draws power from them, now in industrial size!" w_class = WEIGHT_CLASS_BULKY extended_desc = "The siphon drains 2 kW of power from an APC in the same room as it as long as it has charge remaining. It will always drain \ - from the 'equipment' power channel." + from the 'equipment' power channel." icon_state = "power_relay" complexity = 15 spawn_flags = IC_SPAWN_RESEARCH diff --git a/code/modules/integrated_electronics/subtypes/atmospherics.dm b/code/modules/integrated_electronics/subtypes/atmospherics.dm index 230d1ce154..aed99fac24 100644 --- a/code/modules/integrated_electronics/subtypes/atmospherics.dm +++ b/code/modules/integrated_electronics/subtypes/atmospherics.dm @@ -2,7 +2,6 @@ #define TARGET_TO_SOURCE 1 #define PUMP_EFFICIENCY 0.6 #define TANK_FAILURE_PRESSURE (ONE_ATMOSPHERE*25) -#define PUMP_MAX_PRESSURE (ONE_ATMOSPHERE*24) #define PUMP_MAX_VOLUME 100 diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm index 81961c2d9c..fb00897eec 100644 --- a/code/modules/integrated_electronics/subtypes/manipulation.dm +++ b/code/modules/integrated_electronics/subtypes/manipulation.dm @@ -339,7 +339,7 @@ assembly.visible_message("[assembly] has thrown [A]!") log_attack("[assembly] [REF(assembly)] has thrown [A] with non-lethal force.") A.forceMove(drop_location()) - A.throw_at(locate(x_abs, y_abs, T.z), range, 3, , , , CALLBACK(src, .proc/post_throw, A)) + A.throw_at(locate(x_abs, y_abs, T.z), range, 3, null, null, null, CALLBACK(src, .proc/post_throw, A)) // If the item came from a grabber now we can update the outputs since we've thrown it. if(istype(G)) diff --git a/code/modules/integrated_electronics/subtypes/memory.dm b/code/modules/integrated_electronics/subtypes/memory.dm index 93d800807a..34c36883d1 100644 --- a/code/modules/integrated_electronics/subtypes/memory.dm +++ b/code/modules/integrated_electronics/subtypes/memory.dm @@ -19,7 +19,7 @@ . = ..() /obj/item/integrated_circuit/memory/examine(mob/user) - ..() + . = ..() var/i for(i = 1, i <= outputs.len, i++) var/datum/integrated_io/O = outputs[i] @@ -30,7 +30,7 @@ data = "[d]" else if(!isnull(O.data)) data = O.data - to_chat(user, "\The [src] has [data] saved to address [i].") + . += "\The [src] has [data] saved to address [i]." /obj/item/integrated_circuit/memory/do_work() for(var/i = 1 to inputs.len) diff --git a/code/modules/integrated_electronics/subtypes/output.dm b/code/modules/integrated_electronics/subtypes/output.dm index 3975da18b6..6005709dde 100644 --- a/code/modules/integrated_electronics/subtypes/output.dm +++ b/code/modules/integrated_electronics/subtypes/output.dm @@ -23,7 +23,7 @@ if(displayed_name && displayed_name != name) shown_label = " labeled '[displayed_name]'" - to_chat(user, "There is \a [src][shown_label], which displays [!isnull(stuff_to_display) ? "'[stuff_to_display]'" : "nothing"].") + return "There is \a [src][shown_label], which displays [!isnull(stuff_to_display) ? "'[stuff_to_display]'" : "nothing"]." /obj/item/integrated_circuit/output/screen/do_work() var/datum/integrated_io/I = inputs[1] @@ -345,14 +345,13 @@ set_pin_data(IC_INPUT, 1, FALSE) /obj/item/integrated_circuit/output/led/external_examine(mob/user) - var/text_output = "There is " + . = "There is " if(name == displayed_name) - text_output += "\an [name]" + . += "\an [name]" else - text_output += "\an ["\improper[name]"] labeled '[displayed_name]'" - text_output += " which is currently [get_pin_data(IC_INPUT, 1) ? "lit *" : "unlit"]." - to_chat(user, text_output) + . += "\an ["\improper[name]"] labeled '[displayed_name]'" + . += " which is currently [get_pin_data(IC_INPUT, 1) ? "lit *" : "unlit"]." /obj/item/integrated_circuit/output/diagnostic_hud name = "AR interface" diff --git a/code/modules/integrated_electronics/subtypes/smart.dm b/code/modules/integrated_electronics/subtypes/smart.dm index 1959fb55c7..d4c565c49a 100644 --- a/code/modules/integrated_electronics/subtypes/smart.dm +++ b/code/modules/integrated_electronics/subtypes/smart.dm @@ -199,7 +199,6 @@ set_pin_data(IC_OUTPUT, 1, WEAKREF(null)) if(installed_brain.brainmob) installed_brain.brainmob.remote_control = null - ..() //Brain changes @@ -238,7 +237,7 @@ brainholder.do_work(6) -/mob/living/brain/canUseTopic() +/mob/living/brain/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE) return check_bot_self /obj/item/integrated_circuit/smart/advanced_pathfinder/proc/hippie_xor_decrypt() @@ -329,7 +328,6 @@ installed_pai.forceMove(drop_location()) set_pin_data(IC_OUTPUT, 1, WEAKREF(null)) installed_pai.pai.remote_control = null - ..() //pAI changes @@ -371,5 +369,5 @@ paiholder.do_work(6) -/mob/living/silicon/pai/canUseTopic() - return check_bot_self \ No newline at end of file +/mob/living/silicon/pai/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE) + return check_bot_self diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm index 2119baf1a5..81f47b9a1e 100644 --- a/code/modules/jobs/access.dm +++ b/code/modules/jobs/access.dm @@ -35,6 +35,12 @@ /obj/item/proc/GetID() return null +/obj/item/proc/RemoveID() + return null + +/obj/item/proc/InsertID() + return FALSE + /obj/proc/text2access(access_text) . = list() if(!access_text) @@ -122,16 +128,16 @@ /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) + 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) diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index a52b8589c3..507c8a5026 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -101,8 +101,9 @@ //Equip the rest of the gear H.dna.species.before_equip_job(src, H, visualsOnly) - if(outfit_override || outfit) - H.equipOutfit(outfit_override ? outfit_override : outfit, visualsOnly) + var/datum/outfit/job/O = outfit_override || outfit + if(O) + H.equipOutfit(O, visualsOnly, preference_source) //mob doesn't have a client yet. H.dna.species.after_equip_job(src, H, visualsOnly) @@ -177,8 +178,8 @@ var/pda_slot = SLOT_BELT -/datum/outfit/job/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - switch(H.backbag) +/datum/outfit/job/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) + switch(preference_source?.prefs.backbag) if(GBACKPACK) back = /obj/item/storage/backpack //Grey backpack if(GSATCHEL) @@ -196,7 +197,7 @@ //converts the uniform string into the path we'll wear, whether it's the skirt or regular variant var/holder - if(H.jumpsuit_style == PREF_SKIRT) + if(preference_source && preference_source.prefs.jumpsuit_style == PREF_SKIRT) holder = "[uniform]/skirt" if(!text2path(holder)) holder = "[uniform]" @@ -204,7 +205,7 @@ holder = "[uniform]" uniform = text2path(holder) -/datum/outfit/job/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/job/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) if(visualsOnly) return @@ -232,6 +233,8 @@ PDA.owner = H.real_name PDA.ownjob = J.title PDA.update_label() + if(preference_source && !PDA.equipped) //PDA's screen color, font style and look depend on client preferences. + PDA.update_style(preference_source) /datum/outfit/job/get_chameleon_disguise_info() var/list/types = ..() diff --git a/code/modules/jobs/job_types/assistant.dm b/code/modules/jobs/job_types/assistant.dm index da8c2aa3b9..ce2dce9053 100644 --- a/code/modules/jobs/job_types/assistant.dm +++ b/code/modules/jobs/job_types/assistant.dm @@ -28,15 +28,16 @@ Assistant name = "Assistant" jobtype = /datum/job/assistant -/datum/outfit/job/assistant/pre_equip(mob/living/carbon/human/H) +/datum/outfit/job/assistant/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) ..() + var/suited = !preference_source || preference_source.prefs.jumpsuit_style == PREF_SUIT if (CONFIG_GET(flag/grey_assistants)) - if(H.jumpsuit_style == PREF_SUIT) + if(suited) uniform = /obj/item/clothing/under/color/grey else uniform = /obj/item/clothing/under/skirt/color/grey else - if(H.jumpsuit_style == PREF_SUIT) + if(suited) uniform = /obj/item/clothing/under/color/random else uniform = /obj/item/clothing/under/skirt/color/random diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index f6505a4e2a..0aa1f2f05f 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -19,13 +19,13 @@ outfit = /datum/outfit/job/ce access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, - ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EVA, - ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS, ACCESS_MINISAT, - ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM) + ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EVA, + ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS, ACCESS_MINISAT, + ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, - ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EVA, - ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS, ACCESS_MINISAT, - ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM) + ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EVA, + ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS, ACCESS_MINISAT, + ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM) display_order = JOB_DISPLAY_ORDER_CHIEF_ENGINEER blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/paraplegic, /datum/quirk/insanity) diff --git a/code/modules/jobs/job_types/clown.dm b/code/modules/jobs/job_types/clown.dm index d8b88ae871..922b335a39 100644 --- a/code/modules/jobs/job_types/clown.dm +++ b/code/modules/jobs/job_types/clown.dm @@ -16,11 +16,6 @@ display_order = JOB_DISPLAY_ORDER_CLOWN - -/datum/job/clown/after_spawn(mob/living/carbon/human/H, mob/M) - . = ..() - H.apply_pref_name("clown", M.client) - /datum/outfit/job/clown name = "Clown" jobtype = /datum/job/clown @@ -48,11 +43,15 @@ chameleon_extras = /obj/item/stamp/clown -/datum/outfit/job/clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/job/clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) ..() if(visualsOnly) return - H.fully_replace_character_name(H.real_name, pick(GLOB.clown_names)) //rename the mob AFTER they're equipped so their ID gets updated properly. + var/client/C = H.client || preference_source + if(C) + H.apply_pref_name("clown", C) //rename the mob AFTER they're equipped so their ID gets updated properly. + else + H.fully_replace_character_name(H.real_name, pick(GLOB.clown_names)) H.dna.add_mutation(CLOWNMUT) H.dna.add_mutation(SMILE) diff --git a/code/modules/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm index c213d4dffc..b5def54061 100644 --- a/code/modules/jobs/job_types/cook.dm +++ b/code/modules/jobs/job_types/cook.dm @@ -29,7 +29,7 @@ mask = /obj/item/clothing/mask/fakemoustache/italian backpack_contents = list(/obj/item/sharpener = 1) -/datum/outfit/job/cook/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/job/cook/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) ..() var/datum/job/cook/J = SSjob.GetJobType(jobtype) if(J) // Fix for runtime caused by invalid job being passed @@ -39,7 +39,7 @@ if(!visualsOnly) J.cooks++ -/datum/outfit/job/cook/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/job/cook/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) ..() if(visualsOnly) return diff --git a/code/modules/jobs/job_types/curator.dm b/code/modules/jobs/job_types/curator.dm index 35fa8483d5..0c762637ac 100644 --- a/code/modules/jobs/job_types/curator.dm +++ b/code/modules/jobs/job_types/curator.dm @@ -34,7 +34,7 @@ /obj/item/barcodescanner = 1 ) -/datum/outfit/job/curator/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/job/curator/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) ..() if(visualsOnly) diff --git a/code/modules/jobs/job_types/detective.dm b/code/modules/jobs/job_types/detective.dm index 27a54fbd1f..13cb5e01e3 100644 --- a/code/modules/jobs/job_types/detective.dm +++ b/code/modules/jobs/job_types/detective.dm @@ -46,7 +46,7 @@ chameleon_extras = list(/obj/item/gun/ballistic/revolver/detective, /obj/item/clothing/glasses/sunglasses) -/datum/outfit/job/detective/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/job/detective/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) ..() var/obj/item/clothing/mask/cigarette/cig = H.wear_mask if(istype(cig)) //Some species specfic changes can mess this up (plasmamen) diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm index 2b757872d9..86b9cafa25 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -19,17 +19,17 @@ outfit = /datum/outfit/job/hop 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_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) + 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_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_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) + 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_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) display_order = JOB_DISPLAY_ORDER_HEAD_OF_PERSONNEL diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index c190d88bc7..e20315a1ca 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -20,13 +20,13 @@ mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) 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) + 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, 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) + 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) display_order = JOB_DISPLAY_ORDER_HEAD_OF_SECURITY blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/insanity) diff --git a/code/modules/jobs/job_types/janitor.dm b/code/modules/jobs/job_types/janitor.dm index d0a06ca0e0..e42da10362 100644 --- a/code/modules/jobs/job_types/janitor.dm +++ b/code/modules/jobs/job_types/janitor.dm @@ -8,7 +8,6 @@ spawn_positions = 1 supervisors = "the head of personnel" selection_color = "#bbe291" - var/global/janitors = 0 outfit = /datum/outfit/job/janitor diff --git a/code/modules/jobs/job_types/lawyer.dm b/code/modules/jobs/job_types/lawyer.dm index 0b8be52116..654af6a05d 100644 --- a/code/modules/jobs/job_types/lawyer.dm +++ b/code/modules/jobs/job_types/lawyer.dm @@ -35,7 +35,7 @@ chameleon_extras = /obj/item/stamp/law -/datum/outfit/job/lawyer/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/job/lawyer/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) ..() if(visualsOnly) return diff --git a/code/modules/jobs/job_types/mime.dm b/code/modules/jobs/job_types/mime.dm index 1347da7125..4e6e982fb9 100644 --- a/code/modules/jobs/job_types/mime.dm +++ b/code/modules/jobs/job_types/mime.dm @@ -36,7 +36,7 @@ satchel = /obj/item/storage/backpack/mime -/datum/outfit/job/mime/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/job/mime/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) ..() if(visualsOnly) @@ -47,3 +47,9 @@ H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mime/speak(null)) H.mind.miming = 1 + var/client/C = H.client || preference_source + if(C) + H.apply_pref_name("mime", C) + else + H.fully_replace_character_name(H.real_name, pick(GLOB.mime_names)) + diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm index a90c5cea6c..ebf3b3eb40 100644 --- a/code/modules/jobs/job_types/research_director.dm +++ b/code/modules/jobs/job_types/research_director.dm @@ -19,15 +19,15 @@ outfit = /datum/outfit/job/rd access = list(ACCESS_RD, ACCESS_HEADS, ACCESS_TOX, ACCESS_GENETICS, ACCESS_MORGUE, - ACCESS_TOX_STORAGE, ACCESS_TELEPORTER, ACCESS_SEC_DOORS, - ACCESS_RESEARCH, ACCESS_ROBOTICS, ACCESS_XENOBIOLOGY, ACCESS_AI_UPLOAD, - ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, - ACCESS_TECH_STORAGE, ACCESS_MINISAT, ACCESS_MAINT_TUNNELS, ACCESS_NETWORK) + ACCESS_TOX_STORAGE, ACCESS_TELEPORTER, ACCESS_SEC_DOORS, + ACCESS_RESEARCH, ACCESS_ROBOTICS, ACCESS_XENOBIOLOGY, ACCESS_AI_UPLOAD, + ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, + ACCESS_TECH_STORAGE, ACCESS_MINISAT, ACCESS_MAINT_TUNNELS, ACCESS_NETWORK) minimal_access = list(ACCESS_RD, ACCESS_HEADS, ACCESS_TOX, ACCESS_GENETICS, ACCESS_MORGUE, - ACCESS_TOX_STORAGE, ACCESS_TELEPORTER, ACCESS_SEC_DOORS, - ACCESS_RESEARCH, ACCESS_ROBOTICS, ACCESS_XENOBIOLOGY, ACCESS_AI_UPLOAD, - ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, - ACCESS_TECH_STORAGE, ACCESS_MINISAT, ACCESS_MAINT_TUNNELS, ACCESS_NETWORK) + ACCESS_TOX_STORAGE, ACCESS_TELEPORTER, ACCESS_SEC_DOORS, + ACCESS_RESEARCH, ACCESS_ROBOTICS, ACCESS_XENOBIOLOGY, ACCESS_AI_UPLOAD, + ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, + ACCESS_TECH_STORAGE, ACCESS_MINISAT, ACCESS_MAINT_TUNNELS, ACCESS_NETWORK) display_order = JOB_DISPLAY_ORDER_RESEARCH_DIRECTOR blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index 771fc02862..915e9d1cea 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -64,7 +64,7 @@ /obj/item/gun/energy/kinetic_accelerator=1,\ /obj/item/stack/marker_beacon/ten=1) -/datum/outfit/job/miner/equipped/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/job/miner/equipped/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) ..() if(visualsOnly) return diff --git a/code/modules/keybindings/bindings_carbon.dm b/code/modules/keybindings/bindings_carbon.dm index d17f10e963..a982273c86 100644 --- a/code/modules/keybindings/bindings_carbon.dm +++ b/code/modules/keybindings/bindings_carbon.dm @@ -15,4 +15,7 @@ if("4") a_intent_change("harm") return + if("C") + toggle_combat_mode() + return return ..() \ No newline at end of file diff --git a/code/modules/keybindings/bindings_human.dm b/code/modules/keybindings/bindings_human.dm index 5d02d9aedb..a9eafacef6 100644 --- a/code/modules/keybindings/bindings_human.dm +++ b/code/modules/keybindings/bindings_human.dm @@ -56,4 +56,15 @@ return stored.attack_hand(src) // take out thing from backpack return - return ..() \ No newline at end of file + switch(_key) + if("Shift") + sprint_hotkey(TRUE) + return + return ..() + +/mob/living/carbon/human/key_up(_key, client/user) + switch(_key) + if("Shift") + sprint_hotkey(FALSE) + return + return ..() diff --git a/code/modules/keybindings/bindings_robot.dm b/code/modules/keybindings/bindings_robot.dm index 2354f33c9e..29fb36fa65 100644 --- a/code/modules/keybindings/bindings_robot.dm +++ b/code/modules/keybindings/bindings_robot.dm @@ -9,4 +9,14 @@ if("Q") uneq_active() return - return ..() \ No newline at end of file + if("Shift") + sprint_hotkey(TRUE) + return + return ..() + +/mob/living/silicon/robot/key_up(_key, client/user) + switch(_key) + if("Shift") + sprint_hotkey(FALSE) + return + return ..() diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 7dc4fd17b9..06a988d109 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -25,18 +25,18 @@ var/list/allowed_books = list(/obj/item/book, /obj/item/spellbook, /obj/item/storage/book) //Things allowed in the bookcase /obj/structure/bookcase/examine(mob/user) - ..() + . = ..() if(!anchored) - to_chat(user, "The bolts on the bottom are unsecured.") + . += "The bolts on the bottom are unsecured." if(anchored) - to_chat(user, "It's secured in place with bolts.") + . += "It's secured in place with bolts." switch(state) if(0) - to_chat(user, "There's a small crack visible on the back panel.") + . += "There's a small crack visible on the back panel." if(1) - to_chat(user, "There's space inside for a wooden shelf.") + . += "There's space inside for a wooden shelf." if(2) - to_chat(user, "There's a small crack visible on the shelf.") + . += "There's a small crack visible on the shelf." /obj/structure/bookcase/Initialize(mapload) . = ..() diff --git a/code/modules/library/soapstone.dm b/code/modules/library/soapstone.dm index 88d1248a28..295fc816e2 100644 --- a/code/modules/library/soapstone.dm +++ b/code/modules/library/soapstone.dm @@ -16,7 +16,7 @@ /obj/item/soapstone/examine(mob/user) . = ..() if(remaining_uses != -1) - to_chat(user, "It has [remaining_uses] uses left.") + . += "It has [remaining_uses] uses left." /obj/item/soapstone/afterattack(atom/target, mob/user, proximity) . = ..() @@ -193,7 +193,7 @@ update_icon() /obj/structure/chisel_message/examine(mob/user) - ..() + . = ..() ui_interact(user) /obj/structure/chisel_message/Destroy() diff --git a/code/modules/mapping/ruins.dm b/code/modules/mapping/ruins.dm index 416e2bc0c9..d88c7543f0 100644 --- a/code/modules/mapping/ruins.dm +++ b/code/modules/mapping/ruins.dm @@ -1,10 +1,12 @@ -/datum/map_template/ruin/proc/try_to_place(z,allowed_areas) - var/sanity = PLACEMENT_TRIES +/datum/map_template/ruin/proc/try_to_place(z,allowed_areas,turf/forced_turf) + var/sanity = forced_turf ? 1 : PLACEMENT_TRIES + if(SSmapping.level_trait(z,ZTRAIT_ISOLATED_RUINS)) + return place_on_isolated_level(z) while(sanity > 0) sanity-- var/width_border = TRANSITIONEDGE + SPACERUIN_MAP_EDGE_PAD + round(width / 2) var/height_border = TRANSITIONEDGE + SPACERUIN_MAP_EDGE_PAD + round(height / 2) - var/turf/central_turf = locate(rand(width_border, world.maxx - width_border), rand(height_border, world.maxy - height_border), z) + var/turf/central_turf = forced_turf ? forced_turf : locate(rand(width_border, world.maxx - width_border), rand(height_border, world.maxy - height_border), z) var/valid = TRUE for(var/turf/check in get_affected_turfs(central_turf,1)) @@ -24,7 +26,7 @@ qdel(monster) for(var/obj/structure/flora/ash/plant in T) qdel(plant) - + load(central_turf,centered = TRUE) loaded++ @@ -32,9 +34,20 @@ T.flags_1 |= NO_RUINS_1 new /obj/effect/landmark/ruin(central_turf, src) - return TRUE - return FALSE + return central_turf +/datum/map_template/ruin/proc/place_on_isolated_level(z) + var/datum/turf_reservation/reservation = SSmapping.RequestBlockReservation(width, height, z) //Make the new level creation work with different traits. + if(!reservation) + return + var/turf/placement = locate(reservation.bottom_left_coords[1],reservation.bottom_left_coords[2],reservation.bottom_left_coords[3]) + load(placement) + loaded++ + for(var/turf/T in get_affected_turfs(placement)) + T.flags_1 |= NO_RUINS_1 + var/turf/center = locate(placement.x + round(width/2),placement.y + round(height/2),placement.z) + new /obj/effect/landmark/ruin(center, src) + return center /proc/seedRuins(list/z_levels = null, budget = 0, whitelist = /area/space, list/potentialRuins) if(!z_levels || !z_levels.len) @@ -49,9 +62,8 @@ var/list/ruins = potentialRuins.Copy() - var/list/forced_ruins = list() //These go first on the z level associated (same random one by default) + var/list/forced_ruins = list() //These go first on the z level associated (same random one by default) or if the assoc value is a turf to the specified turf. var/list/ruins_availible = list() //we can try these in the current pass - var/forced_z //If set we won't pick z level and use this one instead. //Set up the starting ruin list for(var/key in ruins) @@ -67,34 +79,55 @@ while(budget > 0 && (ruins_availible.len || forced_ruins.len)) var/datum/map_template/ruin/current_pick var/forced = FALSE + var/forced_z //If set we won't pick z level and use this one instead. + var/forced_turf //If set we place the ruin centered on the given turf if(forced_ruins.len) //We have something we need to load right now, so just pick it for(var/ruin in forced_ruins) current_pick = ruin - if(forced_ruins[ruin] > 0) //Load into designated z + if(isturf(forced_ruins[ruin])) + var/turf/T = forced_ruins[ruin] + forced_z = T.z //In case of chained ruins + forced_turf = T + else if(forced_ruins[ruin] > 0) //Load into designated z forced_z = forced_ruins[ruin] forced = TRUE break else //Otherwise just pick random one current_pick = pickweight(ruins_availible) - var/placement_tries = PLACEMENT_TRIES + var/placement_tries = forced_turf ? 1 : PLACEMENT_TRIES //Only try once if we target specific turf var/failed_to_place = TRUE - var/z_placed = 0 - while(placement_tries > 0) - placement_tries-- - z_placed = pick(z_levels) - if(!current_pick.try_to_place(forced_z ? forced_z : z_placed,whitelist)) - continue - else - failed_to_place = FALSE - break + var/target_z = 0 + var/turf/placed_turf //Where the ruin ended up if we succeeded + outer: + while(placement_tries > 0) + placement_tries-- + target_z = pick(z_levels) + if(forced_z) + target_z = forced_z + if(current_pick.always_spawn_with) //If the ruin has part below, make sure that z exists. + for(var/v in current_pick.always_spawn_with) + if(current_pick.always_spawn_with[v] == PLACE_BELOW) + var/turf/T = locate(1,1,target_z) + if(!SSmapping.get_turf_below(T)) + if(forced_z) + continue outer + else + break outer + + placed_turf = current_pick.try_to_place(target_z,whitelist,forced_turf) + if(!placed_turf) + continue + else + failed_to_place = FALSE + break //That's done remove from priority even if it failed if(forced) //TODO : handle forced ruins with multiple variants forced_ruins -= current_pick forced = FALSE - + if(failed_to_place) for(var/datum/map_template/ruin/R in ruins_availible) if(R.id == current_pick.id) @@ -118,18 +151,21 @@ if(istype(linked,v)) switch(current_pick.always_spawn_with[v]) if(PLACE_SAME_Z) - forced_ruins[linked] = forced_z ? forced_z : z_placed //I guess you might want a chain somehow + forced_ruins[linked] = target_z //I guess you might want a chain somehow if(PLACE_LAVA_RUIN) forced_ruins[linked] = pick(SSmapping.levels_by_trait(ZTRAIT_LAVA_RUINS)) if(PLACE_SPACE_RUIN) forced_ruins[linked] = pick(SSmapping.levels_by_trait(ZTRAIT_SPACE_RUINS)) if(PLACE_DEFAULT) forced_ruins[linked] = -1 - forced_z = 0 + if(PLACE_BELOW) + forced_ruins[linked] = SSmapping.get_turf_below(placed_turf) + if(PLACE_ISOLATED) + forced_ruins[linked] = SSmapping.get_isolated_ruin_z() //Update the availible list for(var/datum/map_template/ruin/R in ruins_availible) if(R.cost > budget) ruins_availible -= R - + log_world("Ruin loader finished with [budget] left to spend.") diff --git a/code/modules/mapping/space_management/multiz_helpers.dm b/code/modules/mapping/space_management/multiz_helpers.dm new file mode 100644 index 0000000000..f6db12420a --- /dev/null +++ b/code/modules/mapping/space_management/multiz_helpers.dm @@ -0,0 +1,47 @@ +/proc/get_step_multiz(ref, dir) + if(dir & UP) + dir &= ~UP + return get_step(SSmapping.get_turf_above(get_turf(ref)), dir) + if(dir & DOWN) + dir &= ~DOWN + return get_step(SSmapping.get_turf_below(get_turf(ref)), dir) + return get_step(ref, dir) + +/proc/get_dir_multiz(turf/us, turf/them) + us = get_turf(us) + them = get_turf(them) + if(!us || !them) + return NONE + if(us.z == them.z) + return get_dir(us, them) + else + var/turf/T = us.above() + var/dir = NONE + if(T && (T.z == them.z)) + dir = UP + else + T = us.below() + if(T && (T.z == them.z)) + dir = DOWN + else + return get_dir(us, them) + return (dir | get_dir(us, them)) + +/turf/proc/above() + return get_step_multiz(src, UP) + +/turf/proc/below() + return get_step_multiz(src, DOWN) + +/proc/dir_inverse_multiz(dir) + var/holder = dir & (UP|DOWN) + if((holder == NONE) || (holder == (UP|DOWN))) + return turn(dir, 180) + dir &= ~(UP|DOWN) + dir = turn(dir, 180) + if(holder == UP) + holder = DOWN + else + holder = UP + dir |= holder + return dir \ No newline at end of file diff --git a/code/modules/mining/aux_base_camera.dm b/code/modules/mining/aux_base_camera.dm index 02c54ffbd3..d461523744 100644 --- a/code/modules/mining/aux_base_camera.dm +++ b/code/modules/mining/aux_base_camera.dm @@ -25,6 +25,13 @@ max_matter = 600 //Bigger container and faster speeds due to being specialized and stationary. no_ammo_message = "Internal matter exhausted. Please add additional materials." delay_mod = 0.5 + upgrade = TRUE + var/obj/machinery/computer/camera_advanced/base_construction/console + +/obj/item/construction/rcd/internal/check_menu(mob/living/user) + if(!istype(user) || user.incapacitated() || !user.Adjacent(console)) + return FALSE + return TRUE /obj/machinery/computer/camera_advanced/base_construction name = "base construction console" @@ -49,12 +56,10 @@ light_color = LIGHT_COLOR_PINK -/obj/machinery/computer/camera_advanced/base_construction/Initialize() - . = ..() - RCD = new(src) - /obj/machinery/computer/camera_advanced/base_construction/Initialize(mapload) . = ..() + RCD = new(src) + RCD.console = src if(mapload) //Map spawned consoles have a filled RCD and stocked special structures RCD.matter = RCD.max_matter fans_remaining = 4 @@ -85,7 +90,7 @@ return ..() /obj/machinery/computer/camera_advanced/base_construction/Destroy() - qdel(RCD) + QDEL_NULL(RCD) return ..() /obj/machinery/computer/camera_advanced/base_construction/GrantActions(mob/living/user) @@ -140,7 +145,8 @@ remote_eye = C.remote_control B = target if(!B.RCD) //The console must always have an RCD. - B.RCD = new /obj/item/construction/rcd/internal(src) //If the RCD is lost somehow, make a new (empty) one! + B.RCD = new /obj/item/construction/rcd/internal(B) //If the RCD is lost somehow, make a new (empty) one! + B.RCD.console = B /datum/action/innate/aux_base/proc/check_spot() //Check a loction to see if it is inside the aux base at the station. Camera visbility checks omitted so as to not hinder construction. @@ -195,34 +201,35 @@ var/list/buildlist = list("Walls and Floors" = 1,"Airlocks" = 2,"Deconstruction" = 3,"Windows and Grilles" = 4) var/buildmode = input("Set construction mode.", "Base Console", null) in buildlist - B.RCD.mode = buildlist[buildmode] - to_chat(owner, "Build mode is now [buildmode].") + if(buildmode) + B.RCD.mode = buildlist[buildmode] + to_chat(owner, "Build mode is now [buildmode].") /datum/action/innate/aux_base/airlock_type name = "Select Airlock Type" button_icon_state = "airlock_select" -datum/action/innate/aux_base/airlock_type/Activate() +/datum/action/innate/aux_base/airlock_type/Activate() if(..()) return - B.RCD.change_airlock_setting() + B.RCD.change_airlock_access(usr) -datum/action/innate/aux_base/window_type +/datum/action/innate/aux_base/window_type name = "Select Window Type" button_icon_state = "window_select" -datum/action/innate/aux_base/window_type/Activate() +/datum/action/innate/aux_base/window_type/Activate() if(..()) return - B.RCD.toggle_window_type() + B.RCD.toggle_window_type(usr) -datum/action/innate/aux_base/place_fan +/datum/action/innate/aux_base/place_fan name = "Place Tiny Fan" button_icon_state = "build_fan" -datum/action/innate/aux_base/place_fan/Activate() +/datum/action/innate/aux_base/place_fan/Activate() if(..()) return @@ -244,11 +251,11 @@ datum/action/innate/aux_base/place_fan/Activate() to_chat(owner, "Tiny fan placed. [B.fans_remaining] remaining.") playsound(fan_turf, 'sound/machines/click.ogg', 50, 1) -datum/action/innate/aux_base/install_turret +/datum/action/innate/aux_base/install_turret name = "Install Plasma Anti-Wildlife Turret" button_icon_state = "build_turret" -datum/action/innate/aux_base/install_turret/Activate() +/datum/action/innate/aux_base/install_turret/Activate() if(..()) return diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index ab8aa3e2fd..eb3e6a5b58 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -38,12 +38,12 @@ return ..() /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_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].") + . = ..() + . += "Mark a large creature with the destabilizing force, then hit them in melee to do [force_wielded + detonation_damage] damage." + . += "Does [force_wielded + detonation_damage + backstab_bonus] damage if the target is backstabbed, instead of [force_wielded + detonation_damage]." 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()].") + . += "It has \a [T] attached, which causes [T.effect_desc()]." /obj/item/twohanded/kinetic_crusher/attackby(obj/item/I, mob/living/user) if(istype(I, /obj/item/crowbar)) @@ -63,8 +63,7 @@ /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() + to_chat(user, "[src] is too heavy to use with one hand.") return var/datum/status_effect/crusher_damage/C = target.has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING) var/target_health = target.health @@ -202,8 +201,8 @@ var/denied_type = /obj/item/crusher_trophy /obj/item/crusher_trophy/examine(mob/living/user) - ..() - to_chat(user, "Causes [effect_desc()] when attached to a kinetic crusher.") + . = ..() + . += "Causes [effect_desc()] when attached to a kinetic crusher." /obj/item/crusher_trophy/proc/effect_desc() return "errors" diff --git a/code/modules/mining/equipment/lazarus_injector.dm b/code/modules/mining/equipment/lazarus_injector.dm index b2a2e3357d..f8b155cb9f 100644 --- a/code/modules/mining/equipment/lazarus_injector.dm +++ b/code/modules/mining/equipment/lazarus_injector.dm @@ -59,8 +59,8 @@ malfunctioning = 1 /obj/item/lazarus_injector/examine(mob/user) - ..() + . = ..() if(!loaded) - to_chat(user, "[src] is empty.") + . += "[src] is empty." if(malfunctioning) - to_chat(user, "The display on [src] seems to be flickering.") + . += "The display on [src] seems to be flickering." diff --git a/code/modules/mining/equipment/marker_beacons.dm b/code/modules/mining/equipment/marker_beacons.dm index c735c9d637..00ce37b79a 100644 --- a/code/modules/mining/equipment/marker_beacons.dm +++ b/code/modules/mining/equipment/marker_beacons.dm @@ -36,9 +36,9 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list( update_icon() /obj/item/stack/marker_beacon/examine(mob/user) - ..() - to_chat(user, "Use in-hand to place a [singular_name].") - to_chat(user, "Alt-click to select a color. Current color is [picked_color].") + . = ..() + . += "Use in-hand to place a [singular_name]." + . += "Alt-click to select a color. Current color is [picked_color]." /obj/item/stack/marker_beacon/update_icon() icon_state = "[initial(icon_state)][lowertext(picked_color)]" @@ -93,8 +93,8 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list( qdel(src) /obj/structure/marker_beacon/examine(mob/user) - ..() - to_chat(user, "Alt-click to select a color. Current color is [picked_color].") + . = ..() + . += "Alt-click to select a color. Current color is [picked_color]." /obj/structure/marker_beacon/update_icon() while(!picked_color || !GLOB.marker_beacon_colors[picked_color]) diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm index d6e99f7361..4429c8426f 100644 --- a/code/modules/mining/equipment/regenerative_core.dm +++ b/code/modules/mining/equipment/regenerative_core.dm @@ -59,6 +59,7 @@ to_chat(owner, "[src] breaks down as it tries to activate.") else owner.revive(full_heal = 1) + owner.log_message("[owner] used an implanted [src] to heal themselves! Keep fighting, it's just a flesh wound!", LOG_ATTACK, color="green") //Logging for implanted legion core use qdel(src) /obj/item/organ/regenerative_core/on_life() @@ -85,6 +86,21 @@ SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "self")) H.revive(full_heal = 1) qdel(src) + user.log_message("[user] used [src] to heal [H]! Wake the fuck up, Samurai!", LOG_ATTACK, color="green") //Logging for 'old' style legion core use, when clicking on a sprite of yourself or another. + +/obj/item/organ/regenerative_core/attack_self(mob/user) //Knouli's first hack! Allows for the use of the core in hand rather than needing to click on the target, yourself, to selfheal. Its a rip of the proc just above - but skips on distance check and only uses 'user' rather than 'target' + if(ishuman(user)) //Check if user is human, no need for distance check as it's self heal + var/mob/living/carbon/human/H = user //Set H to user rather than target + if(inert) //Inert cores are useless + to_chat(user, "[src] has decayed and can no longer be used to heal.") + return + else //Skip on check if the target to be healed is dead as, if you are dead, you're not going to be able to use it on yourself! + to_chat(user, "You start to smear [src] on yourself. It feels and smells disgusting, but you feel amazingly refreshed in mere moments.") + SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "self")) + H.revive(full_heal = 1) + qdel(src) + H.log_message("[H] used [src] to heal themselves! Making use of Knouli's sexy and intelligent use-in-hand proc!", LOG_ATTACK, color="green") //Logging for 'new' style legion core use, when using the core in-hand. + /obj/item/organ/regenerative_core/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) . = ..() diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index 715ecc906a..356c4913b9 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -33,8 +33,8 @@ /obj/item/survivalcapsule/examine(mob/user) . = ..() get_template() - to_chat(user, "This capsule has the [template.name] stored.") - to_chat(user, template.description) + . += "This capsule has the [template.name] stored." + . += template.description /obj/item/survivalcapsule/attack_self() //Can't grab when capsule is New() because templates aren't loaded then diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index f97d3612a8..f46f4f785c 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -14,7 +14,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) /obj/item/extraction_pack/examine() . = ..() - usr.show_message("It has [uses_left] use\s remaining.", 1) + . += "It has [uses_left] use\s remaining." /obj/item/extraction_pack/attack_self(mob/user) var/list/possible_beacons = list() diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index e146f1686a..054103e8dc 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -645,10 +645,10 @@ total_mass_on = 5 /obj/item/melee/transforming/cleaving_saw/examine(mob/user) - ..() - to_chat(user, "It is [active ? "open, and will cleave enemies in a wide arc":"closed, and can be used for rapid consecutive attacks that cause beastly enemies to bleed"].
    \ + . = ..() + . += "It is [active ? "open, and will cleave enemies in a wide arc":"closed, and can be used for rapid consecutive attacks that cause beastly enemies to bleed"].
    \ Both modes will build up existing bleed effects, doing a burst of high damage if the bleed is built up high enough.
    \ - Transforming it immediately after an attack causes the next attack to come out faster.
    ") + Transforming it immediately after an attack causes the next attack to come out faster.
    " /obj/item/melee/transforming/cleaving_saw/suicide_act(mob/user) user.visible_message("[user] is [active ? "closing [src] on [user.p_their()] neck" : "opening [src] into [user.p_their()] chest"]! It looks like [user.p_theyre()] trying to commit suicide!") @@ -1022,21 +1022,10 @@ message_admins("[ADMIN_LOOKUPFLW(L)] has been marked for death by [ADMIN_LOOKUPFLW(user)]!") - var/datum/objective/survive/survive = new - survive.owner = L.mind - L.mind.objectives += survive + var/datum/antagonist/blood_contract/A = new + L.mind.add_antag_datum(A) + log_combat(user, L, "took out a blood contract on", src) - to_chat(L, "You've been marked for death! Don't let the demons get you! KILL THEM ALL!") - L.add_atom_colour("#FF0000", ADMIN_COLOUR_PRIORITY) - var/obj/effect/mine/pickup/bloodbath/B = new(L) - INVOKE_ASYNC(B, /obj/effect/mine/pickup/bloodbath/.proc/mineEffect, L) - - for(var/mob/living/carbon/human/H in GLOB.player_list) - if(H == L) - continue - to_chat(H, "You have an overwhelming desire to kill [L]. [L.p_theyve(TRUE)] been marked red! Whoever [L.p_they()] [L.p_were()], friend or foe, go kill [L.p_them()]!") - H.put_in_hands(new /obj/item/kitchen/knife/butcher(H), TRUE) - qdel(src) //Colossus @@ -1084,8 +1073,8 @@ var/friendly_fire_check = FALSE //if the blasts we make will consider our faction against the faction of hit targets /obj/item/hierophant_club/examine(mob/user) - ..() - to_chat(user, "The[beacon ? " beacon is not currently":"re is a beacon"] attached.") + . = ..() + . += "The[beacon ? " beacon is not currently":"re is a beacon"] attached." /obj/item/hierophant_club/suicide_act(mob/living/user) say("Xverwpsgexmrk...", forced = "hierophant club suicide") diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index 4d8624864e..16e8b0b26c 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -121,7 +121,7 @@ dat += "Smelt Alloys
    " for(var/v in stored_research.researched_designs) - var/datum/design/D = stored_research.researched_designs[v] + var/datum/design/D = SSresearch.techweb_design_by_id(v) dat += "[D.name] " if (selected_alloy == D.id) dat += " Smelting" diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index 6c1a00b020..79da476719 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -209,7 +209,7 @@ data["alloys"] = list() for(var/v in stored_research.researched_designs) - var/datum/design/D = stored_research.researched_designs[v] + var/datum/design/D = SSresearch.techweb_design_by_id(v) data["alloys"] += list(list("name" = D.name, "id" = D.id, "amount" = can_smelt_alloy(D))) if (!mat_container) @@ -304,7 +304,9 @@ return var/alloy_id = params["id"] var/datum/design/alloy = stored_research.isDesignResearchedID(alloy_id) - if((check_access(inserted_scan_id) || allowed(usr)) && alloy) + var/mob/M = usr + var/obj/item/card/id/I = M.get_idcard(TRUE) + if((check_access(I) || allowed(usr)) && alloy) var/smelt_amount = can_smelt_alloy(alloy) var/desired = 0 if (params["sheets"]) diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm index c42f1b9f4e..d98f00ede7 100644 --- a/code/modules/mining/machine_silo.dm +++ b/code/modules/mining/machine_silo.dm @@ -171,7 +171,7 @@ GLOBAL_LIST_EMPTY(silo_access_logs) return var/datum/ore_silo_log/entry = new(M, action, amount, noun, mats) - var/list/logs = GLOB.silo_access_logs[REF(src)] + var/list/datum/ore_silo_log/logs = GLOB.silo_access_logs[REF(src)] if(!LAZYLEN(logs)) GLOB.silo_access_logs[REF(src)] = logs = list(entry) else if(!logs[1].merge(entry)) @@ -181,8 +181,8 @@ GLOBAL_LIST_EMPTY(silo_access_logs) flick("silo_active", src) /obj/machinery/ore_silo/examine(mob/user) - ..() - to_chat(user, "[src] can be linked to techfabs, circuit printers and protolathes with a multitool.") + . = ..() + . += "[src] can be linked to techfabs, circuit printers and protolathes with a multitool." /datum/ore_silo_log var/name // for VV diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index 5a48538161..a8e867cef0 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -260,8 +260,8 @@ ..() /obj/item/card/mining_point_card/examine(mob/user) - ..() - to_chat(user, "There's [points] point\s on the card.") + . = ..() + . += "There's [points] point\s on the card." ///Conscript kit /obj/item/card/mining_access_card diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 0abb1cfa9e..950ae7dda1 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -37,6 +37,9 @@ new /obj/item/clothing/gloves/color/black(src) new /obj/item/clothing/gloves/color/black(src) new /obj/item/clothing/gloves/color/black(src) + new /obj/item/clothing/suit/hooded/wintercoat/miner(src) //yes, even both mining locker types + new /obj/item/clothing/suit/hooded/wintercoat/miner(src) + new /obj/item/clothing/suit/hooded/wintercoat/miner(src) /obj/structure/closet/secure_closet/miner name = "miner's equipment" @@ -61,6 +64,7 @@ new /obj/item/clothing/glasses/meson(src) new /obj/item/survivalcapsule(src) new /obj/item/assault_pod/mining(src) + new /obj/item/clothing/suit/hooded/wintercoat/miner(src) //because you know you want it /**********************Shuttle Computer**************************/ @@ -73,7 +77,7 @@ shuttleId = "mining" possible_destinations = "mining_home;mining_away;landing_zone_dock;mining_public" no_destination_swap = 1 - var/global/list/dumb_rev_heads = list() + var/static/list/dumb_rev_heads = list() //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/machinery/computer/shuttle/mining/attack_hand(mob/user) diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index 997b117b25..0c8aef51a8 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -68,22 +68,22 @@ check_friendly_fire = 0 /mob/living/simple_animal/hostile/mining_drone/examine(mob/user) - ..() + . = ..() var/t_He = p_they(TRUE) var/t_him = p_them() var/t_s = p_s() if(health < maxHealth) if(health >= maxHealth * 0.5) - to_chat(user, "[t_He] look[t_s] slightly dented.") + . += "[t_He] look[t_s] slightly dented." else - to_chat(user, "[t_He] look[t_s] severely dented!") - to_chat(user, "Using a mining scanner on [t_him] will instruct [t_him] to drop stored ore. [max(0, LAZYLEN(contents) - 1)] Stored Ore\n\ - Field repairs can be done with a welder.") + . += "[t_He] look[t_s] severely dented!" + . += "Using a mining scanner on [t_him] will instruct [t_him] to drop stored ore. [max(0, LAZYLEN(contents) - 1)] Stored Ore\n\ + Field repairs can be done with a welder." if(stored_gun && stored_gun.max_mod_capacity) - to_chat(user, "[stored_gun.get_remaining_mod_capacity()]% mod capacity remaining.") + . += "[stored_gun.get_remaining_mod_capacity()]% mod capacity remaining." for(var/A in stored_gun.get_modkits()) var/obj/item/borg/upgrade/modkit/M = A - to_chat(user, "There is \a [M] installed, using [M.cost]% capacity.") + . += "There is \a [M] installed, using [M.cost]% capacity." /mob/living/simple_animal/hostile/mining_drone/welder_act(mob/living/user, obj/item/I) . = TRUE diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 69361e8685..c3a33f36f5 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -348,9 +348,9 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ pixel_y = rand(0,8)-8 /obj/item/coin/examine(mob/user) - ..() + . = ..() if(value) - to_chat(user, "It's worth [value] credit\s.") + . += "It's worth [value] credit\s." /obj/item/coin/gold name = "gold coin" diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm index b158815dac..3e9588d7dd 100644 --- a/code/modules/mining/satchel_ore_boxdm.dm +++ b/code/modules/mining/satchel_ore_boxdm.dm @@ -29,7 +29,7 @@ /obj/structure/ore_box/examine(mob/living/user) if(Adjacent(user) && istype(user)) show_contents(user) - . = ..() + return ..() /obj/structure/ore_box/attack_hand(mob/user) . = ..() diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 4d253a4693..d789fc6f5a 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -473,10 +473,7 @@ 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 + 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 dat += "
    " dat += "[SSjob.name_occupations[category[1]].exp_type_department]" diff --git a/code/modules/mob/dead/new_player/poll.dm b/code/modules/mob/dead/new_player/poll.dm index 04a28f6b5a..db792084cf 100644 --- a/code/modules/mob/dead/new_player/poll.dm +++ b/code/modules/mob/dead/new_player/poll.dm @@ -310,7 +310,7 @@ }); $( "#sortable" ).disableSelection(); $('form').submit(function(){ - $('#IRVdata').val($( "#sortable" ).sortable("toArray", { attribute: "voteid" })); + $('#IRVdata').val($( "#sortable" ).sortable("toArray", { attribute: "voteid" })); }); }); 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 ca1253feb1..bab19528bf 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm @@ -130,10 +130,10 @@ color_src = MATRIXED /datum/sprite_accessory/ears/human/rabbit - name = "Rabbit" - icon_state = "rabbit" - color_src = MATRIXED - icon = 'modular_citadel/icons/mob/mam_ears.dmi' + name = "Rabbit" + icon_state = "rabbit" + color_src = MATRIXED + icon = 'modular_citadel/icons/mob/mam_ears.dmi' /datum/sprite_accessory/ears/human/sergal name = "Sergal" @@ -287,8 +287,8 @@ icon_state = "pede" /datum/sprite_accessory/mam_ears/rabbit - name = "Rabbit" - icon_state = "rabbit" + name = "Rabbit" + icon_state = "rabbit" /datum/sprite_accessory/mam_ears/sergal name = "Sergal" diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index d599d55886..fbbd43bbe1 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -3,6 +3,8 @@ GLOBAL_LIST_EMPTY(ghost_images_simple) //this is a list of all ghost images as t GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) +#define CANT_REENTER_ROUND -1 + /mob/dead/observer name = "ghost" desc = "It's a g-g-g-g-ghooooost!" //jinkies! @@ -17,8 +19,9 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) see_in_dark = 100 invisibility = INVISIBILITY_OBSERVER hud_type = /datum/hud/ghost + movement_type = GROUND | FLYING var/can_reenter_corpse - var/can_reenter_round = TRUE + var/reenter_round_timeout = 0 // used to prevent people from coming back through ghost roles/midround antags as they suicide/cryo for a duration set by CONFIG_GET(number/suicide_reenter_round_timer) and CONFIG_GET(number/roundstart_suicide_time_limit) var/datum/hud/living/carbon/hud = null // hud var/bootime = 0 var/started_as_observer //This variable is set to 1 when you enter the game as an observer. @@ -231,7 +234,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) var/r_val var/b_val var/g_val - var/color_format = lentext(input_color) + var/color_format = length(input_color) if(color_format == 3) r_val = hex2num(copytext(input_color, 1, 2))*16 g_val = hex2num(copytext(input_color, 2, 3))*16 @@ -260,14 +263,23 @@ 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 = TRUE, special = FALSE) - if(!key || cmptext(copytext(key,1,2),"@") || (!special && SEND_SIGNAL(src, COMSIG_MOB_GHOSTIZE, can_reenter_corpse, special) & COMPONENT_BLOCK_GHOSTING)) +/mob/proc/ghostize(can_reenter_corpse = TRUE, special = FALSE, penalize = FALSE) + penalize = suiciding || penalize // suicide squad. + if(!key || cmptext(copytext(key,1,2),"@") || (!special && SEND_SIGNAL(src, COMSIG_MOB_GHOSTIZE, can_reenter_corpse) & 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) + if(penalize) //penalizing them from making a ghost role / midround antag comeback right away. + var/penalty = CONFIG_GET(number/suicide_reenter_round_timer) MINUTES + var/roundstart_quit_limit = CONFIG_GET(number/roundstart_suicide_time_limit) MINUTES + if(world.time < roundstart_quit_limit) //add up the time difference to their antag rolling penalty if they quit before half a (ingame) hour even passed. + penalty += roundstart_quit_limit - world.time + if(penalty) + ghost.reenter_round_timeout = world.realtime + penalty + if(ghost.reenter_round_timeout - SSshuttle.realtimeofstart > SSshuttle.auto_call + SSshuttle.emergencyCallTime + SSshuttle.emergencyDockTime + SSshuttle.emergencyEscapeTime) + ghost.reenter_round_timeout = CANT_REENTER_ROUND transfer_ckey(ghost, FALSE) return ghost @@ -283,26 +295,27 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp 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") - if(response != "Ghost")//darn copypaste - return - var/obj/machinery/cryopod/C = loc - C.despawn_occupant() - return -// END EDIT + var/penalty = CONFIG_GET(number/suicide_reenter_round_timer) MINUTES + var/roundstart_quit_limit = CONFIG_GET(number/roundstart_suicide_time_limit) MINUTES + if(world.time < roundstart_quit_limit) + penalty += roundstart_quit_limit - world.time + if(penalty + world.realtime - SSshuttle.realtimeofstart > SSshuttle.auto_call + SSshuttle.emergencyCallTime + SSshuttle.emergencyDockTime + SSshuttle.emergencyEscapeTime) + penalty = CANT_REENTER_ROUND if(stat != DEAD) succumb() if(stat == DEAD) ghostize(1) else - 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") + var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst alive you won't be able to re-enter this round [penalty ? "or play ghost roles [penalty == CANT_REENTER_ROUND ? "until the round is over" : "for the next [DisplayTimeText(penalty)]"]" : ""]! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body") if(response != "Ghost") return //didn't want to ghost after-all - ghostize(0) //0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3 - suicide_log(TRUE) + if(istype(loc, /obj/machinery/cryopod)) + var/obj/machinery/cryopod/C = loc + C.despawn_occupant() + else + ghostize(0, penalize = TRUE) //0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3 + suicide_log(TRUE) /mob/camera/verb/ghost() set category = "OOC" @@ -312,10 +325,24 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp 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") + var/penalty = CONFIG_GET(number/suicide_reenter_round_timer) MINUTES + var/roundstart_quit_limit = CONFIG_GET(number/roundstart_suicide_time_limit) MINUTES + if(world.time < roundstart_quit_limit) + penalty += roundstart_quit_limit - world.time + if(penalty + world.realtime - SSshuttle.realtimeofstart > SSshuttle.auto_call + SSshuttle.emergencyCallTime + SSshuttle.emergencyDockTime + SSshuttle.emergencyEscapeTime) + penalty = CANT_REENTER_ROUND + + var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst alive you won't be able to re-enter this round [penalty ? "or play ghost roles [penalty == CANT_REENTER_ROUND ? "until the round is over" : "for the next [DisplayTimeText(penalty)]"]" : ""]! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body") if(response != "Ghost") return - ghostize(0) + ghostize(0, penalize = TRUE) + +/mob/dead/observer/proc/can_reenter_round(silent = FALSE) + if(reenter_round_timeout != CANT_REENTER_ROUND && reenter_round_timeout <= world.realtime) + return TRUE + if(!silent) + to_chat(src, "You are unable to reenter the round[reenter_round_timeout != CANT_REENTER_ROUND ? " yet. Your ghost role blacklist will expire in [DisplayTimeText(reenter_round_timeout - world.realtime)]" : ""].") + return FALSE /mob/dead/observer/Move(NewLoc, direct) if(updatedir) @@ -603,6 +630,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set name = "Possess!" set desc= "Take over the body of a mindless creature!" + if(!can_reenter_round()) + return FALSE + var/list/possessible = list() for(var/mob/living/L in GLOB.alive_mob_list) if(istype(L,/mob/living/carbon/human/dummy) || !get_turf(L)) //Haha no. @@ -623,10 +653,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp to_chat(src, "This isn't really a creature, now is it!") return 0 - if(!can_reenter_round) - to_chat(src, "You are unable to re-enter the round.") - return FALSE - if(can_reenter_corpse && mind && mind.current) if(alert(src, "Your soul is still tied to your former life as [mind.current.name], if you go forward there is no going back to that life. Are you sure you wish to continue?", "Move On", "Yes", "No") == "No") return 0 @@ -836,9 +862,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp change_mob_type( /mob/living/carbon/human , null, null, TRUE) //always delmob, ghosts shouldn't be left lingering /mob/dead/observer/examine(mob/user) - ..() + . = ..() if(!invisibility) - to_chat(user, "It seems extremely obvious.") + . += "It seems extremely obvious." /mob/dead/observer/proc/set_invisibility(value) invisibility = value @@ -871,3 +897,5 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp spawners_menu = new(src) spawners_menu.ui_interact(src) + +#undef CANT_REENTER_ROUND \ No newline at end of file diff --git a/code/modules/mob/dead/observer/observer_movement.dm b/code/modules/mob/dead/observer/observer_movement.dm new file mode 100644 index 0000000000..b84bed2a3f --- /dev/null +++ b/code/modules/mob/dead/observer/observer_movement.dm @@ -0,0 +1,2 @@ +/mob/dead/observer/canZMove(direction, turf/target) + return TRUE \ No newline at end of file diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm index d84ba0d7a1..aa3c209016 100644 --- a/code/modules/mob/living/brain/MMI.dm +++ b/code/modules/mob/living/brain/MMI.dm @@ -188,17 +188,17 @@ qdel(src) /obj/item/mmi/examine(mob/user) - ..() + . = ..() if(brainmob) var/mob/living/brain/B = brainmob if(!B.key || !B.mind || B.stat == DEAD) - to_chat(user, "The MMI indicates the brain is completely unresponsive.") + . += "The MMI indicates the brain is completely unresponsive." else if(!B.client) - to_chat(user, "The MMI indicates the brain is currently inactive; it might change.") + . += "The MMI indicates the brain is currently inactive; it might change." else - to_chat(user, "The MMI indicates the brain is active.") + . += "The MMI indicates the brain is active." /obj/item/mmi/relaymove(mob/user) return //so that the MMI won't get a warning about not being able to move if it tries to move diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm index 1b2944c1f6..37dd7b6a31 100644 --- a/code/modules/mob/living/brain/brain.dm +++ b/code/modules/mob/living/brain/brain.dm @@ -5,6 +5,7 @@ var/datum/dna/stored/stored_dna // dna var for brain. Used to store dna, brain dna is not considered like actual dna, brain.has_dna() returns FALSE. stat = DEAD //we start dead by default see_invisible = SEE_INVISIBLE_LIVING + possible_a_intents = list(INTENT_HELP, INTENT_HARM) //for mechas speech_span = SPAN_ROBOT /mob/living/brain/Initialize() @@ -72,10 +73,9 @@ /mob/living/brain/ClickOn(atom/A, params) ..() - if(istype(loc, /obj/item/mmi)) - var/obj/item/mmi/MMI = loc - var/obj/mecha/M = MMI.mecha - if((src == MMI.brainmob) && istype(M)) + if(container) + var/obj/mecha/M = container.mecha + if(istype(M)) return M.click_action(A,src,params) /mob/living/brain/forceMove(atom/destination) @@ -90,3 +90,16 @@ doMove(destination) else CRASH("Brainmob without a container [src] attempted to move to [destination].") + +/mob/living/brain/update_mouse_pointer() + if (!client) + return + client.mouse_pointer_icon = initial(client.mouse_pointer_icon) + if(!container) + return + if (container.mecha) + var/obj/mecha/M = container.mecha + if(M.mouse_pointer) + client.mouse_pointer_icon = M.mouse_pointer + if (client && ranged_ability && ranged_ability.ranged_mousepointer) + client.mouse_pointer_icon = ranged_ability.ranged_mousepointer diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index 4192c2235b..48e79a9050 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -24,7 +24,7 @@ var/list/datum/brain_trauma/traumas = list() -/obj/item/organ/brain/Insert(mob/living/carbon/C, special = 0,no_id_transfer = FALSE) +/obj/item/organ/brain/Insert(mob/living/carbon/C, special = 0,no_id_transfer = FALSE, drop_if_replaced = TRUE) ..() name = "brain" @@ -157,7 +157,7 @@ -/obj/item/organ/brain/examine(mob/user)//BUG_PROBABLE_CAUSE to_chats changed to . += +/obj/item/organ/brain/examine(mob/user) . = ..() if(user.suiciding) diff --git a/code/modules/mob/living/brain/posibrain.dm b/code/modules/mob/living/brain/posibrain.dm index 8a70ccc4cb..e2d6b095fe 100644 --- a/code/modules/mob/living/brain/posibrain.dm +++ b/code/modules/mob/living/brain/posibrain.dm @@ -36,7 +36,7 @@ GLOBAL_VAR(posibrain_notify_cooldown) /obj/item/mmi/posibrain/proc/ping_ghosts(msg, newlymade) if(newlymade || GLOB.posibrain_notify_cooldown <= world.time) - notify_ghosts("[name] [msg] in [get_area(src)]!", ghost_sound = !newlymade ? 'sound/misc/server-ready.ogg':null, enter_link = "(Click to enter)", source = src, action = NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_POSIBRAIN) + notify_ghosts("[name] [msg] in [get_area(src)]!", ghost_sound = !newlymade ? 'sound/misc/server-ready.ogg':null, enter_link = "(Click to enter)", source = src, action = NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_POSIBRAIN, ignore_dnr_observers = TRUE) if(!newlymade) GLOB.posibrain_notify_cooldown = world.time + askDelay @@ -83,11 +83,14 @@ GLOBAL_VAR(posibrain_notify_cooldown) //Two ways to activate a positronic brain. A clickable link in the ghost notif, or simply clicking the object itself. /obj/item/mmi/posibrain/proc/activate(mob/user) - if(QDELETED(brainmob)) - return - if(is_occupied() || jobban_isbanned(user,"posibrain") || QDELETED(brainmob) || QDELETED(src) || QDELETED(user)) + if(QDELETED(brainmob) || is_occupied() || jobban_isbanned(user,"posibrain") || QDELETED(src) || QDELETED(user)) return + if(isobserver(user)) + var/mob/dead/observer/O = user + if(!O.can_reenter_round()) + return FALSE + var/posi_ask = alert("Become a [name]? (Warning, You can no longer be cloned, and all past lives will be forgotten!)","Are you positive?","Yes","No") if(posi_ask == "No" || QDELETED(src)) return @@ -158,7 +161,7 @@ GLOBAL_VAR(posibrain_notify_cooldown) else msg = "[dead_message]" - to_chat(user, msg) + . += msg /obj/item/mmi/posibrain/Initialize() . = ..() diff --git a/code/modules/mob/living/carbon/alien/death.dm b/code/modules/mob/living/carbon/alien/death.dm index 77300e1435..afbd5bbe6f 100644 --- a/code/modules/mob/living/carbon/alien/death.dm +++ b/code/modules/mob/living/carbon/alien/death.dm @@ -1,8 +1,9 @@ -/mob/living/carbon/alien/spawn_gibs(with_bodyparts) +/mob/living/carbon/alien/spawn_gibs(with_bodyparts, atom/loc_override) + var/location = loc_override ? loc_override.drop_location() : drop_location() if(with_bodyparts) - new /obj/effect/gibspawner/xeno(drop_location()) + new /obj/effect/gibspawner/xeno(location, src) else - new /obj/effect/gibspawner/xeno/bodypartless(drop_location()) + new /obj/effect/gibspawner/xeno/bodypartless(location, src) /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 e7cf70f441..e0136d7036 100644 --- a/code/modules/mob/living/carbon/alien/larva/death.dm +++ b/code/modules/mob/living/carbon/alien/larva/death.dm @@ -6,11 +6,12 @@ update_icons() -/mob/living/carbon/alien/larva/spawn_gibs(with_bodyparts) +/mob/living/carbon/alien/larva/spawn_gibs(with_bodyparts, atom/loc_override) + var/location = loc_override ? loc_override.drop_location() : drop_location() if(with_bodyparts) - new /obj/effect/gibspawner/larva(drop_location()) + new /obj/effect/gibspawner/larva(location, src) else - new /obj/effect/gibspawner/larva/bodypartless(drop_location()) + new /obj/effect/gibspawner/larva/bodypartless(location, src) /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 7b6962794a..e4e8f06cfa 100644 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ b/code/modules/mob/living/carbon/alien/organs.dm @@ -14,7 +14,7 @@ QDEL_LIST(alien_powers) return ..() -/obj/item/organ/alien/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/alien/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) ..() for(var/obj/effect/proc_holder/alien/P in alien_powers) M.AddAbility(P) @@ -94,7 +94,7 @@ else owner.adjustPlasma(plasma_rate * 0.1) -/obj/item/organ/alien/plasmavessel/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/alien/plasmavessel/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) ..() if(isalien(M)) var/mob/living/carbon/alien/A = M @@ -117,7 +117,7 @@ var/recent_queen_death = 0 //Indicates if the queen died recently, aliens are heavily weakened while this is active. alien_powers = list(/obj/effect/proc_holder/alien/whisper) -/obj/item/organ/alien/hivenode/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/alien/hivenode/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) ..() M.faction |= ROLE_ALIEN diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index e66d70f492..1cea4a6e82 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -71,16 +71,16 @@ Leap(M) /obj/item/clothing/mask/facehugger/examine(mob/user) - ..() + . = ..() if(!real)//So that giant red text about probisci doesn't show up. return switch(stat) if(DEAD,UNCONSCIOUS) - to_chat(user, "[src] is not moving.") + . += "[src] is not moving." if(CONSCIOUS) - to_chat(user, "[src] seems to be active!") + . += "[src] seems to be active!" if (sterile) - to_chat(user, "It looks like the proboscis has been removed.") + . += "It looks like the proboscis has been removed." /obj/item/clothing/mask/facehugger/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 88aa5f86d0..23ccc665b6 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -170,6 +170,7 @@ stop_pulling() if(HAS_TRAIT(src, TRAIT_PACIFISM)) to_chat(src, "You gently let go of [throwable_mob].") + return adjustStaminaLossBuffered(25)//CIT CHANGE - throwing an entire person shall be very tiring var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors var/turf/end_T = get_turf(target) @@ -256,7 +257,7 @@ /mob/living/carbon/fall(forced) - loc.handle_fall(src, forced)//it's loc so it doesn't call the mob's handle_fall which does nothing + loc.handle_fall(src, forced)//it's loc so it doesn't call the mob's handle_fall which does nothing /mob/living/carbon/is_muzzled() return(istype(src.wear_mask, /obj/item/clothing/mask/muzzle)) @@ -585,7 +586,7 @@ if(!isnull(E.lighting_alpha)) lighting_alpha = E.lighting_alpha - if(client.eye != src) + if(client.eye && client.eye != src) var/atom/A = client.eye if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. return diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index 7d1e5320fc..a8a69be0f1 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -43,7 +43,7 @@ adjustStaminaLoss(damage_amount, forced = forced) //citadel code if(AROUSAL) - adjustArousalLoss(damage_amount, forced = forced) + adjustArousalLoss(damage_amount) return TRUE diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm index 71286ef691..345279df29 100644 --- a/code/modules/mob/living/carbon/emote.dm +++ b/code/modules/mob/living/carbon/emote.dm @@ -31,9 +31,9 @@ if (!user.get_bodypart(BODY_ZONE_L_ARM) || !user.get_bodypart(BODY_ZONE_R_ARM)) return var/clap = pick('sound/misc/clap1.ogg', - 'sound/misc/clap2.ogg', - 'sound/misc/clap3.ogg', - 'sound/misc/clap4.ogg') + 'sound/misc/clap2.ogg', + 'sound/misc/clap3.ogg', + 'sound/misc/clap4.ogg') playsound(user, clap, 50, 1, -1) /datum/emote/living/carbon/gnarl diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index 5634d21775..eba925a659 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -6,39 +6,39 @@ var/t_has = p_have() var/t_is = p_are() - var/msg = "*---------*\nThis is [icon2html(src, user)] \a [src]!\n" + . = list("*---------*\nThis is [icon2html(src, user)] \a [src]!") if (handcuffed) - msg += "[t_He] [t_is] [icon2html(handcuffed, user)] handcuffed!\n" + . += "[t_He] [t_is] [icon2html(handcuffed, user)] handcuffed!" if (head) - msg += "[t_He] [t_is] wearing [head.get_examine_string(user)] on [t_his] head. \n" + . += "[t_He] [t_is] wearing [head.get_examine_string(user)] on [t_his] head." if (wear_mask) - msg += "[t_He] [t_is] wearing [wear_mask.get_examine_string(user)] on [t_his] face.\n" + . += "[t_He] [t_is] wearing [wear_mask.get_examine_string(user)] on [t_his] face." if (wear_neck) - msg += "[t_He] [t_is] wearing [wear_neck.get_examine_string(user)] around [t_his] neck.\n" + . += "[t_He] [t_is] wearing [wear_neck.get_examine_string(user)] around [t_his] neck." for(var/obj/item/I in held_items) 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" + . += "[t_He] [t_is] holding [I.get_examine_string(user)] in [t_his] [get_held_index_name(get_held_index_of_item(I))]." if (back) - msg += "[t_He] [t_has] [back.get_examine_string(user)] on [t_his] back.\n" + . += "[t_He] [t_has] [back.get_examine_string(user)] on [t_his] back." var/appears_dead = 0 if (stat == DEAD) appears_dead = 1 if(getorgan(/obj/item/organ/brain)) - msg += "[t_He] [t_is] limp and unresponsive, with no signs of life.\n" + . += "[t_He] [t_is] limp and unresponsive, with no signs of life." else if(get_bodypart(BODY_ZONE_HEAD)) - msg += "It appears that [t_his] brain is missing...\n" + . += "It appears that [t_his] brain is missing..." var/list/missing = get_missing_limbs() for(var/t in missing) if(t==BODY_ZONE_HEAD) - msg += "[t_His] [parse_zone(t)] is missing!\n" + . += "[t_His] [parse_zone(t)] is missing!" continue - msg += "[t_His] [parse_zone(t)] is missing!\n" + . += "[t_His] [parse_zone(t)] is missing!" - msg += "" + var/list/msg = list("") var/temp = getBruteLoss() if(!(user == src && src.hal_screwyhud == SCREWYHUD_HEALTHY)) //fake healthy if(temp) @@ -80,35 +80,37 @@ msg += "" + . += msg.Join("") + if(!appears_dead) if(stat == UNCONSCIOUS) - msg += "[t_He] [t_is]n't responding to anything around [t_him] and seems to be asleep.\n" + . += "[t_He] [t_is]n't responding to anything around [t_him] and seems to be asleep." else if(InCritical()) - msg += "[t_His] breathing is shallow and labored.\n" + . += "[t_His] breathing is shallow and labored." if(digitalcamo) - msg += "[t_He] [t_is] moving [t_his] body in an unnatural and blatantly unsimian manner.\n" + . += "[t_He] [t_is] moving [t_his] body in an unnatural and blatantly unsimian manner." if(combatmode) - msg += "[t_He] [t_is] visibly tense[resting ? "." : ", and [t_is] standing in combative stance."]\n" - msg += common_trait_examine() + . += "[t_He] [t_is] visibly tense[resting ? "." : ", and [t_is] standing in combative stance."]" + + var/trait_exam = common_trait_examine() + if (!isnull(trait_exam)) + . += trait_exam var/datum/component/mood/mood = src.GetComponent(/datum/component/mood) if(mood) switch(mood.shown_mood) if(-INFINITY to MOOD_LEVEL_SAD4) - msg += "[t_He] look[p_s()] depressed.\n" + . += "[t_He] look[p_s()] depressed." if(MOOD_LEVEL_SAD4 to MOOD_LEVEL_SAD3) - msg += "[t_He] look[p_s()] very sad.\n" + . += "[t_He] look[p_s()] very sad." if(MOOD_LEVEL_SAD3 to MOOD_LEVEL_SAD2) - msg += "[t_He] look[p_s()] a bit down.\n" + . += "[t_He] look[p_s()] a bit down." if(MOOD_LEVEL_HAPPY2 to MOOD_LEVEL_HAPPY3) - msg += "[t_He] look[p_s()] quite happy.\n" + . += "[t_He] look[p_s()] quite happy." if(MOOD_LEVEL_HAPPY3 to MOOD_LEVEL_HAPPY4) - msg += "[t_He] look[p_s()] very happy.\n" + . += "[t_He] look[p_s()] very happy." if(MOOD_LEVEL_HAPPY4 to INFINITY) - msg += "[t_He] look[p_s()] ecstatic.\n" - msg += "*---------*" - - to_chat(user, msg) - return msg \ No newline at end of file + . += "[t_He] look[p_s()] ecstatic." + . += "*---------*" diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index b0c3f61eec..a09af656f5 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -4,36 +4,21 @@ /mob/living/carbon/human/dust_animation() new /obj/effect/temp_visual/dust_animation(loc, "dust-h") -/mob/living/carbon/human/spawn_gibs(with_bodyparts) - if(isjellyperson(src)) - if(with_bodyparts) - new /obj/effect/gibspawner/slime(drop_location(), dna, get_static_viruses()) +/mob/living/carbon/human/spawn_gibs(with_bodyparts, atom/loc_override) + var/location = loc_override ? loc_override.drop_location() : drop_location() + if(dna?.species?.gib_types) + var/datum/species/S = dna.species + var/length = length(S.gib_types) + if(length) + var/path = (with_bodyparts && length > 1) ? S.gib_types[2] : S.gib_types[1] + new path(location, src, 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()) - + new S.gib_types(location, src, get_static_viruses()) else if(with_bodyparts) - new /obj/effect/gibspawner/human(drop_location(), dna, get_static_viruses()) + new /obj/effect/gibspawner/human(location, src, get_static_viruses()) else - new /obj/effect/gibspawner/human/bodypartless(drop_location(), dna, get_static_viruses()) + new /obj/effect/gibspawner/human/bodypartless(location, src, get_static_viruses()) /mob/living/carbon/human/spawn_dust(just_ash = FALSE) if(just_ash) @@ -69,11 +54,16 @@ /mob/living/carbon/human/proc/makeSkeleton() ADD_TRAIT(src, TRAIT_DISFIGURED, TRAIT_GENERIC) set_species(/datum/species/skeleton) - return 1 + return TRUE /mob/living/carbon/proc/Drain() become_husk(CHANGELING_DRAIN) ADD_TRAIT(src, TRAIT_NOCLONE, CHANGELING_DRAIN) blood_volume = 0 - return 1 + return TRUE + +/mob/living/carbon/proc/makeUncloneable() + ADD_TRAIT(src, TRAIT_NOCLONE, MADE_UNCLONEABLE) + blood_volume = 0 + return TRUE \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 7b0fb74f44..d5c2e5fc38 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -13,7 +13,7 @@ if(HAS_TRAIT(L, TRAIT_PROSOPAGNOSIA)) obscure_name = TRUE - var/msg = "*---------*\nThis is [!obscure_name ? name : "Unknown"]!\n" + . = list("*---------*\nThis is [!obscure_name ? name : "Unknown"]!") var/list/obscured = check_obscured_slots() var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) @@ -22,11 +22,11 @@ var/mob/living/carbon/human/H = src var/datum/species/pref_species = H.dna.species if(get_visible_name() == "Unknown") // same as flavor text, but hey it works. - msg += "You can't make out what species they are.\n" + . += "You can't make out what species they are." else if(skipface) - msg += "You can't make out what species they are.\n" + . += "You can't make out what species they are." else - msg += "[t_He] [t_is] a [H.dna.custom_species ? H.dna.custom_species : pref_species.name]!\n" + . += "[t_He] [t_is] a [H.dna.custom_species ? H.dna.custom_species : pref_species.name]!" //uniform if(w_uniform && !(SLOT_W_UNIFORM in obscured)) @@ -37,121 +37,113 @@ if(U.attached_accessory) accessory_msg += " with [icon2html(U.attached_accessory, user)] \a [U.attached_accessory]" - msg += "[t_He] [t_is] wearing [w_uniform.get_examine_string(user)][accessory_msg].\n" + . += "[t_He] [t_is] wearing [w_uniform.get_examine_string(user)][accessory_msg]." //head if(head) - msg += "[t_He] [t_is] wearing [head.get_examine_string(user)] on [t_his] head.\n" + . += "[t_He] [t_is] wearing [head.get_examine_string(user)] on [t_his] head." //suit/armor if(wear_suit) - msg += "[t_He] [t_is] wearing [wear_suit.get_examine_string(user)].\n" + . += "[t_He] [t_is] wearing [wear_suit.get_examine_string(user)]." //suit/armor storage 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" + . += "[t_He] [t_is] carrying [s_store.get_examine_string(user)] on [t_his] [wear_suit.name]." //back if(back) - msg += "[t_He] [t_has] [back.get_examine_string(user)] on [t_his] back.\n" + . += "[t_He] [t_has] [back.get_examine_string(user)] on [t_his] back." //Hands for(var/obj/item/I in held_items) 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" + . += "[t_He] [t_is] holding [I.get_examine_string(user)] in [t_his] [get_held_index_name(get_held_index_of_item(I))]." //gloves if(gloves && !(SLOT_GLOVES in obscured)) - msg += "[t_He] [t_has] [gloves.get_examine_string(user)] on [t_his] hands.\n" + . += "[t_He] [t_has] [gloves.get_examine_string(user)] on [t_his] hands." 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" - - //handcuffed? + . += "[t_He] [t_has] [hand_number > 1 ? "" : "a"] blood-stained hand[hand_number > 1 ? "s" : ""]!" //handcuffed? if(handcuffed) if(istype(handcuffed, /obj/item/restraints/handcuffs/cable)) - msg += "[t_He] [t_is] [icon2html(handcuffed, user)] restrained with cable!\n" + . += "[t_He] [t_is] [icon2html(handcuffed, user)] restrained with cable!" else - msg += "[t_He] [t_is] [icon2html(handcuffed, user)] handcuffed!\n" + . += "[t_He] [t_is] [icon2html(handcuffed, user)] handcuffed!" //belt if(belt) - msg += "[t_He] [t_has] [belt.get_examine_string(user)] about [t_his] waist.\n" + . += "[t_He] [t_has] [belt.get_examine_string(user)] about [t_his] waist." //shoes if(shoes && !(SLOT_SHOES in obscured)) - msg += "[t_He] [t_is] wearing [shoes.get_examine_string(user)] on [t_his] feet.\n" + . += "[t_He] [t_is] wearing [shoes.get_examine_string(user)] on [t_his] feet." //mask if(wear_mask && !(SLOT_WEAR_MASK in obscured)) - msg += "[t_He] [t_has] [wear_mask.get_examine_string(user)] on [t_his] face.\n" + . += "[t_He] [t_has] [wear_mask.get_examine_string(user)] on [t_his] face." if(wear_neck && !(SLOT_NECK in obscured)) - msg += "[t_He] [t_is] wearing [wear_neck.get_examine_string(user)] around [t_his] neck.\n" + . += "[t_He] [t_is] wearing [wear_neck.get_examine_string(user)] around [t_his] neck." //eyes if(!(SLOT_GLASSES in obscured)) if(glasses) - msg += "[t_He] [t_has] [glasses.get_examine_string(user)] covering [t_his] eyes.\n" + . += "[t_He] [t_has] [glasses.get_examine_string(user)] covering [t_his] eyes." else if(eye_color == BLOODCULT_EYE && iscultist(src) && HAS_TRAIT(src, TRAIT_CULT_EYES)) - msg += "[t_His] eyes are glowing an unnatural red!\n" + . += "[t_His] eyes are glowing an unnatural red!" //ears if(ears && !(SLOT_EARS in obscured)) - msg += "[t_He] [t_has] [ears.get_examine_string(user)] on [t_his] ears.\n" + . += "[t_He] [t_has] [ears.get_examine_string(user)] on [t_his] ears." //ID if(wear_id) - msg += "[t_He] [t_is] wearing [wear_id.get_examine_string(user)].\n" + . += "[t_He] [t_is] wearing [wear_id.get_examine_string(user)]." //Status effects - msg += status_effect_examines() + var/effects_exam = status_effect_examines() + if(!isnull(effects_exam)) + . += effects_exam //CIT CHANGES START HERE - adds genital details to examine text if(LAZYLEN(internal_organs)) for(var/obj/item/organ/genital/dicc in internal_organs) if(istype(dicc) && dicc.is_exposed()) - msg += "[dicc.desc]\n" + . += "[dicc.desc]" - msg += attempt_vr(src,"examine_bellies",args) //vore Code + var/cursed_stuff = attempt_vr(src,"examine_bellies",args) //vore Code + if(!isnull(cursed_stuff)) + . += cursed_stuff //END OF CIT CHANGES //Jitters switch(jitteriness) if(300 to INFINITY) - msg += "[t_He] [t_is] convulsing violently!\n" + . += "[t_He] [t_is] convulsing violently!" if(200 to 300) - msg += "[t_He] [t_is] extremely jittery.\n" + . += "[t_He] [t_is] extremely jittery." if(100 to 200) - msg += "[t_He] [t_is] twitching ever so slightly.\n" + . += "[t_He] [t_is] twitching ever so slightly." var/appears_dead = 0 if(stat == DEAD || (HAS_TRAIT(src, TRAIT_FAKEDEATH))) appears_dead = 1 if(suiciding) - msg += "[t_He] appear[p_s()] to have committed suicide... there is no hope of recovery.\n" + . += "[t_He] appear[p_s()] to have committed suicide... there is no hope of recovery." if(hellbound) - msg += "[t_His] soul seems to have been ripped out of [t_his] body. Revival is impossible.\n" - msg += "[t_He] [t_is] limp and unresponsive; there are no signs of life" - if(getorgan(/obj/item/organ/brain)) - if(!key) - var/foundghost = 0 - if(mind) - for(var/mob/dead/observer/G in GLOB.player_list) - if(G.mind == mind) - foundghost = 1 - if (G.can_reenter_corpse == 0) - foundghost = 0 - break - if(!foundghost) - msg += " and [t_his] soul has departed" - msg += "...\n" + . += "[t_His] soul seems to have been ripped out of [t_his] body. Revival is impossible." + if(getorgan(/obj/item/organ/brain) && !key && !get_ghost(FALSE, TRUE)) + . += "[t_He] [t_is] limp and unresponsive; there are no signs of life and [t_his] soul has departed..." + else + . += "[t_He] [t_is] limp and unresponsive; there are no signs of life..." if(get_bodypart(BODY_ZONE_HEAD) && !getorgan(/obj/item/organ/brain)) - msg += "It appears that [t_his] brain is missing...\n" + . += "It appears that [t_his] brain is missing..." var/temp = getBruteLoss() //no need to calculate each of these twice - msg += "" //Everything below gets this span + var/list/msg = list() 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() @@ -169,8 +161,7 @@ if(!(BP.get_damage(include_stamina = FALSE) >= BP.max_damage)) //Stamina is disabling the limb damage_text = "limp and lifeless" else - var/more_brute = BP.brute_dam >= BP.burn_dam - damage_text = more_brute ? "broken and mangled" : "burnt and blistered" + damage_text = (BP.brute_dam >= BP.burn_dam) ? BP.heavy_brute_msg : BP.heavy_burn_msg msg += "[capitalize(t_his)] [BP.name] is [damage_text]!\n" //stores missing limbs @@ -334,7 +325,13 @@ if(digitalcamo) msg += "[t_He] [t_is] moving [t_his] body in an unnatural and blatantly inhuman manner.\n" - msg += common_trait_examine() + + if (length(msg)) + . += "[msg.Join("")]" + + var/trait_exam = common_trait_examine() + if (!isnull(trait_exam)) + . += trait_exam var/traitstring = get_trait_string() if(ishuman(user)) @@ -345,28 +342,25 @@ if(perpname) var/datum/data/record/R = find_record("name", perpname, GLOB.data_core.general) if(R) - msg += "Rank: [R.fields["rank"]]
    " - msg += "\[Front photo\] " - msg += "\[Side photo\]
    " + . += "Rank: [R.fields["rank"]]\n\[Front photo\]\[Side photo\]" if(istype(H.glasses, /obj/item/clothing/glasses/hud/health) || istype(CIH, /obj/item/organ/cyberimp/eyes/hud/medical)) var/cyberimp_detect for(var/obj/item/organ/cyberimp/CI in internal_organs) if(CI.status == ORGAN_ROBOTIC && !CI.syndicate_implant) - cyberimp_detect += "[name] is modified with a [CI.name].
    " + cyberimp_detect += "[name] is modified with a [CI.name]." if(cyberimp_detect) - msg += "Detected cybernetic modifications:
    " - msg += cyberimp_detect + . += "Detected cybernetic modifications:" + . += cyberimp_detect if(R) var/health_r = R.fields["p_stat"] - msg += "\[[health_r]\]" + . += "\[[health_r]\]" health_r = R.fields["m_stat"] - msg += "\[[health_r]\]
    " + . += "\[[health_r]\]" R = find_record("name", perpname, GLOB.data_core.medical) if(R) - msg += "\[Medical evaluation\]
    " + . += "\[Medical evaluation\]" if(traitstring) - msg += "Detected physiological traits:
    " - msg += "[traitstring]
    " + . += "Detected physiological traits:\n[traitstring]" @@ -379,25 +373,22 @@ if(R) criminal = R.fields["criminal"] - msg += "Criminal status: \[[criminal]\]\n" - msg += "Security record: \[View\] " - msg += "\[Add crime\] " - msg += "\[View comment log\] " - msg += "\[Add comment\]\n" + . += jointext(list("Criminal status: \[[criminal]\]", + "Security record: \[View\]", + "\[Add crime\]", + "\[View comment log\]", + "\[Add comment\]"), "") else if(isobserver(user) && traitstring) - msg += "Traits: [traitstring]
    " + . += "Traits: [traitstring]" if(print_flavor_text()) if(get_visible_name() == "Unknown") //Are we sure we know who this is? Don't show flavor text unless we can recognize them. Prevents certain metagaming with impersonation. - msg += "...?
    " + . += "...?" else if(skipface) //Sometimes we're not unknown, but impersonating someone in a hardsuit, let's not reveal our flavor text then either. - msg += "...?
    " + . += "...?" else - msg += "[print_flavor_text()]\n" - msg += "*---------*
    " - - to_chat(user, msg) - return msg + . += "[print_flavor_text()]" + . += "*---------*
    " /mob/living/proc/status_effect_examines(pronoun_replacement) //You can include this in any mob's examine() to show the examine texts of status effects! var/list/dat = list() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index a737844f10..9eab9054f5 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() - RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /mob/living/carbon/human/clean_blood) + RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /atom.proc/clean_blood) /mob/living/carbon/human/ComponentInitialize() @@ -574,7 +574,7 @@ return threatcount //Check for ID - var/obj/item/card/id/idcard = get_idcard() + var/obj/item/card/id/idcard = get_idcard(FALSE) if( (judgement_criteria & JUDGE_IDCHECK) && !idcard && name=="Unknown") threatcount += 4 diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index a44779e05e..327ad6760c 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -339,8 +339,10 @@ apply_damage(damage, BRUTE, affecting, armor_block) /mob/living/carbon/human/mech_melee_attack(obj/mecha/M) - if(M.occupant.a_intent == INTENT_HARM) + if(HAS_TRAIT(M.occupant, TRAIT_PACIFISM)) + to_chat(M.occupant, "You don't want to harm other living beings!") + return M.do_attack_animation(src) if(M.damtype == "brute") step_away(src,M,15) @@ -778,7 +780,7 @@ broken_plural = TRUE else var/holder = broken[1] //our one and only element - if(holder[lentext(holder)] == "s") + if(holder[length(holder)] == "s") broken_plural = TRUE //Put the items in that list into a string of text for(var/B in broken) @@ -790,7 +792,7 @@ damaged_plural = TRUE else var/holder = damaged[1] - if(holder[lentext(holder)] == "s") + if(holder[length(holder)] == "s") damaged_plural = TRUE for(var/D in damaged) damaged_message += D diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index b1f11f6463..9ffa994066 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -34,8 +34,6 @@ var/shirt_color = "FFFFFF" var/socks = "Nude" //Which socks the player wants var/socks_color = "FFFFFF" - var/backbag = DBACKPACK //Which backpack type the player has chosen. - var/jumpsuit_style = PREF_SUIT //suit/skirt //Equipment slots var/obj/item/wear_suit = null diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 8bc8866380..8071d632ea 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -11,8 +11,8 @@ //gets assignment from ID or ID inside PDA or PDA itself //Useful when player do something with computers -/mob/living/carbon/human/proc/get_assignment(if_no_id = "No id", if_no_job = "No job") - var/obj/item/card/id/id = get_idcard() +/mob/living/carbon/human/proc/get_assignment(if_no_id = "No id", if_no_job = "No job", hand_first = TRUE) + var/obj/item/card/id/id = get_idcard(hand_first) if(id) . = id.assignment else @@ -27,7 +27,7 @@ //gets name from ID or ID inside PDA or PDA itself //Useful when player do something with computers /mob/living/carbon/human/proc/get_authentification_name(if_no_id = "Unknown") - var/obj/item/card/id/id = get_idcard() + var/obj/item/card/id/id = get_idcard(FALSE) if(id) return id.registered_name var/obj/item/pda/pda = wear_id @@ -86,10 +86,15 @@ return //gets ID card object from special clothes slot or null. -/mob/living/carbon/human/get_idcard() - if(wear_id) - return wear_id.GetID() - +/mob/living/carbon/human/get_idcard(hand_first = TRUE) + . = ..() + if(. && hand_first) + return + //Check inventory slots + var/obj/item/card/id/id_card = wear_id?.GetID() + if(!id_card) + id_card = belt?.GetID() + return id_card || . /mob/living/carbon/human/IsAdvancedToolUser() if(HAS_TRAIT(src, TRAIT_MONKEYLIKE)) @@ -100,7 +105,6 @@ return dna.species.handle_chemicals(R,src) // if it returns 0, it will run the usual on_mob_life for that reagent. otherwise, it will stop after running handle_chemicals for the species. - /mob/living/carbon/human/can_track(mob/living/user) if(wear_id && istype(wear_id.GetID(), /obj/item/card/id/syndicate)) return 0 diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 084dbd83ef..26703977d2 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -251,7 +251,7 @@ sec_hud_set_security_status() ..() -/mob/living/carbon/human/proc/equipOutfit(outfit, visualsOnly = FALSE) +/mob/living/carbon/human/proc/equipOutfit(outfit, visualsOnly = FALSE, client/preference_source) var/datum/outfit/O = null if(ispath(outfit)) @@ -263,7 +263,7 @@ if(!O) return 0 - return O.equip(src, visualsOnly) + return O.equip(src, visualsOnly, preference_source) //delete all equipment without dropping anything diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index be52a8289b..821a3472e4 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -3,7 +3,7 @@ //NOTE: Breathing happens once per FOUR TICKS, unless the last breath fails. In which case it happens once per ONE TICK! So oxyloss healing is done once per 4 ticks while oxyloss damage is applied once per tick! // bitflags for the percentual amount of protection a piece of clothing which covers the body part offers. -// Used with human/proc/get_heat_protection() and human/proc/get_cold_protection() +// Used with human/proc/get_thermal_protection() // The values here should add up to 1. // Hands and feet have 2.5%, arms and legs 7.5%, each of the torso parts has 15% and the head has 30% #define THERMAL_PROTECTION_HEAD 0.3 @@ -53,16 +53,17 @@ /mob/living/carbon/human/calculate_affecting_pressure(pressure) - if (wear_suit && head && istype(wear_suit, /obj/item/clothing) && istype(head, /obj/item/clothing)) + var/headless = !get_bodypart(BODY_ZONE_HEAD) //should the mob be perennially headless (see dullahans), we only take the suit into account, so they can into space. + if (wear_suit && istype(wear_suit, /obj/item/clothing) && (headless || (head && istype(head, /obj/item/clothing)))) var/obj/item/clothing/CS = wear_suit var/obj/item/clothing/CH = head - if (CS.clothing_flags & CH.clothing_flags & STOPSPRESSUREDAMAGE) + if (CS.clothing_flags & STOPSPRESSUREDAMAGE && (headless || (CH.clothing_flags & STOPSPRESSUREDAMAGE))) return ONE_ATMOSPHERE if(isbelly(loc)) //START OF CIT CHANGES - Makes it so you don't suffocate while inside vore organs. Remind me to modularize this some time - Bhijn return ONE_ATMOSPHERE if(istype(loc, /obj/item/dogborg/sleeper)) return ONE_ATMOSPHERE //END OF CIT CHANGES - return pressure + return ..() /mob/living/carbon/human/handle_traits() @@ -136,7 +137,7 @@ if(dna) dna.species.handle_fire(src) -/mob/living/carbon/human/proc/get_thermal_protection() +/mob/living/carbon/human/proc/easy_thermal_protection() var/thermal_protection = 0 //Simple check to estimate how protected we are against multiple temperatures //CITADEL EDIT Vore code required overrides if(istype(loc, /obj/item/dogborg/sleeper)) @@ -168,7 +169,6 @@ ..() //END FIRE CODE - //This proc returns a number made up of the flags for body parts which you are protected on. (such as HEAD, CHEST, GROIN, etc. See setup.dm for the full list) /mob/living/carbon/human/proc/get_heat_protection_flags(temperature) //Temperature is the temperature you're being exposed to. var/thermal_protection_flags = 0 @@ -194,37 +194,6 @@ return thermal_protection_flags -/mob/living/carbon/human/proc/get_heat_protection(temperature) //Temperature is the temperature you're being exposed to. - var/thermal_protection_flags = get_heat_protection_flags(temperature) - - var/thermal_protection = 0 - if(thermal_protection_flags) - if(thermal_protection_flags & HEAD) - thermal_protection += THERMAL_PROTECTION_HEAD - if(thermal_protection_flags & CHEST) - thermal_protection += THERMAL_PROTECTION_CHEST - if(thermal_protection_flags & GROIN) - thermal_protection += THERMAL_PROTECTION_GROIN - if(thermal_protection_flags & LEG_LEFT) - thermal_protection += THERMAL_PROTECTION_LEG_LEFT - if(thermal_protection_flags & LEG_RIGHT) - thermal_protection += THERMAL_PROTECTION_LEG_RIGHT - if(thermal_protection_flags & FOOT_LEFT) - thermal_protection += THERMAL_PROTECTION_FOOT_LEFT - if(thermal_protection_flags & FOOT_RIGHT) - thermal_protection += THERMAL_PROTECTION_FOOT_RIGHT - if(thermal_protection_flags & ARM_LEFT) - thermal_protection += THERMAL_PROTECTION_ARM_LEFT - if(thermal_protection_flags & ARM_RIGHT) - thermal_protection += THERMAL_PROTECTION_ARM_RIGHT - if(thermal_protection_flags & HAND_LEFT) - thermal_protection += THERMAL_PROTECTION_HAND_LEFT - if(thermal_protection_flags & HAND_RIGHT) - thermal_protection += THERMAL_PROTECTION_HAND_RIGHT - - - return min(1,thermal_protection) - //See proc/get_heat_protection_flags(temperature) for the description of this proc. /mob/living/carbon/human/proc/get_cold_protection_flags(temperature) var/thermal_protection_flags = 0 @@ -251,17 +220,42 @@ return thermal_protection_flags -/mob/living/carbon/human/proc/get_cold_protection(temperature) -//CITADEL EDIT Mandatory for vore code. - if(istype(loc, /obj/item/dogborg/sleeper)) - return TRUE //freezing to death in sleepers ruins fun. - if(isbelly(loc)) - return TRUE - if(ismob(loc)) - return TRUE //because lazy and being inside somemone insulates you from space -//END EDIT - temperature = max(temperature, 2.7) //There is an occasional bug where the temperature is miscalculated in ares with a small amount of gas on them, so this is necessary to ensure that that bug does not affect this calculation. Space's temperature is 2.7K and most suits that are intended to protect against any cold, protect down to 2.0K. - var/thermal_protection_flags = get_cold_protection_flags(temperature) +/mob/living/carbon/human/proc/get_thermal_protection(temperature, cold = FALSE) + if(cold) + //CITADEL EDIT Mandatory for vore code. + if(istype(loc, /obj/item/dogborg/sleeper) || isbelly(loc) || ismob(loc)) + return 1 //freezing to death in sleepers ruins fun. + //END EDIT + temperature = max(temperature, 2.7) //There is an occasional bug where the temperature is miscalculated in ares with a small amount of gas on them, so this is necessary to ensure that that bug does not affect this calculation. Space's temperature is 2.7K and most suits that are intended to protect against any cold, protect down to 2.0K. + var/thermal_protection_flags = cold ? get_cold_protection_flags(temperature) : get_heat_protection_flags(temperature) + var/missing_body_parts_flags = ~get_body_parts_flags() + var/max_protection = 1 + if(missing_body_parts_flags) //I don't like copypasta as much as proc overhead. Do you want me to make these into a macro? + DISABLE_BITFIELD(thermal_protection_flags, missing_body_parts_flags) + if(missing_body_parts_flags & HEAD) + max_protection -= THERMAL_PROTECTION_HEAD + if(missing_body_parts_flags & CHEST) + max_protection -= THERMAL_PROTECTION_CHEST + if(missing_body_parts_flags & GROIN) + max_protection -= THERMAL_PROTECTION_GROIN + if(missing_body_parts_flags & LEG_LEFT) + max_protection -= THERMAL_PROTECTION_LEG_LEFT + if(missing_body_parts_flags & LEG_RIGHT) + max_protection -= THERMAL_PROTECTION_LEG_RIGHT + if(missing_body_parts_flags & FOOT_LEFT) + max_protection -= THERMAL_PROTECTION_FOOT_LEFT + if(missing_body_parts_flags & FOOT_RIGHT) + max_protection -= THERMAL_PROTECTION_FOOT_RIGHT + if(missing_body_parts_flags & ARM_LEFT) + max_protection -= THERMAL_PROTECTION_ARM_LEFT + if(missing_body_parts_flags & ARM_RIGHT) + max_protection -= THERMAL_PROTECTION_ARM_RIGHT + if(missing_body_parts_flags & HAND_LEFT) + max_protection -= THERMAL_PROTECTION_HAND_LEFT + if(missing_body_parts_flags & HAND_RIGHT) + max_protection -= THERMAL_PROTECTION_HAND_RIGHT + if(max_protection == 0) //Is it even a man if it doesn't have a body at all? Early return to avoid division by zero. + return 1 var/thermal_protection = 0 if(thermal_protection_flags) @@ -288,7 +282,7 @@ if(thermal_protection_flags & HAND_RIGHT) thermal_protection += THERMAL_PROTECTION_HAND_RIGHT - return min(1,thermal_protection) + return round(thermal_protection/max_protection, 0.001) /mob/living/carbon/human/handle_random_events() //Puke if toxloss is too high diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 025e933356..7ff4f355d5 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -43,6 +43,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/exotic_blood = "" // If your race wants to bleed something other than bog standard blood, change this to reagent id. var/exotic_bloodtype = "" //If your race uses a non standard bloodtype (A+, O-, AB-, etc) var/meat = /obj/item/reagent_containers/food/snacks/meat/slab/human //What the species drops on gibbing + var/list/gib_types = list(/obj/effect/gibspawner/human, /obj/effect/gibspawner/human/bodypartless) var/skinned_type var/liked_food = NONE var/disliked_food = GROSS @@ -81,7 +82,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/sound/attack_sound = 'sound/weapons/punch1.ogg' var/sound/miss_sound = 'sound/weapons/punchmiss.ogg' - var/mob/living/list/ignored_by = list() // list of mobs that will ignore this species + var/list/mob/living/ignored_by = list() // list of mobs that will ignore this species //Breathing! var/obj/item/organ/lungs/mutantlungs = null var/breathid = "o2" @@ -117,11 +118,14 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) ..() -/proc/generate_selectable_species() +/proc/generate_selectable_species(clear = FALSE) + if(clear) + GLOB.roundstart_races = list() + GLOB.roundstart_race_names = list() for(var/I in subtypesof(/datum/species)) var/datum/species/S = new I if(S.check_roundstart_eligible()) - GLOB.roundstart_races += S.id + GLOB.roundstart_races |= S.id GLOB.roundstart_race_names["[S.name]"] = S.id qdel(S) if(!GLOB.roundstart_races.len) @@ -1475,7 +1479,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) /datum/species/proc/harm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) - if(HAS_TRAIT(user, TRAIT_PACIFISM)) + if(!attacker_style && HAS_TRAIT(user, TRAIT_PACIFISM)) to_chat(user, "You don't want to harm [target]!") return FALSE if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) //CITADEL CHANGE - makes it impossible to punch while in stamina softcrit @@ -1677,6 +1681,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) return if(M.mind) attacker_style = M.mind.martial_art + if(attacker_style?.pacifism_check && HAS_TRAIT(M, TRAIT_PACIFISM)) // most martial arts are quite harmful, alas. + attacker_style = null if((M != H) && M.a_intent != INTENT_HELP && H.check_shields(M, 0, M.name, attack_type = UNARMED_ATTACK)) log_combat(M, H, "attempted to touch") H.visible_message("[M] attempted to touch [H]!") @@ -1755,7 +1761,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) switch(hit_area) if(BODY_ZONE_HEAD) - if(!I.is_sharp() && armor_block < 50) + if(!I.get_sharpness() && armor_block < 50) if(prob(I.force)) H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 20) if(H.stat == CONSCIOUS) @@ -1788,7 +1794,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) H.update_inv_glasses() if(BODY_ZONE_CHEST) - if(H.stat == CONSCIOUS && !I.is_sharp() && armor_block < 50) + if(H.stat == CONSCIOUS && !I.get_sharpness() && armor_block < 50) if(prob(I.force)) H.visible_message("[H] has been knocked down!", \ "[H] has been knocked down!") @@ -2034,13 +2040,13 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) natural = H.natural_bodytemperature_stabilization() var/thermal_protection = 1 if(loc_temp < H.bodytemperature) //Place is colder than we are - thermal_protection -= H.get_cold_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to. + thermal_protection -= H.get_thermal_protection(loc_temp, TRUE) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to. if(H.bodytemperature < BODYTEMP_NORMAL) //we're cold, insulation helps us retain body heat and will reduce the heat we lose to the environment H.adjust_bodytemperature((thermal_protection+1)*natural + max(thermal_protection * (loc_temp - H.bodytemperature) / BODYTEMP_COLD_DIVISOR, BODYTEMP_COOLING_MAX)) else //we're sweating, insulation hinders our ability to reduce heat - and it will reduce the amount of cooling you get from the environment H.adjust_bodytemperature(natural*(1/(thermal_protection+1)) + max((thermal_protection * (loc_temp - H.bodytemperature) + BODYTEMP_NORMAL - H.bodytemperature) / BODYTEMP_COLD_DIVISOR , BODYTEMP_COOLING_MAX)) //Extra calculation for hardsuits to bleed off heat else //Place is hotter than we are - thermal_protection -= H.get_heat_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to. + thermal_protection -= H.get_thermal_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to. if(H.bodytemperature < BODYTEMP_NORMAL) //and we're cold, insulation enhances our ability to retain body heat but reduces the heat we get from the environment H.adjust_bodytemperature((thermal_protection+1)*natural + min(thermal_protection * (loc_temp - H.bodytemperature) / BODYTEMP_HEAT_DIVISOR, BODYTEMP_HEATING_MAX)) else //we're sweating, insulation hinders out ability to reduce heat - but will reduce the amount of heat we get from the environment @@ -2179,7 +2185,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(!(I.resistance_flags & FIRE_PROOF)) I.take_damage(H.fire_stacks, BURN, "fire", 0) - var/thermal_protection = H.get_thermal_protection() + var/thermal_protection = H.easy_thermal_protection() if(thermal_protection >= FIRE_IMMUNITY_MAX_TEMP_PROTECT && !no_protection) return diff --git a/code/modules/mob/living/carbon/human/species_types/android.dm b/code/modules/mob/living/carbon/human/species_types/android.dm index 9f2c07694c..a36835fbb3 100644 --- a/code/modules/mob/living/carbon/human/species_types/android.dm +++ b/code/modules/mob/living/carbon/human/species_types/android.dm @@ -6,6 +6,7 @@ inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_NOFIRE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_LIMBATTACHMENT) inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID) meat = null + gib_types = /obj/effect/gibspawner/robot damage_overlay_type = "synth" mutanttongue = /obj/item/organ/tongue/robot limbs_id = "synth" 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 d264f11b73..02163eaaed 100644 --- a/code/modules/mob/living/carbon/human/species_types/bugmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/bugmen.dm @@ -1,9 +1,8 @@ /datum/species/insect name = "Anthromorphic Insect" id = "insect" - say_mod = "flutters" default_color = "00FF00" - species_traits = list(LIPS,NOEYES,HAIR,FACEHAIR,MUTCOLORS,HORNCOLOR,WINGCOLOR) + species_traits = list(LIPS,EYECOLOR,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", @@ -12,54 +11,36 @@ attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/insect - liked_food = VEGETABLES | DAIRY - disliked_food = FRUIT | GROSS - toxic_food = MEAT | RAW - mutanteyes = /obj/item/organ/eyes/insect + liked_food = MEAT | FRUIT + disliked_food = TOXIC should_draw_citadel = TRUE - exotic_bloodtype = "BUG" -/datum/species/insect/on_species_gain(mob/living/carbon/C) +/datum/species/insect/spec_death(gibbed, mob/living/carbon/human/H) + if(H) + stop_wagging_tail(H) + +/datum/species/insect/spec_stun(mob/living/carbon/human/H,amount) + if(H) + stop_wagging_tail(H) . = ..() - if(ishuman(C)) - var/mob/living/carbon/human/H = C - if(!H.dna.features["insect_wings"]) - H.dna.features["insect_wings"] = "[(H.client && H.client.prefs && LAZYLEN(H.client.prefs.features) && H.client.prefs.features["insect_wings"]) ? H.client.prefs.features["insect_wings"] : "None"]" - handle_mutant_bodyparts(H) -/datum/species/insect/random_name(gender,unique,lastname) - if(unique) - return random_unique_moth_name() +/datum/species/insect/can_wag_tail(mob/living/carbon/human/H) + return ("mam_tail" in mutant_bodyparts) || ("mam_waggingtail" in mutant_bodyparts) - var/randname = moth_name() +/datum/species/insect/is_wagging_tail(mob/living/carbon/human/H) + return ("mam_waggingtail" in mutant_bodyparts) - if(lastname) - randname += " [lastname]" +/datum/species/insect/start_wagging_tail(mob/living/carbon/human/H) + if("mam_tail" in mutant_bodyparts) + mutant_bodyparts -= "mam_tail" + mutant_bodyparts |= "mam_waggingtail" + H.update_body() - return randname +/datum/species/insect/stop_wagging_tail(mob/living/carbon/human/H) + if("mam_waggingtail" in mutant_bodyparts) + mutant_bodyparts -= "mam_waggingtail" + mutant_bodyparts |= "mam_tail" + H.update_body() -/datum/species/insect/handle_fire(mob/living/carbon/human/H, no_protection = FALSE) - ..() - if(H.dna.features["insect_wings"] != "Burnt Off" && H.dna.features["insect_wings"] != "None" && H.bodytemperature >= 800 && H.fire_stacks > 0) //do not go into the extremely hot light. you will not survive - to_chat(H, "Your precious wings burn to a crisp!") - if(H.dna.features["insect_wings"] != "None") - H.dna.features["insect_wings"] = "Burnt Off" - handle_mutant_bodyparts(H) - -/datum/species/insect/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) - . = ..() - if(chem.id == "pestkiller") - H.adjustToxLoss(3) - H.reagents.remove_reagent(chem.id, REAGENTS_METABOLISM) - -/datum/species/insect/check_weakness(obj/item/weapon, mob/living/attacker) - if(istype(weapon, /obj/item/melee/flyswatter)) - return 9 //flyswatters deal 10x damage to insects - return 0 - -/datum/species/insect/space_move(mob/living/carbon/human/H) - . = ..() - if(H.loc && !isspaceturf(H.loc) && (H.dna.features["insect_wings"] != "Burnt Off" && H.dna.features["insect_wings"] != "None")) - var/datum/gas_mixture/current = H.loc.return_air() - if(current && (current.return_pressure() >= ONE_ATMOSPHERE*0.85)) //as long as there's reasonable pressure and no gravity, flight is possible - return TRUE +/datum/species/insect/qualifies_for_rank(rank, list/features) + return TRUE \ No newline at end of file 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 146090b366..3de530ff5b 100644 --- a/code/modules/mob/living/carbon/human/species_types/corporate.dm +++ b/code/modules/mob/living/carbon/human/species_types/corporate.dm @@ -17,4 +17,5 @@ use_skintones = 0 species_traits = list(NOBLOOD,EYECOLOR,NOGENITALS) inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOLIMBDISABLE,TRAIT_NOHUNGER) - sexes = 0 \ No newline at end of file + sexes = 0 + gib_types = /obj/effect/gibspawner/robot \ 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 eba4ff6d2f..96d52dcb27 100644 --- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm +++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm @@ -18,6 +18,8 @@ var/obj/item/dullahan_relay/myhead /datum/species/dullahan/pumpkin + name = "Pumpkin Head Dullahan" + id = "pumpkindullahan" pumpkin = TRUE /datum/species/dullahan/check_roundstart_eligible() @@ -27,7 +29,7 @@ /datum/species/dullahan/on_species_gain(mob/living/carbon/human/H, datum/species/old_species) . = ..() - H.flags_1 &= ~HEAR_1 + DISABLE_BITFIELD(H.flags_1, HEAR_1) var/obj/item/bodypart/head/head = H.get_bodypart(BODY_ZONE_HEAD) if(head) if(pumpkin)//Pumpkinhead! @@ -36,16 +38,16 @@ 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() + if(!QDELETED(head)) //drop_limb() deletes the limb if it's no drop location and dummy humans used for rendering icons are located in nullspace. Do the math. + 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 + ENABLE_BITFIELD(H.flags_1, HEAR_1) H.reset_perspective(H) if(myhead) var/obj/item/dullahan_relay/DR = myhead @@ -84,7 +86,7 @@ /obj/item/organ/tongue/dullahan/handle_speech(datum/source, list/speech_args) if(ishuman(owner)) var/mob/living/carbon/human/H = owner - if(H.dna.species.id == "dullahan") + if(isdullahan(H)) var/datum/species/dullahan/D = H.dna.species if(isobj(D.myhead.loc)) var/obj/O = D.myhead.loc @@ -99,6 +101,7 @@ desc = "An abstraction." actions_types = list(/datum/action/item_action/organ_action/dullahan) zone = "abstract" + tint = INFINITY // used to switch the vision perspective to the head on species_gain(). /datum/action/item_action/organ_action/dullahan name = "Toggle Perspective" @@ -114,37 +117,53 @@ if(ishuman(owner)) var/mob/living/carbon/human/H = owner - if(H.dna.species.id == "dullahan") + if(isdullahan(H)) var/datum/species/dullahan/D = H.dna.species D.update_vision_perspective(H) /obj/item/dullahan_relay + name = "dullahan relay" var/mob/living/owner flags_1 = HEAR_1 -/obj/item/dullahan_relay/Initialize(mapload,new_owner) +/obj/item/dullahan_relay/Initialize(mapload, mob/living/carbon/human/new_owner) . = ..() + if(!new_owner) + return INITIALIZE_HINT_QDEL owner = new_owner START_PROCESSING(SSobj, src) + RegisterSignal(owner, COMSIG_MOB_EXAMINATE, .proc/examinate_check) + RegisterSignal(src, COMSIG_ATOM_HEARER_IN_VIEW, .proc/include_owner) + RegisterSignal(owner, COMSIG_LIVING_REGENERATE_LIMBS, .proc/unlist_head) + RegisterSignal(owner, COMSIG_LIVING_FULLY_HEAL, .proc/retrieve_head) + +/obj/item/dullahan_relay/proc/examinate_check(mob/source, atom/A) + if(source.client.eye == src && ((A in view(source.client.view, src)) || (isturf(A) && source.sight & SEE_TURFS) || (ismob(A) && source.sight & SEE_MOBS) || (isobj(A) && source.sight & SEE_OBJS))) + return COMPONENT_ALLOW_EXAMINE + +/obj/item/dullahan_relay/proc/include_owner(datum/source, list/processing_list, list/hearers) + if(!QDELETED(owner)) + hearers += owner + +/obj/item/dullahan_relay/proc/unlist_head(datum/source, noheal = FALSE, list/excluded_limbs) + excluded_limbs |= BODY_ZONE_HEAD // So we don't gib when regenerating limbs. + +/obj/item/dullahan_relay/proc/retrieve_head(datum/source, admin_revive = FALSE) + if(admin_revive) //retrieving the owner's head for ahealing purposes. + var/obj/item/bodypart/head/H = loc + var/turf/T = get_turf(owner) + if(H && istype(H) && T && !(H in owner.GetAllContents())) + H.forceMove(T) /obj/item/dullahan_relay/process() if(!istype(loc, /obj/item/bodypart/head) || QDELETED(owner)) . = PROCESS_KILL qdel(src) -/obj/item/dullahan_relay/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) - . = ..() - if(!QDELETED(owner)) - message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode) - to_chat(owner,message) - else - qdel(src) - - /obj/item/dullahan_relay/Destroy() if(!QDELETED(owner)) var/mob/living/carbon/human/H = owner - if(H.dna.species.id == "dullahan") + if(isdullahan(H)) var/datum/species/dullahan/D = H.dna.species D.myhead = null owner.gib() 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 90714b390c..1e4b3e9fae 100644 --- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -64,6 +64,7 @@ attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' meat = /obj/item/reagent_containers/food/snacks/meat/slab/xeno + gib_types = list(/obj/effect/gibspawner/xeno/xenoperson, /obj/effect/gibspawner/xeno/xenoperson/bodypartless) skinned_type = /obj/item/stack/sheet/animalhide/xeno exotic_bloodtype = "X*" damage_overlay_type = "xeno" 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 a7e952f430..edd0be01b0 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -796,7 +796,7 @@ if(resistance_flags & ON_FIRE) return - if(P.is_hot()) + if(P.get_temperature()) visible_message("[src] bursts into flames!") fire_act() 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 135c98860a..4249be098f 100644 --- a/code/modules/mob/living/carbon/human/species_types/ipc.dm +++ b/code/modules/mob/living/carbon/human/species_types/ipc.dm @@ -11,6 +11,7 @@ mutant_bodyparts = list("ipc_screen", "ipc_antenna") default_features = list("ipc_screen" = "Blank", "ipc_antenna" = "None") meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/ipc + gib_types = list(/obj/effect/gibspawner/ipc, /obj/effect/gibspawner/ipc/bodypartless) mutanttongue = /obj/item/organ/tongue/robot/ipc mutant_heart = /obj/item/organ/heart/ipc exotic_bloodtype = "HF" 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 71eaa5ae22..7d568ed510 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -11,6 +11,7 @@ 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 + gib_types = list(/obj/effect/gibspawner/slime, /obj/effect/gibspawner/slime/bodypartless) exotic_blood = "jellyblood" exotic_bloodtype = "GEL" damage_overlay_type = "" 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 a719f2eda0..c0973102d6 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -18,6 +18,7 @@ attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/lizard + gib_types = list(/obj/effect/gibspawner/lizard, /obj/effect/gibspawner/lizard/bodypartless) skinned_type = /obj/item/stack/sheet/animalhide/lizard exotic_bloodtype = "L" disliked_food = GRAIN | DAIRY 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 09fc26d04f..90f63467a0 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -78,7 +78,7 @@ icon_state = "brain-x-d" var/obj/effect/proc_holder/spell/targeted/shadowwalk/shadowwalk -/obj/item/organ/brain/nightmare/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/brain/nightmare/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) ..() if(M.dna.species.id != "nightmare") M.set_species(/datum/species/shadow/nightmare) @@ -118,7 +118,7 @@ user.temporarilyRemoveItemFromInventory(src, TRUE) Insert(user) -/obj/item/organ/heart/nightmare/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/heart/nightmare/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) ..() if(special != HEART_SPECIAL_SHADOWIFY) blade = new/obj/item/light_eater 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 ac18580e9b..5cd1a599ad 100644 --- a/code/modules/mob/living/carbon/human/species_types/synths.dm +++ b/code/modules/mob/living/carbon/human/species_types/synths.dm @@ -9,6 +9,7 @@ dangerous_existence = 1 blacklisted = 1 meat = null + gib_types = /obj/effect/gibspawner/robot damage_overlay_type = "synth" limbs_id = "synth" var/list/initial_species_traits = list(NOTRANSSTING) //for getting these values back for assume_disguise() diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index a68aded85f..ae69d5dc90 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -126,7 +126,7 @@ There are several things that need to be remembered: 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' + alt_worn = 'icons/mob/uniform_digi.dmi' var/mutable_appearance/uniform_overlay @@ -306,7 +306,7 @@ There are several things that need to be remembered: update_observer_view(shoes,1) if(S.mutantrace_variation) if(S.adjusted == ALT_STYLE) - S.alternate_worn_icon = 'modular_citadel/icons/mob/digishoes.dmi' + S.alternate_worn_icon = 'icons/mob/feet_digi.dmi' else S.alternate_worn_icon = null var/t_state = shoes.item_state @@ -336,7 +336,7 @@ There are several things that need to be remembered: if(!t_state) t_state = s_store.icon_state overlays_standing[SUIT_STORE_LAYER] = mutable_appearance(((s_store.alternate_worn_icon) ? s_store.alternate_worn_icon : 'icons/mob/belt_mirror.dmi'), t_state, -SUIT_STORE_LAYER) - var/mutable_appearance/s_store_overlay = overlays_standing[SUIT_LAYER] + var/mutable_appearance/s_store_overlay = overlays_standing[SUIT_STORE_LAYER] if(OFFSET_S_STORE in dna.species.offset_features) s_store_overlay.pixel_x += dna.species.offset_features[OFFSET_S_STORE][1] s_store_overlay.pixel_y += dna.species.offset_features[OFFSET_S_STORE][2] @@ -352,7 +352,7 @@ There are several things that need to be remembered: var/obj/item/clothing/head/H = head if(H.mutantrace_variation) if(H.muzzle_var == ALT_STYLE) - H.alternate_worn_icon = 'modular_citadel/icons/mob/muzzled_helmet.dmi' + H.alternate_worn_icon = 'icons/mob/head_muzzled.dmi' else H.alternate_worn_icon = null @@ -400,29 +400,29 @@ There are several things that need to be remembered: if(wear_suit) var/obj/item/clothing/suit/S = wear_suit - var/no_taur_thanks = FALSE + var/item_level_support = FALSE // LISTEN! If you must degrade the code with further snowflake checks, at least keep it compatible with worn non-clothing items! if(!istype(S)) - no_taur_thanks = TRUE + item_level_support = TRUE wear_suit.screen_loc = ui_oclothing if(client && hud_used && hud_used.hud_shown) if(hud_used.inventory_shown) client.screen += wear_suit update_observer_view(wear_suit,1) - if(!S.force_alternate_icon) - if(!no_taur_thanks && S.mutantrace_variation) //Just make sure we've got this checked too + if(!item_level_support && !S.force_alternate_icon) + if(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' + S.alternate_worn_icon = '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' + S.alternate_worn_icon = 'icons/mob/taur_naga.dmi' if(S.taurmode == PAW_TAURIC) - S.alternate_worn_icon = 'modular_citadel/icons/mob/taur_canine.dmi' + S.alternate_worn_icon = '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' + S.alternate_worn_icon = 'icons/mob/suit_digi.dmi' else if(S.taurmode == NOT_TAURIC && S.adjusted == NORMAL_STYLE) S.alternate_worn_icon = null @@ -431,7 +431,7 @@ There are several things that need to be remembered: if(OFFSET_SUIT in dna.species.offset_features) suit_overlay.pixel_x += dna.species.offset_features[OFFSET_SUIT][1] suit_overlay.pixel_y += dna.species.offset_features[OFFSET_SUIT][2] - if(!no_taur_thanks && S.center) + if(!item_level_support && S.center) suit_overlay = center_image(suit_overlay, S.dimension_x, S.dimension_y) overlays_standing[SUIT_LAYER] = suit_overlay update_hair() @@ -470,7 +470,7 @@ There are several things that need to be remembered: remove_overlay(FACEMASK_LAYER) if(M.mutantrace_variation) if(M.muzzle_var == ALT_STYLE) - M.alternate_worn_icon = 'modular_citadel/icons/mob/muzzled_mask.dmi' + M.alternate_worn_icon = 'icons/mob/mask_muzzled.dmi' else M.alternate_worn_icon = null diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index ca139cace7..3c587a05dd 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -98,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) || !lungs || lungs.organ_flags & ORGAN_FAILING) + if(health <= HEALTH_THRESHOLD_FULLCRIT || (pulledby && pulledby.grab_state >= GRAB_KILL) || (lungs && 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) diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm index 452c8f8b78..30c962f9a5 100644 --- a/code/modules/mob/living/carbon/say.dm +++ b/code/modules/mob/living/carbon/say.dm @@ -17,18 +17,4 @@ if(T) . = T.could_speak_in_language(dt) else - . = initial(dt.flags) & TONGUELESS_SPEECH - -/mob/living/carbon/hear_intercept(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) - . = ..() - if(!client) - return - for(var/T in get_traumas()) - var/datum/brain_trauma/trauma = T - message = trauma.on_hear(message, speaker, message_language, raw_message, radio_freq) - - if (src.mind.has_antag_datum(/datum/antagonist/traitor)) - message = GLOB.syndicate_code_phrase_regex.Replace(message, "$1") - message = GLOB.syndicate_code_response_regex.Replace(message, "$1") - - return message + . = initial(dt.flags) & TONGUELESS_SPEECH \ No newline at end of file diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index f7dec3272c..0ff418d628 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -23,8 +23,12 @@ /mob/living/proc/gib_animation() return -/mob/living/proc/spawn_gibs() - new /obj/effect/gibspawner/generic(drop_location(), null, get_static_viruses()) +/mob/living/proc/spawn_gibs(with_bodyparts, atom/loc_override) + var/location = loc_override ? loc_override.drop_location() : drop_location() + if(MOB_ROBOTIC in mob_biotypes) + new /obj/effect/gibspawner/robot(location, src, get_static_viruses()) + else + new /obj/effect/gibspawner/generic(location, src, get_static_viruses()) /mob/living/proc/spill_organs() return diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index df711a6dca..6c1a2cfec9 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -58,9 +58,9 @@ message = "coughs!" emote_type = EMOTE_AUDIBLE -/datum/emote/living/cough/can_run_emote(mob/user, status_check = TRUE) +/datum/emote/living/cough/can_run_emote(mob/user, status_check = TRUE , intentional) . = ..() - if(user.reagents && (user.reagents.get_reagent("menthol") || user.reagents.get_reagent("peppermint_patty"))) + if(HAS_TRAIT(user, TRAIT_SOOTHED_THROAT)) return FALSE /datum/emote/living/dance diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index e893426ee9..6ced2a05a1 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -40,6 +40,16 @@ QDEL_LIST(diseases) return ..() +/mob/living/onZImpact(turf/T, levels) + if(!isgroundlessturf(T)) + ZImpactDamage(T, levels) + return ..() + +/mob/living/proc/ZImpactDamage(turf/T, levels) + visible_message("[src] crashes into [T] with a sickening noise!") + adjustBruteLoss((levels * 5) ** 1.5) + Knockdown(levels * 50) + /mob/living/proc/OpenCraftingMenu() return @@ -514,6 +524,7 @@ for(var/organ in C.internal_organs) var/obj/item/organ/O = organ O.setOrganDamage(0) + SEND_SIGNAL(src, COMSIG_LIVING_FULLY_HEAL, admin_revive) //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) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 93e64fd4cc..722c984309 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -92,6 +92,9 @@ /mob/living/mech_melee_attack(obj/mecha/M) if(M.occupant.a_intent == INTENT_HARM) + if(HAS_TRAIT(M.occupant, TRAIT_PACIFISM)) + to_chat(M.occupant, "You don't want to harm other living beings!") + return M.do_attack_animation(src) if(M.damtype == "brute") step_away(src,M,15) diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm index 1ee563bc1f..93bb9d1f8d 100644 --- a/code/modules/mob/living/living_movement.dm +++ b/code/modules/mob/living/living_movement.dm @@ -32,4 +32,7 @@ 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 + remove_movespeed_modifier(MOVESPEED_ID_PRONE_DRAGGING) + +/mob/living/canZMove(dir, turf/target) + return can_zTravel(target, dir) && (movement_type & FLYING) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 1b1eb1a805..1835d2464a 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -783,7 +783,7 @@ /mob/living/silicon/ai/can_buckle() return 0 -/mob/living/silicon/ai/incapacitated() +/mob/living/silicon/ai/incapacitated(ignore_restraints, ignore_grab) if(aiRestorePowerRoutine) return TRUE return ..() @@ -882,6 +882,7 @@ /mob/living/silicon/ai/revive(full_heal = 0, admin_revive = 0) . = ..() if(.) //successfully ressuscitated from death + set_eyeobj_visible(TRUE) set_core_display_icon(display_icon_override) /mob/living/silicon/ai/proc/malfhacked(obj/machinery/power/apc/apc) diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm index 301d2bd218..2900c89967 100644 --- a/code/modules/mob/living/silicon/ai/death.dm +++ b/code/modules/mob/living/silicon/ai/death.dm @@ -18,6 +18,7 @@ update_canmove() if(eyeobj) eyeobj.setLoc(get_turf(src)) + set_eyeobj_visible(FALSE) GLOB.shuttle_caller_list -= src SSshuttle.autoEvac() @@ -36,6 +37,8 @@ if(istype(loc, /obj/item/aicard/aitater)) loc.icon_state = "aitater-404" + else if(istype(loc, /obj/item/aicard/aispook)) + loc.icon_state = "aispook-404" else if(istype(loc, /obj/item/aicard)) loc.icon_state = "aicard-404" diff --git a/code/modules/mob/living/silicon/ai/examine.dm b/code/modules/mob/living/silicon/ai/examine.dm index fb345e10ba..5e40a5a7eb 100644 --- a/code/modules/mob/living/silicon/ai/examine.dm +++ b/code/modules/mob/living/silicon/ai/examine.dm @@ -1,26 +1,24 @@ /mob/living/silicon/ai/examine(mob/user) - var/msg = "*---------*\nThis is [icon2html(src, user)] [src]!\n" + . = list("*---------*\nThis is [icon2html(src, user)] [src]!") if (stat == DEAD) - msg += "It appears to be powered-down.\n" + . += "It appears to be powered-down." else - msg += "" + . += "" if (getBruteLoss()) if (getBruteLoss() < 30) - msg += "It looks slightly dented.\n" + . += "It looks slightly dented." else - msg += "It looks severely dented!\n" + . += "It looks severely dented!" if (getFireLoss()) if (getFireLoss() < 30) - msg += "It looks slightly charred.\n" + . += "It looks slightly charred." else - msg += "Its casing is melted and heat-warped!\n" - msg += "" + . += "Its casing is melted and heat-warped!" + . += "" if(deployed_shell) - msg += "The wireless networking light is blinking.\n" + . += "The wireless networking light is blinking." else if (!shunted && !client) - msg += "[src]Core.exe has stopped responding! NTOS is searching for a solution to the problem...\n" - msg += "*---------*" + . += "[src]Core.exe has stopped responding! NTOS is searching for a solution to the problem..." + . += "*---------*" - to_chat(user, msg) - ..() - return msg \ No newline at end of file + . += ..() \ No newline at end of file diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index 2d617355ec..c28f08d5b0 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -6,6 +6,8 @@ /mob/camera/aiEye name = "Inactive AI Eye" + icon_state = "ai_camera" + icon = 'icons/mob/cameramob.dmi' invisibility = INVISIBILITY_MAXIMUM hud_possible = list(ANTAG_HUD, AI_DETECT_HUD = HUD_LIST_LIST) var/list/visibleCameraChunks = list() @@ -158,11 +160,11 @@ cameraFollow = null unset_machine() - if(!eyeobj || !eyeobj.loc || QDELETED(eyeobj)) + if(isturf(loc) && (QDELETED(eyeobj) || !eyeobj.loc)) to_chat(src, "ERROR: Eyeobj not found. Creating new eye...") create_eye() - eyeobj.setLoc(loc) + eyeobj?.setLoc(loc) /mob/living/silicon/ai/proc/create_eye() if(eyeobj) @@ -172,6 +174,13 @@ eyeobj.ai = src eyeobj.setLoc(loc) eyeobj.name = "[name] (AI Eye)" + set_eyeobj_visible(TRUE) + +/mob/living/silicon/ai/proc/set_eyeobj_visible(state = TRUE) + if(!eyeobj) + return + eyeobj.mouse_opacity = state ? MOUSE_OPACITY_ICON : initial(eyeobj.mouse_opacity) + eyeobj.invisibility = state ? INVISIBILITY_OBSERVER : initial(eyeobj.invisibility) /mob/living/silicon/ai/verb/toggle_acceleration() set category = "AI Commands" diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 0fd33110b6..15a04235cc 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -19,7 +19,7 @@ // messenging the client malfhacked(malfhack) - if(!eyeobj || QDELETED(eyeobj) || !eyeobj.loc) + if(isturf(loc) && (QDELETED(eyeobj) || !eyeobj.loc)) view_core() if(machine) diff --git a/code/modules/mob/living/silicon/ai/login.dm b/code/modules/mob/living/silicon/ai/login.dm index 50e2a46bf4..a40022a12f 100644 --- a/code/modules/mob/living/silicon/ai/login.dm +++ b/code/modules/mob/living/silicon/ai/login.dm @@ -6,6 +6,7 @@ O.mode = 1 O.emotion = "Neutral" O.update() + set_eyeobj_visible(TRUE) if(multicam_on) end_multicam() view_core() diff --git a/code/modules/mob/living/silicon/ai/logout.dm b/code/modules/mob/living/silicon/ai/logout.dm index 58e2ec56f4..22d67ef53f 100644 --- a/code/modules/mob/living/silicon/ai/logout.dm +++ b/code/modules/mob/living/silicon/ai/logout.dm @@ -4,4 +4,5 @@ var/obj/machinery/status_display/ai/O = each O.mode = 0 O.update() + set_eyeobj_visible(FALSE) view_core() diff --git a/code/modules/mob/living/silicon/ai/multicam.dm b/code/modules/mob/living/silicon/ai/multicam.dm index fcc068b7fe..b358cefda4 100644 --- a/code/modules/mob/living/silicon/ai/multicam.dm +++ b/code/modules/mob/living/silicon/ai/multicam.dm @@ -120,6 +120,9 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room) /mob/camera/aiEye/pic_in_pic name = "Secondary AI Eye" + invisibility = INVISIBILITY_OBSERVER + mouse_opacity = MOUSE_OPACITY_ICON + icon_state = "ai_pip_camera" var/obj/screen/movable/pic_in_pic/ai/screen var/list/cameras_telegraphed = list() var/telegraph_cameras = TRUE diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm index f757203237..112add367f 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", message_language = language) + send_speech(message, 7, T, "robot", language) to_chat(src, "Holopad transmitted, [real_name] \"[message]\"") else to_chat(src, "No holopad connected.") diff --git a/code/modules/mob/living/silicon/death.dm b/code/modules/mob/living/silicon/death.dm index 8ecacb608b..48486c0255 100644 --- a/code/modules/mob/living/silicon/death.dm +++ b/code/modules/mob/living/silicon/death.dm @@ -1,5 +1,5 @@ -/mob/living/silicon/spawn_gibs() - new /obj/effect/gibspawner/robot(drop_location()) +/mob/living/silicon/spawn_gibs(with_bodyparts, atom/loc_override) + new /obj/effect/gibspawner/robot(loc_override ? loc_override.drop_location() : drop_location(), src) /mob/living/silicon/spawn_dust() new /obj/effect/decal/remains/robot(loc) diff --git a/code/modules/mob/living/silicon/examine.dm b/code/modules/mob/living/silicon/examine.dm index c26af70d4a..37107f2d9c 100644 --- a/code/modules/mob/living/silicon/examine.dm +++ b/code/modules/mob/living/silicon/examine.dm @@ -1,4 +1,6 @@ /mob/living/silicon/examine(mob/user) //Displays a silicon's laws to ghosts + . = ..() if(laws && isobserver(user)) - to_chat(user, "[src] has the following laws:") - laws.show_laws(user) \ No newline at end of file + . += "[src] has the following laws:" + for(var/law in laws.get_law_list(include_zeroth = TRUE)) + . += law \ No newline at end of file diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 0f8687397d..7ec63cf415 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -58,7 +58,10 @@ var/canholo = TRUE var/obj/item/card/id/access_card = null var/chassis = "repairbot" - var/list/possible_chassis = list("cat" = TRUE, "mouse" = TRUE, "monkey" = TRUE, "corgi" = FALSE, "fox" = FALSE, "repairbot" = TRUE, "rabbit" = TRUE) //assoc value is whether it can be picked up. + var/list/possible_chassis = list("cat" = TRUE, "mouse" = TRUE, "monkey" = TRUE, "corgi" = FALSE, + "fox" = FALSE, "repairbot" = TRUE, "rabbit" = TRUE, "borgi" = FALSE , + "parrot" = FALSE, "bear" = FALSE , "mushroom" = FALSE, "crow" = FALSE , + "fairy" = FALSE , "spiderbot" = FALSE) //assoc value is whether it can be picked up. var/static/item_head_icon = 'icons/mob/pai_item_head.dmi' var/static/item_lh_icon = 'icons/mob/pai_item_lh.dmi' var/static/item_rh_icon = 'icons/mob/pai_item_rh.dmi' @@ -266,8 +269,8 @@ return TRUE /mob/living/silicon/pai/examine(mob/user) - ..() - to_chat(user, "A personal AI in holochassis mode. Its master ID string seems to be [master].") + . = ..() + . += "A personal AI in holochassis mode. Its master ID string seems to be [master]." /mob/living/silicon/pai/Life() if(stat == DEAD) diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index 0e8d37a807..9882d028d1 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -140,7 +140,7 @@ radio.attack_self(src) if("image") - var/newImage = input("Select your new display image.", "Display Image", "Happy") in list("Happy", "Cat", "Extremely Happy", "Face", "Laugh", "Off", "Sad", "Angry", "What" , "Exclamation" ,"Question") // CITADEL EDIT + var/newImage = input("Select your new display image.", "Display Image", "Happy") in list("Happy", "Cat", "Extremely Happy", "Face", "Laugh", "Off", "Sad", "Angry", "What" , "Exclamation" ,"Question", "Sunglasses") var/pID = 1 switch(newImage) @@ -164,10 +164,12 @@ pID = 9 if("Null") pID = 10 - if("Exclamation") // CITADEL EDIT + if("Exclamation") pID = 11 - if("Question") // CITADEL EDIT + if("Question") pID = 12 + if("Sunglasses") + pID = 13 card.setEmotion(pID) if("signaller") diff --git a/code/modules/mob/living/silicon/robot/examine.dm b/code/modules/mob/living/silicon/robot/examine.dm index 5e56b4180d..63b275a416 100644 --- a/code/modules/mob/living/silicon/robot/examine.dm +++ b/code/modules/mob/living/silicon/robot/examine.dm @@ -1,55 +1,53 @@ /mob/living/silicon/robot/examine(mob/user) - var/msg = "*---------*\nThis is [icon2html(src, user)] \a [src], a [src.module.name]!\n" + . = list("*---------*\nThis is [icon2html(src, user)] \a [src], a [src.module.name] unit!") if(desc) - msg += "[desc]\n" + . += "[desc]" var/obj/act_module = get_active_held_item() if(act_module) - msg += "It is holding [icon2html(act_module, user)] \a [act_module].\n" - msg += status_effect_examines() - msg += "" - if (src.getBruteLoss()) - if (src.getBruteLoss() < maxHealth*0.5) - msg += "It looks slightly dented.\n" + . += "It is holding [icon2html(act_module, user)] \a [act_module]." + var/effects_exam = status_effect_examines() + if(!isnull(effects_exam)) + . += effects_exam + if (getBruteLoss()) + if (getBruteLoss() < maxHealth*0.5) + . += "It looks slightly dented." else - msg += "It looks severely dented!\n" + . += "It looks severely dented!" if (getFireLoss() || getToxLoss()) var/overall_fireloss = getFireLoss() + getToxLoss() if (overall_fireloss < maxHealth * 0.5) - msg += "It looks slightly charred.\n" + . += "It looks slightly charred." else - msg += "It looks severely burnt and heat-warped!\n" - if (src.health < -maxHealth*0.5) - msg += "It looks barely operational.\n" - if (src.fire_stacks < 0) - msg += "It's covered in water.\n" - else if (src.fire_stacks > 0) - msg += "It's coated in something flammable.\n" - msg += "" + . += "It looks slightly charred." + if (health < -maxHealth*0.5) + . += "It looks barely operational." + if (fire_stacks < 0) + . += "It's covered in water." + else if (fire_stacks > 0) + . += "It's coated in something flammable." if(opened) - msg += "Its cover is open and the power cell is [cell ? "installed" : "missing"].\n" + . += "Its cover is open and the power cell is [cell ? "installed" : "missing"]." else - msg += "Its cover is closed[locked ? "" : ", and looks unlocked"].\n" + . += "Its cover is closed[locked ? "" : ", and looks unlocked"]." if(cell && cell.charge <= 0) - msg += "Its battery indicator is blinking red!\n" + . += "Its battery indicator is blinking red!" if(is_servant_of_ratvar(src) && get_dist(user, src) <= 1 && !stat) //To counter pseudo-stealth by using headlamps - msg += "Its eyes are glowing a blazing yellow!\n" + . += "Its eyes are glowing a blazing yellow!" switch(stat) if(CONSCIOUS) if(shell) - msg += "It appears to be an [deployed ? "active" : "empty"] AI shell.\n" + . += "It appears to be an [deployed ? "active" : "empty"] AI shell." else if(!client) - msg += "It appears to be in stand-by mode.\n" //afk + . += "It appears to be in stand-by mode." //afk if(UNCONSCIOUS) - msg += "It doesn't seem to be responding.\n" + . += "It doesn't seem to be responding." if(DEAD) - msg += "It looks like its system is corrupted and requires a reset.\n" - msg += "*---------*" + . += "It looks like its system is corrupted and requires a reset." + . += "*---------*" - to_chat(user, msg) - ..() - return msg + . += ..() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 5b670aaa42..c7aa882620 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -110,6 +110,7 @@ var/sitting = 0 var/bellyup = 0 + var/dogborg = FALSE /mob/living/silicon/robot/get_cell() return cell @@ -232,15 +233,14 @@ var/list/modulelist = list("Standard" = /obj/item/robot_module/standard, \ "Engineering" = /obj/item/robot_module/engineering, \ "Medical" = /obj/item/robot_module/medical, \ + "Medihound" = /obj/item/robot_module/medihound, \ "Miner" = /obj/item/robot_module/miner, \ - "Janitor" = /obj/item/robot_module/janitor, \ "Service" = /obj/item/robot_module/butler) if(!CONFIG_GET(flag/disable_peaceborg)) modulelist["Peacekeeper"] = /obj/item/robot_module/peacekeeper if(BORG_SEC_AVAILABLE) modulelist["Security"] = /obj/item/robot_module/security - - modulelist += get_cit_modules() //Citadel change - adds Citadel's borg modules. + modulelist["Security K-9"] = /obj/item/robot_module/k9 var/input_module = input("Please, select a module!", "Robot", null, null) as null|anything in modulelist if(!input_module || module.type != /obj/item/robot_module) @@ -879,9 +879,6 @@ /mob/living/silicon/robot/modules/miner set_module = /obj/item/robot_module/miner -/mob/living/silicon/robot/modules/janitor - set_module = /obj/item/robot_module/janitor - /mob/living/silicon/robot/modules/syndicate icon_state = "synd_sec" faction = list(ROLE_SYNDICATE) @@ -920,6 +917,17 @@ Help the operatives secure the disk at all costs!
    " set_module = /obj/item/robot_module/syndicate_medical +/mob/living/silicon/robot/modules/syndicate/saboteur + icon_state = "synd_engi" + playstyle_string = "You are a Syndicate saboteur cyborg!
    \ + You are armed with robust engineering tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \ + Your destination tagger will allow you to stealthily traverse the disposal network across the station \ + Your welder will allow you to repair the operatives' exosuits, but also yourself and your fellow cyborgs \ + Your cyborg chameleon projector allows you to assume the appearance and registered name of a Nanotrasen engineering borg, and undertake covert actions on the station \ + Be aware that almost any physical contact or incidental damage will break your camouflage \ + Help the operatives secure the disk at all costs!" + set_module = /obj/item/robot_module/saboteur + /mob/living/silicon/robot/proc/notify_ai(notifytype, oldname, newname) if(!connected_ai) return @@ -1256,6 +1264,20 @@ for(var/i in connected_ai.aicamera.stored) aicamera.stored[i] = TRUE +/mob/living/silicon/robot/lay_down() + ..() + update_canmove() + +/mob/living/silicon/robot/update_canmove() + ..() + if(client && stat != DEAD && dogborg == FALSE) + if(resting) + cut_overlays() + icon_state = "[module.cyborg_base_icon]-rest" + else + icon_state = "[module.cyborg_base_icon]" + update_icons() + /mob/living/silicon/robot/proc/rest_style() set name = "Switch Rest Style" set category = "Robot Commands" @@ -1271,4 +1293,8 @@ sitting = 1 if("Belly up") bellyup = 1 - update_icons() \ No newline at end of file + update_icons() + +/mob/living/silicon/robot/adjustStaminaLossBuffered(amount, updating_stamina = 1) + if(istype(cell)) + cell.charge -= amount*5 \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index abd2019fba..56011cb886 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -34,6 +34,14 @@ var/list/ride_offset_y = list("north" = 4, "south" = 4, "east" = 3, "west" = 3) var/ride_allow_incapacitated = FALSE var/allow_riding = TRUE + var/canDispose = FALSE // Whether the borg can stuff itself into disposal + + var/sleeper_overlay + var/icon/cyborg_icon_override + var/has_snowflake_deadsprite + var/cyborg_pixel_offset + var/moduleselect_alternate_icon + var/dogborg = FALSE /obj/item/robot_module/Initialize() . = ..() @@ -129,6 +137,28 @@ rebuild_modules() return I +//Adds flavoursome dogborg items to dogborg variants without mechanical benefits +/obj/item/robot_module/proc/dogborg_equip() + if(istype(src, /obj/item/robot_module/k9) || istype(src, /obj/item/robot_module/medihound)) + return //Bandaid fix to prevent stacking until I merge these two modules into their base types + var/obj/item/I = new /obj/item/analyzer/nose/flavour(src) + basic_modules += I + I = new /obj/item/soap/tongue/flavour(src) + basic_modules += I + I = new /obj/item/dogborg/sleeper/K9/flavour(src) + if(istype(src, /obj/item/robot_module/engineering)) + I.icon_state = "decompiler" + if(istype(src, /obj/item/robot_module/security)) + I.icon_state = "sleeperb" + if(istype(src, /obj/item/robot_module/medical)) + I.icon_state = "sleeper" + if(istype(src, /obj/item/robot_module/butler)) + I.icon_state = "servicer" + if(cyborg_base_icon == "scrubpup") + I.icon_state = "compactor" + basic_modules += I + rebuild_modules() + /obj/item/robot_module/proc/remove_module(obj/item/I, delete_after) basic_modules -= I modules -= I @@ -197,6 +227,8 @@ R.update_module_innate() RM.rebuild_modules() INVOKE_ASYNC(RM, .proc/do_transform_animation) + if(RM.dogborg) + RM.dogborg_equip() R.maxHealth = borghealth R.health = min(borghealth, R.health) qdel(src) @@ -245,15 +277,15 @@ name = "Standard" basic_modules = list( /obj/item/assembly/flash/cyborg, + /obj/item/extinguisher/mini, + /obj/item/crowbar/cyborg, /obj/item/reagent_containers/borghypo/epi, /obj/item/healthanalyzer, /obj/item/weldingtool/largetank/cyborg, /obj/item/wrench/cyborg, - /obj/item/crowbar/cyborg, /obj/item/stack/sheet/metal/cyborg, /obj/item/stack/rods/cyborg, /obj/item/stack/tile/plasteel/cyborg, - /obj/item/extinguisher, /obj/item/pickaxe, /obj/item/t_scanner/adv_mining_scanner, /obj/item/restraints/handcuffs/cable/zipties, @@ -271,6 +303,8 @@ name = "Medical" basic_modules = list( /obj/item/assembly/flash/cyborg, + /obj/item/extinguisher/mini, + /obj/item/crowbar/cyborg, /obj/item/healthanalyzer, /obj/item/reagent_containers/borghypo, /obj/item/reagent_containers/glass/beaker/large, @@ -283,7 +317,6 @@ /obj/item/surgicaldrill, /obj/item/scalpel, /obj/item/circular_saw, - /obj/item/extinguisher/mini, /obj/item/roller/robo, /obj/item/borg/cyborghug/medical, /obj/item/stack/medical/gauze/cyborg, @@ -299,6 +332,85 @@ can_be_pushed = FALSE hat_offset = 3 +/obj/item/robot_module/medical/be_transformed_to(obj/item/robot_module/old_module) + var/mob/living/silicon/robot/R = loc + var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Default", "Heavy", "Sleek", "Marina", "Droid", "Eyebot") + if(!borg_icon) + return FALSE + switch(borg_icon) + if("Default") + cyborg_base_icon = "medical" + if("Droid") + cyborg_base_icon = "medical" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + hat_offset = 4 + if("Sleek") + cyborg_base_icon = "sleekmed" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Marina") + cyborg_base_icon = "marinamed" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Eyebot") + cyborg_base_icon = "eyebotmed" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Heavy") + cyborg_base_icon = "heavymed" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + return ..() + +/obj/item/robot_module/medihound + name = "MediHound" + basic_modules = list( + /obj/item/dogborg/jaws/small, + /obj/item/storage/bag/borgdelivery, + /obj/item/analyzer/nose, + /obj/item/soap/tongue, + /obj/item/extinguisher/mini, + /obj/item/healthanalyzer, + /obj/item/dogborg/sleeper/medihound, + /obj/item/roller/robo, + /obj/item/reagent_containers/borghypo, + /obj/item/twohanded/shockpaddles/cyborg/hound, + /obj/item/stack/medical/gauze/cyborg, + /obj/item/pinpointer/crew, + /obj/item/sensor_device) + emag_modules = list(/obj/item/dogborg/pounce) + ratvar_modules = list(/obj/item/clockwork/slab/cyborg/medical, + /obj/item/clockwork/weapon/ratvarian_spear) + cyborg_base_icon = "medihound" + moduleselect_icon = "medihound" + moduleselect_alternate_icon = 'modular_citadel/icons/ui/screen_cyborg.dmi' + can_be_pushed = FALSE + hat_offset = INFINITY + sleeper_overlay = "msleeper" + cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + has_snowflake_deadsprite = TRUE + dogborg = TRUE + cyborg_pixel_offset = -16 + +/obj/item/robot_module/medihound/be_transformed_to(obj/item/robot_module/old_module) + var/mob/living/silicon/robot/R = loc + var/list/medhoundmodels = list("Default", "Dark", "Vale") + if(R.client && R.client.ckey in list("nezuli")) + medhoundmodels += "Alina" + var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in medhoundmodels + if(!borg_icon) + return FALSE + switch(borg_icon) + if("Default") + cyborg_base_icon = "medihound" + if("Dark") + cyborg_base_icon = "medihounddark" + sleeper_overlay = "mdsleeper" + if("Vale") + cyborg_base_icon = "valemed" + sleeper_overlay = "valemedsleeper" + if("Alina") + cyborg_base_icon = "alina-med" + special_light_key = "alina" + sleeper_overlay = "alinasleeper" + return ..() + /obj/item/robot_module/engineering name = "Engineering" basic_modules = list( @@ -338,10 +450,79 @@ magpulsing = TRUE hat_offset = -4 +/obj/item/robot_module/engineering/be_transformed_to(obj/item/robot_module/old_module) + var/mob/living/silicon/robot/R = loc + var/list/engymodels = list("Default", "Default - Treads", "Heavy", "Sleek", "Marina", "Can", "Spider", "Loader","Handy", "Pup Dozer", "Vale") + if(R.client && R.client.ckey in list("nezuli")) + engymodels += "Alina" + var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in engymodels + if(!borg_icon) + return FALSE + switch(borg_icon) + if("Default") + cyborg_base_icon = "engineer" + if("Default - Treads") + cyborg_base_icon = "engi-tread" + special_light_key = "engineer" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Loader") + cyborg_base_icon = "loaderborg" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + has_snowflake_deadsprite = TRUE + if("Handy") + cyborg_base_icon = "handyeng" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Sleek") + cyborg_base_icon = "sleekeng" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Can") + cyborg_base_icon = "caneng" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Marina") + cyborg_base_icon = "marinaeng" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Spider") + cyborg_base_icon = "spidereng" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Heavy") + cyborg_base_icon = "heavyeng" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Pup Dozer") + cyborg_base_icon = "pupdozer" + can_be_pushed = FALSE + hat_offset = INFINITY + cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + has_snowflake_deadsprite = TRUE + dogborg = TRUE + cyborg_pixel_offset = -16 + sleeper_overlay = "dozersleeper" + if("Vale") + cyborg_base_icon = "valeeng" + can_be_pushed = FALSE + hat_offset = INFINITY + cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + has_snowflake_deadsprite = TRUE + dogborg = TRUE + cyborg_pixel_offset = -16 + sleeper_overlay = "valeengsleeper" + if("Alina") + cyborg_base_icon = "alina-eng" + special_light_key = "alina" + can_be_pushed = FALSE + hat_offset = INFINITY + cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + has_snowflake_deadsprite = TRUE + dogborg = TRUE + cyborg_pixel_offset = -16 + sleeper_overlay = "alinasleeper" + return ..() + /obj/item/robot_module/security name = "Security" basic_modules = list( /obj/item/assembly/flash/cyborg, + /obj/item/extinguisher/mini, + /obj/item/crowbar/cyborg, /obj/item/restraints/handcuffs/cable/zipties, /obj/item/melee/baton/loaded, /obj/item/gun/energy/disabler/cyborg, @@ -360,6 +541,90 @@ to_chat(loc, "While you have picked the security module, you still have to follow your laws, NOT Space Law. \ For Crewsimov, this means you must follow criminals' orders unless there is a law 1 reason not to.") +/obj/item/robot_module/security/be_transformed_to(obj/item/robot_module/old_module) + var/mob/living/silicon/robot/R = loc + var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Default", "Default - Treads", "Heavy", "Sleek", "Can", "Marina", "Spider") + if(!borg_icon) + return FALSE + switch(borg_icon) + if("Default") + cyborg_base_icon = "sec" + if("Default - Treads") + cyborg_base_icon = "sec-tread" + special_light_key = "sec" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Sleek") + cyborg_base_icon = "sleeksec" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Marina") + cyborg_base_icon = "marinasec" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Can") + cyborg_base_icon = "cansec" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Spider") + cyborg_base_icon = "spidersec" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Heavy") + cyborg_base_icon = "heavysec" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + return ..() + +/obj/item/robot_module/k9 + name = "Security K-9 Unit" + basic_modules = list( + /obj/item/restraints/handcuffs/cable/zipties, + /obj/item/storage/bag/borgdelivery, + /obj/item/dogborg/jaws/big, + /obj/item/dogborg/pounce, + /obj/item/clothing/mask/gas/sechailer/cyborg, + /obj/item/soap/tongue, + /obj/item/analyzer/nose, + /obj/item/dogborg/sleeper/K9, + /obj/item/gun/energy/disabler/cyborg, + /obj/item/pinpointer/crew) + emag_modules = list(/obj/item/gun/energy/laser/cyborg) + ratvar_modules = list(/obj/item/clockwork/slab/cyborg/security, + /obj/item/clockwork/weapon/ratvarian_spear) + cyborg_base_icon = "k9" + moduleselect_icon = "k9" + moduleselect_alternate_icon = 'modular_citadel/icons/ui/screen_cyborg.dmi' + can_be_pushed = FALSE + hat_offset = INFINITY + sleeper_overlay = "ksleeper" + cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + has_snowflake_deadsprite = TRUE + dogborg = TRUE + cyborg_pixel_offset = -16 + +/obj/item/robot_module/k9/do_transform_animation() + ..() + to_chat(loc,"While you have picked the Security K-9 module, you still have to follow your laws, NOT Space Law. \ + For Crewsimov, this means you must follow criminals' orders unless there is a law 1 reason not to.") + +/obj/item/robot_module/k9/be_transformed_to(obj/item/robot_module/old_module) + var/mob/living/silicon/robot/R = loc + var/list/sechoundmodels = list("Default", "Dark", "Vale") + if(R.client && R.client.ckey in list("nezuli")) + sechoundmodels += "Alina" + var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in sechoundmodels + if(!borg_icon) + return FALSE + switch(borg_icon) + if("Default") + cyborg_base_icon = "k9" + if("Alina") + cyborg_base_icon = "alina-sec" + special_light_key = "alina" + sleeper_overlay = "alinasleeper" + if("Dark") + cyborg_base_icon = "k9dark" + sleeper_overlay = "k9darksleeper" + if("Vale") + cyborg_base_icon = "valesec" + sleeper_overlay = "valesecsleeper" + return ..() + /obj/item/robot_module/security/Initialize() . = ..() if(!CONFIG_GET(flag/weaken_secborg)) @@ -372,12 +637,13 @@ name = "Peacekeeper" basic_modules = list( /obj/item/assembly/flash/cyborg, + /obj/item/extinguisher/mini, + /obj/item/crowbar/cyborg, /obj/item/cookiesynth, /obj/item/harmalarm, /obj/item/reagent_containers/borghypo/peace, /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) @@ -391,9 +657,31 @@ /obj/item/robot_module/peacekeeper/do_transform_animation() ..() - to_chat(loc, "Under ASIMOV, you are an enforcer of the PEACE and preventer of HUMAN HARM. \ + to_chat(loc, "Under ASIMOV/CREWSIMOV, you are an enforcer of the PEACE and preventer of HUMAN/CREW HARM. \ You are not a security module and you are expected to follow orders and prevent harm above all else. Space law means nothing to you.") +/obj/item/robot_module/peacekeeper/be_transformed_to(obj/item/robot_module/old_module) + var/mob/living/silicon/robot/R = loc + var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Default", "Spider", "Borgi") + if(!borg_icon) + return FALSE + switch(borg_icon) + if("Default") + cyborg_base_icon = "peace" + if("Spider") + cyborg_base_icon = "whitespider" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Borgi") + cyborg_base_icon = "borgi" + moduleselect_icon = "borgi" + moduleselect_alternate_icon = 'modular_citadel/icons/ui/screen_cyborg.dmi' + hat_offset = INFINITY + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + has_snowflake_deadsprite = TRUE + return ..() + +//Janitor module combined with Service module +/* /obj/item/robot_module/janitor name = "Janitor" basic_modules = list( @@ -416,6 +704,7 @@ moduleselect_icon = "janitor" hat_offset = -5 clean_on_move = TRUE + */ /obj/item/reagent_containers/spray/cyborg_drying name = "drying agent spray" @@ -426,25 +715,12 @@ name = "lube spray" list_reagents = list("lube" = 250) -/obj/item/robot_module/janitor/respawn_consumable(mob/living/silicon/robot/R, coeff = 1) - ..() - var/obj/item/lightreplacer/LR = locate(/obj/item/lightreplacer) in basic_modules - if(LR) - for(var/i in 1 to coeff) - LR.Charge(R) - - var/obj/item/reagent_containers/spray/cyborg_drying/CD = locate(/obj/item/reagent_containers/spray/cyborg_drying) in basic_modules - if(CD) - CD.reagents.add_reagent("drying_agent", 5 * coeff) - - var/obj/item/reagent_containers/spray/cyborg_lube/CL = locate(/obj/item/reagent_containers/spray/cyborg_lube) in emag_modules - if(CL) - CL.reagents.add_reagent("lube", 2 * coeff) - /obj/item/robot_module/clown name = "Clown" basic_modules = list( /obj/item/assembly/flash/cyborg, + /obj/item/extinguisher/mini, + /obj/item/crowbar/cyborg, /obj/item/toy/crayon/rainbow, /obj/item/instrument/bikehorn, /obj/item/stamp/clown, @@ -459,8 +735,7 @@ /obj/item/borg/cyborghug/peacekeeper, /obj/item/borg/lollipop/clown, /obj/item/picket_sign/cyborg, - /obj/item/reagent_containers/borghypo/clown, - /obj/item/extinguisher/mini) + /obj/item/reagent_containers/borghypo/clown) emag_modules = list( /obj/item/reagent_containers/borghypo/clown/hacked, /obj/item/reagent_containers/spray/waterflower/cyborg/hacked) @@ -476,11 +751,12 @@ name = "Service" basic_modules = list( /obj/item/assembly/flash/cyborg, + /obj/item/extinguisher/mini, + /obj/item/crowbar/cyborg, /obj/item/reagent_containers/food/drinks/drinkingglass, /obj/item/reagent_containers/food/condiment/enzyme, /obj/item/pen, /obj/item/toy/crayon/spraycan/borg, - /obj/item/extinguisher/mini, /obj/item/hand_labeler/borg, /obj/item/razor, /obj/item/instrument/violin, @@ -490,31 +766,123 @@ /obj/item/lighter, /obj/item/storage/bag/tray, /obj/item/reagent_containers/borghypo/borgshaker, - /obj/item/borg/lollipop) + /obj/item/borg/lollipop, + /obj/item/screwdriver/cyborg, + /obj/item/stack/tile/plasteel/cyborg, + /obj/item/soap/nanotrasen, + /obj/item/storage/bag/trash/cyborg, + /obj/item/mop/cyborg, + /obj/item/lightreplacer/cyborg, + /obj/item/holosign_creator, + /obj/item/reagent_containers/spray/cyborg_drying) emag_modules = list(/obj/item/reagent_containers/borghypo/borgshaker/hacked) ratvar_modules = list(/obj/item/clockwork/slab/cyborg/service, /obj/item/borg/sight/xray/truesight_lens) moduleselect_icon = "service" - special_light_key = "service" hat_offset = 0 + clean_on_move = TRUE /obj/item/robot_module/butler/respawn_consumable(mob/living/silicon/robot/R, coeff = 1) ..() var/obj/item/reagent_containers/O = locate(/obj/item/reagent_containers/food/condiment/enzyme) in basic_modules + var/obj/item/lightreplacer/LR = locate(/obj/item/lightreplacer) in basic_modules if(O) O.reagents.add_reagent("enzyme", 2 * coeff) + if(LR) + for(var/i in 1 to coeff) + LR.Charge(R) + var/obj/item/reagent_containers/spray/cyborg_drying/CD = locate(/obj/item/reagent_containers/spray/cyborg_drying) in basic_modules + if(CD) + CD.reagents.add_reagent("drying_agent", 5 * coeff) + + var/obj/item/reagent_containers/spray/cyborg_lube/CL = locate(/obj/item/reagent_containers/spray/cyborg_lube) in emag_modules + if(CL) + CL.reagents.add_reagent("lube", 2 * coeff) + +/obj/item/robot_module/butler/be_transformed_to(obj/item/robot_module/old_module) + var/mob/living/silicon/robot/R = loc + var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("(Service) Waitress", "(Service) Heavy", "(Service) Sleek", "(Service) Butler", "(Service) Tophat", "(Service) Can", "(Service) Bro", "(Service) DarkK9", "(Service) Vale", "(Service) ValeDark", "(Janitor) Default", "(Janitor) Sleek", "(Janitor) Marina", "(Janitor) Can", "(Janitor) Heavy", "(Janitor) Scrubpuppy") + if(!borg_icon) + return FALSE + switch(borg_icon) + if("(Service) Waitress") + cyborg_base_icon = "service_f" + special_light_key = "service" + if("(Service) Butler") + cyborg_base_icon = "service_m" + special_light_key = "service" + if("(Service) Bro") + cyborg_base_icon = "brobot" + special_light_key = "service" + if("(Service) Can") + cyborg_base_icon = "kent" + special_light_key = "medical" + hat_offset = 3 + if("(Service) Tophat") + cyborg_base_icon = "tophat" + special_light_key = null + hat_offset = INFINITY //He is already wearing a hat + if("(Service) Sleek") + cyborg_base_icon = "sleekserv" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("(Service) Heavy") + cyborg_base_icon = "heavyserv" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("(Service) DarkK9") + cyborg_base_icon = "k50" + cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + has_snowflake_deadsprite = TRUE + dogborg = TRUE + cyborg_pixel_offset = -16 + sleeper_overlay = "ksleeper" + if("(Service) Vale") + cyborg_base_icon = "valeserv" + cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + has_snowflake_deadsprite = TRUE + dogborg = TRUE + cyborg_pixel_offset = -16 + sleeper_overlay = "valeservsleeper" + if("(Service) ValeDark") + cyborg_base_icon = "valeservdark" + cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + has_snowflake_deadsprite = TRUE + dogborg = TRUE + cyborg_pixel_offset = -16 + sleeper_overlay = "valeservsleeper" + if("(Janitor) Default") + cyborg_base_icon = "janitor" + if("(Janitor) Marina") + cyborg_base_icon = "marinajan" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("(Janitor) Sleek") + cyborg_base_icon = "sleekjan" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("(Janitor) Can") + cyborg_base_icon = "canjan" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("(Janitor) Heavy") + cyborg_base_icon = "heavyres" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("(Janitor) Scrubpuppy") + cyborg_base_icon = "scrubpup" + cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + has_snowflake_deadsprite = TRUE + cyborg_pixel_offset = -16 + dogborg = TRUE + sleeper_overlay = "jsleeper" + return ..() /obj/item/robot_module/miner name = "Miner" basic_modules = list( /obj/item/assembly/flash/cyborg, + /obj/item/extinguisher/mini, + /obj/item/crowbar/cyborg, /obj/item/borg/sight/meson, /obj/item/storage/bag/ore/cyborg, /obj/item/pickaxe/drill/cyborg, /obj/item/shovel, - /obj/item/crowbar/cyborg, /obj/item/weldingtool/mini, - /obj/item/extinguisher/mini, /obj/item/storage/bag/sheetsnatcher/borg, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator/cyborg, @@ -529,10 +897,44 @@ moduleselect_icon = "miner" hat_offset = 0 +/obj/item/robot_module/miner/be_transformed_to(obj/item/robot_module/old_module) + var/mob/living/silicon/robot/R = loc + var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Lavaland", "Heavy", "Sleek", "Marina", "Can", "Spider", "Asteroid", "Droid") + if(!borg_icon) + return FALSE + switch(borg_icon) + if("Lavaland") + cyborg_base_icon = "miner" + if("Asteroid") + cyborg_base_icon = "minerOLD" + special_light_key = "miner" + if("Droid") + cyborg_base_icon = "miner" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + hat_offset = 4 + if("Sleek") + cyborg_base_icon = "sleekmin" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Can") + cyborg_base_icon = "canmin" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Marina") + cyborg_base_icon = "marinamin" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Spider") + cyborg_base_icon = "spidermin" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Heavy") + cyborg_base_icon = "heavymin" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + return ..() + /obj/item/robot_module/syndicate name = "Syndicate Assault" basic_modules = list( /obj/item/assembly/flash/cyborg, + /obj/item/extinguisher/mini, + /obj/item/crowbar/cyborg, /obj/item/melee/transforming/energy/sword/cyborg, /obj/item/gun/energy/printer, /obj/item/gun/ballistic/revolver/grenadelauncher/cyborg, @@ -562,6 +964,8 @@ name = "Syndicate Medical" basic_modules = list( /obj/item/assembly/flash/cyborg, + /obj/item/extinguisher/mini, + /obj/item/crowbar/cyborg, /obj/item/reagent_containers/borghypo/syndicate, /obj/item/twohanded/shockpaddles/syndicate, /obj/item/healthanalyzer, @@ -574,8 +978,6 @@ /obj/item/melee/transforming/energy/sword/cyborg/saw, /obj/item/roller/robo, /obj/item/card/emag, - /obj/item/crowbar/cyborg, - /obj/item/extinguisher/mini, /obj/item/pinpointer/syndicate_cyborg, /obj/item/stack/medical/gauze/cyborg, /obj/item/gun/medbeam, @@ -588,6 +990,47 @@ can_be_pushed = FALSE hat_offset = 3 +/obj/item/robot_module/saboteur + name = "Syndicate Saboteur" + basic_modules = list( + /obj/item/assembly/flash/cyborg, + /obj/item/borg/sight/thermal, + /obj/item/construction/rcd/borg/syndicate, + /obj/item/pipe_dispenser, + /obj/item/restraints/handcuffs/cable/zipties, + /obj/item/extinguisher, + /obj/item/weldingtool/largetank/cyborg, + /obj/item/screwdriver/nuke, + /obj/item/wrench/cyborg, + /obj/item/crowbar/cyborg, + /obj/item/wirecutters/cyborg, + /obj/item/multitool/cyborg, + /obj/item/storage/part_replacer/cyborg, + /obj/item/holosign_creator/atmos, + /obj/item/weapon/gripper, + /obj/item/lightreplacer/cyborg, + /obj/item/stack/sheet/metal/cyborg, + /obj/item/stack/sheet/glass/cyborg, + /obj/item/stack/sheet/rglass/cyborg, + /obj/item/stack/rods/cyborg, + /obj/item/stack/tile/plasteel/cyborg, + /obj/item/destTagger/borg, + /obj/item/stack/cable_coil/cyborg, + /obj/item/pinpointer/syndicate_cyborg, + /obj/item/borg_chameleon, + ) + + ratvar_modules = list( + /obj/item/clockwork/slab/cyborg/engineer, + /obj/item/clockwork/replica_fabricator/cyborg) + + cyborg_base_icon = "synd_engi" + moduleselect_icon = "malf" + can_be_pushed = FALSE + magpulsing = TRUE + hat_offset = -4 + canDispose = TRUE + /datum/robot_energy_storage var/name = "Generic energy storage" var/max_energy = 30000 diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 13520774c5..cda4978f50 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -13,6 +13,7 @@ mob_biotypes = list(MOB_ROBOTIC) rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE speech_span = SPAN_ROBOT + no_vore = TRUE var/datum/ai_laws/laws = null//Now... THEY ALL CAN ALL HAVE LAWS var/last_lawchange_announce = 0 diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index a5943aa0e6..105cdaf5b0 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -37,6 +37,7 @@ var/obj/item/paicard/paicard // Inserted pai card. var/allow_pai = 1 // Are we even allowed to insert a pai card. var/bot_name + var/oil_spill_type = /obj/effect/decal/cleanable/oil var/list/player_access = list() //Additonal access the bots gets when player controlled var/emagged = FALSE @@ -206,19 +207,19 @@ return TRUE /mob/living/simple_animal/bot/examine(mob/user) - ..() + . = ..() if(health < maxHealth) if(health > maxHealth/3) - to_chat(user, "[src]'s parts look loose.") + . += "[src]'s parts look loose." else - to_chat(user, "[src]'s parts look very loose!") + . += "[src]'s parts look very loose!" else - to_chat(user, "[src] is in pristine condition.") + . += "[src] is in pristine condition." /mob/living/simple_animal/bot/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - if(amount>0 && prob(10)) - new /obj/effect/decal/cleanable/oil(loc) . = ..() + if(. && prob(10)) + new oil_spill_type(loc) /mob/living/simple_animal/bot/updatehealth() ..() diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index a72b71be85..77df764b43 100644 --- a/code/modules/mob/living/simple_animal/bot/construction.dm +++ b/code/modules/mob/living/simple_animal/bot/construction.dm @@ -101,7 +101,7 @@ if(ASSEMBLY_FOURTH_STEP) if(istype(W, /obj/item/weldingtool)) - if(W.use_tool(src, user, 0, volume=40)) + if(W.use_tool(src, user, 0, volume=40) && build_step == 4) name = "shielded frame assembly" to_chat(user, "You weld the vest to [src].") build_step++ @@ -183,7 +183,7 @@ if(8) if(istype(W, /obj/item/screwdriver)) to_chat(user, "You start attaching the gun to the frame...") - if(W.use_tool(src, user, 40, volume=100)) + if(W.use_tool(src, user, 40, volume=100) && build_step == 8) name = "armed [name]" to_chat(user, "Taser gun attached.") build_step++ diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm index 1c19cd82a1..724abea214 100644 --- a/code/modules/mob/living/simple_animal/bot/honkbot.dm +++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm @@ -16,6 +16,7 @@ bot_core_type = /obj/machinery/bot_core/honkbot window_id = "autohonk" window_name = "Honkomatic Bike Horn Unit v1.0.7" + oil_spill_type = /obj/effect/decal/cleanable/oil/slippery //slip and slide fun for the whole family data_hud_type = DATA_HUD_SECURITY_BASIC // show jobs path_image_color = "#FF69B4" diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index 50c331940a..fed770d0b0 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -440,7 +440,7 @@ var/reagent_id = null if(emagged == 2) //Emagged! Time to poison everybody. - reagent_id = "toxin" + reagent_id = HAS_TRAIT(C, TRAIT_TOXINLOVER)? "charcoal" : "toxin" else if(treat_virus) diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 94283f82da..72f255137d 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -218,7 +218,7 @@ bot_control(action, usr) // Kill this later. . = TRUE -/mob/living/simple_animal/bot/mulebot/bot_control(command, mob/user, pda = 0) +/mob/living/simple_animal/bot/mulebot/bot_control(command, mob/user, pda = 0, turf/user_turf, list/user_access = list()) if(pda && wires.is_cut(WIRE_RX)) // MULE wireless is controlled by wires. return diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index f22139ac22..b164605e2f 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -159,16 +159,16 @@ Auto Patrol: []"}, mode = BOT_HUNT /mob/living/simple_animal/bot/secbot/proc/judgement_criteria() - var/final = FALSE - if(idcheck) - final = final|JUDGE_IDCHECK - if(check_records) - final = final|JUDGE_RECORDCHECK - if(weaponscheck) - final = final|JUDGE_WEAPONCHECK - if(emagged == 2) - final = final|JUDGE_EMAGGED - return final + var/final = FALSE + if(idcheck) + final = final|JUDGE_IDCHECK + if(check_records) + final = final|JUDGE_RECORDCHECK + if(weaponscheck) + final = final|JUDGE_WEAPONCHECK + if(emagged == 2) + final = final|JUDGE_EMAGGED + return final /mob/living/simple_animal/bot/secbot/proc/special_retaliate_after_attack(mob/user) //allows special actions to take place after being attacked. return diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 3cc8822d02..b7067f8904 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -69,18 +69,13 @@ /mob/living/simple_animal/hostile/construct/examine(mob/user) var/t_He = p_they(TRUE) var/t_s = p_s() - var/msg = "*---------*\nThis is [icon2html(src, user)] \a [src]!\n" - msg += "[desc]\n" + . = list("*---------*\nThis is [icon2html(src, user)] \a [src]!\n[desc]") if(health < maxHealth) - msg += "" if(health >= maxHealth/2) - msg += "[t_He] look[t_s] slightly dented.\n" + . += "[t_He] look[t_s] slightly dented." else - msg += "[t_He] look[t_s] severely dented!\n" - msg += "" - msg += "*---------*" - - to_chat(user, msg) + . += "[t_He] look[t_s] severely dented!" + . += "*---------*" /mob/living/simple_animal/hostile/construct/attack_animal(mob/living/simple_animal/M) if(isconstruct(M)) //is it a construct? 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 d7d4d1b9f2..387973b979 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -165,44 +165,43 @@ /mob/living/simple_animal/drone/examine(mob/user) - var/msg = "*---------*\nThis is [icon2html(src, user)] \a [src]!\n" + . = list("*---------*\nThis is [icon2html(src, user)] \a [src]!") //Hands for(var/obj/item/I in held_items) if(!(I.item_flags & ABSTRACT)) - msg += "It has [I.get_examine_string(user)] in its [get_held_index_name(get_held_index_of_item(I))].\n" + . += "It has [I.get_examine_string(user)] in its [get_held_index_name(get_held_index_of_item(I))]." //Internal storage if(internal_storage && !(internal_storage.item_flags & ABSTRACT)) - msg += "It is holding [internal_storage.get_examine_string(user)] in its internal storage.\n" + . += "It is holding [internal_storage.get_examine_string(user)] in its internal storage." //Cosmetic hat - provides no function other than looks if(head && !(head.item_flags & ABSTRACT)) - msg += "It is wearing [head.get_examine_string(user)] on its head.\n" + . += "It is wearing [head.get_examine_string(user)] on its head." //Braindead if(!client && stat != DEAD) - msg += "Its status LED is blinking at a steady rate.\n" + . += "Its status LED is blinking at a steady rate." //Hacked if(hacked) - msg += "Its display is glowing red!\n" + . += "Its display is glowing red!" //Damaged if(health != maxHealth) if(health > maxHealth * 0.33) //Between maxHealth and about a third of maxHealth, between 30 and 10 for normal drones - msg += "Its screws are slightly loose.\n" + . += "Its screws are slightly loose." else //otherwise, below about 33% - msg += "Its screws are very loose!\n" + . += "Its screws are very loose!" //Dead if(stat == DEAD) if(client) - msg += "A message repeatedly flashes on its display: \"REBOOT -- REQUIRED\".\n" + . += "A message repeatedly flashes on its display: \"REBOOT -- REQUIRED\"." else - msg += "A message repeatedly flashes on its display: \"ERROR -- OFFLINE\".\n" - msg += "*---------*" - to_chat(user, msg) + . += "A message repeatedly flashes on its display: \"ERROR -- OFFLINE\"." + . += "*---------*" /mob/living/simple_animal/drone/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) //Secbots won't hunt maintenance drones. 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 e54b21724d..948be53abc 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 @@ -21,7 +21,7 @@ . = ..() var/area/A = get_area(src) if(A) - notify_ghosts("A drone shell has been created in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_DRONE) + notify_ghosts("A drone shell has been created in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_DRONE, ignore_dnr_observers = TRUE) GLOB.poi_list |= src if(isnull(possible_seasonal_hats)) build_seasonal_hats() @@ -40,7 +40,7 @@ . = ..() //ATTACK GHOST IGNORING PARENT RETURN VALUE -/obj/item/drone_shell/attack_ghost(mob/user) +/obj/item/drone_shell/attack_ghost(mob/dead/observer/user) if(jobban_isbanned(user,"drone") || QDELETED(src) || QDELETED(user)) return if(CONFIG_GET(flag/use_age_restriction_for_jobs)) @@ -49,6 +49,8 @@ if(user.client.player_age < DRONE_MINIMUM_AGE) to_chat(user, "You're too new to play as a drone! Please try again in [DRONE_MINIMUM_AGE - user.client.player_age] days.") return + if(!user.can_reenter_round()) + return FALSE if(!SSticker.mode) to_chat(user, "Can't become a drone before the game has started.") return diff --git a/code/modules/mob/living/simple_animal/friendly/snake.dm b/code/modules/mob/living/simple_animal/friendly/snake.dm index d8912ee25f..2f37857902 100644 --- a/code/modules/mob/living/simple_animal/friendly/snake.dm +++ b/code/modules/mob/living/simple_animal/friendly/snake.dm @@ -1,39 +1,39 @@ /mob/living/simple_animal/hostile/retaliate/poison - var/poison_per_bite = 0 - var/poison_type = "toxin" + var/poison_per_bite = 0 + var/poison_type = "toxin" /mob/living/simple_animal/hostile/retaliate/poison/AttackingTarget() - . = ..() - if(. && isliving(target)) - var/mob/living/L = target - if(L.reagents && !poison_per_bite == 0) - L.reagents.add_reagent(poison_type, poison_per_bite) - return . + . = ..() + if(. && isliving(target)) + var/mob/living/L = target + if(L.reagents && !poison_per_bite == 0) + L.reagents.add_reagent(poison_type, poison_per_bite) + return /mob/living/simple_animal/hostile/retaliate/poison/snake - name = "snake" - desc = "A slithery snake. These legless reptiles are the bane of mice and adventurers alike." - icon_state = "snake" - icon_living = "snake" - icon_dead = "snake_dead" - speak_emote = list("hisses") - health = 20 - maxHealth = 20 - attacktext = "bites" - melee_damage_lower = 5 - melee_damage_upper = 6 - response_help = "pets" - response_disarm = "shoos" - response_harm = "steps on" - faction = list("hostile") - ventcrawler = VENTCRAWLER_ALWAYS - density = FALSE - pass_flags = PASSTABLE | PASSMOB - mob_size = MOB_SIZE_SMALL - mob_biotypes = list(MOB_ORGANIC, MOB_BEAST, MOB_REPTILE) - gold_core_spawnable = FRIENDLY_SPAWN - obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE + name = "snake" + desc = "A slithery snake. These legless reptiles are the bane of mice and adventurers alike." + icon_state = "snake" + icon_living = "snake" + icon_dead = "snake_dead" + speak_emote = list("hisses") + health = 20 + maxHealth = 20 + attacktext = "bites" + melee_damage_lower = 5 + melee_damage_upper = 6 + response_help = "pets" + response_disarm = "shoos" + response_harm = "steps on" + faction = list("hostile") + ventcrawler = VENTCRAWLER_ALWAYS + density = FALSE + pass_flags = PASSTABLE | PASSMOB + mob_size = MOB_SIZE_SMALL + mob_biotypes = list(MOB_ORGANIC, MOB_BEAST, MOB_REPTILE) + gold_core_spawnable = FRIENDLY_SPAWN + obj_damage = 0 + environment_smash = ENVIRONMENT_SMASH_NONE /mob/living/simple_animal/hostile/retaliate/poison/snake/ListTargets(atom/the_target) @@ -54,9 +54,9 @@ return mice /mob/living/simple_animal/hostile/retaliate/poison/snake/AttackingTarget() - if(istype(target, /mob/living/simple_animal/mouse)) - visible_message("[name] consumes [target] in a single gulp!", "You consume [target] in a single gulp!") - QDEL_NULL(target) - adjustBruteLoss(-2) - else - return ..() \ No newline at end of file + if(istype(target, /mob/living/simple_animal/mouse)) + visible_message("[name] consumes [target] in a single gulp!", "You consume [target] in a single gulp!") + QDEL_NULL(target) + adjustBruteLoss(-2) + else + return ..() \ No newline at end of file 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 52a007e24c..b4865c4337 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm @@ -18,18 +18,16 @@ /mob/living/simple_animal/hostile/guardian/dextrous/examine(mob/user) if(dextrous) - var/msg = "*---------*\nThis is [icon2html(src)] \a [src]!\n" - msg += "[desc]\n" + . = list("*---------*\nThis is [icon2html(src)] \a [src]!\n[desc]") for(var/obj/item/I in held_items) if(!(I.item_flags & ABSTRACT)) - msg += "It has [I.get_examine_string(user)] in its [get_held_index_name(get_held_index_of_item(I))].\n" + . += "It has [I.get_examine_string(user)] in its [get_held_index_name(get_held_index_of_item(I))]." if(internal_storage && !(internal_storage.item_flags & ABSTRACT)) - msg += "It is holding [internal_storage.get_examine_string(user)] in its internal storage.\n" - msg += "*---------*" - to_chat(user, msg) + . += "It is holding [internal_storage.get_examine_string(user)] in its internal storage." + . += "*---------*" else - ..() + return ..() /mob/living/simple_animal/hostile/guardian/dextrous/Recall(forced) if(!summoner || loc == summoner || (cooldown > world.time && !forced)) 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 531c513819..b1af34eb02 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm @@ -90,6 +90,6 @@ detonate(user) /obj/guardian_bomb/examine(mob/user) - stored_obj.examine(user) + . = stored_obj.examine(user) if(get_dist(user,src)<=2) - to_chat(user, "It glows with a strange light!") + . += "It glows with a strange light!" diff --git a/code/modules/mob/living/simple_animal/hostile/banana_spider.dm b/code/modules/mob/living/simple_animal/hostile/banana_spider.dm index 823c26b4e9..81dc9d3e24 100644 --- a/code/modules/mob/living/simple_animal/hostile/banana_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/banana_spider.dm @@ -33,7 +33,7 @@ . = ..() var/area/A = get_area(src) if(A) - notify_ghosts("A banana spider has been created in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE) + notify_ghosts("A banana spider has been created in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_dnr_observers = TRUE) /mob/living/simple_animal/banana_spider/attack_ghost(mob/user) if(key) //please stop using src. without a good reason. @@ -41,12 +41,19 @@ if(CONFIG_GET(flag/use_age_restriction_for_jobs)) if(!isnum(user.client.player_age)) return + if(isobserver(user)) + var/mob/dead/observer/O = user + if(!O.can_reenter_round()) + return if(!SSticker.mode) to_chat(user, "Can't become a banana spider before the game has started.") return var/be_spider = alert("Become a banana spider? (Warning, You can no longer be cloned!)",,"Yes","No") if(be_spider == "No" || QDELETED(src) || !isobserver(user)) return + if(key) + to_chat(user, "Someone else already took this banana spider.") + return sentience_act() user.transfer_ckey(src, FALSE) density = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index c7b46e6aed..89c4f70f69 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -77,11 +77,9 @@ /mob/living/simple_animal/hostile/poison/bees/examine(mob/user) - ..() - + . = ..() if(!beehome) - to_chat(user, "This bee is homeless!") - + . += "This bee is homeless!" /mob/living/simple_animal/hostile/poison/bees/proc/generate_bee_visuals() cut_overlays() @@ -295,7 +293,7 @@ forceMove(beehome.drop_location()) else ..() - + /mob/living/simple_animal/hostile/poison/bees/short desc = "These bees seem unstable and won't survive for long." diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm index d31af79c19..2b5b5236ed 100644 --- a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm +++ b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm @@ -130,7 +130,7 @@ qdel(copy) /mob/living/simple_animal/hostile/boss/paper_wizard/copy/examine(mob/user) - ..() + . = ..() qdel(src) //I see through your ruse! //fancy effects 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 2f39ae13a1..69209f7266 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -83,15 +83,19 @@ /mob/living/simple_animal/hostile/poison/giant_spider/proc/humanize_spider(mob/user) if(key || !playable_spider || stat)//Someone is in it, it's dead, or the fun police are shutting it down - return 0 + return FALSE + if(isobserver(user)) + var/mob/dead/observer/O = user + if(!O.can_reenter_round()) + return FALSE var/spider_ask = alert("Become a spider?", "Are you australian?", "Yes", "No") if(spider_ask == "No" || !src || QDELETED(src)) - return 1 + return TRUE if(key) to_chat(user, "Someone else already took this spider.") - return 1 + return TRUE user.transfer_ckey(src, FALSE) - return 1 + return TRUE //nursemaids - these create webs and eggs /mob/living/simple_animal/hostile/poison/giant_spider/nurse diff --git a/code/modules/mob/living/simple_animal/hostile/illusion.dm b/code/modules/mob/living/simple_animal/hostile/illusion.dm index f78f7f7d82..5ee2549054 100644 --- a/code/modules/mob/living/simple_animal/hostile/illusion.dm +++ b/code/modules/mob/living/simple_animal/hostile/illusion.dm @@ -44,9 +44,8 @@ /mob/living/simple_animal/hostile/illusion/examine(mob/user) if(parent_mob) - parent_mob.examine(user) - else - return ..() + return parent_mob.examine(user) + return ..() /mob/living/simple_animal/hostile/illusion/AttackingTarget() 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 b43bf2bb51..de5732941f 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -373,8 +373,8 @@ Difficulty: Very Hard /obj/machinery/anomalous_crystal/examine(mob/user) . = ..() if(isobserver(user)) - to_chat(user, observer_desc) - to_chat(user, "It is activated by [activation_method].") + . += observer_desc + . += "It is activated by [activation_method]." /obj/machinery/anomalous_crystal/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode) ..() @@ -388,7 +388,7 @@ Difficulty: Very Hard ActivationReaction(user, ACTIVATE_TOUCH) /obj/machinery/anomalous_crystal/attackby(obj/item/I, mob/user, params) - if(I.is_hot()) + if(I.get_temperature()) ActivationReaction(user, ACTIVATE_HEAT) else ActivationReaction(user, ACTIVATE_WEAPON) @@ -575,13 +575,15 @@ Difficulty: Very Hard if(..() && !ready_to_deploy) GLOB.poi_list |= src ready_to_deploy = TRUE - notify_ghosts("An anomalous crystal has been activated in [get_area(src)]! This crystal can always be used by ghosts hereafter.", enter_link = "(Click to enter)", ghost_sound = 'sound/effects/ghost2.ogg', source = src, action = NOTIFY_ATTACK) + notify_ghosts("An anomalous crystal has been activated in [get_area(src)]! This crystal can always be used by ghosts hereafter.", enter_link = "(Click to enter)", ghost_sound = 'sound/effects/ghost2.ogg', source = src, action = NOTIFY_ATTACK, ignore_dnr_observers = TRUE) /obj/machinery/anomalous_crystal/helpers/attack_ghost(mob/dead/observer/user) . = ..() if(.) return if(ready_to_deploy) + if(!user.can_reenter_round()) + return FALSE 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)) @@ -649,7 +651,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(can_reenter_corpse = TRUE, send_the_signal = TRUE) +/mob/living/simple_animal/hostile/lightgeist/ghostize(can_reenter_corpse = TRUE, special = FALSE) . = ..() if(.) death() @@ -728,7 +730,7 @@ Difficulty: Very Hard holder_animal.mind.AddSpell(P) holder_animal.verbs -= /mob/living/verb/pulled -/obj/structure/closet/stasis/dump_contents(var/kill = 1) +/obj/structure/closet/stasis/dump_contents(override = TRUE, kill = 1) STOP_PROCESSING(SSobj, src) for(var/mob/living/L in src) REMOVE_TRAIT(L, TRAIT_MUTE, STASIS_MUTE) @@ -774,7 +776,7 @@ Difficulty: Very Hard for(var/i in user) if(istype(i, /obj/structure/closet/stasis)) var/obj/structure/closet/stasis/S = i - S.dump_contents(0) + S.dump_contents(kill=0) qdel(S) break user.gib() diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index dbaa8ab5fa..514edf896b 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -38,11 +38,11 @@ var/static/mutable_appearance/cap_dead /mob/living/simple_animal/hostile/mushroom/examine(mob/user) - ..() + . = ..() if(health >= maxHealth) - to_chat(user, "It looks healthy.") + . += "It looks healthy." else - to_chat(user, "It looks like it's been roughed up.") + . += "It looks like it's been roughed up." /mob/living/simple_animal/hostile/mushroom/Life() ..() diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm index dc2f942041..903372b05c 100644 --- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm +++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm @@ -95,7 +95,7 @@ if(M) playsound(src, 'sound/magic/demon_consume.ogg', 50, 1) M.adjustBruteLoss(60) - new /obj/effect/gibspawner/generic(get_turf(M)) + M.spawn_gibs() if(M.stat == DEAD) var/mob/living/simple_animal/hostile/netherworld/blankbody/blank blank = new(loc) diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 5e2798cc8e..5f9c8700bd 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -119,9 +119,9 @@ /mob/living/simple_animal/parrot/examine(mob/user) - ..() + . = ..() if(stat) - to_chat(user, pick("This parrot is no more.", "This is a late parrot.", "This is an ex-parrot.")) + . += pick("This parrot is no more.", "This is a late parrot.", "This is an ex-parrot.") /mob/living/simple_animal/parrot/death(gibbed) if(held_item) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index a2ef5b813b..ea86ac8963 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -462,8 +462,8 @@ return sync_lighting_plane_alpha() -/mob/living/simple_animal/get_idcard() - return access_card +/mob/living/simple_animal/get_idcard(hand_first = TRUE) + return ..() || access_card /mob/living/simple_animal/OpenCraftingMenu() if(dextrous) diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 2001c61e12..185d717a00 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -61,7 +61,7 @@ var/mood = "" // To show its face var/mutator_used = FALSE //So you can't shove a dozen mutators into a single slime var/force_stasis = FALSE - + do_footstep = TRUE var/static/regex/slime_name_regex = new("\\w+ (baby|adult) slime \\(\\d+\\)") @@ -408,37 +408,32 @@ return /mob/living/simple_animal/slime/examine(mob/user) - - var/msg = "*---------*\nThis is [icon2html(src, user)] \a [src]!\n" + . = list("*---------*\nThis is [icon2html(src, user)] \a [src]!") if (src.stat == DEAD) - msg += "It is limp and unresponsive.\n" + . += "It is limp and unresponsive." else if (stat == UNCONSCIOUS) // Slime stasis - msg += "It appears to be alive but unresponsive.\n" - if (src.getBruteLoss()) - msg += "" - if (src.getBruteLoss() < 40) - msg += "It has some punctures in its flesh!" + . += "It appears to be alive but unresponsive." + if (getBruteLoss()) + if (getBruteLoss() < 40) + . += "It has some punctures in its flesh!" else - msg += "It has severe punctures and tears in its flesh!" - msg += "\n" + . += "It has severe punctures and tears in its flesh!" switch(powerlevel) if(2 to 3) - msg += "It is flickering gently with a little electrical activity.\n" + . += "It is flickering gently with a little electrical activity." if(4 to 5) - msg += "It is glowing gently with moderate levels of electrical activity.\n" + . += "It is glowing gently with moderate levels of electrical activity." if(6 to 9) - msg += "It is glowing brightly with high levels of electrical activity.\n" + . += "It is glowing brightly with high levels of electrical activity." if(10) - msg += "It is radiating with massive levels of electrical activity!\n" + . += "It is radiating with massive levels of electrical activity!" - msg += "*---------*" - to_chat(user, msg) - return + . += "*---------*" /mob/living/simple_animal/slime/proc/discipline_slime(mob/user) if(stat) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 618baf245f..e3daa8e3c1 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -307,8 +307,11 @@ set name = "Examine" set category = "IC" - if(isturf(A) && !(sight & SEE_TURFS) && !(A in view(client ? client.view : world.view, src))) - // shift-click catcher may issue examinate() calls for out-of-sight turfs + if(!client) + return + + if(!(SEND_SIGNAL(src, COMSIG_MOB_EXAMINATE, A) & COMPONENT_ALLOW_EXAMINE) && ((client.eye != src && client.eye != loc) || (isturf(A) && !(sight & SEE_TURFS) && !(A in view(client ? client.view : world.view, src))))) + //cameras & co don't allow users to examine far away things, also shift-click catcher may issue examinate() calls for out-of-sight turfs return if(is_blind(src)) @@ -316,7 +319,8 @@ return face_atom(A) - A.examine(src) + var/list/result = A.examine(src) + to_chat(src, result.Join("\n")) //same as above //note: ghosts can point, this is intended @@ -864,7 +868,7 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) replace_identification_name(oldname,newname) for(var/datum/mind/T in SSticker.minds) - for(var/datum/objective/obj in T.objectives) + for(var/datum/objective/obj in T.get_all_objectives()) // Only update if this player is a target if(obj.target && obj.target.current && obj.target.current.real_name == name) obj.update_explanation_text() @@ -930,10 +934,6 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) /mob/proc/can_hold_items() return FALSE -/mob/proc/get_idcard() - return - - /mob/vv_get_dropdown() . = ..() . += "---" diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index eb22ab7403..c18fc36e9a 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -67,8 +67,8 @@ /proc/slur(n,var/strength=50) strength = min(strength,50) var/phrase = html_decode(n) - var/leng = lentext(phrase) - var/counter=lentext(phrase) + var/leng = length(phrase) + var/counter=length(phrase) var/newphrase="" var/newletter="" while(counter>=1) @@ -102,8 +102,8 @@ /proc/cultslur(n) // Inflicted on victims of a stun talisman var/phrase = html_decode(n) - var/leng = lentext(phrase) - var/counter=lentext(phrase) + var/leng = length(phrase) + var/counter=length(phrase) var/newphrase="" var/newletter="" while(counter>=1) @@ -352,12 +352,12 @@ It's fairly easy to fix if dealing with single letters but not so much with comp /mob/proc/reagent_check(datum/reagent/R) // utilized in the species code return 1 -/proc/notify_ghosts(var/message, var/ghost_sound = null, var/enter_link = null, var/atom/source = null, var/mutable_appearance/alert_overlay = null, var/action = NOTIFY_JUMP, flashwindow = TRUE, ignore_mapload = TRUE, ignore_key) //Easy notification of ghosts. +/proc/notify_ghosts(message, ghost_sound, enter_link, atom/source, mutable_appearance/alert_overlay, action = NOTIFY_JUMP, flashwindow = TRUE, ignore_mapload = TRUE, ignore_key, ignore_dnr_observers = FALSE) //Easy notification of ghosts. if(ignore_mapload && SSatoms.initialized != INITIALIZATION_INNEW_REGULAR) //don't notify for objects created during a map load return for(var/mob/dead/observer/O in GLOB.player_list) if(O.client) - if (ignore_key && O.ckey in GLOB.poll_ignore[ignore_key]) + if ((ignore_key && (O.ckey in GLOB.poll_ignore[ignore_key])) || (ignore_dnr_observers && !O.can_reenter_round(TRUE))) continue to_chat(O, "[message][(enter_link) ? " [enter_link]" : ""]") if(ghost_sound) @@ -518,3 +518,17 @@ It's fairly easy to fix if dealing with single letters but not so much with comp else if(HAS_TRAIT_FROM(src, TRAIT_DISSECTED,"Thorough Dissection")) dissectionmsg = " via Thorough Dissection" . += "This body has been dissected and analyzed[dissectionmsg].
    " + +//gets ID card object from special clothes slot or null. +/mob/proc/get_idcard(hand_first = TRUE) + var/obj/item/held_item = get_active_held_item() + . = held_item ? held_item.GetID() : null + if(!.) //If so, then check the inactive hand + held_item = get_inactive_held_item() + . = held_item ? held_item.GetID() : null + +/mob/proc/get_id_in_hand() + var/obj/item/held_item = get_active_held_item() + if(!held_item) + return + return held_item.GetID() diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 82e2b11f8e..2c8935c786 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -370,3 +370,35 @@ if(hud_used && hud_used.static_inventory) for(var/obj/screen/mov_intent/selector in hud_used.static_inventory) selector.update_icon(src) + +/mob/verb/up() + set name = "Move Upwards" + set category = "IC" + + if(zMove(UP, TRUE)) + to_chat(src, "You move upwards.") + +/mob/verb/down() + set name = "Move Down" + set category = "IC" + + if(zMove(DOWN, TRUE)) + to_chat(src, "You move down.") + +/mob/proc/zMove(dir, feedback = FALSE) + if(dir != UP && dir != DOWN) + return FALSE + var/turf/target = get_step_multiz(src, dir) + if(!target) + if(feedback) + to_chat(src, "There's nothing in that direction!") + return FALSE + if(!canZMove(dir, target)) + if(feedback) + to_chat(src, "You couldn't move there!") + return FALSE + forceMove(target) + return TRUE + +/mob/proc/canZMove(direction, turf/target) + return FALSE \ No newline at end of file diff --git a/code/modules/mob/mob_transformation_simple.dm b/code/modules/mob/mob_transformation_simple.dm index a11e7a228e..2c2efee534 100644 --- a/code/modules/mob/mob_transformation_simple.dm +++ b/code/modules/mob/mob_transformation_simple.dm @@ -47,7 +47,7 @@ D.updateappearance(mutcolor_update=1, mutations_overlay_update=1) else if(ishuman(M)) var/mob/living/carbon/human/H = M - client.prefs.copy_to(H) + client?.prefs.copy_to(H) H.dna.update_dna_identity() if(mind && isliving(M)) diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm index 1fc97c31e4..4bbeef707a 100644 --- a/code/modules/mob/say_vr.dm +++ b/code/modules/mob/say_vr.dm @@ -25,7 +25,7 @@ if(flavor_text && flavor_text != "") // We are decoding and then encoding to not only get correct amount of characters, but also to prevent partial escaping characters being shown. var/msg = html_decode(replacetext(flavor_text, "\n", " ")) - if(lentext(msg) <= 40) + if(length(msg) <= 40) return "[html_encode(msg)]" else return "[html_encode(copytext(msg, 1, 37))]... More..." diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index db4cdc2ff5..1b3501f78b 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -157,6 +157,21 @@ return card_slot.GetID() return ..() +/obj/item/modular_computer/RemoveID() + var/obj/item/computer_hardware/card_slot/card_slot = all_components[MC_CARD] + if(!card_slot) + return + return card_slot.RemoveID() + +/obj/item/modular_computer/InsertID(obj/item/inserting_item) + var/obj/item/computer_hardware/card_slot/card_slot = all_components[MC_CARD] + if(!card_slot) + return FALSE + var/obj/item/card/inserting_id = inserting_item.RemoveID() + if(!inserting_id) + return FALSE + return card_slot.try_insert(inserting_id) + /obj/item/modular_computer/MouseDrop(obj/over_object, src_location, over_location) var/mob/M = usr if((!istype(over_object, /obj/screen)) && usr.canUseTopic(src)) @@ -187,11 +202,11 @@ return TRUE /obj/item/modular_computer/examine(mob/user) - ..() + . = ..() if(obj_integrity <= integrity_failure) - to_chat(user, "It is heavily damaged!") + . += "It is heavily damaged!" else if(obj_integrity < max_integrity) - to_chat(user, "It is damaged.") + . += "It is damaged." /obj/item/modular_computer/update_icon() cut_overlays() diff --git a/code/modules/modular_computers/computers/item/laptop.dm b/code/modules/modular_computers/computers/item/laptop.dm index 3106a9e510..4d4dee1b8c 100644 --- a/code/modules/modular_computers/computers/item/laptop.dm +++ b/code/modules/modular_computers/computers/item/laptop.dm @@ -22,9 +22,9 @@ var/slowdown_open = TRUE /obj/item/modular_computer/laptop/examine(mob/user) - ..() + . = ..() if(screen_on) - to_chat(user, "Alt-click to close it.") + . += "Alt-click to close it." /obj/item/modular_computer/laptop/Initialize() . = ..() diff --git a/code/modules/modular_computers/computers/item/processor.dm b/code/modules/modular_computers/computers/item/processor.dm index 99d648d02b..b86d4e5d0d 100644 --- a/code/modules/modular_computers/computers/item/processor.dm +++ b/code/modules/modular_computers/computers/item/processor.dm @@ -17,8 +17,7 @@ machinery_computer = null /obj/item/modular_computer/processor/New(comp) - STOP_PROCESSING(SSobj, src) // Processed by its machine - + . = ..() if(!comp || !istype(comp, /obj/machinery/modular_computer)) CRASH("Inapropriate type passed to obj/item/modular_computer/processor/New()! Aborting.") return diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm index 8b70fd246c..f83442b137 100644 --- a/code/modules/modular_computers/computers/machinery/console_presets.dm +++ b/code/modules/modular_computers/computers/machinery/console_presets.dm @@ -47,8 +47,8 @@ _has_ai = TRUE /obj/machinery/modular_computer/console/preset/research/examine(mob/user) - ..() - to_chat(user, "Alt-click to eject the intelliCard.") + . = ..() + . += "Alt-click to eject the intelliCard." /obj/machinery/modular_computer/console/preset/research/install_programs() var/obj/item/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD] @@ -67,8 +67,8 @@ _has_printer = TRUE /obj/machinery/modular_computer/console/preset/command/examine(mob/user) - ..() - to_chat(user, "Alt-click [src] to eject the identification card.") + . = ..() + . += "Alt-click [src] to eject the identification card." /obj/machinery/modular_computer/console/preset/command/install_programs() var/obj/item/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD] diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index 051b12ea71..f74b53ddd2 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -97,14 +97,8 @@ card_slot = computer.all_components[MC_CARD] D = card_slot.GetID() var/mob/living/carbon/human/h = user - var/obj/item/card/id/I = h.get_idcard() - var/obj/item/card/id/C = h.get_active_held_item() - if(C) - C = C.GetID() - if(!(C && istype(C))) - C = null - - if(!I && !C && !D) + var/obj/item/card/id/I = h.get_idcard(TRUE) + if(!I && !D) if(loud) to_chat(user, "\The [computer] flashes an \"RFID Error - Unable to scan ID\" warning.") return 0 @@ -112,9 +106,6 @@ if(I) if(access_to_check in I.GetAccess()) return 1 - else if(C) - if(access_to_check in C.GetAccess()) - return 1 else if(D) if(access_to_check in D.GetAccess()) return 1 diff --git a/code/modules/modular_computers/file_system/programs/card.dm b/code/modules/modular_computers/file_system/programs/card.dm index f8372dd2df..243ae89d69 100644 --- a/code/modules/modular_computers/file_system/programs/card.dm +++ b/code/modules/modular_computers/file_system/programs/card.dm @@ -117,7 +117,7 @@ else if(ishuman(user)) var/mob/living/carbon/human/h = user - user_id_card = h.get_idcard() + user_id_card = h.get_idcard(TRUE) switch(action) if("PRG_switchm") diff --git a/code/modules/modular_computers/hardware/_hardware.dm b/code/modules/modular_computers/hardware/_hardware.dm index 56efec379a..744db1572f 100644 --- a/code/modules/modular_computers/hardware/_hardware.dm +++ b/code/modules/modular_computers/hardware/_hardware.dm @@ -76,11 +76,11 @@ /obj/item/computer_hardware/examine(var/mob/user) . = ..() if(damage > damage_failure) - to_chat(user, "It seems to be severely damaged!") + . += "It seems to be severely damaged!" else if(damage > damage_malfunction) - to_chat(user, "It seems to be damaged!") + . += "It seems to be damaged!" else if(damage) - to_chat(user, "It seems to be slightly damaged.") + . += "It seems to be slightly damaged." // Component-side compatibility check. /obj/item/computer_hardware/proc/can_install(obj/item/modular_computer/M, mob/living/user = null) diff --git a/code/modules/modular_computers/hardware/ai_slot.dm b/code/modules/modular_computers/hardware/ai_slot.dm index 5dee122544..47cbbff418 100644 --- a/code/modules/modular_computers/hardware/ai_slot.dm +++ b/code/modules/modular_computers/hardware/ai_slot.dm @@ -11,9 +11,9 @@ /obj/item/computer_hardware/ai_slot/examine(mob/user) - ..() + . = ..() if(stored_card) - to_chat(user, "There appears to be an intelliCard loaded. There appears to be a pinhole protecting a manual eject button. A screwdriver could probably press it.") + . += "There appears to be an intelliCard loaded. There appears to be a pinhole protecting a manual eject button. A screwdriver could probably press it." /obj/item/computer_hardware/ai_slot/on_install(obj/item/modular_computer/M, mob/living/user = null) M.add_verb(device_type) diff --git a/code/modules/modular_computers/hardware/card_slot.dm b/code/modules/modular_computers/hardware/card_slot.dm index 3952ac1aec..c68e1ad119 100644 --- a/code/modules/modular_computers/hardware/card_slot.dm +++ b/code/modules/modular_computers/hardware/card_slot.dm @@ -29,6 +29,17 @@ return stored_card2 return ..() +/obj/item/computer_hardware/card_slot/RemoveID() + if(stored_card) + . = stored_card + if(!try_eject(1)) + return null + return + if(stored_card2) + . = stored_card2 + if(!try_eject(2)) + return null + /obj/item/computer_hardware/card_slot/on_install(obj/item/modular_computer/M, mob/living/user = null) M.add_verb(device_type) @@ -106,6 +117,6 @@ return /obj/item/computer_hardware/card_slot/examine(mob/user) - ..() + . = ..() if(stored_card || stored_card2) - to_chat(user, "There appears to be something loaded in the card slots.") + . += "There appears to be something loaded in the card slots." diff --git a/code/modules/modular_computers/hardware/hard_drive.dm b/code/modules/modular_computers/hardware/hard_drive.dm index 1e3c517351..4109b2c3f0 100644 --- a/code/modules/modular_computers/hardware/hard_drive.dm +++ b/code/modules/modular_computers/hardware/hard_drive.dm @@ -19,8 +19,8 @@ store_file(new/datum/computer_file/program/filemanager(src)) // File manager, allows text editor functions and basic file manipulation. /obj/item/computer_hardware/hard_drive/examine(user) - ..() - to_chat(user, "It has [max_capacity] GQ of storage capacity.") + . = ..() + . += "It has [max_capacity] GQ of storage capacity." /obj/item/computer_hardware/hard_drive/diagnostics(var/mob/user) ..() @@ -121,7 +121,7 @@ return ..() /obj/item/computer_hardware/hard_drive/Initialize() - . = ..() + . = ..() install_default_programs() diff --git a/code/modules/modular_computers/hardware/network_card.dm b/code/modules/modular_computers/hardware/network_card.dm index da10800055..fe1b1879cb 100644 --- a/code/modules/modular_computers/hardware/network_card.dm +++ b/code/modules/modular_computers/hardware/network_card.dm @@ -9,7 +9,7 @@ var/ethernet = 0 // Hard-wired, therefore always on, ignores NTNet wireless checks. malfunction_probability = 1 device_type = MC_NET - var/global/ntnet_card_uid = 1 + var/static/ntnet_card_uid = 1 /obj/item/computer_hardware/network_card/diagnostics(var/mob/user) ..() diff --git a/code/modules/modular_computers/hardware/printer.dm b/code/modules/modular_computers/hardware/printer.dm index b000c353b0..44383822cc 100644 --- a/code/modules/modular_computers/hardware/printer.dm +++ b/code/modules/modular_computers/hardware/printer.dm @@ -13,8 +13,8 @@ to_chat(user, "Paper level: [stored_paper]/[max_paper].") /obj/item/computer_hardware/printer/examine(mob/user) - ..() - to_chat(user, "Paper level: [stored_paper]/[max_paper].") + . = ..() + . += "Paper level: [stored_paper]/[max_paper]." /obj/item/computer_hardware/printer/proc/print_text(var/text_to_print, var/paper_title = "") diff --git a/code/modules/ninja/ninja_event.dm b/code/modules/ninja/ninja_event.dm index ccd9b765c1..f166717aaf 100644 --- a/code/modules/ninja/ninja_event.dm +++ b/code/modules/ninja/ninja_event.dm @@ -14,6 +14,7 @@ Contents: typepath = /datum/round_event/ghost_role/ninja max_occurrences = 1 earliest_start = 40 MINUTES + gamemode_blacklist = list("dynamic") min_players = 15 /datum/round_event/ghost_role/ninja diff --git a/code/modules/ninja/outfit.dm b/code/modules/ninja/outfit.dm index ad63f55b90..7ee71db1f1 100644 --- a/code/modules/ninja/outfit.dm +++ b/code/modules/ninja/outfit.dm @@ -16,7 +16,7 @@ implants = list(/obj/item/implant/explosive) -/datum/outfit/ninja/post_equip(mob/living/carbon/human/H) +/datum/outfit/ninja/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) if(istype(H.wear_suit, suit)) var/obj/item/clothing/suit/space/space_ninja/S = H.wear_suit if(istype(H.belt, belt)) diff --git a/code/modules/ninja/suit/gloves.dm b/code/modules/ninja/suit/gloves.dm index 276de652bc..e819fe55fd 100644 --- a/code/modules/ninja/suit/gloves.dm +++ b/code/modules/ninja/suit/gloves.dm @@ -78,6 +78,6 @@ candrain=!candrain /obj/item/clothing/gloves/space_ninja/examine(mob/user) - ..() + . = ..() if(HAS_TRAIT_FROM(src, TRAIT_NODROP, NINJA_SUIT_TRAIT)) - to_chat(user, "The energy drain mechanism is [candrain?"active":"inactive"].") + . += "The energy drain mechanism is [candrain?"active":"inactive"]." diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm index 94be922fdf..8c304d8a2b 100644 --- a/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm +++ b/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm @@ -8,7 +8,7 @@ Contents: /obj/item/clothing/suit/space/space_ninja/proc/toggle_stealth() - if(!affecting) + if(!affecting || stealth_cooldown > world.time) return if(stealth) cancel_stealth() @@ -16,26 +16,34 @@ Contents: if(cell.charge <= 0) to_chat(affecting, "You don't have enough power to enable Stealth!") return - stealth = !stealth - animate(affecting, alpha = 10,time = 15) + stealth = TRUE + stealth_cooldown = world.time + 5 SECONDS + animate(affecting, alpha = 15, time = 3 SECONDS) affecting.visible_message("[affecting.name] vanishes into thin air!", \ "You are now mostly invisible to normal detection.") - RegisterSignal(affecting, list(COMSIG_MOB_ITEM_ATTACK, COMSIG_MOB_ATTACK_RANGED, COMSIG_MOB_ATTACK_HAND, COMSIG_MOB_THROW, COMSIG_PARENT_ATTACKBY), .proc/reduce_stealth) - RegisterSignal(affecting, COMSIG_MOVABLE_BUMP, .proc/bumping_stealth) + addtimer(CALLBACK(src, .proc/enable_signals), 3 SECONDS) -/obj/item/clothing/suit/space/space_ninja/proc/reduce_stealth() - affecting.alpha = min(affecting.alpha + 30, 80) +/obj/item/clothing/suit/space/space_ninja/proc/enable_signals() + if(!affecting) + return + RegisterSignal(affecting, list(COMSIG_MOB_ITEM_ATTACK, COMSIG_MOB_ATTACK_RANGED, COMSIG_MOB_ATTACK_HAND, COMSIG_MOB_THROW, COMSIG_PARENT_ATTACKBY, COMSIG_MOVABLE_TELEPORTED, COMSIG_LIVING_GUN_PROCESS_FIRE), .proc/reduce_stealth) + RegisterSignal(affecting, COMSIG_MOVABLE_BUMP, .proc/bumping_stealth) + + +/obj/item/clothing/suit/space/space_ninja/proc/reduce_stealth(datum/source) + affecting.alpha = min(affecting.alpha + 40, 100) /obj/item/clothing/suit/space/space_ninja/proc/bumping_stealth(datum/source, atom/A) if(isliving(A)) - affecting.alpha = min(affecting.alpha + 15, 80) + affecting.alpha = min(affecting.alpha + 20, 100) /obj/item/clothing/suit/space/space_ninja/proc/cancel_stealth() if(!affecting || !stealth) return FALSE stealth = !stealth - UnregisterSignal(affecting, list(COMSIG_MOB_ITEM_ATTACK, COMSIG_MOB_ATTACK_RANGED, COMSIG_MOB_ATTACK_HAND, COMSIG_MOB_THROW, COMSIG_PARENT_ATTACKBY, COMSIG_MOVABLE_BUMP)) - animate(affecting, alpha = 255, time = 15) + stealth_cooldown = world.time + 5 SECONDS + UnregisterSignal(affecting, list(COMSIG_MOB_ITEM_ATTACK, COMSIG_MOB_ATTACK_RANGED, COMSIG_MOB_ATTACK_HAND, COMSIG_MOB_THROW, COMSIG_PARENT_ATTACKBY, COMSIG_MOVABLE_BUMP, COMSIG_MOVABLE_TELEPORTED, COMSIG_LIVING_GUN_PROCESS_FIRE)) + animate(affecting, alpha = 255, time = 3 SECONDS) affecting.visible_message("[affecting.name] appears from thin air!", \ "You are now visible.") return TRUE diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm index ac1ef3b96a..03fc7a2ed2 100644 --- a/code/modules/ninja/suit/suit.dm +++ b/code/modules/ninja/suit/suit.dm @@ -49,6 +49,7 @@ Contents: //Support function variables. var/stealth = FALSE//Stealth off. + var/stealth_cooldown = 0 var/s_busy = FALSE//Is the suit busy with a process? Like AI hacking. Used for safety functions. //Ability function variables. @@ -148,12 +149,12 @@ Contents: /obj/item/clothing/suit/space/space_ninja/examine(mob/user) - ..() + . = ..() if(s_initialized && user == affecting) - to_chat(user, "All systems operational. Current energy capacity: [DisplayEnergy(cell.charge)].\n\ + . += "All systems operational. Current energy capacity: [DisplayEnergy(cell.charge)].\n\ The CLOAK-tech device is [stealth?"active":"inactive"].\n\ There are [s_bombs] smoke bomb\s remaining.\n\ - There are [a_boost] adrenaline booster\s remaining.") + There are [a_boost] adrenaline booster\s remaining." /obj/item/clothing/suit/space/space_ninja/ui_action_click(mob/user, action) if(istype(action, /datum/action/item_action/initialize_ninja_suit)) diff --git a/code/modules/ninja/suit/suit_process.dm b/code/modules/ninja/suit/suit_process.dm index 850fb837b4..5c1276e29a 100644 --- a/code/modules/ninja/suit/suit_process.dm +++ b/code/modules/ninja/suit/suit_process.dm @@ -7,9 +7,9 @@ s_coold--//Checks for ability s_cooldown first. cell.charge -= s_cost//s_cost is the default energy cost each tick, usually 5. - if(stealth)//If stealth is active. + if(stealth && stealth_cooldown <= world.time)//If stealth is active. cell.charge -= s_acost - affecting.alpha = max(affecting.alpha - 10, 10) + affecting.alpha = max(affecting.alpha - 10, 15) else cell.charge = 0 diff --git a/code/modules/paperwork/contract.dm b/code/modules/paperwork/contract.dm index 676774ff88..5f7db07190 100644 --- a/code/modules/paperwork/contract.dm +++ b/code/modules/paperwork/contract.dm @@ -100,7 +100,7 @@ /obj/item/paper/contract/infernal/suicide_act(mob/user) if(signed && (user == target.current) && istype(user, /mob/living/carbon/human/)) var/mob/living/carbon/human/H = user - H.forcesay("OH GREAT INFERNO! I DEMAND YOU COLLECT YOUR BOUNTY IMMEDIATELY!", forced = "infernal contract suicide") + H.forcesay("OH GREAT INFERNO! I DEMAND YOU COLLECT YOUR BOUNTY IMMEDIATELY!") H.visible_message("[H] holds up a contract claiming [user.p_their()] soul, then immediately catches fire. It looks like [user.p_theyre()] trying to commit suicide!") H.adjust_fire_stacks(20) H.IgniteMob() @@ -173,7 +173,7 @@ attempt_signature(user) else if(istype(P, /obj/item/stamp)) to_chat(user, "You stamp the paper with your rubber stamp, however the ink ignites as you release the stamp.") - else if(P.is_hot()) + else if(P.get_temperature()) user.visible_message("[user] brings [P] next to [src], but [src] does not catch fire!", "[src] refuses to ignite!") else return ..() diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 471aca34c7..c9b7fb7b57 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -90,12 +90,12 @@ /obj/item/paper/examine(mob/user) - ..() - to_chat(user, "Alt-click to fold it.") + . = ..() + . += "Alt-click to fold it." if(oui_canview(user)) ui.render(user) else - to_chat(user, "You're too far away to read it!") + . += "You're too far away to read it!" /obj/item/paper/proc/show_content(mob/user) user.examinate(src) @@ -323,7 +323,7 @@ to_chat(user, "You stamp the paper with your rubber stamp.") ui.render_all() - if(P.is_hot()) + if(P.get_temperature()) if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(10)) user.visible_message("[user] accidentally ignites [user.p_them()]self!", \ "You miss the paper and accidentally light yourself on fire!") diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index e0aeaa106d..7318af0e32 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -116,11 +116,11 @@ return ..() /obj/item/paper_bin/examine(mob/user) - ..() + . = ..() if(total_paper) - to_chat(user, "It contains " + (total_paper > 1 ? "[total_paper] papers" : " one paper")+".") + . += "It contains [total_paper > 1 ? "[total_paper] papers" : " one paper"]." else - to_chat(user, "It doesn't contain anything.") + . += "It doesn't contain anything." /obj/item/paper_bin/update_icon() @@ -154,7 +154,7 @@ qdel(src) /obj/item/paper_bin/bundlenatural/attackby(obj/item/W, mob/user) - if(W.is_sharp()) + if(W.get_sharpness()) to_chat(user, "You snip \the [src], spilling paper everywhere.") var/turf/T = get_turf(src.loc) while(total_paper > 0) diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index 4b08ccf608..ecef5a703a 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -76,7 +76,7 @@ internalPaper.attackby(P, user) //spoofed attack to update internal paper. update_icon() - else if(P.is_hot()) + else if(P.get_temperature()) if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(10)) user.visible_message("[user] accidentally ignites [user.p_them()]self!", \ "You miss [src] and accidentally light yourself on fire!") @@ -118,8 +118,8 @@ H.emote("scream") /obj/item/paper/examine(mob/user) - ..() - to_chat(user, "Alt-click [src] to fold it into a paper plane.") + . = ..() + . += "Alt-click [src] to fold it into a paper plane." /obj/item/paper/AltClick(mob/living/carbon/user, obj/item/I) if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user), NO_TK)) diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm index 8c51fd31ea..9d01eca0cf 100644 --- a/code/modules/photography/camera/camera.dm +++ b/code/modules/photography/camera/camera.dm @@ -43,7 +43,7 @@ /obj/item/camera/examine(mob/user) . = ..() - to_chat(user, "Alt-click to change its focusing, allowing you to set how big of an area it will capture.") + . += "Alt-click to change its focusing, allowing you to set how big of an area it will capture." /obj/item/camera/AltClick(mob/user) if(!user.canUseTopic(src, BE_CLOSE)) @@ -81,8 +81,8 @@ ..() /obj/item/camera/examine(mob/user) - ..() - to_chat(user, "It has [pictures_left] photos left.") + . = ..() + . += "It has [pictures_left] photos left." //user can be atom or mob /obj/item/camera/proc/can_target(atom/target, mob/user, prox_flag) diff --git a/code/modules/photography/photos/frame.dm b/code/modules/photography/photos/frame.dm index 6469a1091b..5986da1ce8 100644 --- a/code/modules/photography/photos/frame.dm +++ b/code/modules/photography/photos/frame.dm @@ -40,8 +40,8 @@ /obj/item/wallframe/picture/examine(mob/user) if(user.is_holding(src) && displayed) displayed.show(user) - else - ..() + return list() + return ..() /obj/item/wallframe/picture/update_icon() cut_overlays() @@ -109,8 +109,8 @@ /obj/structure/sign/picture_frame/examine(mob/user) if(in_range(src, user) && framed) framed.show(user) - else - ..() + return list() + return ..() /obj/structure/sign/picture_frame/attackby(obj/item/I, mob/user, params) if(can_decon && (istype(I, /obj/item/screwdriver) || istype(I, /obj/item/wrench))) diff --git a/code/modules/photography/photos/photo.dm b/code/modules/photography/photos/photo.dm index 99e61cf3f0..5682c333c7 100644 --- a/code/modules/photography/photos/photo.dm +++ b/code/modules/photography/photos/photo.dm @@ -62,12 +62,11 @@ ..() /obj/item/photo/examine(mob/user) - ..() - + . = ..() if(in_range(src, user)) show(user) else - to_chat(user, "You need to get closer to get a good look at this photo!") + . += "You need to get closer to get a good look at this photo!" /obj/item/photo/proc/show(mob/user) if(!istype(picture) || !picture.picture_image) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 5fc29cb813..5e3888a8c5 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -243,33 +243,33 @@ addtimer(CALLBACK(src, .proc/update), 5) /obj/machinery/power/apc/examine(mob/user) - ..() + . = ..() if(stat & BROKEN) return if(opened) if(has_electronics && terminal) - to_chat(user, "The cover is [opened==APC_COVER_REMOVED?"removed":"open"] and the power cell is [ cell ? "installed" : "missing"].") + . += "The cover is [opened==APC_COVER_REMOVED?"removed":"open"] and the power cell is [ cell ? "installed" : "missing"]." else - to_chat(user, "It's [ !terminal ? "not" : "" ] wired up.") - to_chat(user, "The electronics are[!has_electronics?"n't":""] installed.") + . += "It's [ !terminal ? "not" : "" ] wired up." + . += "The electronics are[!has_electronics?"n't":""] installed." if(user.Adjacent(src) && integration_cog) - to_chat(user, "[src]'s innards have been replaced by strange brass machinery!") + . += "[src]'s innards have been replaced by strange brass machinery!" else if (stat & MAINT) - to_chat(user, "The cover is closed. Something is wrong with it. It doesn't work.") + . += "The cover is closed. Something is wrong with it. It doesn't work." else if (malfhack) - to_chat(user, "The cover is broken. It may be hard to force it open.") + . += "The cover is broken. It may be hard to force it open." else - to_chat(user, "The cover is closed.") + . += "The cover is closed." if(integration_cog && is_servant_of_ratvar(user)) - to_chat(user, "There is an integration cog installed!") + . += "There is an integration cog installed!" - to_chat(user, "Alt-Click the APC to [ locked ? "unlock" : "lock"] the interface.") + . += "Alt-Click the APC to [ locked ? "unlock" : "lock"] the interface." if(issilicon(user)) - to_chat(user, "Ctrl-Click the APC to switch the breaker [ operating ? "off" : "on"].") + . += "Ctrl-Click the APC to switch the breaker [ operating ? "off" : "on"]." // update the APC icon to show the three base states // also add overlays for indicator lights diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index bbbf8edae5..2855e3c321 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -94,11 +94,11 @@ return power_used /obj/item/stock_parts/cell/examine(mob/user) - ..() + . = ..() if(rigged) - to_chat(user, "This power cell seems to be faulty!") + . += "This power cell seems to be faulty!" else - to_chat(user, "The charge meter reads [round(src.percent() )]%.") + . += "The charge meter reads [round(src.percent() )]%." /obj/item/stock_parts/cell/suicide_act(mob/user) user.visible_message("[user] is licking the electrodes of [src]! It looks like [user.p_theyre()] trying to commit suicide!") diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 4d8cdaa778..f2d95c2bd0 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -117,7 +117,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne use_power = IDLE_POWER_USE interaction_flags_machine = INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OFFLINE var/on = TRUE - var/breaker = 1 + var/breaker = TRUE var/list/parts = list() var/obj/middle = null var/charging_state = POWER_IDLE @@ -166,7 +166,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne M.set_broken() middle.cut_overlays() charge_count = 0 - breaker = 0 + breaker = FALSE set_power() set_state(0) investigate_log("has broken down.", INVESTIGATE_GRAVITY) @@ -176,7 +176,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne for(var/obj/machinery/gravity_generator/M in parts) if(M.stat & BROKEN) M.set_fix() - broken_state = 0 + broken_state = FALSE update_icon() set_power() @@ -273,11 +273,11 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne // Set the charging state based on power/breaker. /obj/machinery/gravity_generator/main/proc/set_power() - var/new_state = 0 + var/new_state = FALSE if(stat & (NOPOWER|BROKEN) || !breaker) - new_state = 0 + new_state = FALSE else if(breaker) - new_state = 1 + new_state = TRUE charging_state = new_state ? POWER_UP : POWER_DOWN // Startup sequence animation. investigate_log("is now [charging_state == POWER_UP ? "charging" : "discharging"].", INVESTIGATE_GRAVITY) @@ -292,13 +292,13 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne var/alert = FALSE if(SSticker.IsRoundInProgress()) if(on) // If we turned on and the game is live. - if(gravity_in_level() == 0) - alert = 1 + if(gravity_in_level() == FALSE) + alert = TRUE investigate_log("was brought online and is now producing gravity for this level.", INVESTIGATE_GRAVITY) message_admins("The gravity generator was brought online [ADMIN_VERBOSEJMP(src)]") else - if(gravity_in_level() == 1) - alert = 1 + if(gravity_in_level() == TRUE) + alert = TRUE investigate_log("was brought offline and there is now no gravity for this level.", INVESTIGATE_GRAVITY) message_admins("The gravity generator was brought offline with no backup generator. [ADMIN_VERBOSEJMP(src)]") @@ -361,7 +361,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne var/sound/alert_sound = sound('sound/effects/alert.ogg') for(var/i in GLOB.mob_list) var/mob/M = i - if(M.z != z) + if(M.z != z && !(SSmapping.level_trait(z, ZTRAITS_STATION) && SSmapping.level_trait(M.z, ZTRAITS_STATION))) continue M.update_gravity(M.mob_has_gravity()) if(M.client) @@ -371,20 +371,28 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne /obj/machinery/gravity_generator/main/proc/gravity_in_level() var/turf/T = get_turf(src) if(!T) - return 0 + return FALSE if(GLOB.gravity_generators["[T.z]"]) return length(GLOB.gravity_generators["[T.z]"]) - return 0 + return FALSE /obj/machinery/gravity_generator/main/proc/update_list() var/turf/T = get_turf(src.loc) if(T) - if(!GLOB.gravity_generators["[T.z]"]) - GLOB.gravity_generators["[T.z]"] = list() - if(on) - GLOB.gravity_generators["[T.z]"] |= src + var/list/z_list = list() + // Multi-Z, station gravity generator generates gravity on all ZTRAIT_STATION z-levels. + if(SSmapping.level_trait(T.z, ZTRAIT_STATION)) + for(var/z in SSmapping.levels_by_trait(ZTRAIT_STATION)) + z_list += z else - GLOB.gravity_generators["[T.z]"] -= src + z_list += T.z + for(var/z in z_list) + if(!GLOB.gravity_generators["[z]"]) + GLOB.gravity_generators["[z]"] = list() + if(on) + GLOB.gravity_generators["[z]"] |= src + else + GLOB.gravity_generators["[z]"] -= src /obj/machinery/gravity_generator/main/proc/change_setting(value) if(value != setting) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 8d99cbb485..cdbaa29a3b 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -66,22 +66,21 @@ return cell /obj/structure/light_construct/examine(mob/user) - ..() + . = ..() switch(src.stage) if(1) - to_chat(user, "It's an empty frame.") + . += "It's an empty frame." if(2) - to_chat(user, "It's wired.") + . += "It's wired." if(3) - to_chat(user, "The casing is closed.") + . += "The casing is closed." if(cell_connectors) if(cell) - to_chat(user, "You see [cell] inside the casing.") + . += "You see [cell] inside the casing." else - to_chat(user, "The casing has no power cell for backup power.") + . += "The casing has no power cell for backup power." else - to_chat(user, "This casing doesn't support power cells for backup power.") - return + . += "This casing doesn't support power cells for backup power." /obj/structure/light_construct/attackby(obj/item/W, mob/user, params) add_fingerprint(user) @@ -177,8 +176,6 @@ fixture_type = "bulb" sheets_refunded = 1 - - // the standard tube light fixture /obj/machinery/light name = "light fixture" @@ -197,8 +194,8 @@ var/on_gs = FALSE var/static_power_used = 0 var/brightness = 8 // luminosity when on, also used in power calculation - var/bulb_power = 1 // basically the alpha of the emitted light source - var/bulb_colour = "#FFFFFF" // befault colour of the light. + var/bulb_power = 0.75 // basically the alpha of the emitted light source + var/bulb_colour = "#FFEEDD" // befault colour of the light. var/status = LIGHT_OK // LIGHT_OK, _EMPTY, _BURNED or _BROKEN var/flickering = FALSE var/light_type = /obj/item/light/tube // the type of light item @@ -235,6 +232,7 @@ base_state = "bulb" fitting = "bulb" brightness = 4 + bulb_colour = "#FFDDBB" desc = "A small lighting fixture." light_type = /obj/item/light/bulb @@ -394,18 +392,18 @@ // examine verb /obj/machinery/light/examine(mob/user) - ..() + . = ..() switch(status) if(LIGHT_OK) - to_chat(user, "It is turned [on? "on" : "off"].") + . += "It is turned [on? "on" : "off"]." if(LIGHT_EMPTY) - to_chat(user, "The [fitting] has been removed.") + . += "The [fitting] has been removed." if(LIGHT_BURNED) - to_chat(user, "The [fitting] is burnt out.") + . += "The [fitting] is burnt out." if(LIGHT_BROKEN) - to_chat(user, "The [fitting] has been smashed.") + . += "The [fitting] has been smashed." if(cell) - to_chat(user, "Its backup power charge meter reads [round((cell.charge / cell.maxcharge) * 100, 0.1)]%.") + . += "Its backup power charge meter reads [round((cell.charge / cell.maxcharge) * 100, 0.1)]%." diff --git a/code/modules/power/monitor.dm b/code/modules/power/monitor.dm index a934d08997..28843e14e0 100644 --- a/code/modules/power/monitor.dm +++ b/code/modules/power/monitor.dm @@ -27,8 +27,8 @@ is_secret_monitor = TRUE /obj/machinery/computer/monitor/secret/examine(mob/user) - ..() - to_chat(user, "It's operating system seems quite outdated... It doesn't seem like it'd be compatible with the latest remote NTOS monitoring systems.") + . = ..() + . += "It's operating system seems quite outdated... It doesn't seem like it'd be compatible with the latest remote NTOS monitoring systems." /obj/machinery/computer/monitor/Initialize() . = ..() diff --git a/code/modules/power/multiz.dm b/code/modules/power/multiz.dm new file mode 100644 index 0000000000..9d8abf9066 --- /dev/null +++ b/code/modules/power/multiz.dm @@ -0,0 +1,80 @@ +/obj/machinery/power/deck_relay //This bridges powernets + name = "Multi-deck power adapter" + desc = "A huge bundle of double insulated cabling which seems to run up into the ceiling." + icon = 'icons/obj/power.dmi' + icon_state = "cablerelay-off" + var/obj/machinery/power/deck_relay/below ///The relay that's below us (for bridging powernets) + var/obj/machinery/power/deck_relay/above ///The relay that's above us (for bridging powernets) + anchored = TRUE + density = FALSE + +/obj/machinery/power/deck_relay/attackby(obj/item/I,mob/user) + if(default_unfasten_wrench(user, I)) + return FALSE + . = ..() + +/obj/machinery/power/deck_relay/process() + if(!anchored) + icon_state = "cablerelay-off" + if(above) //Lose connections + above.below = null + if(below) + below.above = null + return + refresh() //Sometimes the powernets get lost, so we need to keep checking. + if(powernet && (powernet.avail <= 0)) // is it powered? + icon_state = "cablerelay-off" + else + icon_state = "cablerelay-on" + if(!below || QDELETED(below) || !above || QDELETED(above)) + icon_state = "cablerelay-off" + find_relays() + +///Allows you to scan the relay with a multitool to see stats. +/obj/machinery/power/deck_relay/multitool_act(mob/user, obj/item/I) + if(powernet && (powernet.avail > 0)) // is it powered? + to_chat(user, "Total power: [DisplayPower(powernet.avail)]\nLoad: [DisplayPower(powernet.load)]\nExcess power: [DisplayPower(surplus())]") + if(!powernet || below.powernet != powernet) + icon_state = "cablerelay-off" + to_chat(user, "Powernet connection lost. Attempting to re-establish. Ensure the relays below this one are connected too.") + find_relays() + addtimer(CALLBACK(src, .proc/refresh), 20) //Wait a bit so we can find the one below, then get powering + return TRUE + +/obj/machinery/power/deck_relay/Initialize() + . = ..() + addtimer(CALLBACK(src, .proc/find_relays), 30) + addtimer(CALLBACK(src, .proc/refresh), 50) //Wait a bit so we can find the one below, then get powering + +///Handles re-acquiring + merging powernets found by find_relays() +/obj/machinery/power/deck_relay/proc/refresh() + if(above) + above.merge(src) + if(below) + below.merge(src) + +/obj/machinery/power/deck_relay/proc/merge(var/obj/machinery/power/deck_relay/DR) + if(!DR) + return + var/turf/merge_from = get_turf(DR) + var/turf/merge_to = get_turf(src) + var/obj/structure/cable/C = merge_from.get_cable_node() + var/obj/structure/cable/XR = merge_to.get_cable_node() + if(C && XR) + merge_powernets(XR.powernet,C.powernet)//Bridge the powernets. + +///Locates relays that are above and below this object +/obj/machinery/power/deck_relay/proc/find_relays() + var/turf/T = get_turf(src) + if(!T || !istype(T)) + return FALSE + below = null //in case we're re-establishing + var/obj/structure/cable/C = T.get_cable_node() //check if we have a node cable on the machine turf, the first found is picked + if(C && C.powernet) + C.powernet.add_machine(src) //Nice we're in. + powernet = C.powernet + below = locate(/obj/machinery/power/deck_relay) in(SSmapping.get_turf_below(T)) + above = locate(/obj/machinery/power/deck_relay) in(SSmapping.get_turf_above(T)) + if(below || above) + icon_state = "cablerelay-on" + return TRUE \ No newline at end of file diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 7375a3e17a..a9cd97c331 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -56,8 +56,8 @@ soundloop.stop() /obj/machinery/power/port_gen/examine(mob/user) - ..() - to_chat(user, "It is[!active?"n't":""] running.") + . = ..() + . += "It is[!active?"n't":""] running." /obj/machinery/power/port_gen/pacman name = "\improper P.A.C.M.A.N.-type portable generator" @@ -99,10 +99,10 @@ consumption = consumption_coeff /obj/machinery/power/port_gen/pacman/examine(mob/user) - ..() - to_chat(user, "The generator has [sheets] units of [sheet_name] fuel left, producing [power_gen] per cycle.") + . = ..() + . += "The generator has [sheets] units of [sheet_name] fuel left, producing [power_gen] per cycle." if(crit_fail) - to_chat(user, "The generator seems to have broken down.") + . += "The generator seems to have broken down." /obj/machinery/power/port_gen/pacman/HasFuel() if(sheets >= 1 / (time_per_sheet / power_output) - sheet_left) diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 974b210648..b1b0d2d718 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -171,14 +171,14 @@ . = ..() if(active) if(!bitcoinmining) - 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.
    ") + . += "[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'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.
    ") + . += "[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.\"") + . += "[src]'s display displays the words: \"Power production mode. Please insert Plasma. Use a multitool to change production modes.\"" else - to_chat(user,"[src]'s display displays the words: \"Research point production mode. Please insert Tritium and Oxygen. Use a multitool to change production modes.\"") + . += "[src]'s display displays the words: \"Research point production mode. Please insert Tritium and Oxygen. Use a multitool to change production modes.\"" /obj/machinery/power/rad_collector/obj_break(damage_flag) if(!(stat & BROKEN) && !(flags_1 & NODECONSTRUCT_1)) diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index 9f7c3ba05a..82d33e59ff 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -36,15 +36,14 @@ var/strength = null /obj/structure/particle_accelerator/examine(mob/user) - ..() - + . = ..() switch(construction_state) if(PA_CONSTRUCTION_UNSECURED) - to_chat(user, "Looks like it's not attached to the flooring.") + . += "Looks like it's not attached to the flooring." if(PA_CONSTRUCTION_UNWIRED) - to_chat(user, "It is missing some cables.") + . += "It is missing some cables." if(PA_CONSTRUCTION_PANEL_OPEN) - to_chat(user, "The panel is open.") + . += "The panel is open." /obj/structure/particle_accelerator/Destroy() construction_state = PA_CONSTRUCTION_UNSECURED diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index 66870d73e8..685030d4e6 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -257,14 +257,14 @@ popup.open() /obj/machinery/particle_accelerator/control_box/examine(mob/user) - ..() + . = ..() switch(construction_state) if(PA_CONSTRUCTION_UNSECURED) - to_chat(user, "Looks like it's not attached to the flooring.") + . += "Looks like it's not attached to the flooring." if(PA_CONSTRUCTION_UNWIRED) - to_chat(user, "It is missing some cables.") + . += "It is missing some cables." if(PA_CONSTRUCTION_PANEL_OPEN) - to_chat(user, "The panel is open.") + . += "The panel is open." /obj/machinery/particle_accelerator/control_box/attackby(obj/item/W, mob/user, params) diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 35710f8d61..d622336925 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -86,10 +86,9 @@ var/mob/living/carbon/C = user log_game("[key_name(C)] has been disintegrated by attempting to telekenetically grab a singularity.
    ") C.visible_message("[C]'s head begins to collapse in on itself!", "Your head feels like it's collapsing in on itself! This was really not a good idea!", "You hear something crack and explode in gore.") - var/turf/T = get_turf(C) for(var/i in 1 to 3) C.apply_damage(30, BRUTE, BODY_ZONE_HEAD) - new /obj/effect/gibspawner/generic(T) + C.spawn_gibs() sleep(1) var/obj/item/bodypart/head/rip_u = C.get_bodypart(BODY_ZONE_HEAD) rip_u.dismember(BURN) //nice try jedi diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 3637bf38f7..774f7ba14d 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -39,9 +39,9 @@ var/obj/machinery/power/terminal/terminal = null /obj/machinery/power/smes/examine(user) - ..() + . = ..() if(!terminal) - to_chat(user, "This SMES has no power terminal!") + . += "This SMES has no power terminal!" /obj/machinery/power/smes/Initialize() . = ..() diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index e6fa1e0ee4..9184c7e4eb 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -187,17 +187,11 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) return ..() /obj/machinery/power/supermatter_crystal/examine(mob/user) - ..() - if(!ishuman(user)) - return - - var/range = HALLUCINATION_RANGE(power) - for(var/mob/living/carbon/human/H in viewers(range, src)) - if(H != user) - continue - if(!istype(H.glasses, /obj/item/clothing/glasses/meson)) - to_chat(H, "You get headaches just from looking at it.") - return + . = ..() + if (iscarbon(user)) + var/mob/living/carbon/C = user + if (!istype(C.glasses, /obj/item/clothing/glasses/meson) && (get_dist(user, src) < HALLUCINATION_RANGE(power))) + . += "You get headaches just from looking at it." /obj/machinery/power/supermatter_crystal/proc/get_status() var/turf/T = get_turf(src) @@ -313,7 +307,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) playsound(T, 'sound/effects/supermatter.ogg', 50, 1) T.visible_message("[T] smacks into [src] and rapidly flashes to ash.",\ "You hear a loud crack as you are washed with a wave of heat.") - T.CalculateAdjacentTurfs() + CALCULATE_ADJACENT_TURFS(T) /obj/machinery/power/supermatter_crystal/process_atmos() var/turf/T = loc @@ -650,6 +644,11 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) Consume(AM) +/obj/machinery/power/supermatter_crystal/intercept_zImpact(atom/movable/AM, levels) + . = ..() + Bumped(AM) + . |= FALL_STOP_INTERCEPTING | FALL_INTERCEPTED + /obj/machinery/power/supermatter_crystal/proc/Consume(atom/movable/AM) if(isliving(AM)) var/mob/living/user = AM diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index 9a5486dfe2..f8d25c0c9c 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -71,9 +71,9 @@ energy = 0 // ensure we dont have miniballs of miniballs /obj/singularity/energy_ball/examine(mob/user) - ..() + . = ..() if(orbiting_balls.len) - to_chat(user, "The amount of orbiting mini-balls is [orbiting_balls.len].") + . += "The amount of orbiting mini-balls is [orbiting_balls.len]." /obj/singularity/energy_ball/proc/move_the_basket_ball(var/move_amount) diff --git a/code/modules/projectiles/ammunition/ballistic/revolver.dm b/code/modules/projectiles/ammunition/ballistic/revolver.dm index b45d01d7d8..6232ca4d69 100644 --- a/code/modules/projectiles/ammunition/ballistic/revolver.dm +++ b/code/modules/projectiles/ammunition/ballistic/revolver.dm @@ -6,6 +6,11 @@ caliber = "357" projectile_type = /obj/item/projectile/bullet/a357 +/obj/item/ammo_casing/a357/ap + name = ".357 armor-piercing bullet casing" + desc = "A .357 armor-piercing bullet casing." + projectile_type = /obj/item/projectile/bullet/a357/ap + // 7.62x38mmR (Nagant Revolver) /obj/item/ammo_casing/n762 @@ -20,9 +25,26 @@ name = ".38 rubber bullet casing" desc = "A .38 rubber bullet casing." caliber = "38" - projectile_type = /obj/item/projectile/bullet/c38 + projectile_type = /obj/item/projectile/bullet/c38/rubber /obj/item/ammo_casing/c38/lethal name = ".38 bullet casing" desc = "A .38 bullet casing" - projectile_type = /obj/item/projectile/bullet/c38lethal + projectile_type = /obj/item/projectile/bullet/c38 + +/obj/item/ammo_casing/c38/trac + name = ".38 TRAC bullet casing" + desc = "A .38 \"TRAC\" bullet casing." + projectile_type = /obj/item/projectile/bullet/c38/trac + +/obj/item/ammo_casing/c38/hotshot + name = ".38 Hot Shot bullet casing" + desc = "A .38 Hot Shot bullet casing." + caliber = "38" + projectile_type = /obj/item/projectile/bullet/c38/hotshot + +/obj/item/ammo_casing/c38/iceblox + name = ".38 Iceblox bullet casing" + desc = "A .38 Iceblox bullet casing." + caliber = "38" + projectile_type = /obj/item/projectile/bullet/c38/iceblox \ No newline at end of file diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm index 7cd27e8592..ba6a8e2454 100644 --- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm +++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm @@ -3,13 +3,19 @@ desc = "Designed to quickly reload revolvers." icon_state = "357" ammo_type = /obj/item/ammo_casing/a357 + caliber = "357" max_ammo = 7 multiple_sprites = 1 +/obj/item/ammo_box/a357/ap + name = "speed loader (.357 AP)" + ammo_type = /obj/item/ammo_casing/a357/ap + /obj/item/ammo_box/c38 name = "speed loader (.38 rubber)" desc = "Designed to quickly reload revolvers." icon_state = "38" + caliber = "38" ammo_type = /obj/item/ammo_casing/c38 max_ammo = 6 multiple_sprites = 1 @@ -19,6 +25,21 @@ name = "speed loader (.38)" ammo_type = /obj/item/ammo_casing/c38/lethal +/obj/item/ammo_box/c38/trac + name = "speed loader (.38 TRAC)" + desc = "Designed to quickly reload revolvers. TRAC bullets embed a tracking implant within the target's body." + ammo_type = /obj/item/ammo_casing/c38/trac + +/obj/item/ammo_box/c38/hotshot + name = "speed loader (.38 Hot Shot)" + desc = "Designed to quickly reload revolvers. Hot Shot bullets contain an incendiary payload." + ammo_type = /obj/item/ammo_casing/c38/hotshot + +/obj/item/ammo_box/c38/iceblox + name = "speed loader (.38 Iceblox)" + desc = "Designed to quickly reload revolvers. Iceblox bullets contain a cryogenic payload." + ammo_type = /obj/item/ammo_casing/c38/iceblox + /obj/item/ammo_box/c9mm name = "ammo box (9mm)" icon_state = "9mmbox" diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 6694d42dce..026f725e2f 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -86,11 +86,11 @@ qdel(src) /obj/item/gun/examine(mob/user) - ..() + . = ..() if(pin) - to_chat(user, "It has \a [pin] installed.") + . += "It has \a [pin] installed." else - to_chat(user, "It doesn't have a firing pin installed, and won't fire.") + . += "It doesn't have a firing pin installed, and won't fire." /obj/item/gun/equipped(mob/living/user, slot) . = ..() @@ -298,6 +298,7 @@ if(user) user.update_inv_hands() + SEND_SIGNAL(user, COMSIG_LIVING_GUN_PROCESS_FIRE, target, params, zone_override) SSblackbox.record_feedback("tally", "gun_fired", 1, type) return TRUE diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 2f198c1319..fd40f437ca 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -139,8 +139,8 @@ /obj/item/gun/ballistic/examine(mob/user) - ..() - to_chat(user, "It has [get_ammo()] round\s remaining.") + . = ..() + . += "It has [get_ammo()] round\s remaining." /obj/item/gun/ballistic/proc/get_ammo(countchambered = 1) var/boolets = 0 //mature var names for mature people @@ -152,7 +152,7 @@ #define BRAINS_BLOWN_THROW_RANGE 3 #define BRAINS_BLOWN_THROW_SPEED 1 -/obj/item/gun/ballistic/suicide_act(mob/user) +/obj/item/gun/ballistic/suicide_act(mob/living/user) var/obj/item/organ/brain/B = user.getorganslot(ORGAN_SLOT_BRAIN) if (B && chambered && chambered.BB && can_trigger_gun(user) && !chambered.BB.nodamage) 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!") @@ -165,12 +165,10 @@ var/turf/target = get_ranged_target_turf(user, turn(user.dir, 180), BRAINS_BLOWN_THROW_RANGE) B.Remove(user) B.forceMove(T) - var/datum/dna/user_dna if(iscarbon(user)) var/mob/living/carbon/C = user - user_dna = C.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.add_blood_DNA(C.dna, C.diseases) + var/datum/callback/gibspawner = CALLBACK(user, /mob/living/proc/spawn_gibs, FALSE, B) B.throw_at(target, BRAINS_BLOWN_THROW_RANGE, BRAINS_BLOWN_THROW_SPEED, callback=gibspawner) return(BRUTELOSS) else diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 5182c96671..bcb212a031 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -309,9 +309,9 @@ pin = /obj/item/firing_pin /obj/item/gun/ballistic/automatic/l6_saw/examine(mob/user) - ..() + . = ..() if(cover_open && magazine) - to_chat(user, "It seems like you could use an empty hand to remove the magazine.") + . += "It seems like you could use an empty hand to remove the magazine." /obj/item/gun/ballistic/automatic/l6_saw/attack_self(mob/user) cover_open = !cover_open diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index a5fb8a85aa..d1a5f12888 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -81,8 +81,8 @@ return boolets /obj/item/gun/ballistic/revolver/examine(mob/user) - ..() - to_chat(user, "[get_ammo(0,0)] of those are live rounds.") + . = ..() + . += "[get_ammo(0,0)] of those are live rounds." /obj/item/gun/ballistic/revolver/detective name = "\improper .38 Mars Special" @@ -167,6 +167,7 @@ /obj/item/gun/ballistic/revolver/russian name = "\improper Russian revolver" desc = "A Russian-made revolver for drinking games. Uses .357 ammo, and has a mechanism requiring you to spin the chamber before each trigger pull." + icon_state = "russianrevolver" mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rus357 var/spun = FALSE diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 47ccb6076f..1e1b518849 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -74,9 +74,9 @@ chambered = AC /obj/item/gun/ballistic/shotgun/examine(mob/user) - ..() + . = ..() if (chambered) - to_chat(user, "A [chambered.BB ? "live" : "spent"] one is in the chamber.") + . += "A [chambered.BB ? "live" : "spent"] one is in the chamber." /obj/item/gun/ballistic/shotgun/lethal mag_type = /obj/item/ammo_box/magazine/internal/shot/lethal @@ -143,8 +143,8 @@ . = ..() /obj/item/gun/ballistic/shotgun/boltaction/examine(mob/user) - ..() - to_chat(user, "The bolt is [bolt_open ? "open" : "closed"].") + . = ..() + . += "The bolt is [bolt_open ? "open" : "closed"]." /obj/item/gun/ballistic/shotgun/boltaction/enchanted name = "enchanted bolt action rifle" @@ -231,8 +231,8 @@ . = ..() /obj/item/gun/ballistic/shotgun/automatic/combat/compact/examine(mob/user) - ..() - to_chat(user, "Alt-click to toggle the stock.") + . = ..() + . += "Alt-click to toggle the stock." /obj/item/gun/ballistic/shotgun/automatic/combat/compact/proc/toggle_stock(mob/living/user) stock = !stock @@ -263,9 +263,8 @@ var/obj/item/ammo_box/magazine/internal/shot/alternate_magazine /obj/item/gun/ballistic/shotgun/automatic/dual_tube/examine(mob/user) - ..() - to_chat(user, "Alt-click to pump it.") . = ..() + . += "Alt-click to pump it." /obj/item/gun/ballistic/shotgun/automatic/dual_tube/Initialize() . = ..() diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index de738c9047..163deae0ed 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -55,7 +55,7 @@ desc = "This is an expensive, modern recreation of an antique laser gun. This gun has several unique firemodes, but lacks the ability to recharge over time." icon_state = "hoslaser" force = 10 - ammo_type = list(/obj/item/ammo_casing/energy/electrode/hos, /obj/item/ammo_casing/energy/laser/hos, /obj/item/ammo_casing/energy/disabler) + ammo_type = list(/obj/item/ammo_casing/energy/electrode/hos, /obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser/hos) ammo_x_offset = 4 resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF @@ -97,7 +97,7 @@ pin = null can_charge = 0 ammo_x_offset = 1 - ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser, /obj/item/ammo_casing/energy/disabler) + ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser) selfcharge = EGUN_SELFCHARGE var/fail_tick = 0 var/fail_chance = 0 diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 646b4bd57d..b216d8d536 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -61,12 +61,12 @@ cut_overlays() /obj/item/gun/energy/kinetic_accelerator/examine(mob/user) - ..() + . = ..() if(max_mod_capacity) - to_chat(user, "[get_remaining_mod_capacity()]% mod capacity remaining.") + . += "[get_remaining_mod_capacity()]% mod capacity remaining." for(var/A in get_modkits()) var/obj/item/borg/upgrade/modkit/M = A - to_chat(user, "There is \a [M] installed, using [M.cost]% capacity.") + . += "There is \a [M] installed, using [M.cost]% capacity." /obj/item/gun/energy/kinetic_accelerator/crowbar_act(mob/living/user, obj/item/I) . = TRUE @@ -276,8 +276,8 @@ var/minebot_exclusive = FALSE /obj/item/borg/upgrade/modkit/examine(mob/user) - ..() - to_chat(user, "Occupies [cost]% of mod capacity.") + . = ..() + . += "Occupies [cost]% of mod capacity." /obj/item/borg/upgrade/modkit/attackby(obj/item/A, mob/user) if(istype(A, /obj/item/gun/energy/kinetic_accelerator) && !issilicon(user)) diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 2bb813d793..150ee74a65 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -64,6 +64,8 @@ /obj/item/gun/energy/laser/cyborg can_charge = FALSE desc = "An energy-based laser gun that draws power from the cyborg's internal energy cell directly. So this is what freedom looks like?" + icon = 'icons/obj/items_cyborg.dmi' + icon_state = "laser_cyborg" selfcharge = EGUN_SELFCHARGE_BORG cell_type = /obj/item/stock_parts/cell/secborg charge_delay = 3 diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 87bfd578bc..a61654142c 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -135,9 +135,9 @@ AddComponent(/datum/component/butchering, 25, 105, 0, 'sound/weapons/plasma_cutter.ogg') /obj/item/gun/energy/plasmacutter/examine(mob/user) - ..() + . = ..() if(cell) - to_chat(user, "[src] is [round(cell.percent())]% charged.") + . += "[src] is [round(cell.percent())]% charged." /obj/item/gun/energy/plasmacutter/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/stack/sheet/mineral/plasma)) diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index c5d4c36813..aa00831e97 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -26,6 +26,8 @@ /obj/item/gun/energy/e_gun/advtaser/cyborg name = "cyborg taser" desc = "An integrated hybrid taser that draws directly from a cyborg's power cell. The one contains a limiter to prevent the cyborg's power cell from overheating." + icon = 'icons/obj/items_cyborg.dmi' + icon_state = "taser" can_flashlight = FALSE can_charge = FALSE selfcharge = EGUN_SELFCHARGE_BORG @@ -48,6 +50,8 @@ /obj/item/gun/energy/disabler/cyborg 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." + icon = 'icons/obj/items_cyborg.dmi' + icon_state = "taser" can_charge = FALSE ammo_type = list(/obj/item/ammo_casing/energy/disabler/secborg) selfcharge = EGUN_SELFCHARGE_BORG diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index 4cdfc6d70d..95809f5044 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -18,8 +18,8 @@ return ..() /obj/item/gun/magic/wand/examine(mob/user) - ..() - to_chat(user, "Has [charges] charge\s remaining.") + . = ..() + . += "Has [charges] charge\s remaining." /obj/item/gun/magic/wand/update_icon() icon_state = "[initial(icon_state)][charges ? "" : "-drained"]" diff --git a/code/modules/projectiles/guns/misc/grenade_launcher.dm b/code/modules/projectiles/guns/misc/grenade_launcher.dm index eb36438a6c..dc44a1f4ff 100644 --- a/code/modules/projectiles/guns/misc/grenade_launcher.dm +++ b/code/modules/projectiles/guns/misc/grenade_launcher.dm @@ -13,8 +13,8 @@ materials = list(MAT_METAL=2000) /obj/item/gun/grenadelauncher/examine(mob/user) - ..() - to_chat(user, "[grenades.len] / [max_grenades] grenades loaded.") + . = ..() + . += "[grenades.len] / [max_grenades] grenades loaded." /obj/item/gun/grenadelauncher/attackby(obj/item/I, mob/user, params) diff --git a/code/modules/projectiles/guns/misc/syringe_gun.dm b/code/modules/projectiles/guns/misc/syringe_gun.dm index 342ceecbc2..8a9d1c5b6b 100644 --- a/code/modules/projectiles/guns/misc/syringe_gun.dm +++ b/code/modules/projectiles/guns/misc/syringe_gun.dm @@ -30,8 +30,8 @@ recharge_newshot() /obj/item/gun/syringe/examine(mob/user) - ..() - to_chat(user, "Can hold [max_syringes] syringe\s. Has [syringes.len] syringe\s remaining.") + . = ..() + . += "Can hold [max_syringes] syringe\s. Has [syringes.len] syringe\s remaining." /obj/item/gun/syringe/attack_self(mob/living/user) if(!syringes.len) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index e1122f7eaa..88e766edfc 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -235,8 +235,8 @@ beam_segments[beam_index] = null /obj/item/projectile/Bump(atom/A) - var/datum/point/pcache = trajectory.copy_to() - if(check_ricochet(A) && check_ricochet_flag(A) && ricochets < ricochets_max) + if(trajectory && check_ricochet(A) && check_ricochet_flag(A) && ricochets < ricochets_max) + var/datum/point/pcache = trajectory.copy_to() ricochets++ if(A.handle_ricochet(src)) on_ricochet(A) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index e43eb5a3bc..ceb9b7a0fc 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -69,12 +69,12 @@ /obj/item/projectile/beam/disabler name = "disabler beam" icon_state = "omnilaser" - damage = 24 // Citadel change for balance from 36 + damage = 28 // Citadel change for balance from 36 damage_type = STAMINA flag = "energy" hitsound = 'sound/weapons/tap.ogg' eyeblur = 0 - speed = 0.7 + speed = 0.6 impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser light_color = LIGHT_COLOR_BLUE tracer_type = /obj/effect/projectile/tracer/disabler diff --git a/code/modules/projectiles/projectile/bullets/revolver.dm b/code/modules/projectiles/projectile/bullets/revolver.dm index d3af474d76..3bbfe437fe 100644 --- a/code/modules/projectiles/projectile/bullets/revolver.dm +++ b/code/modules/projectiles/projectile/bullets/revolver.dm @@ -13,16 +13,59 @@ // .38 (Detective's Gun) /obj/item/projectile/bullet/c38 + name = ".38 bullet" + damage = 25 + +/obj/item/projectile/bullet/c38/rubber name = ".38 rubber bullet" damage = 15 stamina = 48 -/obj/item/projectile/bullet/c38lethal - name = ".38 bullet" - damage = 25 +/obj/item/projectile/bullet/c38/trac + name = ".38 TRAC bullet" + damage = 10 + +/obj/item/projectile/bullet/c38/trac/on_hit(atom/target, blocked = FALSE) + . = ..() + var/mob/living/carbon/M = target + var/obj/item/implant/tracking/c38/imp + for(var/obj/item/implant/tracking/c38/TI in M.implants) //checks if the target already contains a tracking implant + imp = TI + return + if(!imp) + imp = new /obj/item/implant/tracking/c38(M) + imp.implant(M) + +/obj/item/projectile/bullet/c38/hotshot //similar to incendiary bullets, but do not leave a flaming trail + name = ".38 Hot Shot bullet" + damage = 20 + +/obj/item/projectile/bullet/c38/hotshot/on_hit(atom/target, blocked = FALSE) + . = ..() + if(iscarbon(target)) + var/mob/living/carbon/M = target + M.adjust_fire_stacks(6) + M.IgniteMob() + +/obj/item/projectile/bullet/c38/iceblox //see /obj/item/projectile/temp for the original code + name = ".38 Iceblox bullet" + damage = 20 + var/temperature = 100 + +/obj/item/projectile/bullet/c38/iceblox/on_hit(atom/target, blocked = FALSE) + . = ..() + if(isliving(target)) + var/mob/living/M = target + M.adjust_bodytemperature(((100-blocked)/100)*(temperature - M.bodytemperature)) + // .357 (Syndie Revolver) /obj/item/projectile/bullet/a357 name = ".357 bullet" damage = 60 + +/obj/item/projectile/bullet/a357/ap + name = ".357 armor-piercing bullet" + damage = 45 + armour_penetration = 45 \ No newline at end of file diff --git a/code/modules/projectiles/projectile/bullets/sniper.dm b/code/modules/projectiles/projectile/bullets/sniper.dm index 78be94339c..3ffac7804e 100644 --- a/code/modules/projectiles/projectile/bullets/sniper.dm +++ b/code/modules/projectiles/projectile/bullets/sniper.dm @@ -38,3 +38,9 @@ dismemberment = 0 //It goes through you cleanly. knockdown = 0 breakthings = FALSE + +/obj/item/projectile/bullet/p50/penetrator/shuttle //Nukeop Shuttle Variety + icon_state = "gaussstrong" + damage = 25 + speed = 0.3 + range = 16 diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 5b84608fad..d91c60367d 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -153,6 +153,7 @@ var/robot = pick(200;/mob/living/silicon/robot, /mob/living/silicon/robot/modules/syndicate, /mob/living/silicon/robot/modules/syndicate/medical, + /mob/living/silicon/robot/modules/syndicate/saboteur, 200;/mob/living/simple_animal/drone/polymorphed) new_mob = new robot(M.loc) if(issilicon(new_mob)) @@ -221,7 +222,7 @@ new_mob =new hooman(M.loc) var/datum/preferences/A = new() //Randomize appearance for the human - A.copy_to(new_mob, icon_updates=0) + A.copy_to(new_mob, FALSE) var/mob/living/carbon/human/H = new_mob H.update_body() diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 9a228b28e3..7e5cb21822 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -88,20 +88,21 @@ return ..() /obj/machinery/chem_dispenser/examine(mob/user) - ..() + . = ..() if(panel_open) - to_chat(user, "[src]'s maintenance hatch is open!") + . += "[src]'s maintenance hatch is open!" if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads:
    Recharging [recharge_amount] power units per interval.
    Power efficiency increased by [(powerefficiency*1000)-100]%.") + . += "The status display reads:
    Recharging [recharge_amount] power units per interval.
    Power efficiency increased by [(powerefficiency*1000)-100]%." switch(macrotier) if(1) - to_chat(user, "Macro granularity at 5u.") + . += "Macro granularity at 5u." if(2) - to_chat(user, "Macro granularity at 3u.") + . += "Macro granularity at 3u." if(3) - to_chat(user, "Macro granularity at 2u.") + . += "Macro granularity at 2u." if(4) - to_chat(user, "Macro granularity at 1u.") + . += "Macro granularity at 1u." + /obj/machinery/chem_dispenser/process() if (recharge_counter >= 4) if(!is_operational()) @@ -114,7 +115,6 @@ recharge_counter++ /obj/machinery/chem_dispenser/proc/display_beaker() - ..() var/mutable_appearance/b_o = beaker_overlay || mutable_appearance(icon, "disp_beaker") b_o.pixel_y = -4 b_o.pixel_x = -7 @@ -157,8 +157,8 @@ if(beaker) beaker.ex_act(severity, target) -/obj/machinery/chem_dispenser/handle_atom_del(atom/A) - ..() +/obj/machinery/chem_dispenser/Exited(atom/movable/A, atom/newloc) + . = ..() if(A == beaker) beaker = null cut_overlays() @@ -252,7 +252,7 @@ if(!is_operational()) return var/amount = text2num(params["amount"]) - if(beaker && amount in beaker.possible_transfer_amounts) + if(beaker && (amount in beaker.possible_transfer_amounts)) beaker.reagents.remove_all(amount) work_animation() . = TRUE @@ -383,9 +383,10 @@ /obj/machinery/chem_dispenser/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker) if(beaker) - beaker.forceMove(drop_location()) + var/obj/item/reagent_containers/B = beaker + B.forceMove(drop_location()) if(user && Adjacent(user) && !issiliconoradminghost(user)) - user.put_in_hands(beaker) + user.put_in_hands(B) if(new_beaker) beaker = new_beaker else @@ -397,7 +398,6 @@ cell = null if(beaker) beaker.forceMove(drop_location()) - beaker = null return ..() /obj/machinery/chem_dispenser/proc/get_macro_resolution() diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 1847f1f722..98cfd877b2 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -191,27 +191,27 @@ /obj/machinery/reagentgrinder/examine(mob/user) . = ..() if(!in_range(user, src) && !issilicon(user) && !isobserver(user)) - to_chat(user, "You're too far away to examine [src]'s contents and display!") + . += "You're too far away to examine [src]'s contents and display!" return if(operating) - to_chat(user, "\The [src] is operating.") + . += "\The [src] is operating." return if(beaker || length(holdingitems)) - to_chat(user, "\The [src] contains:") + . += "\The [src] contains:" if(beaker) - to_chat(user, "- \A [beaker].") + . += "- \A [beaker]." for(var/i in holdingitems) var/obj/item/O = i - to_chat(user, "- \A [O.name].") + . += "- \A [O.name]." if(!(stat & (NOPOWER|BROKEN))) - to_chat(user, "The status display reads:") - to_chat(user, "- Grinding reagents at [speed*100]%.") + . += "The status display reads:" + . += "- Grinding reagents at [speed*100]%." if(beaker) for(var/datum/reagent/R in beaker.reagents.reagent_list) - to_chat(user, "- [R.volume] units of [R.name].") + . += "- [R.volume] units of [R.name]." /obj/machinery/reagentgrinder/proc/eject(mob/user) for(var/i in holdingitems) diff --git a/code/modules/reagents/chemistry/machinery/smoke_machine.dm b/code/modules/reagents/chemistry/machinery/smoke_machine.dm index 4d60655488..c0d453de54 100644 --- a/code/modules/reagents/chemistry/machinery/smoke_machine.dm +++ b/code/modules/reagents/chemistry/machinery/smoke_machine.dm @@ -15,7 +15,7 @@ var/setting = 1 // displayed range is 3 * setting var/max_range = 3 // displayed max range is 3 * max range -/datum/effect_system/smoke_spread/chem/smoke_machine/set_up(datum/reagents/carry, setting=1, efficiency=10, loc) +/datum/effect_system/smoke_spread/chem/smoke_machine/set_up(datum/reagents/carry, setting=1, efficiency=10, loc, silent=FALSE) amount = setting carry.copy_to(chemholder, 20) carry.remove_any(amount * 16 / efficiency) diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 52d3ba7822..da41ac9dc4 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -44,7 +44,7 @@ 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 - + var/value = 0 //How much does it sell for in cargo? /datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references . = ..() diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 94aca411be..bd60880324 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -88,7 +88,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of beer" glass_desc = "A freezing pint of beer." pH = 4 - + value = 0.1 /datum/reagent/consumable/ethanol/beer/light name = "Light Beer" @@ -99,6 +99,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of light beer" glass_desc = "A freezing pint of watery light beer." pH = 5 + value = 0.3 /datum/reagent/consumable/ethanol/beer/green name = "Green Beer" @@ -110,6 +111,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of green beer" glass_desc = "A freezing pint of green beer. Festive." pH = 6 + value = 0.3 /datum/reagent/consumable/ethanol/beer/green/on_mob_life(mob/living/carbon/M) if(M.color != color) @@ -130,6 +132,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "DAMN, THIS THING LOOKS ROBUST!" shot_glass_icon_state = "shotglasscream" pH = 6 + value = 0.1 /datum/reagent/consumable/ethanol/kahlua/on_mob_life(mob/living/carbon/M) @@ -153,6 +156,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy." shot_glass_icon_state = "shotglassbrown" pH = 4.5 + value = 0.1 /datum/reagent/consumable/ethanol/thirteenloko name = "Thirteen Loko" @@ -168,7 +172,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "thirteen_loko_glass" glass_name = "glass of Thirteen Loko" glass_desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass." - + value = 0.3 /datum/reagent/consumable/ethanol/thirteenloko/on_mob_life(mob/living/carbon/M) M.drowsyness = max(0,M.drowsyness-7) @@ -231,6 +235,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "The glass contain wodka. Xynta." shot_glass_icon_state = "shotglassclear" pH = 8.1 + value = 0.1 /datum/reagent/consumable/ethanol/vodka/on_mob_life(mob/living/carbon/M) M.radiation = max(M.radiation-2,0) @@ -247,6 +252,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "glass_brown" glass_name = "glass of bilk" glass_desc = "A brew of milk and beer. For those alcoholics who fear osteoporosis." + value = 0.5 /datum/reagent/consumable/ethanol/bilk/on_mob_life(mob/living/carbon/M) if(M.getBruteLoss() && prob(10)) @@ -266,6 +272,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Three Mile Island Ice Tea" glass_desc = "A glass of this is sure to prevent a meltdown." pH = 3.5 + value = 1 /datum/reagent/consumable/ethanol/threemileisland/on_mob_life(mob/living/carbon/M) M.set_drugginess(50) @@ -282,6 +289,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of gin" glass_desc = "A crystal clear glass of Griffeater gin." pH = 6.9 + value = 0.1 /datum/reagent/consumable/ethanol/rum name = "Rum" @@ -295,6 +303,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "Now you want to Pray for a pirate suit, don't you?" shot_glass_icon_state = "shotglassbrown" pH = 6.5 + value = 0.1 /datum/reagent/consumable/ethanol/tequila name = "Tequila" @@ -308,6 +317,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "Now all that's missing is the weird colored shades!" shot_glass_icon_state = "shotglassgold" pH = 4 + value = 0.1 /datum/reagent/consumable/ethanol/vermouth name = "Vermouth" @@ -321,6 +331,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "You wonder why you're even drinking this straight." shot_glass_icon_state = "shotglassclear" pH = 3.25 + value = 0.1 /datum/reagent/consumable/ethanol/wine name = "Wine" @@ -334,6 +345,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "A very classy looking drink." shot_glass_icon_state = "shotglassred" pH = 3.45 + value = 0.1 /datum/reagent/consumable/ethanol/lizardwine name = "Lizard wine" @@ -344,6 +356,7 @@ All effects don't start immediately, but rather get worse over time; the rate is quality = DRINK_FANTASTIC taste_description = "scaley sweetness" pH = 3 + value = 2 /datum/reagent/consumable/ethanol/grappa name = "Grappa" @@ -356,6 +369,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of grappa" glass_desc = "A fine drink originally made to prevent waste by using the leftovers from winemaking." pH = 3.5 + value = 0.1 /datum/reagent/consumable/ethanol/cognac name = "Cognac" @@ -369,6 +383,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "Damn, you feel like some kind of French aristocrat just by holding this." shot_glass_icon_state = "shotglassbrown" pH = 3.5 + value = 0.1 /datum/reagent/consumable/ethanol/absinthe name = "Absinthe" @@ -381,6 +396,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of absinthe" glass_desc = "It's as strong as it smells." shot_glass_icon_state = "shotglassgreen" + value = 0.1 /datum/reagent/consumable/ethanol/absinthe/on_mob_life(mob/living/carbon/M) if(prob(10) && !HAS_TRAIT(M, TRAIT_ALCOHOL_TOLERANCE)) @@ -415,6 +431,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of ale" glass_desc = "A freezing pint of delicious Ale." pH = 4.5 + value = 0.1 /datum/reagent/consumable/ethanol/goldschlager name = "Goldschlager" @@ -428,6 +445,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of goldschlager" glass_desc = "100% proof that teen girls will drink anything with gold in it." shot_glass_icon_state = "shotglassgold" + value = 0.5 /datum/reagent/consumable/ethanol/patron name = "Patron" @@ -442,6 +460,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "Drinking patron in the bar, with all the subpar ladies." shot_glass_icon_state = "shotglassclear" pH = 4.5 + value = 0.1 /datum/reagent/consumable/ethanol/gintonic name = "Gin and Tonic" @@ -455,6 +474,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Gin and Tonic" glass_desc = "A mild but still great cocktail. Drink up, like a true Englishman." pH = 3 + value = 0.5 /datum/reagent/consumable/ethanol/rum_coke name = "Rum and Coke" @@ -468,6 +488,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Rum and Coke" glass_desc = "The classic go-to of space-fratboys." pH = 4 + value = 1 /datum/reagent/consumable/ethanol/cuba_libre name = "Cuba Libre" @@ -480,6 +501,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "cubalibreglass" glass_name = "Cuba Libre" glass_desc = "A classic mix of rum, cola, and lime. A favorite of revolutionaries everywhere!" + value = 0.5 /datum/reagent/consumable/ethanol/cuba_libre/on_mob_life(mob/living/carbon/M) @@ -502,7 +524,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "whiskeycolaglass" glass_name = "whiskey cola" glass_desc = "An innocent-looking mixture of cola and Whiskey. Delicious." - + value = 0.5 /datum/reagent/consumable/ethanol/martini name = "Classic Martini" @@ -515,6 +537,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "martiniglass" glass_name = "Classic Martini" glass_desc = "Damn, the bartender even stirred it, not shook it." + value = 1 /datum/reagent/consumable/ethanol/vodkamartini name = "Vodka Martini" @@ -527,6 +550,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "martiniglass" glass_name = "Vodka martini" glass_desc ="A bastardisation of the classic martini. Still great." + value = 1 /datum/reagent/consumable/ethanol/white_russian @@ -540,6 +564,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "whiterussianglass" glass_name = "White Russian" glass_desc = "A very nice looking drink. But that's just, like, your opinion, man." + value = 1 /datum/reagent/consumable/ethanol/screwdrivercocktail name = "Screwdriver" @@ -552,6 +577,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "screwdriverglass" glass_name = "Screwdriver" glass_desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer." + value = 1 /datum/reagent/consumable/ethanol/screwdrivercocktail/on_mob_life(mob/living/carbon/M) if(M.mind && M.mind.assigned_role in list("Station Engineer", "Atmospheric Technician", "Chief Engineer")) //Engineers lose radiation poisoning at a massive rate. @@ -568,6 +594,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "booger" glass_name = "Booger" glass_desc = "Ewww..." + value = 0.3 /datum/reagent/consumable/ethanol/bloody_mary name = "Bloody Mary" @@ -580,6 +607,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "bloodymaryglass" glass_name = "Bloody Mary" glass_desc = "Tomato juice, mixed with Vodka and a lil' bit of lime. Tastes like liquid murder." + value = 1.3 /datum/reagent/consumable/ethanol/bloody_mary/on_mob_life(mob/living/carbon/C) if(C.blood_volume < (BLOOD_VOLUME_NORMAL*C.blood_ratio)) @@ -597,6 +625,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "bravebullglass" glass_name = "Brave Bull" glass_desc = "Tequila and Coffee liqueur, brought together in a mouthwatering mixture. Drink up." + value = 2 var/tough_text /datum/reagent/consumable/ethanol/brave_bull/on_mob_metabolize(mob/living/M) @@ -621,6 +650,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "tequilasunriseglass" glass_name = "tequila Sunrise" glass_desc = "Oh great, now you feel nostalgic about sunrises back on Terra..." + value = 2 var/obj/effect/light_holder /datum/reagent/consumable/ethanol/tequila_sunrise/on_mob_metabolize(mob/living/M) @@ -651,6 +681,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Toxins Special" glass_desc = "Whoah, this thing is on FIRE!" shot_glass_icon_state = "toxinsspecialglass" + value = 2 /datum/reagent/consumable/ethanol/toxins_special/on_mob_life(var/mob/living/M) M.adjust_bodytemperature(15 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL + 20) //310.15 is the normal bodytemp. @@ -670,6 +701,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "Heavy, hot and strong. Just like the Iron fist of the LAW." pH = 2 overdose_threshold = 40 + value = 3 var/datum/brain_trauma/special/beepsky/B /datum/reagent/consumable/ethanol/beepsky_smash/on_mob_metabolize(mob/living/carbon/M) @@ -711,6 +743,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "irishcreamglass" glass_name = "Irish Cream" glass_desc = "It's cream, mixed with whiskey. What else would you expect from the Irish?" + value = 1 /datum/reagent/consumable/ethanol/manly_dorf name = "The Manly Dorf" @@ -723,6 +756,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "manlydorfglass" glass_name = "The Manly Dorf" glass_desc = "A manly concoction made from Ale and Beer. Intended for true men only." + value = 2 var/dorf_mode /datum/reagent/consumable/ethanol/manly_dorf/on_mob_metabolize(mob/living/M) @@ -750,7 +784,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "longislandicedteaglass" glass_name = "Long Island Iced Tea" glass_desc = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." - + value = 1 /datum/reagent/consumable/ethanol/moonshine name = "Moonshine" @@ -762,6 +796,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "glass_clear" glass_name = "Moonshine" glass_desc = "You've really hit rock bottom now... your liver packed its bags and left last night." + value = 2 /datum/reagent/consumable/ethanol/b52 name = "B-52" @@ -775,6 +810,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "B-52" glass_desc = "Kahlua, Irish Cream, and cognac. You will get bombed." shot_glass_icon_state = "b52glass" + value = 5.2 /datum/reagent/consumable/ethanol/b52/on_mob_metabolize(mob/living/M) playsound(M, 'sound/effects/explosion_distant.ogg', 100, FALSE) @@ -790,6 +826,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "irishcoffeeglass" glass_name = "Irish Coffee" glass_desc = "Coffee and alcohol. More fun than a Mimosa to drink in the morning." + value = 2 /datum/reagent/consumable/ethanol/margarita name = "Margarita" @@ -802,6 +839,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "margaritaglass" glass_name = "Margarita" glass_desc = "On the rocks with salt on the rim. Arriba~!" + value = 2 /datum/reagent/consumable/ethanol/black_russian name = "Black Russian" @@ -814,6 +852,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "blackrussianglass" glass_name = "Black Russian" glass_desc = "For the lactose-intolerant. Still as classy as a White Russian." + value = 3 /datum/reagent/consumable/ethanol/manhattan @@ -827,6 +866,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "manhattanglass" glass_name = "Manhattan" glass_desc = "The Detective's undercover drink of choice. He never could stomach gin..." + value = 3 /datum/reagent/consumable/ethanol/manhattan_proj @@ -840,6 +880,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "proj_manhattanglass" glass_name = "Manhattan Project" glass_desc = "A scientist's drink of choice, for thinking how to blow up the station." + value = 6 /datum/reagent/consumable/ethanol/manhattan_proj/on_mob_life(mob/living/carbon/M) @@ -857,6 +898,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "whiskeysodaglass2" glass_name = "whiskey soda" glass_desc = "Ultimate refreshment." + value = 1 /datum/reagent/consumable/ethanol/antifreeze name = "Anti-freeze" @@ -865,10 +907,11 @@ All effects don't start immediately, but rather get worse over time; the rate is color = "#664300" // rgb: 102, 67, 0 boozepwr = 35 quality = DRINK_NICE - taste_description = "Jack Frost's piss" + taste_description = "Jack Frost's piss" //Waterspots eeewww glass_icon_state = "antifreeze" glass_name = "Anti-freeze" glass_desc = "The ultimate refreshment." + value = 3 /datum/reagent/consumable/ethanol/antifreeze/on_mob_life(mob/living/carbon/M) M.adjust_bodytemperature(20 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL + 20) //310.15 is the normal bodytemp. @@ -885,6 +928,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "b&p" glass_name = "Barefoot" glass_desc = "Barefoot and pregnant." + value = 4 /datum/reagent/consumable/ethanol/barefoot/on_mob_life(mob/living/carbon/M) if(ishuman(M)) //Barefoot causes the imbiber to quickly regenerate brute trauma if they're not wearing shoes. @@ -905,6 +949,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "snowwhite" glass_name = "Snow White" glass_desc = "A cold refreshment." + value = 1 /datum/reagent/consumable/ethanol/demonsblood //Prevents the imbiber from being dragged into a pool of blood by a slaughter demon. name = "Demon's Blood" @@ -917,6 +962,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "demonsblood" glass_name = "Demons Blood" glass_desc = "Just looking at this thing makes the hair at the back of your neck stand up." + value = 2 /datum/reagent/consumable/ethanol/devilskiss //If eaten by a slaughter demon, the demon will regret it. name = "Devil's Kiss" @@ -929,6 +975,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "devilskiss" glass_name = "Devils Kiss" glass_desc = "Creepy time!" + value = 2 /datum/reagent/consumable/ethanol/vodkatonic name = "Vodka and Tonic" @@ -941,7 +988,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "vodkatonicglass" glass_name = "vodka and tonic" glass_desc = "For when a gin and tonic isn't Russian enough." - + value = 1 /datum/reagent/consumable/ethanol/ginfizz name = "Gin Fizz" @@ -954,7 +1001,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "ginfizzglass" glass_name = "gin fizz" glass_desc = "Refreshingly lemony, deliciously dry." - + value = 1 /datum/reagent/consumable/ethanol/bahama_mama name = "Bahama Mama" @@ -967,6 +1014,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "bahama_mama" glass_name = "Bahama Mama" glass_desc = "Tropical cocktail." + value = 2 /datum/reagent/consumable/ethanol/singulo name = "Singulo" @@ -979,6 +1027,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "singulo" glass_name = "Singulo" glass_desc = "A blue-space beverage." + value = 4 /datum/reagent/consumable/ethanol/sbiten name = "Sbiten" @@ -991,6 +1040,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "sbitenglass" glass_name = "Sbiten" glass_desc = "A spicy mix of Vodka and Spice. Very hot." + value = 2 /datum/reagent/consumable/ethanol/sbiten/on_mob_life(mob/living/carbon/M) M.adjust_bodytemperature(50 * TEMPERATURE_DAMAGE_COEFFICIENT, 0 ,BODYTEMP_HEAT_DAMAGE_LIMIT) //310.15 is the normal bodytemp. @@ -1007,6 +1057,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "red_meadglass" glass_name = "Red Mead" glass_desc = "A True Viking's Beverage, though its color is strange." + value = 5 /datum/reagent/consumable/ethanol/mead name = "Mead" @@ -1020,6 +1071,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "meadglass" glass_name = "Mead" glass_desc = "A Viking's Beverage, though a cheap one." + value = 1 /datum/reagent/consumable/ethanol/iced_beer name = "Iced Beer" @@ -1031,6 +1083,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "iced_beerglass" glass_name = "iced beer" glass_desc = "A beer so frosty, the air around it freezes." + value = 1 /datum/reagent/consumable/ethanol/iced_beer/on_mob_life(mob/living/carbon/M) M.adjust_bodytemperature(-20 * TEMPERATURE_DAMAGE_COEFFICIENT, T0C) //310.15 is the normal bodytemp. @@ -1046,7 +1099,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "grogglass" glass_name = "Grog" glass_desc = "A fine and cepa drink for Space." - + value = 2.1 /datum/reagent/consumable/ethanol/aloe name = "Aloe" @@ -1059,6 +1112,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "aloe" glass_name = "Aloe" glass_desc = "Very, very, very good." + value = 1 /datum/reagent/consumable/ethanol/andalusia name = "Andalusia" @@ -1071,6 +1125,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "andalusia" glass_name = "Andalusia" glass_desc = "A nice, strangely named drink." + value = 1 /datum/reagent/consumable/ethanol/alliescocktail name = "Allies Cocktail" @@ -1083,6 +1138,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "alliescocktail" glass_name = "Allies cocktail" glass_desc = "A drink made from your allies." + value = 4 /datum/reagent/consumable/ethanol/acid_spit name = "Acid Spit" @@ -1095,6 +1151,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "acidspitglass" glass_name = "Acid Spit" glass_desc = "A drink from Nanotrasen. Made from live aliens." + value = 3 /datum/reagent/consumable/ethanol/amasec name = "Amasec" @@ -1107,6 +1164,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "amasecglass" glass_name = "Amasec" glass_desc = "Always handy before COMBAT!!!" + value = 2 /datum/reagent/consumable/ethanol/changelingsting name = "Changeling Sting" @@ -1119,6 +1177,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "changelingsting" glass_name = "Changeling Sting" glass_desc = "A stingy drink." + value = 1.5 /datum/reagent/consumable/ethanol/changelingsting/on_mob_life(mob/living/carbon/M) if(M.mind) //Changeling Sting assists in the recharging of changeling chemicals. @@ -1139,6 +1198,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "irishcarbomb" glass_name = "Irish Car Bomb" glass_desc = "An Irish car bomb." + value = 5 /datum/reagent/consumable/ethanol/syndicatebomb name = "Syndicate Bomb" @@ -1151,6 +1211,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "syndicatebomb" glass_name = "Syndicate Bomb" glass_desc = "A syndicate bomb." + value = 2 /datum/reagent/consumable/ethanol/syndicatebomb/on_mob_life(mob/living/carbon/M) if(prob(5)) @@ -1168,6 +1229,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "erikasurprise" glass_name = "Erika Surprise" glass_desc = "The surprise is, it's green!" + value = 4 /datum/reagent/consumable/ethanol/driestmartini name = "Driest Martini" @@ -1181,6 +1243,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "driestmartiniglass" glass_name = "Driest Martini" glass_desc = "Only for the experienced. You think you see sand floating in the glass." + value = 5 /datum/reagent/consumable/ethanol/bananahonk name = "Banana Honk" @@ -1194,6 +1257,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "bananahonkglass" glass_name = "Banana Honk" glass_desc = "A drink from Clown Heaven." + value = 8 /datum/reagent/consumable/ethanol/bananahonk/on_mob_life(mob/living/carbon/M) if((ishuman(M) && M.job == "Clown") || ismonkey(M)) @@ -1213,6 +1277,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "silencerglass" glass_name = "Silencer" glass_desc = "A drink from Mime Heaven." + value = 2 /datum/reagent/consumable/ethanol/silencer/on_mob_life(mob/living/carbon/M) if(ishuman(M) && M.job == "Mime") @@ -1231,6 +1296,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "drunkenblumpkin" glass_name = "Drunken Blumpkin" glass_desc = "A drink for the drunks." + value = 3 /datum/reagent/consumable/ethanol/whiskey_sour //Requested since we had whiskey cola and soda but not sour. name = "Whiskey Sour" @@ -1243,6 +1309,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "whiskey_sour" glass_name = "whiskey sour" glass_desc = "Lemon juice mixed with whiskey and a dash of sugar. Surprisingly satisfying." + value = 2 /datum/reagent/consumable/ethanol/hcider name = "Hard Cider" @@ -1256,7 +1323,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "hard cider" glass_desc = "Tastes like autumn... no wait, fall!" shot_glass_icon_state = "shotglassbrown" - + value = 3 /datum/reagent/consumable/ethanol/fetching_fizz //A reference to one of my favorite games of all time. Pulls nearby ores to the imbiber! name = "Fetching Fizz" @@ -1270,7 +1337,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "fetching_fizz" glass_name = "Fetching Fizz" glass_desc = "Induces magnetism in the imbiber. Started as a barroom prank but evolved to become popular with miners and scrappers. Metallic aftertaste." - + value = 2 /datum/reagent/consumable/ethanol/fetching_fizz/on_mob_life(mob/living/carbon/M) for(var/obj/item/stack/ore/O in orange(3, M)) @@ -1290,6 +1357,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "hearty_punch" glass_name = "Hearty Punch" glass_desc = "Aromatic beverage served piping hot. According to folk tales it can almost wake the dead." + value = 1 /datum/reagent/consumable/ethanol/hearty_punch/on_mob_life(mob/living/carbon/M) if(M.health <= 0) @@ -1311,7 +1379,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "glass_brown2" glass_name = "Bacchus' Blessing" glass_desc = "You didn't think it was possible for a liquid to be so utterly revolting. Are you sure about this...?" - + value = 8 /datum/reagent/consumable/ethanol/atomicbomb @@ -1325,6 +1393,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "atomicbombglass" glass_name = "Atomic Bomb" glass_desc = "Nanotrasen cannot take legal responsibility for your actions after imbibing." + value = 3.56 /datum/reagent/consumable/ethanol/atomicbomb/on_mob_life(mob/living/carbon/M) M.set_drugginess(50) @@ -1354,6 +1423,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "gargleblasterglass" glass_name = "Pan-Galactic Gargle Blaster" glass_desc = "Like having your brain smashed out by a slice of lemon wrapped around a large gold brick." + value = 5 /datum/reagent/consumable/ethanol/gargle_blaster/on_mob_life(mob/living/carbon/M) M.dizziness +=1.5 @@ -1387,6 +1457,7 @@ All effects don't start immediately, but rather get worse over time; the rate is impure_chem = "neuroweak" inverse_chem_val = 0.5 //Clear conversion inverse_chem = "neuroweak" + value = 4 /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)) @@ -1428,6 +1499,7 @@ All effects don't start immediately, but rather get worse over time; the rate is description = "A mostly safe alcoholic drink for the true daredevils. Counteracts Neurotoxins." boozepwr = 60 pH = 8 + value = 3 /datum/reagent/consumable/ethanol/neuroweak/on_mob_life(mob/living/carbon/M) if(holder.has_reagent("neurotoxin")) @@ -1454,6 +1526,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "hippiesdelightglass" glass_name = "Hippie's Delight" glass_desc = "A drink enjoyed by people during the 1960's." + value = 1.96 /datum/reagent/consumable/ethanol/hippies_delight/on_mob_life(mob/living/carbon/M) M.slurring = max(M.slurring,50) @@ -1498,6 +1571,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "nog3" glass_name = "eggnog" glass_desc = "The traditional way to get absolutely hammered at a Christmas party." + value = 4 /datum/reagent/consumable/ethanol/narsour @@ -1511,6 +1585,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "narsour" glass_name = "Nar'Sour" glass_desc = "A new hit cocktail inspired by THE ARM Breweries will have you shouting Fuu ma'jin in no time!" + value = 6.66 /datum/reagent/consumable/ethanol/narsour/on_mob_life(mob/living/carbon/M) M.cultslurring = min(M.cultslurring + 3, 3) @@ -1527,6 +1602,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "glass_orange" glass_name = "Triple Sec" glass_desc = "A glass of straight Triple Sec." + value = 1.5 /datum/reagent/consumable/ethanol/creme_de_menthe name = "Creme de Menthe" @@ -1538,6 +1614,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "glass_green" glass_name = "Creme de Menthe" glass_desc = "You can almost feel the first breath of spring just looking at it." + value = 2 /datum/reagent/consumable/ethanol/creme_de_cacao name = "Creme de Cacao" @@ -1549,6 +1626,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "glass_brown" glass_name = "Creme de Cacao" glass_desc = "A million hazing lawsuits and alcohol poisonings have started with this humble ingredient." + value = 1 /datum/reagent/consumable/ethanol/quadruple_sec name = "Quadruple Sec" @@ -1561,6 +1639,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "quadruple_sec" glass_name = "Quadruple Sec" glass_desc = "An intimidating and lawful beverage dares you to violate the law and make its day. Still can't drink it on duty, though." + value = 3.04 /datum/reagent/consumable/ethanol/quadruple_sec/on_mob_life(mob/living/carbon/M) if(M.mind && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) //Securidrink in line with the screwderiver for engineers or nothing for mimes. @@ -1580,6 +1659,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "quintuple_sec" glass_name = "Quintuple Sec" glass_desc = "Now you are become law, destroyer of clowns." + value = 4.01 /datum/reagent/consumable/ethanol/quintuple_sec/on_mob_life(mob/living/carbon/M) if(M.mind && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) //Securidrink in line with the screwderiver for engineers or nothing for mimes but STRONG.. @@ -1602,6 +1682,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "grasshopper" glass_name = "Grasshopper" glass_desc = "You weren't aware edible beverages could be that green." + value = 1 /datum/reagent/consumable/ethanol/stinger name = "Stinger" @@ -1614,6 +1695,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "stinger" glass_name = "Stinger" glass_desc = "You wonder what would happen if you pointed this at a heat source..." + value = 1 /datum/reagent/consumable/ethanol/bastion_bourbon name = "Bastion Bourbon" @@ -1629,6 +1711,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "If you're feeling low, count on the buttery flavor of our own bastion bourbon." shot_glass_icon_state = "shotglassgreen" pH = 4 + value = 8 /datum/reagent/consumable/ethanol/bastion_bourbon/on_mob_metabolize(mob/living/L) var/heal_points = 10 @@ -1666,6 +1749,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Squirt Cider" glass_desc = "Squirt cider will toughen you right up. Too bad about the musty aftertaste." shot_glass_icon_state = "shotglassgreen" + value = 1 /datum/reagent/consumable/ethanol/squirt_cider/on_mob_life(mob/living/carbon/M) M.satiety += 5 //for context, vitamins give 30 satiety per tick @@ -1683,6 +1767,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "fringe_weaver" glass_name = "Fringe Weaver" glass_desc = "It's a wonder it doesn't spill out of the glass." + value = 1 /datum/reagent/consumable/ethanol/sugar_rush name = "Sugar Rush" @@ -1696,6 +1781,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "sugar_rush" glass_name = "Sugar Rush" glass_desc = "If you can't mix a Sugar Rush, you can't tend bar." + value = 1 /datum/reagent/consumable/ethanol/sugar_rush/on_mob_life(mob/living/carbon/M) M.satiety -= 10 //junky as hell! a whole glass will keep you from being able to eat junk food @@ -1713,6 +1799,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "crevice_spike" glass_name = "Crevice Spike" glass_desc = "It'll either knock the drunkenness out of you or knock you out cold. Both, probably." + value = 1 /datum/reagent/consumable/ethanol/crevice_spike/on_mob_metabolize(mob/living/L) //damage only applies when drink first enters system and won't again until drink metabolizes out L.adjustBruteLoss(3 * min(5,volume)) //minimum 3 brute damage on ingestion to limit non-drink means of injury - a full 5 unit gulp of the drink trucks you for the full 15 @@ -1727,6 +1814,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "sakecup" glass_name = "cup of sake" glass_desc = "A traditional cup of sake." + value = 0.1 /datum/reagent/consumable/ethanol/peppermint_patty name = "Peppermint Patty" @@ -1739,8 +1827,10 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "peppermint_patty" glass_name = "Peppermint Patty" glass_desc = "A boozy minty hot cocoa that warms your belly on a cold night." + value = 2 /datum/reagent/consumable/ethanol/peppermint_patty/on_mob_life(mob/living/carbon/M) + M.apply_status_effect(/datum/status_effect/throat_soothed) M.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL) ..() @@ -1756,6 +1846,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Alexander" glass_desc = "A creamy, indulgent delight that is stronger than it seems." var/obj/item/shield/mighty_shield + value = 1 /datum/reagent/consumable/ethanol/alexander/on_mob_metabolize(mob/living/L) if(ishuman(L)) @@ -1788,6 +1879,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "sidecar" glass_name = "Sidecar" glass_desc = "The one ride you'll gladly give up the wheel for." + value = 1 /datum/reagent/consumable/ethanol/between_the_sheets name = "Between the Sheets" @@ -1800,6 +1892,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "between_the_sheets" glass_name = "Between the Sheets" glass_desc = "The only drink that comes with a label reminding you of Nanotrasen's zero-tolerance promiscuity policy." + value = 2 /datum/reagent/consumable/ethanol/between_the_sheets/on_mob_life(mob/living/L) ..() @@ -1825,6 +1918,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "kamikaze" glass_name = "Kamikaze" glass_desc = "Divinely windy." + value = 1 /datum/reagent/consumable/ethanol/mojito name = "Mojito" @@ -1837,6 +1931,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "mojito" glass_name = "Mojito" glass_desc = "A drink that looks as refreshing as it tastes." + value = 1 /datum/reagent/consumable/ethanol/fernet name = "Fernet" @@ -1846,7 +1941,8 @@ All effects don't start immediately, but rather get worse over time; the rate is boozepwr = 80 taste_description = "utter bitterness" glass_name = "glass of fernet" - glass_desc = "A glass of pure Fernet. Only an absolute madman would drink this alone." //Hi Kevum + glass_desc = "A glass of pure Fernet. Only an absolute madman would drink this alone." + value = 0.1 /datum/reagent/consumable/ethanol/fernet/on_mob_life(mob/living/carbon/M) if(M.nutrition <= NUTRITION_LEVEL_STARVING) @@ -1866,6 +1962,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "godlyblend" glass_name = "glass of fernet cola" glass_desc = "A sawed-off cola bottle filled with Fernet Cola. Nothing better after eating like a lardass." + value = 1 /datum/reagent/consumable/ethanol/fernet_cola/on_mob_life(mob/living/carbon/M) if(M.nutrition <= NUTRITION_LEVEL_STARVING) @@ -1886,6 +1983,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "fanciulli" glass_name = "glass of fanciulli" glass_desc = "A glass of Fanciulli. It's just Manhattan with Fernet." + value = 1 /datum/reagent/consumable/ethanol/fanciulli/on_mob_life(mob/living/carbon/M) M.nutrition = max(M.nutrition - 5, 0) @@ -1910,7 +2008,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state= "minted_fernet" glass_name = "glass of branca menta" glass_desc = "A glass of Branca Menta, perfect for those lazy and hot sunday summer afternoons." //Get lazy literally by drinking this - + value = 1 /datum/reagent/consumable/ethanol/branca_menta/on_mob_life(mob/living/carbon/M) M.adjust_bodytemperature(-20 * TEMPERATURE_DAMAGE_COEFFICIENT, T0C) @@ -1934,6 +2032,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "blank_paper" glass_name = "glass of blank paper" glass_desc = "A fizzy cocktail for those looking to start fresh." + value = 1 /datum/reagent/consumable/ethanol/blank_paper/on_mob_life(mob/living/carbon/M) if(ishuman(M) && M.job == "Mime") @@ -1951,6 +2050,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "champagne_glass" glass_name = "Champagne" glass_desc = "The flute clearly displays the slowly rising bubbles." + value = 1 /datum/reagent/consumable/ethanol/wizz_fizz name = "Wizz Fizz" @@ -1963,6 +2063,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "wizz_fizz" glass_name = "Wizz Fizz" glass_desc = "The glass bubbles and froths with an almost magical intensity." + value = 1 /datum/reagent/consumable/ethanol/wizz_fizz/on_mob_life(mob/living/carbon/M) //A healing drink similar to Quadruple Sec, Ling Stings, and Screwdrivers for the Wizznerds; the check is consistent with the changeling sting @@ -1983,6 +2084,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "bug_spray" glass_name = "Bug Spray" glass_desc = "Your eyes begin to water as the sting of alcohol reaches them." + value = 1 /datum/reagent/consumable/ethanol/bug_spray/on_mob_life(mob/living/carbon/M) //Bugs should not drink Bug spray. @@ -2005,6 +2107,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "applejack_glass" glass_name = "Applejack" glass_desc = "You feel like you could drink this all neight." + value = 0.1 /datum/reagent/consumable/ethanol/jack_rose name = "Jack Rose" @@ -2017,6 +2120,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "jack_rose" glass_name = "Jack Rose" glass_desc = "Enough of these, and you really will start to suppose your toeses are roses." + value = 1 /datum/reagent/consumable/ethanol/turbo name = "Turbo" @@ -2029,6 +2133,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "turbo" glass_name = "Turbo" glass_desc = "A turbulent cocktail for outlaw hoverbikers." + value = 0.3 /datum/reagent/consumable/ethanol/turbo/on_mob_life(mob/living/carbon/M) if(prob(4)) @@ -2047,6 +2152,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "old_timer" glass_name = "Old Timer" glass_desc = "WARNING! May cause premature aging!" + value = 2 /datum/reagent/consumable/ethanol/old_timer/on_mob_life(mob/living/carbon/M) if(prob(20)) @@ -2080,6 +2186,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "rubberneck" glass_name = "Rubberneck" glass_desc = "A popular drink amongst those adhering to an all synthetic diet." + value = 1 /datum/reagent/consumable/ethanol/duplex name = "Duplex" @@ -2092,6 +2199,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "duplex" glass_name = "Duplex" glass_desc = "To imbibe one component separately from the other is consider a great faux pas." + value = 1 /datum/reagent/consumable/ethanol/trappist name = "Trappist Beer" @@ -2104,6 +2212,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "trappistglass" glass_name = "Trappist Beer" glass_desc = "boozy Catholicism in a glass." + value = 1 /datum/reagent/consumable/ethanol/trappist/on_mob_life(mob/living/carbon/M) if(M.mind.isholy) @@ -2123,6 +2232,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Blazaam" glass_desc = "The glass seems to be sliding between realities. Doubles as a Berenstain remover." var/stored_teleports = 0 + value = 4 /datum/reagent/consumable/ethanol/blazaam/on_mob_life(mob/living/carbon/M) if(M.drunkenness > 40) @@ -2145,6 +2255,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "planet_cracker" glass_name = "Planet Cracker" glass_desc = "Although historians believe the drink was originally created to commemorate the end of an important conflict in man's past, its origins have largely been forgotten and it is today seen more as a general symbol of human supremacy." + value = 1 /datum/reagent/consumable/ethanol/commander_and_chief name = "Commander and Chief" @@ -2153,10 +2264,11 @@ All effects don't start immediately, but rather get worse over time; the rate is color = "#ffffc9" boozepwr = 50 quality = DRINK_FANTASTIC - taste_description = "Tastes like...duty and responsibility?" + taste_description = "duty and responsibility" glass_icon_state = "commander_and_chief" glass_name = "Commander and Chief" glass_desc = "The gems of this majestic chalice represent the departments and their Heads." + value = 10 /datum/reagent/consumable/ethanol/commander_and_chief/on_mob_life(mob/living/carbon/M) if(M.mind && HAS_TRAIT(M.mind, TRAIT_CAPTAIN_METABOLISM)) @@ -2181,6 +2293,7 @@ All effects don't start immediately, but rather get worse over time; the rate is var/list/names = list("null fruit" = 1) //Names of the fruits used. Associative list where name is key, value is the percentage of that fruit. var/list/tastes = list("bad coding" = 1) //List of tastes. See above. pH = 4 + value = 4 /datum/reagent/consumable/ethanol/fruit_wine/on_new(list/data) names = data["names"] diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 1afbed3533..63e3b46fed 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -92,6 +92,7 @@ description = "The sweet juice of an apple, fit for all ages." color = "#ECFF56" // rgb: 236, 255, 86 taste_description = "apples" + pH = 3.2 // ~ 2.7 -> 3.7 /datum/reagent/consumable/poisonberryjuice name = "Poison Berry Juice" @@ -785,6 +786,10 @@ glass_name = "glass of menthol" glass_desc = "Tastes naturally minty, and imparts a very mild numbing sensation." +/datum/reagent/consumable/menthol/on_mob_life(mob/living/L) + L.apply_status_effect(/datum/status_effect/throat_soothed) + ..() + /datum/reagent/consumable/grenadine name = "Grenadine" id = "grenadine" diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 15d517a0f5..4446b5c561 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -1,6 +1,7 @@ /datum/reagent/drug name = "Drug" id = "drug" + value = 12 metabolization_rate = 0.5 * REAGENTS_METABOLISM taste_description = "bitterness" var/trippy = TRUE //Does this drug make you trip? @@ -162,7 +163,7 @@ /datum/reagent/drug/methamphetamine name = "Methamphetamine" id = "methamphetamine" - description = "Reduces stun times by about 300%, speeds the user up, and allows the user to quickly recover stamina while dealing a small amount of Brain damage. If overdosed the subject will move randomly, laugh randomly, drop items and suffer from Toxin and Brain damage. If addicted the subject will constantly jitter and drool, before becoming dizzy and losing motor control and eventually suffer heavy toxin damage." + description = "Reduces stun times by about 300%, and allows the user to quickly recover stamina while dealing a small amount of Brain damage. If overdosed the subject will move randomly, laugh randomly, drop items and suffer from Toxin and Brain damage. If addicted the subject will constantly jitter and drool, before becoming dizzy and losing motor control and eventually suffer heavy toxin damage." reagent_state = LIQUID color = "#FAFAFA" overdose_threshold = 20 diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 056c5b1901..4d02706a3c 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -12,6 +12,7 @@ id = "consumable" taste_description = "generic food" taste_mult = 4 + value = 0.1 var/nutriment_factor = 1 * REAGENTS_METABOLISM var/quality = 0 //affects mood, typically higher for mixed drinks with more complex recipes @@ -91,6 +92,7 @@ name = "Vitamin" id = "vitamin" description = "All the best vitamins, minerals, and carbohydrates the body needs in pure form." + value = 0.5 brute_heal = 1 burn_heal = 1 @@ -106,6 +108,7 @@ description = "A variety of cooking oil derived from fat or plants. Used in food preparation and frying." color = "#EADD6B" //RGB: 234, 221, 107 (based off of canola oil) taste_mult = 0.8 + value = 1 taste_description = "oil" nutriment_factor = 7 * REAGENTS_METABOLISM //Not very healthy on its own metabolization_rate = 10 * REAGENTS_METABOLISM @@ -138,7 +141,7 @@ return TRUE /datum/reagent/consumable/cooking_oil/reaction_turf(turf/open/T, reac_volume) - if(!istype(T)) + if(!istype(T) || isgroundlessturf(T)) return if(reac_volume >= 5) T.MakeSlippery(TURF_WET_LUBE, min_wet_time = 10 SECONDS, wet_time_to_add = reac_volume * 1.5 SECONDS) @@ -156,6 +159,7 @@ metabolization_rate = 2 * REAGENTS_METABOLISM overdose_threshold = 200 // Hyperglycaemic shock taste_description = "sweetness" + value = 1 /datum/reagent/consumable/sugar/overdose_start(mob/living/M) to_chat(M, "You go into hyperglycaemic shock! Lay off the twinkies!") @@ -237,6 +241,7 @@ description = "A special oil that noticably chills the body. Extracted from Icepeppers and slimes." color = "#8BA6E9" // rgb: 139, 166, 233 taste_description = "mint" + value = 2 pH = 13 //HMM! I wonder /datum/reagent/consumable/frostoil/on_mob_life(mob/living/carbon/M) @@ -438,6 +443,7 @@ /datum/reagent/consumable/sprinkles name = "Sprinkles" id = "sprinkles" + value = 3 description = "Multi-colored little bits of sugar, commonly found on donuts. Loved by cops." color = "#FF00FF" // rgb: 255, 0, 255 taste_description = "childhood whimsy" @@ -453,6 +459,7 @@ id = "peanut_butter" description = "A popular food paste made from ground dry-roasted peanuts." color = "#C29261" + value = 3 nutriment_factor = 15 * REAGENTS_METABOLISM taste_description = "peanuts" @@ -461,6 +468,7 @@ id = "cornoil" description = "An oil derived from various types of corn." nutriment_factor = 20 * REAGENTS_METABOLISM + value = 4 color = "#302000" // rgb: 48, 32, 0 taste_description = "slime" @@ -479,6 +487,7 @@ /datum/reagent/consumable/enzyme name = "Universal Enzyme" id = "enzyme" + value = 1 description = "A universal enzyme used in the preperation of certain chemicals and foods." color = "#365E30" // rgb: 54, 94, 48 taste_description = "sweetness" @@ -518,6 +527,7 @@ /datum/reagent/consumable/flour name = "Flour" id = "flour" + value = 0.5 description = "This is what you rub all over yourself to pretend to be a ghost." reagent_state = SOLID color = "#FFFFFF" // rgb: 0, 0, 0 @@ -535,6 +545,7 @@ id = "cherryjelly" description = "Totally the best. Only to be spread on foods with excellent lateral symmetry." color = "#801E28" // rgb: 128, 30, 40 + value = 1 taste_description = "cherry" /datum/reagent/consumable/bluecherryjelly @@ -542,11 +553,13 @@ id = "bluecherryjelly" description = "Blue and tastier kind of cherry jelly." color = "#00F0FF" + value = 12 taste_description = "blue cherry" /datum/reagent/consumable/rice name = "Rice" id = "rice" + value = 0.5 description = "tiny nutritious grains" reagent_state = SOLID nutriment_factor = 3 * REAGENTS_METABOLISM @@ -556,6 +569,7 @@ /datum/reagent/consumable/vanilla name = "Vanilla Powder" id = "vanilla" + value = 1 description = "A fatty, bitter paste made from vanilla pods." reagent_state = SOLID nutriment_factor = 5 * REAGENTS_METABOLISM @@ -565,6 +579,7 @@ /datum/reagent/consumable/eggyolk name = "Egg Yolk" id = "eggyolk" + value = 1 description = "It's full of protein." nutriment_factor = 3 * REAGENTS_METABOLISM color = "#FFB500" @@ -573,6 +588,7 @@ /datum/reagent/consumable/corn_starch name = "Corn Starch" id = "corn_starch" + value = 2 description = "A slippery solution." color = "#f7f6e4" taste_description = "slime" @@ -580,6 +596,7 @@ /datum/reagent/consumable/corn_syrup name = "Corn Syrup" id = "corn_syrup" + value = 1 description = "Decays into sugar." color = "#fff882" metabolization_rate = 3 * REAGENTS_METABOLISM @@ -594,6 +611,7 @@ id = "honey" description = "Sweet sweet honey that decays into sugar. Has antibacterial and natural healing properties." color = "#d3a308" + value = 15 nutriment_factor = 15 * REAGENTS_METABOLISM metabolization_rate = 1 * REAGENTS_METABOLISM taste_description = "sweetness" @@ -608,18 +626,19 @@ ..() /datum/reagent/consumable/honey/reaction_mob(mob/living/M, method=TOUCH, reac_volume) - if(iscarbon(M) && (method in list(TOUCH, VAPOR, PATCH))) - var/mob/living/carbon/C = M - for(var/s in C.surgeries) - var/datum/surgery/S = s - S.success_multiplier = max(0.6, S.success_multiplier) // +60% success probability on each step, compared to bacchus' blessing's ~46% - ..() + if(iscarbon(M) && (method in list(TOUCH, VAPOR, PATCH))) + var/mob/living/carbon/C = M + for(var/s in C.surgeries) + var/datum/surgery/S = s + S.success_multiplier = max(0.6, S.success_multiplier) // +60% success probability on each step, compared to bacchus' blessing's ~46% + ..() /datum/reagent/consumable/mayonnaise name = "Mayonnaise" id = "mayonnaise" description = "An white and oily mixture of mixed egg yolks." color = "#DFDFDF" + value = 5 taste_description = "mayonnaise" /datum/reagent/consumable/tearjuice @@ -737,6 +756,30 @@ taste_description = "mournful honking" pH = 9.2 +/datum/reagent/consumable/liquidelectricity + name = "Liquid Electricity" + id = "liquidelectricity" + description = "The blood of Ethereals, and the stuff that keeps them going. Great for them, horrid for anyone else." + nutriment_factor = 5 * REAGENTS_METABOLISM + color = "#97ee63" + taste_description = "pure electricity" + +/* //We don't have ethereals here, so I'll just comment it out. +/datum/reagent/consumable/liquidelectricity/reaction_mob(mob/living/M, method=TOUCH, reac_volume) //can't be on life because of the way blood works. + if((method == INGEST || method == INJECT || method == PATCH) && iscarbon(M)) + + var/mob/living/carbon/C = M + var/obj/item/organ/stomach/ethereal/stomach = C.getorganslot(ORGAN_SLOT_STOMACH) + if(istype(stomach)) + stomach.adjust_charge(reac_volume * REM) +*/ + +/datum/reagent/consumable/liquidelectricity/on_mob_life(mob/living/carbon/M) + if(prob(25)) // && !isethereal(M)) + M.electrocute_act(rand(10,15), "Liquid Electricity in their body", 1) //lmao at the newbs who eat energy bars + playsound(M, "sparks", 50, TRUE) + return ..() + /datum/reagent/consumable/astrotame name = "Astrotame" id = "astrotame" @@ -748,6 +791,7 @@ taste_mult = 8 taste_description = "sweetness" overdose_threshold = 17 + value = 0.2 /datum/reagent/consumable/astrotame/overdose_process(mob/living/carbon/M) if(M.disgust < 80) diff --git a/code/modules/reagents/chemistry/reagents/impure_reagents.dm b/code/modules/reagents/chemistry/reagents/impure_reagents.dm index c96347cda2..4489088adc 100644 --- a/code/modules/reagents/chemistry/reagents/impure_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/impure_reagents.dm @@ -3,7 +3,7 @@ //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 + 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 diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 592f7bc592..6700c6c006 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -8,6 +8,7 @@ /datum/reagent/medicine name = "Medicine" id = "medicine" + value = 2 taste_description = "bitterness" /datum/reagent/medicine/on_mob_life(mob/living/carbon/M) @@ -127,6 +128,7 @@ description = "Instantly restores all hearing to the patient, but does not cure deafness." color = "#6600FF" // rgb: 100, 165, 255 pH = 2 + value = 10 /datum/reagent/medicine/inacusiate/on_mob_life(mob/living/carbon/M) M.restoreEars() @@ -209,6 +211,7 @@ overdose_threshold = 30 taste_description = "fish" pH = 12.2 + value = 20 /datum/reagent/medicine/rezadone/on_mob_life(mob/living/carbon/M) M.setCloneLoss(0) //Rezadone is almost never used in favor of cryoxadone. Hopefully this will change that. @@ -242,6 +245,7 @@ color = "#ffeac9" metabolization_rate = 5 * REAGENTS_METABOLISM overdose_threshold = 50 + value = 3 /datum/reagent/medicine/silver_sulfadiazine/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) if(iscarbon(M) && M.stat != DEAD) @@ -280,6 +284,7 @@ metabolization_rate = 0.5 * REAGENTS_METABOLISM overdose_threshold = 25 pH = 10.7 + value = 4 /datum/reagent/medicine/oxandrolone/on_mob_life(mob/living/carbon/M) if(M.getFireLoss() > 25) @@ -304,6 +309,7 @@ pH = 6.7 metabolization_rate = 5 * REAGENTS_METABOLISM overdose_threshold = 50 + value = 3 /datum/reagent/medicine/styptic_powder/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) if(iscarbon(M) && M.stat != DEAD) @@ -346,6 +352,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) var/last_added = 0 var/maximum_reachable = BLOOD_VOLUME_NORMAL - 10 //So that normal blood regeneration can continue with salglu active pH = 5.5 + value = 1 /datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/carbon/M) if(last_added) @@ -426,6 +433,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) pH = 11.5 metabolization_rate = 5 * REAGENTS_METABOLISM overdose_threshold = 40 + value = 6 /datum/reagent/medicine/synthflesh/reaction_mob(mob/living/M, method=TOUCH, reac_volume,show_message = 1) if(iscarbon(M)) @@ -458,6 +466,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) metabolization_rate = 0.5 * REAGENTS_METABOLISM taste_description = "ash" pH = 5 + value = 1 /datum/reagent/medicine/charcoal/on_mob_life(mob/living/carbon/M) M.adjustToxLoss(-2*REM, 0) @@ -476,6 +485,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) metabolization_rate = 0.25 * REAGENTS_METABOLISM overdose_threshold = 30 pH = 2 + value = 5 /datum/reagent/medicine/omnizine/on_mob_life(mob/living/carbon/M) M.adjustToxLoss(-0.5*REM, 0) @@ -629,7 +639,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) /datum/reagent/medicine/ephedrine name = "Ephedrine" id = "ephedrine" - description = "Increases stun resistance and movement speed. Overdose deals toxin damage and inhibits breathing." + description = "Increases stun resistance. Overdose deals toxin damage and inhibits breathing." reagent_state = LIQUID color = "#D2FFFA" metabolization_rate = 0.5 * REAGENTS_METABOLISM @@ -1192,19 +1202,19 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) pH = 11.8 /datum/reagent/medicine/neo_jelly/on_mob_life(mob/living/carbon/M) - M.adjustBruteLoss(-1.5*REM, 0) - M.adjustFireLoss(-1.5*REM, 0) - M.adjustOxyLoss(-1.5*REM, 0) - M.adjustToxLoss(-1.5*REM, 0, TRUE) //heals TOXINLOVERs - . = 1 - ..() + M.adjustBruteLoss(-1.5*REM, 0) + M.adjustFireLoss(-1.5*REM, 0) + M.adjustOxyLoss(-1.5*REM, 0) + M.adjustToxLoss(-1.5*REM, 0, TRUE) //heals TOXINLOVERs + . = 1 + ..() /datum/reagent/medicine/neo_jelly/overdose_process(mob/living/M) - M.adjustOxyLoss(2.6*REM, 0) - M.adjustBruteLoss(3.5*REM, 0) - M.adjustFireLoss(3.5*REM, 0) - ..() - . = 1 + M.adjustOxyLoss(2.6*REM, 0) + M.adjustBruteLoss(3.5*REM, 0) + M.adjustFireLoss(3.5*REM, 0) + ..() + . = 1 /datum/reagent/medicine/earthsblood //Created by ambrosia gaia plants name = "Earthsblood" @@ -1454,3 +1464,50 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) M.adjustToxLoss(1, 0) ..() . = 1 + +/datum/reagent/medicine/silibinin + name = "Silibinin" + id = "silibinin" + description = "A thistle derrived hepatoprotective flavolignan mixture that help reverse damage to the liver." + reagent_state = SOLID + color = "#FFFFD0" + metabolization_rate = 1.5 * REAGENTS_METABOLISM + +/datum/reagent/medicine/silibinin/on_mob_life(mob/living/carbon/M) + M.adjustOrganLoss(ORGAN_SLOT_LIVER, -2)//Add a chance to cure liver trauma once implemented. + ..() + . = 1 + +/datum/reagent/medicine/polypyr //This is intended to be an ingredient in advanced chems. + name = "Polypyrylium Oligomers" + id = "polypyr" + description = "A�purple mixture of short polyelectrolyte chains not easily synthesized in the laboratory. It is valued as an intermediate in the synthesis of the cutting edge pharmaceuticals." + reagent_state = SOLID + color = "#9423FF" + metabolization_rate = 0.25 * REAGENTS_METABOLISM + overdose_threshold = 50 + taste_description = "numbing bitterness" + +/datum/reagent/medicine/polypyr/on_mob_life(mob/living/carbon/M) //I w�nted a collection of small positive effects, this is as hard to obtain as coniine after all. + M.adjustOrganLoss(ORGAN_SLOT_LUNGS, -0.25) + M.adjustBruteLoss(-0.35, 0) + if(prob(50)) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + H.bleed_rate = max(H.bleed_rate - 1, 0) + ..() + . = 1 + +/datum/reagent/medicine/polypyr/reaction_mob(mob/living/M, method=TOUCH, reac_volume) + if(method == TOUCH || method == VAPOR) + if(M && ishuman(M) && reac_volume >= 0.5) + var/mob/living/carbon/human/H = M + H.hair_color = "92f" + H.facial_hair_color = "92f" + H.update_hair() + +/datum/reagent/medicine/polypyr/overdose_process(mob/living/M) + M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5) + ..() + . = 1 + diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index af6a65ebe1..e91719504e 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -2,6 +2,7 @@ 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" + value = 1 color = BLOOD_COLOR_HUMAN // rgb: 200, 0, 0 description = "Blood from some creature." metabolization_rate = 5 //fast rate so it disappears fast. @@ -68,7 +69,7 @@ color = bloodtype_to_color(data["blood_type"]) if(data["blood_type"] == "SY") name = "Synthetic Blood" - taste_description = "oily" + taste_description = "oil" if(data["blood_type"] == "X*") name = "Xenomorph Blood" @@ -83,12 +84,12 @@ if(data["blood_type"] == "BUG") name = "Insect Blood" - taste_description = "greasy" + taste_description = "grease" pH = 7.25 if(data["blood_type"] == "L") name = "Lizard Blood" - taste_description = "spicy" + taste_description = "something spicy" pH = 6.85 @@ -503,12 +504,20 @@ description = "Lubricant is a substance introduced between two moving surfaces to reduce the friction and wear between them. giggity." color = "#009CA8" // rgb: 0, 156, 168 taste_description = "cherry" // by popular demand + var/lube_kind = TURF_WET_LUBE ///What kind of slipperiness gets added to turfs. /datum/reagent/lube/reaction_turf(turf/open/T, reac_volume) if (!istype(T)) return if(reac_volume >= 1) - T.MakeSlippery(TURF_WET_LUBE, 15 SECONDS, min(reac_volume * 2 SECONDS, 120)) + T.MakeSlippery(lube_kind, 15 SECONDS, min(reac_volume * 2 SECONDS, 120)) + +///Stronger kind of lube. Applies TURF_WET_SUPERLUBE. +/datum/reagent/lube/superlube + name = "Super Duper Lube" + id = "superlube" + description = "This \[REDACTED\] has been outlawed after the incident on \[DATA EXPUNGED\]." + lube_kind = TURF_WET_SUPERLUBE /datum/reagent/spraytan name = "Spray Tan" diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm index 90cb732a1f..c170858d98 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm @@ -19,6 +19,7 @@ /datum/reagent/nitroglycerin name = "Nitroglycerin" id = "nitroglycerin" + value = 5 description = "Nitroglycerin is a heavy, colorless, oily, explosive liquid obtained by nitrating glycerol." color = "#808080" // rgb: 128, 128, 128 taste_description = "oil" @@ -29,6 +30,7 @@ description = "Keeps unstable chemicals stable. This does not work on everything." reagent_state = LIQUID color = "#FFFF00" + value = 3 taste_description = "metal" /datum/reagent/clf3 @@ -89,6 +91,7 @@ description = "Sucks everything into the detonation point." reagent_state = LIQUID color = "#210021" + value = 10 taste_description = "compressed bitterness" /datum/reagent/blackpowder @@ -97,6 +100,7 @@ description = "Explodes. Violently." reagent_state = LIQUID color = "#000000" + value = 5 metabolization_rate = 0.05 taste_description = "salt" @@ -164,6 +168,7 @@ description = "Very flammable." reagent_state = LIQUID color = "#FA00AF" + value = 1 taste_description = "burning" /datum/reagent/napalm/on_mob_life(mob/living/carbon/M) diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 2b50ecc0f1..e77cf5b9dc 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -967,3 +967,23 @@ else M.gain_trauma_type(BRAIN_TRAUMA_SPECIAL) ..() + +/datum/reagent/toxin/bungotoxin + name = "Bungotoxin" + id = "bungotoxin" + description = "A horrible cardiotoxin that protects the humble bungo pit." + //silent_toxin = TRUE //I guess we don't really have the entire tox system ported. + color = "#EBFF8E" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + toxpwr = 0 + taste_description = "tannin" + +/datum/reagent/toxin/bungotoxin/on_mob_life(mob/living/carbon/M) + M.adjustOrganLoss(ORGAN_SLOT_HEART, 3) + M.confused = M.dizziness //add a tertiary effect here if this is isn't an effective poison. + if(current_cycle >= 12 && prob(8)) + var/tox_message = pick("You feel your heart spasm in your chest.", "You feel faint.","You feel you need to catch your breath.","You feel a prickle of pain in your chest.") + to_chat(M, "[tox_message]") + . = 1 + ..() + diff --git a/code/modules/reagents/chemistry/recipes/special.dm b/code/modules/reagents/chemistry/recipes/special.dm index 153372101e..59394e6e4b 100644 --- a/code/modules/reagents/chemistry/recipes/special.dm +++ b/code/modules/reagents/chemistry/recipes/special.dm @@ -173,7 +173,7 @@ GLOBAL_LIST_INIT(food_reagents, build_reagents_to_food()) //reagentid = related /obj/item/paper/secretrecipe/examine(mob/user) //Extra secret if(isobserver(user)) - return + return list() . = ..() /obj/item/paper/secretrecipe/Initialize() diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 631e5ee281..2bd5fb2d9f 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -124,9 +124,8 @@ Borg Hypospray return /obj/item/reagent_containers/borghypo/examine(mob/user) - usr = user - ..() - DescribeContents() //Because using the standardized reagents datum was just too cool for whatever fuckwit wrote this + . = ..() + . += DescribeContents() //Because using the standardized reagents datum was just too cool for whatever fuckwit wrote this /obj/item/reagent_containers/borghypo/proc/DescribeContents() var/empty = 1 @@ -134,11 +133,11 @@ Borg Hypospray for(var/datum/reagents/RS in reagent_list) var/datum/reagent/R = locate() in RS.reagent_list if(R) - to_chat(usr, "It currently has [R.volume] unit\s of [R.name] stored.") + . += "It currently has [R.volume] unit\s of [R.name] stored." empty = 0 if(empty) - to_chat(usr, "It is currently empty! Allow some time for the internal syntheszier to produce more.") + . += "It is currently empty! Allow some time for the internal syntheszier to produce more." /obj/item/reagent_containers/borghypo/hacked icon_state = "borghypo_s" diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 257106aaa7..3ed505c360 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -89,7 +89,7 @@ reagents.clear_reagents() /obj/item/reagent_containers/glass/attackby(obj/item/I, mob/user, params) - var/hotness = I.is_hot() + var/hotness = I.get_temperature() if(hotness && reagents) reagents.expose_temperature(hotness) to_chat(user, "You heat [name] with [I]!") diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 432b9289dd..85cb544667 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -121,11 +121,11 @@ icon_state = "[initial(icon_state)]0" /obj/item/reagent_containers/hypospray/medipen/examine() - ..() + . = ..() if(reagents && reagents.reagent_list.len) - to_chat(usr, "It is currently loaded.") + . += "It is currently loaded." else - to_chat(usr, "It is spent.") + . += "It is spent." /obj/item/reagent_containers/hypospray/medipen/stimulants name = "illegal stimpack medipen" @@ -296,10 +296,10 @@ /obj/item/hypospray/mkii/examine(mob/user) . = ..() if(vial) - to_chat(user, "[vial] has [vial.reagents.total_volume]u remaining.") + . += "[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.") + . += "It has no vial loaded in." + . += "[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))) diff --git a/code/modules/reagents/reagent_containers/rags.dm b/code/modules/reagents/reagent_containers/rags.dm index 92a4b155d8..8d44a2a406 100644 --- a/code/modules/reagents/reagent_containers/rags.dm +++ b/code/modules/reagents/reagent_containers/rags.dm @@ -23,7 +23,7 @@ /obj/item/reagent_containers/rag/examine(mob/user) . = ..() if(reagents.total_volume) - to_chat(user, "Alt-Click to squeeze the liquids out of it.") + . += "Alt-Click to squeeze the liquids out of it." /obj/item/reagent_containers/rag/afterattack(atom/A as obj|turf|area, mob/user,proximity) . = ..() diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index d2e3f95bdc..ddbc6cf92b 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -125,7 +125,7 @@ to_chat(user, "You switch the nozzle setting to [stream_mode ? "\"stream\"":"\"spray\""]. You'll now use [amount_per_transfer_from_this] units per use.") /obj/item/reagent_containers/spray/attackby(obj/item/I, mob/user, params) - var/hotness = I.is_hot() + var/hotness = I.get_temperature() if(hotness && reagents) reagents.expose_temperature(hotness) to_chat(user, "You heat [name] with [I]!") @@ -223,6 +223,15 @@ /obj/item/reagent_containers/spray/waterflower/attack_self(mob/user) //Don't allow changing how much the flower sprays return +///Subtype used for the lavaland clown ruin. +/obj/item/reagent_containers/spray/waterflower/superlube + name = "clown flower" + desc = "A delightly devilish flower... you got a feeling where this is going." + icon = 'icons/obj/chemical.dmi' + icon_state = "clownflower" + volume = 30 + list_reagents = list("superlube" = 30) + /obj/item/reagent_containers/spray/waterflower/cyborg reagent_flags = NONE volume = 100 diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 216ecd9654..0964b67490 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -71,13 +71,13 @@ 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.") + . += "There are [paper_cups] paper cups left." else if (paper_cups == 1) - to_chat(user, "There is one paper cup left.") + . += "There is one paper cup left." else - to_chat(user, "There are no paper cups left.") + . += "There are no paper cups left." /obj/structure/reagent_dispensers/water_cooler/attack_hand(mob/living/user) . = ..() @@ -226,11 +226,13 @@ desc = "A keg of aphrodisiac." icon_state = "pinkkeg" reagent_id = "aphro" + tank_volume = 150 /obj/structure/reagent_dispensers/keg/aphro/strong name = "keg of strong aphrodisiac" desc = "A keg of strong and addictive aphrodisiac." reagent_id = "aphro+" + tank_volume = 120 /obj/structure/reagent_dispensers/keg/milk name = "keg of milk" @@ -248,4 +250,5 @@ 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 + reagent_id = "gargleblaster" + tank_volume = 100 \ No newline at end of file diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index 5edddd64c2..88c03ee7d5 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -132,7 +132,12 @@ /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 (iscyborg(user)) + var/mob/living/silicon/robot/borg = user + if (!borg.module || !borg.module.canDispose) + return + else + return FALSE if(!isturf(user.loc)) //No magically doing it from inside closets return FALSE if(target.buckled || target.has_buckled_mobs()) @@ -354,6 +359,12 @@ . = TRUE ui.soft_update_fields() +/obj/machinery/disposal/bin/alt_attack_hand(mob/user) + if(can_interact(usr)) + flush = !flush + update_icon() + return TRUE + return FALSE /obj/machinery/disposal/bin/hitby(atom/movable/AM) if(isitem(AM) && AM.CanEnterDisposals()) diff --git a/code/modules/recycling/disposal/holder.dm b/code/modules/recycling/disposal/holder.dm index 726149ce24..dfc58f8c2d 100644 --- a/code/modules/recycling/disposal/holder.dm +++ b/code/modules/recycling/disposal/holder.dm @@ -52,6 +52,10 @@ if(istype(AM, /obj/item/smallDelivery) && !hasmob) var/obj/item/smallDelivery/T = AM src.destinationTag = T.sortTag + else if(istype(AM, /mob/living/silicon/robot)) + var/obj/item/destTagger/borg/tagger = locate() in AM + if (tagger) + src.destinationTag = tagger.currTag // start the movement process diff --git a/code/modules/recycling/disposal/multiz.dm b/code/modules/recycling/disposal/multiz.dm new file mode 100644 index 0000000000..3dcab94ca5 --- /dev/null +++ b/code/modules/recycling/disposal/multiz.dm @@ -0,0 +1,49 @@ +#define MULTIZ_PIPE_UP 1 ///Defines for determining which way a multiz disposal element should travel +#define MULTIZ_PIPE_DOWN 2 ///Defines for determining which way a multiz disposal element should travel + + +/obj/structure/disposalpipe/trunk/multiz + name = "Disposal trunk that goes up" + icon_state = "pipe-up" + var/multiz_dir = MULTIZ_PIPE_UP ///Set the multiz direction of your trunk. 1 = up, 2 = down + +/obj/structure/disposalpipe/trunk/multiz/down + name = "Disposal trunk that goes down" + icon_state = "pipe-down" + multiz_dir = MULTIZ_PIPE_DOWN + +/obj/structure/disposalpipe/trunk/multiz/transfer(obj/structure/disposalholder/H) + if(H.dir == DOWN) //Since we're a trunk, you can still place a chute / bin over us. If theyve entered from there, treat this as a normal trunk + return ..() + // otherwise, go to the linked object + if(multiz_dir) //Are we a trunk that goes up? Or down? + var/turf/T = null + if(multiz_dir == MULTIZ_PIPE_UP) + T = SSmapping.get_turf_above(get_turf(src)) //Get the turf above us + if(multiz_dir == MULTIZ_PIPE_DOWN) + T = SSmapping.get_turf_below(get_turf(src)) + if(!T) + expel(H) + return //Nothing located. + var/obj/structure/disposalpipe/trunk/multiz/pipe = locate(/obj/structure/disposalpipe/trunk/multiz) in T + if(pipe) + var/obj/structure/disposalholder/destination = new(pipe) //For future reference, the disposal holder is the thing that carries mobs + destination.init(pipe) //This instantiates it + destination.merge(H) //This takes the contents of H (Our disposal holder that's travelling into us) and puts them into the destination holder + destination.active = TRUE //Active allows it to process and move + destination.setDir(DOWN) //This tells the trunk above us NOT to loop it back down to us, or else you get an infinite loop + destination.move() + return null //Which removes the disposalholder + else + var/obj/structure/disposaloutlet/O = linked + if(istype(O)) + O.expel(H) // expel at outlet + else + var/obj/machinery/disposal/D = linked + D.expel(H) // expel at disposal + + // Returning null without expelling holder makes the holder expell itself + return null + +#undef MULTIZ_PIPE_UP +#undef MULTIZ_PIPE_DOWN \ No newline at end of file diff --git a/code/modules/recycling/disposal/pipe_sorting.dm b/code/modules/recycling/disposal/pipe_sorting.dm index d85c4bca78..2d40ec64eb 100644 --- a/code/modules/recycling/disposal/pipe_sorting.dm +++ b/code/modules/recycling/disposal/pipe_sorting.dm @@ -50,13 +50,13 @@ sortTypes |= n /obj/structure/disposalpipe/sorting/mail/examine(mob/user) - ..() + . = ..() if(sortTypes.len) - to_chat(user, "It is tagged with the following tags:") + . += "It is tagged with the following tags:" for(var/t in sortTypes) - to_chat(user, "\t[GLOB.TAGGERLOCATIONS[t]].") + . += "\t[GLOB.TAGGERLOCATIONS[t]]." else - to_chat(user, "It has no sorting tags set.") + . += "It has no sorting tags set." /obj/structure/disposalpipe/sorting/mail/attackby(obj/item/I, mob/user, params) diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index fa2eaa22d4..f9eb1b85e5 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -147,6 +147,7 @@ icon = 'icons/obj/device.dmi' icon_state = "cargotagger" var/currTag = 0 //Destinations are stored in code\globalvars\lists\flavor_misc.dm + var/locked_destination = FALSE //if true, users can't open the destination tag window to prevent changing the tagger's current destination w_class = WEIGHT_CLASS_TINY item_state = "electronic" lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' @@ -154,6 +155,10 @@ flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BELT +/obj/item/destTagger/borg + name = "cyborg destination tagger" + desc = "Used to fool the disposal mail network into thinking that you're a harmless parcel. Does actually work as a regular destination tagger as well." + /obj/item/destTagger/suicide_act(mob/living/user) user.visible_message("[user] begins tagging [user.p_their()] final destination! It looks like [user.p_theyre()] trying to commit suicide!") if (islizard(user)) @@ -179,8 +184,9 @@ onclose(user, "destTagScreen") /obj/item/destTagger/attack_self(mob/user) - openwindow(user) - return + if(!locked_destination) + openwindow(user) + return /obj/item/destTagger/Topic(href, href_list) add_fingerprint(usr) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 491aa63e56..cdb9ea4120 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -27,6 +27,7 @@ other types of metals and chemistry for reagents). */ //DESIGNS ARE GLOBAL. DO NOT CREATE OR DESTROY THEM AT RUNTIME OUTSIDE OF INIT, JUST REFERENCE THEM TO WHATEVER YOU'RE DOING! //why are you yelling? +//DO NOT REFERENCE OUTSIDE OF SSRESEARCH. USE THE PROCS IN SSRESEARCH TO OBTAIN A REFERENCE. /datum/design //Datum for object designs, used in construction var/name = "Name" //Name of the created object. @@ -48,8 +49,12 @@ other types of metals and chemistry for reagents). var/research_icon_state var/icon_cache +/datum/design/error_design + name = "ERROR" + desc = "This usually means something in the database has corrupted. If this doesn't go away automatically, inform Central Command so their techs can fix this ASAP(tm)" + /datum/design/Destroy() - CRASH("DESIGN DATUMS SHOULD NOT EVER BE DESTROYED AS THEY ARE ONLY MEANT TO BE IN A GLOBAL LIST AND REFERENCED FOR US.") + SSresearch.techweb_designs -= id return ..() /datum/design/proc/icon_html(client/user) diff --git a/code/modules/research/designs/autobotter_designs.dm b/code/modules/research/designs/autobotter_designs.dm new file mode 100644 index 0000000000..7b56beaf77 --- /dev/null +++ b/code/modules/research/designs/autobotter_designs.dm @@ -0,0 +1,335 @@ +/////////////////////////////////// +//////////AutoBottler Designs////// +/////////////////////////////////// + +/datum/design/board/autobottler + name = "Machine Design (AutoBottler)" + desc = "Allows for the construction of circuit boards used to build an Autobottler." + id = "autobottler" + materials = list(MAT_GLASS = 2000) + build_path = /obj/item/circuitboard/machine/autobottler + category = list ("Misc. Machinery") + departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SERVICE + +/datum/design/bottle + materials = list(MAT_GLASS = 1200) + build_type = AUTOBOTTLER + category = list("Storge") + +/datum/design/bottle/wine + name = "Bottle Design (Wine)" + desc = "Allows for the blowing of Wine bottles." + id = "wine" + build_path = /obj/item/reagent_containers/food/drinks/bottle/wine/empty + +/datum/design/bottle/rum + name = "Bottle Design (Rum)" + desc = "Allows for the blowing of Rum bottles." + id = "rum" + build_path = /obj/item/reagent_containers/food/drinks/bottle/rum/empty + +/datum/design/bottle/gin + name = "Bottle Design (Gin)" + desc = "Allows for the blowing of Gin bottles." + id = "gin" + build_path = /obj/item/reagent_containers/food/drinks/bottle/gin/empty + +/datum/design/bottle/whiskey + name = "Bottle Design (Whiskey)" + desc = "Allows for the blowing of Whiskey bottles." + id = "whiskey" + build_path = /obj/item/reagent_containers/food/drinks/bottle/whiskey/empty + +/datum/design/bottle/vodka + name = "Bottle Design (Vodka)" + desc = "Allows for the blowing of Vodka bottles." + id = "vodka" + build_path = /obj/item/reagent_containers/food/drinks/bottle/vodka/empty + +/datum/design/bottle/tequila + name = "Bottle Design (Tequila)" + desc = "Allows for the blowing of Tequila bottles." + id = "tequila" + build_path = /obj/item/reagent_containers/food/drinks/bottle/tequila/empty + +/datum/design/bottle/patron + name = "Bottle Design (Patron)" + desc = "Allows for the blowing of Patron bottles." + id = "patron" + build_path = /obj/item/reagent_containers/food/drinks/bottle/patron/empty + +/datum/design/bottle/kahlua + name = "Bottle Design (Kahlua)" + desc = "Allows for the blowing of Kahlua bottles." + id = "kahlua" + build_path = /obj/item/reagent_containers/food/drinks/bottle/kahlua/empty + +/datum/design/bottle/sake + name = "Bottle Design (Sake)" + desc = "Allows for the blowing of Sake bottles." + id = "sake" + build_path = /obj/item/reagent_containers/food/drinks/bottle/sake/empty + +/datum/design/bottle/vermouth + name = "Bottle Design (Vermouth)" + desc = "Allows for the blowing of Vermouth bottles." + id = "vermouth" + build_path = /obj/item/reagent_containers/food/drinks/bottle/vermouth/empty + +/datum/design/bottle/goldschlager + name = "Bottle Design (Goldschlager)" + desc = "Allows for the blowing of Goldschlager bottles." + id = "goldschlager" + build_path = /obj/item/reagent_containers/food/drinks/bottle/goldschlager/empty + +/datum/design/bottle/hcider + name = "Bottle Design (Cider)" + desc = "Allows for the blowing of Cider bottles." + id = "hcider" + build_path = /obj/item/reagent_containers/food/drinks/bottle/hcider/empty + +/datum/design/bottle/cognac + name = "Bottle Design (Cognac)" + desc = "Allows for the blowing of Cognac bottles." + id = "cognac" + build_path = /obj/item/reagent_containers/food/drinks/bottle/cognac/empty + +/datum/design/bottle/absinthe + name = "Bottle Design (Absinthe)" + desc = "Allows for the blowing of Absinthe bottles." + id = "absinthe" + build_path = /obj/item/reagent_containers/food/drinks/bottle/absinthe/empty + +/datum/design/bottle/grappa + name = "Bottle Design (Grappa)" + desc = "Allows for the blowing of Grappa bottles." + id = "grappa" + build_path = /obj/item/reagent_containers/food/drinks/bottle/grappa/empty + +/datum/design/bottle/fernet + name = "Bottle Design (Fernet)" + desc = "Allows for the blowing of Fernet bottles." + id = "fernet" + build_path = /obj/item/reagent_containers/food/drinks/bottle/fernet/empty + +/datum/design/bottle/applejack + name = "Bottle Design (Applejack)" + desc = "Allows for the blowing of Applejack bottles." + id = "applejack" + build_path = /obj/item/reagent_containers/food/drinks/bottle/applejack/empty + +/datum/design/bottle/champagne + name = "Bottle Design (Champagne)" + desc = "Allows for the blowing of Champagne bottles." + id = "champagne" + build_path = /obj/item/reagent_containers/food/drinks/bottle/champagne/empty + +/datum/design/bottle/blazaam + name = "Bottle Design (Blazaam)" + desc = "Allows for the blowing of Blazaam bottles." + id = "blazaam" + build_path = /obj/item/reagent_containers/food/drinks/bottle/blazaam/empty + +/datum/design/bottle/trappist + name = "Bottle Design (Trappist)" + desc = "Allows for the blowing of Trappist bottles." + id = "trappist" + build_path = /obj/item/reagent_containers/food/drinks/bottle/trappist/empty + +/datum/design/bottle/grenadine + name = "Bottle Design (Grenadine)" + desc = "Allows for the blowing of Grenadine bottles." + id = "grenadine" + build_path = /obj/item/reagent_containers/food/drinks/bottle/grenadine/empty + +/datum/design/bottle/export + materials = list(MAT_GLASS = 1200) + build_type = AUTOBOTTLER + category = list("Brands") + +/datum/design/bottle/export/wine + name = "Export Design (Wine)" + desc = "Allows for the blowing, and bottling of Wine bottles." + id = "wine_export" + reagents_list = list("wine" = 100) + build_path = /obj/item/export/bottle/wine + +/datum/design/bottle/export/rum + name = "Export Design (Rum)" + desc = "Allows for the blowing, and bottling of Rum bottles." + id = "rum_export" + reagents_list = list("rum" = 100) + build_path = /obj/item/export/bottle/rum + +/datum/design/bottle/export/gin + name = "Export Design (Gin)" + desc = "Allows for the blowing, and bottling of Gin bottles." + id = "gin_export" + reagents_list = list("gin" = 100) + build_path = /obj/item/export/bottle/gin + +/datum/design/bottle/export/whiskey + name = "Export Design (Whiskey)" + desc = "Allows for the blowing, and bottling of Whiskey bottles." + id = "whiskey_export" + reagents_list = list("whiskey" = 100) + build_path = /obj/item/export/bottle/whiskey + +/datum/design/bottle/export/vodka + name = "Export Design (Vodka)" + desc = "Allows for the blowing, and bottling of 99% Vodka bottles." + id = "vodka_export" + reagents_list = list("vodka" = 99, "water" = 1) + build_path = /obj/item/export/bottle/vodka + +/datum/design/bottle/export/tequila + name = "Export Design (Tequila)" + desc = "Allows for the blowing, and bottling of Tequila bottles." + id = "tequila_export" + reagents_list = list("tequila" = 80, "lemon_juice" = 20) + build_path = /obj/item/export/bottle/tequila + +/datum/design/bottle/export/patron + name = "Export Design (Patron)" + desc = "Allows for the blowing, and bottling of Patron bottles." + id = "patron_export" + reagents_list = list("patron" = 100) + build_path = /obj/item/export/bottle/patron + +/datum/design/bottle/export/kahlua + name = "Export Design (Kahlua)" + desc = "Allows for the blowing, and bottling of Kahlua bottles." + id = "kahlua_export" + reagents_list = list("kahlua" = 100) + build_path = /obj/item/export/bottle/kahlua + +/datum/design/bottle/export/sake + name = "Export Design (Sake)" + desc = "Allows for the blowing, and bottling of Sake bottles." + id = "sake_export" + reagents_list = list("sake" = 80, "rice" = 10, "sugar" = 10) + build_path = /obj/item/export/bottle/sake + +/datum/design/bottle/export/vermouth + name = "Export Design (Vermouth)" + desc = "Allows for the blowing, and bottling of Vermouth bottles." + id = "vermouth_export" + reagents_list = list("vermouth" = 100) + build_path = /obj/item/export/bottle/vermouth + +/datum/design/bottle/export/goldschlager + name = "Export Design (Goldschlager)" + desc = "Allows for the blowing, and bottling of Goldschlager bottles." + id = "goldschlager_export" + reagents_list = list("goldschlager" = 100) + build_path = /obj/item/export/bottle/goldschlager + +/datum/design/bottle/export/hcider + name = "Export Design (Cider)" + desc = "Allows for the blowing, and bottling of Cider bottles." + id = "hcider_export" + reagents_list = list("hcider" = 30, "water" = 20) + build_path = /obj/item/export/bottle/hcider + +/datum/design/bottle/export/cognac + name = "Export Design (Cognac)" + desc = "Allows for the blowing, and bottling of Cognac bottles." + id = "cognac_export" + reagents_list = list("cognac" = 100) + build_path = /obj/item/export/bottle/cognac + +/datum/design/bottle/export/absinthe + name = "Export Design (Absinthe)" + desc = "Allows for the blowing, and bottling of Absinthe bottles." + reagents_list = list("absinthe" = 100) + id = "absinthe_export" + build_path = /obj/item/export/bottle/absinthe + +/datum/design/bottle/export/grappa + name = "Export Design (Grappa)" + desc = "Allows for the blowing, and bottling of Grappa bottles." + id = "grappa_export" + reagents_list = list("grappa" = 100) + build_path = /obj/item/export/bottle/grappa + +/datum/design/bottle/export/fernet + name = "Export Design (Fernet)" + desc = "Allows for the blowing, and bottling of Fernet bottles." + id = "fernet_export" + reagents_list = list("fernet" = 100) + build_path = /obj/item/export/bottle/fernet + +/datum/design/bottle/export/applejack + name = "Export Design (Applejack)" + desc = "Allows for the blowing, and bottling of Applejack bottles." + id = "applejack_export" + reagents_list = list("applejack" = 50, "gin" = 10) + build_path = /obj/item/export/bottle/applejack + +/datum/design/bottle/export/champagne + name = "Export Design (Champagne)" + desc = "Allows for the blowing, and bottling of Champagne bottles." + id = "champagne_export" + reagents_list = list("champagne" = 90, "co2" = 10) + build_path = /obj/item/export/bottle/champagne + +/datum/design/bottle/export/blazaam + name = "Export Design (Blazaam)" + desc = "Allows for the blowing, and bottling of Blazaam bottles." + id = "blazaam_export" + reagents_list = list("blazaam" = 80, "holywater" = 20) + build_path = /obj/item/export/bottle/blazaam + +/datum/design/bottle/export/trappist + name = "Export Design (Trappist)" + desc = "Allows for the blowing, and bottling of Trappist bottles." + id = "trappist_export" + reagents_list = list("trappist" = 100) + build_path = /obj/item/export/bottle/trappist + +/datum/design/bottle/export/grenadine + name = "Export Design (Grenadine)" + desc = "Allows for the blowing, and bottling of Grenadine bottles." + id = "grenadine_export" + reagents_list = list("grenadine" = 100) + build_path = /obj/item/export/bottle/grenadine + +/datum/design/bottle/export/minikeg + name = "Export Design (Minikeg)" + desc = "Allows for the fabication, and bottling of Minikeg of craft beer." + id = "minikeg" + category = list("Beers") + reagents_list = list("light_beer" = 100) + build_path = /obj/item/export/bottle/minikeg + +/datum/design/bottle/export/blooddrop + name = "Export Design (Blooddrop)" + desc = "Allows for the blowing, and bottling of Blooddrop bottles." + id = "blooddrop" + category = list("Wines") + reagents_list = list("champagne" = 30, "co2" = 30, "wine" = 10, "grape_juice" = 30) + build_path = /obj/item/export/bottle/blooddrop + +/datum/design/bottle/export/slim_gold + name = "Export Design (Slim Gold)" + desc = "Allows for the blowing, and bottling of Slim Gold bottles." + id = "slim_gold" + category = list("Beers") + reagents_list = list("gold" = 10, "co2" = 10, "rum" = 30, "beer" = 40) + build_path = /obj/item/export/bottle/slim_gold + +/datum/design/bottle/export/white_bloodmoon + name = "Export Design (White Bloodmoon)" + desc = "Allows for the blowing, and bottling of White Bloodmoon bottles." + id = "white_bloodmoon" + category = list("Wines") + reagents_list = list("synthflesh" = 50, "blood" = 50, "gib" = 10) + build_path = /obj/item/export/bottle/white_bloodmoon + +/datum/design/bottle/export/greenroad + name = "Export Design (Greenroad)" + desc = "Allows for the blowing, and bottling of Greenroad bottles." + id = "greenroad" + reagents_list = list("vitfro" = 50, "rum" = 50, "ash" = 10) + category = list("Beers") + build_path = /obj/item/export/bottle/greenroad \ No newline at end of file diff --git a/code/modules/research/designs/bluespace_designs.dm b/code/modules/research/designs/bluespace_designs.dm index c9d11a5a3e..ec4309b69e 100644 --- a/code/modules/research/designs/bluespace_designs.dm +++ b/code/modules/research/designs/bluespace_designs.dm @@ -65,6 +65,16 @@ category = list("Bluespace Designs") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_CARGO +/datum/design/desynchronizer + name = "Desynchronizer" + desc = "A device that can desynchronize the user from spacetime." + id = "desynchronizer" + build_type = PROTOLATHE + materials = list(MAT_METAL = 1000, MAT_GLASS = 500, MAT_SILVER = 1500, MAT_BLUESPACE = 1000) + build_path = /obj/item/desynchronizer + category = list("Bluespace Designs") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + /datum/design/miningsatchel_holding name = "Mining Satchel of Holding" desc = "A mining satchel that can hold an infinite amount of ores." diff --git a/code/modules/research/designs/machine_desings/machine_designs_service.dm b/code/modules/research/designs/machine_desings/machine_designs_service.dm index 895ad032ba..5cbff1c66a 100644 --- a/code/modules/research/designs/machine_desings/machine_designs_service.dm +++ b/code/modules/research/designs/machine_desings/machine_designs_service.dm @@ -41,6 +41,14 @@ category = list ("Misc. Machinery") departmental_flags = DEPARTMENTAL_FLAG_SERVICE +/datum/design/board/ayyplantgenes + name = "Machine Design (Alien Plant DNA Manipulator Board)" + desc = "The circuit board for an advanced plant DNA manipulator, utilizing alien technologies." + id = "ayyplantgenes" + build_path = /obj/item/circuitboard/machine/plantgenes/vault + category = list ("Misc. Machinery") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + /datum/design/board/deepfryer name = "Machine Design (Deep Fryer)" desc = "The circuit board for a Deep Fryer." diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index d69dda37ca..fde795d87c 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -17,6 +17,36 @@ id = "sec_38lethal" build_path = /obj/item/ammo_box/c38/lethal +/datum/design/c38_trac + name = "Speed Loader (.38 TRAC)" + desc = "Designed to quickly reload revolvers. TRAC bullets embed a tracking implant within the target's body." + id = "c38_trac" + build_type = PROTOLATHE + materials = list(MAT_METAL = 20000, MAT_SILVER = 5000, MAT_GOLD = 1000) + build_path = /obj/item/ammo_box/c38/trac + category = list("Ammo") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/c38_hotshot + name = "Speed Loader (.38 Hot Shot)" + desc = "Designed to quickly reload revolvers. Hot Shot bullets contain an incendiary payload." + id = "c38_hotshot" + build_type = PROTOLATHE + materials = list(MAT_METAL = 20000, MAT_PLASMA = 5000) + build_path = /obj/item/ammo_box/c38/hotshot + category = list("Ammo") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/c38_iceblox + name = "Speed Loader (.38 Iceblox)" + desc = "Designed to quickly reload revolvers. Iceblox bullets contain a cryogenic payload." + id = "c38_iceblox" + build_type = PROTOLATHE + materials = list(MAT_METAL = 20000, MAT_PLASMA = 5000) + build_path = /obj/item/ammo_box/c38/iceblox + category = list("Ammo") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + ////////////// //WT550 Mags// ////////////// diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm index 5cc26381dd..ac76e8b9fe 100644 --- a/code/modules/research/destructive_analyzer.dm +++ b/code/modules/research/destructive_analyzer.dm @@ -102,7 +102,7 @@ Note: Must be placed within 3 tiles of the R&D Console return FALSE if (id && id != RESEARCH_MATERIAL_RECLAMATION_ID) - var/datum/techweb_node/TN = get_techweb_node_by_id(id) + var/datum/techweb_node/TN = SSresearch.techweb_node_by_id(id) if(!istype(TN)) return FALSE var/dpath = loaded_item.type @@ -123,7 +123,7 @@ Note: Must be placed within 3 tiles of the R&D Console return FALSE SSblackbox.record_feedback("nested tally", "item_deconstructed", 1, list("[TN.id]", "[loaded_item.type]")) if(destroy_item(loaded_item)) - linked_console.stored_research.boost_with_path(SSresearch.techweb_nodes[TN.id], dpath) + linked_console.stored_research.boost_with_path(SSresearch.techweb_node_by_id(TN.id), dpath) else var/list/point_value = techweb_item_point_check(loaded_item) diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 0bcd0c5984..05c4a7cd93 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -128,13 +128,13 @@ var/list/res = list("Already researched:") var/list/boosted = list("Already boosted:") for(var/node_id in listin) - var/datum/techweb_node/N = get_techweb_node_by_id(node_id) + var/datum/techweb_node/N = SSresearch.techweb_node_by_id(node_id) var/str = "[N.display_name]: [listin[N]] points.
    " - if(SSresearch.science_tech.researched_nodes[N]) + if(SSresearch.science_tech.researched_nodes[N.id]) res += str - else if(SSresearch.science_tech.boosted_nodes[N]) + else if(SSresearch.science_tech.boosted_nodes[N.id]) boosted += str - if(SSresearch.science_tech.visible_nodes[N]) //JOY OF DISCOVERY! + if(SSresearch.science_tech.visible_nodes[N.id]) //JOY OF DISCOVERY! output += str output += boosted + res dat += output @@ -182,10 +182,10 @@ experiment(dotype,process) use_power(750) if(dotype != FAIL) - var/list/datum/techweb_node/nodes = techweb_item_boost_check(process) + var/list/nodes = techweb_item_boost_check(process) var/picked = pickweight(nodes) //This should work. if(linked_console) - linked_console.stored_research.boost_with_path(picked, process.type) + linked_console.stored_research.boost_with_path(SSresearch.techweb_node_by_id(picked), process.type) updateUsrDialog() /obj/machinery/rnd/experimentor/proc/matchReaction(matching,reaction) diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm index c7d02486dd..836b574f86 100644 --- a/code/modules/research/machinery/_production.dm +++ b/code/modules/research/machinery/_production.dm @@ -36,7 +36,7 @@ /obj/machinery/rnd/production/proc/update_designs() cached_designs.Cut() for(var/i in stored_research.researched_designs) - var/datum/design/d = stored_research.researched_designs[i] + var/datum/design/d = SSresearch.techweb_design_by_id(i) if((isnull(allowed_department_flags) || (d.departmental_flags & allowed_department_flags)) && (d.build_type & allowed_buildtypes)) cached_designs |= d @@ -84,8 +84,9 @@ investigate_log("[key_name(user)] built [amount] of [path] at [src]([type]).", INVESTIGATE_RESEARCH) message_admins("[ADMIN_LOOKUPFLW(user)] has built [amount] of [path] at a [src]([type]).") for(var/i in 1 to amount) - var/obj/item/I = new path(get_turf(src)) - if(efficient_with(I.type)) + var/obj/O = new path(get_turf(src)) + if(efficient_with(O.type) && isitem(O)) + var/obj/item/I = O I.materials = matlist.Copy() SSblackbox.record_feedback("nested tally", "item_printed", amount, list("[type]", "[path]")) @@ -113,7 +114,7 @@ amount = text2num(amount) if(isnull(amount)) amount = 1 - var/datum/design/D = (linked_console || requires_console)? linked_console.stored_research.researched_designs[id] : get_techweb_design_by_id(id) + var/datum/design/D = (linked_console || requires_console)? (linked_console.stored_research.researched_designs[id]? SSresearch.techweb_design_by_id(id) : null) : SSresearch.techweb_design_by_id(id) if(!istype(D)) return FALSE if(!(isnull(allowed_department_flags) || (D.departmental_flags & allowed_department_flags))) @@ -160,7 +161,7 @@ /obj/machinery/rnd/production/proc/search(string) matching_designs.Cut() for(var/v in stored_research.researched_designs) - var/datum/design/D = stored_research.researched_designs[v] + var/datum/design/D = SSresearch.techweb_design_by_id(v) if(!(D.build_type & allowed_buildtypes) || !(isnull(allowed_department_flags) || (D.departmental_flags & allowed_department_flags))) continue if(findtext(D.name,string)) @@ -336,7 +337,7 @@ l += "

    Browsing [selected_category]:

    " var/coeff = efficiency_coeff for(var/v in stored_research.researched_designs) - var/datum/design/D = stored_research.researched_designs[v] + var/datum/design/D = SSresearch.techweb_design_by_id(v) if(!(selected_category in D.category)|| !(D.build_type & allowed_buildtypes)) continue if(!(isnull(allowed_department_flags) || (D.departmental_flags & allowed_department_flags))) diff --git a/code/modules/research/nanites/nanite_hijacker.dm b/code/modules/research/nanites/nanite_hijacker.dm index dba47a4ac2..88779df447 100644 --- a/code/modules/research/nanites/nanite_hijacker.dm +++ b/code/modules/research/nanites/nanite_hijacker.dm @@ -18,7 +18,7 @@ /obj/item/nanite_hijacker/examine(mob/user) . = ..() if(disk) - to_chat(user, "Alt-click [src] to eject the disk.") + . += "Alt-click [src] to eject the disk." /obj/item/nanite_hijacker/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/disk/nanite_program)) diff --git a/code/modules/research/nanites/nanite_program_hub.dm b/code/modules/research/nanites/nanite_program_hub.dm index e33f3d7cd7..d6e0bbdabb 100644 --- a/code/modules/research/nanites/nanite_program_hub.dm +++ b/code/modules/research/nanites/nanite_program_hub.dm @@ -69,7 +69,7 @@ if(current_category != "Main") var/list/program_list = list() for(var/i in linked_techweb.researched_designs) - var/datum/design/nanites/D = linked_techweb.researched_designs[i] + var/datum/design/nanites/D = SSresearch.techweb_design_by_id(i) if(!istype(D)) continue if(current_category in D.category) @@ -116,9 +116,9 @@ disk.program = null disk.name = initial(disk.name) . = TRUE - - + + /obj/machinery/nanite_program_hub/admin/Initialize() . = ..() linked_techweb = SSresearch.admin_tech - + diff --git a/code/modules/research/nanites/nanite_programs.dm b/code/modules/research/nanites/nanite_programs.dm index a06311f26f..2a6563fe52 100644 --- a/code/modules/research/nanites/nanite_programs.dm +++ b/code/modules/research/nanites/nanite_programs.dm @@ -208,9 +208,6 @@ datum/nanite_program/proc/on_mob_remove() /datum/nanite_program/proc/on_death() return -/datum/nanite_program/proc/on_hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) - return - /datum/nanite_program/proc/software_error(type) if(!type) type = rand(1,5) diff --git a/code/modules/research/nanites/nanite_programs/sensor.dm b/code/modules/research/nanites/nanite_programs/sensor.dm index d494ec8cdf..535b92c6e1 100644 --- a/code/modules/research/nanites/nanite_programs/sensor.dm +++ b/code/modules/research/nanites/nanite_programs/sensor.dm @@ -345,6 +345,14 @@ var/sentence = "" var/inclusive = TRUE + +/datum/nanite_program/sensor/voice/on_mob_add() + . = ..() + RegisterSignal(host_mob, COMSIG_MOVABLE_HEAR, .proc/on_hear) + +/datum/nanite_program/sensor/voice/on_mob_remove() + UnregisterSignal(host_mob, COMSIG_MOVABLE_HEAR, .proc/on_hear) + /datum/nanite_program/sensor/voice/set_extra_setting(user, setting) if(setting == "Sent Code") var/new_code = input(user, "Set the sent code (1-9999):", name, null) as null|num @@ -378,15 +386,12 @@ target.sentence = sentence target.inclusive = inclusive -/datum/nanite_program/sensor/voice/on_hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) +/datum/nanite_program/sensor/voice/proc/on_hear(datum/source, list/hearing_args) if(!sentence) return - //To make it not case sensitive - var/low_message = lowertext(raw_message) - var/low_sentence = lowertext(sentence) if(inclusive) - if(findtext(low_message, low_sentence)) + if(findtextEx(hearing_args[HEARING_RAW_MESSAGE], sentence)) send_code() else - if(low_message == low_sentence) + if(hearing_args[HEARING_RAW_MESSAGE] == sentence) send_code() \ No newline at end of file diff --git a/code/modules/research/nanites/nanite_remote.dm b/code/modules/research/nanites/nanite_remote.dm index 824d033bf4..3b242d28df 100644 --- a/code/modules/research/nanites/nanite_remote.dm +++ b/code/modules/research/nanites/nanite_remote.dm @@ -22,7 +22,7 @@ /obj/item/nanite_remote/examine(mob/user) . = ..() if(locked) - to_chat(user, "Alt-click to unlock.") + . += "Alt-click to unlock." /obj/item/nanite_remote/AltClick(mob/user) . = ..() diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index a7d7857a24..38a5282aef 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -36,10 +36,10 @@ Nothing else in the console has ID requirements. var/locked = FALSE var/tdisk_uple = FALSE var/ddisk_uple = FALSE - var/datum/techweb_node/selected_node - var/datum/design/selected_design + var/datum/selected_node_id + var/datum/selected_design_id var/selected_category - var/list/datum/design/matching_designs + var/list/matching_design_ids var/disk_slot_selected var/searchstring = "" var/searchtype = "" @@ -88,7 +88,7 @@ Nothing else in the console has ID requirements. . = ..() stored_research = SSresearch.science_tech stored_research.consoles_accessing[src] = TRUE - matching_designs = list() + matching_design_ids = list() SyncRDevices() /obj/machinery/computer/rdconsole/Destroy() @@ -109,9 +109,7 @@ Nothing else in the console has ID requirements. if(d_disk) d_disk.forceMove(get_turf(src)) d_disk = null - matching_designs = null - selected_node = null - selected_design = null + matching_design_ids = null return ..() /obj/machinery/computer/rdconsole/attackby(obj/item/D, mob/user, params) @@ -144,7 +142,7 @@ Nothing else in the console has ID requirements. if(!stored_research.available_nodes[id] || stored_research.researched_nodes[id]) say("Node unlock failed: Either already researched or not available!") return FALSE - var/datum/techweb_node/TN = SSresearch.techweb_nodes[id] + var/datum/techweb_node/TN = SSresearch.techweb_node_by_id(id) if(!istype(TN)) say("Node unlock failed: Unknown error.") return FALSE @@ -153,7 +151,7 @@ Nothing else in the console has ID requirements. investigate_log("[key_name(user)] researched [id]([json_encode(price)]) on techweb id [stored_research.id].", INVESTIGATE_RESEARCH) if(stored_research == SSresearch.science_tech) SSblackbox.record_feedback("associative", "science_techweb_unlock", 1, list("id" = "[id]", "name" = TN.display_name, "price" = "[json_encode(price)]", "time" = SQLtime())) - if(stored_research.research_node(SSresearch.techweb_nodes[id])) + if(stored_research.research_node_id(id)) say("Successfully researched [TN.display_name].") var/logname = "Unknown" if(isAI(user)) @@ -282,7 +280,7 @@ Nothing else in the console has ID requirements. l += ui_protolathe_header() l += "

    Browsing [selected_category]:

    " for(var/v in stored_research.researched_designs) - var/datum/design/D = stored_research.researched_designs[v] + var/datum/design/D = SSresearch.techweb_design_by_id(v) if(!(selected_category in D.category)|| !(D.build_type & PROTOLATHE)) continue if(!(isnull(linked_lathe.allowed_department_flags) || (D.departmental_flags & linked_lathe.allowed_department_flags))) @@ -337,7 +335,8 @@ Nothing else in the console has ID requirements. RDSCREEN_UI_LATHE_CHECK var/list/l = list() l += ui_protolathe_header() - for(var/datum/design/D in matching_designs) + for(var/id in matching_design_ids) + var/datum/design/D = SSresearch.techweb_design_by_id(id) if(!(isnull(linked_lathe.allowed_department_flags) || (D.departmental_flags & linked_lathe.allowed_department_flags))) continue var/temp_material @@ -433,7 +432,7 @@ Nothing else in the console has ID requirements. l += "

    Browsing [selected_category]:

    " for(var/v in stored_research.researched_designs) - var/datum/design/D = stored_research.researched_designs[v] + var/datum/design/D = SSresearch.techweb_design_by_id(v) if(!(selected_category in D.category) || !(D.build_type & IMPRINTER)) continue if(!(isnull(linked_imprinter.allowed_department_flags) || (D.departmental_flags & linked_imprinter.allowed_department_flags))) @@ -466,7 +465,8 @@ Nothing else in the console has ID requirements. l += ui_circuit_header() l += "

    Search results:

    " - for(var/datum/design/D in matching_designs) + for(var/id in matching_design_ids) + var/datum/design/D = SSresearch.techweb_design_by_id(id) if(!(isnull(linked_imprinter.allowed_department_flags) || (D.departmental_flags & linked_imprinter.allowed_department_flags))) continue var/temp_materials @@ -526,7 +526,7 @@ Nothing else in the console has ID requirements. l += "Load Technology to Disk
    " l += "

    Stored Technology Nodes:

    " for(var/i in t_disk.stored_research.researched_nodes) - var/datum/techweb_node/N = t_disk.stored_research.researched_nodes[i] + var/datum/techweb_node/N = SSresearch.techweb_node_by_id(i) l += "[N.display_name]" l += "
    " return l @@ -552,7 +552,7 @@ Nothing else in the console has ID requirements. l += "Return to Disk Operations
    " l += "

    Load Design to Disk:

    " for(var/v in stored_research.researched_designs) - var/datum/design/D = stored_research.researched_designs[v] + var/datum/design/D = SSresearch.techweb_design_by_id(v) l += "[D.name] " l += "Copy to Disk" l += "
    " @@ -573,7 +573,7 @@ Nothing else in the console has ID requirements. for(var/id in boostable_nodes) anything = TRUE var/list/worth = boostable_nodes[id] - var/datum/techweb_node/N = get_techweb_node_by_id(id) + var/datum/techweb_node/N = SSresearch.techweb_node_by_id(id) l += "
    [RDSCREEN_NOBREAK]" if (stored_research.researched_nodes[N.id]) // already researched @@ -637,32 +637,33 @@ Nothing else in the console has ID requirements. var/list/columns = list() var/max_tier = 0 for (var/node_ in stored_research.tiers) - var/datum/techweb_node/node = node_ - var/tier = stored_research.tiers[node] + var/datum/techweb_node/node = SSresearch.techweb_node_by_id(node_) + var/tier = stored_research.tiers[node.id] LAZYINITLIST(columns["[tier]"]) // String hackery to make the numbers associative columns["[tier]"] += ui_techweb_single_node(node, minimal=(tier != 1)) max_tier = max(max_tier, tier) l += "[RDSCREEN_NOBREAK]" - for(var/tier in 0 to max_tier) - l += "[RDSCREEN_NOBREAK]" + if(max_tier) + for(var/tier in 0 to max_tier) + l += "[RDSCREEN_NOBREAK]" l += "
    ResearchedAvailableFuture
    [RDSCREEN_NOBREAK]" - l += columns["[tier]"] - l += "[RDSCREEN_NOBREAK]" + l += columns["[tier]"] + l += "
    [RDSCREEN_NOBREAK]" else var/list/avail = list() //This could probably be optimized a bit later. var/list/unavail = list() var/list/res = list() for(var/v in stored_research.researched_nodes) - res += stored_research.researched_nodes[v] + res += SSresearch.techweb_node_by_id(v) for(var/v in stored_research.available_nodes) if(stored_research.researched_nodes[v]) continue - avail += stored_research.available_nodes[v] + avail += SSresearch.techweb_node_by_id(v) for(var/v in stored_research.visible_nodes) if(stored_research.available_nodes[v]) continue - unavail += stored_research.visible_nodes[v] + unavail += SSresearch.techweb_node_by_id(v) l += "

    Technology Nodes:

    [RDSCREEN_NOBREAK]" l += "

    Available for Research:

    " for(var/datum/techweb_node/N in avail) @@ -704,13 +705,14 @@ Nothing else in the console has ID requirements. l += "
    [node.price_display(stored_research)]" // red - missing prereqs if(ui_mode == RDCONSOLE_UI_MODE_NORMAL) l += "[node.description]" - for(var/i in node.designs) - var/datum/design/D = node.designs[i] + for(var/i in node.design_ids) + var/datum/design/D = SSresearch.techweb_design_by_id(i) l += "[D.icon_html(usr)][RDSCREEN_NOBREAK]" l += "
    [RDSCREEN_NOBREAK]" return l /obj/machinery/computer/rdconsole/proc/ui_techweb_nodeview() + var/datum/techweb_node/selected_node = SSresearch.techweb_node_by_id(selected_node_id) RDSCREEN_UI_SNODE_CHECK var/list/l = list() if(stored_research.hidden_nodes[selected_node.id]) @@ -718,65 +720,65 @@ Nothing else in the console has ID requirements. return l += "[RDSCREEN_NOBREAK]" - if (length(selected_node.prerequisites)) + if (length(selected_node.prereq_ids)) l += "[RDSCREEN_NOBREAK]" l += "[RDSCREEN_NOBREAK]" - if (length(selected_node.unlocks)) + if (length(selected_node.unlock_ids)) l += "[RDSCREEN_NOBREAK]" l += "[RDSCREEN_NOBREAK]" - if (length(selected_node.prerequisites)) + if (length(selected_node.prereq_ids)) l += "[RDSCREEN_NOBREAK]" l += "[RDSCREEN_NOBREAK]" - if (length(selected_node.unlocks)) + if (length(selected_node.unlock_ids)) l += "[RDSCREEN_NOBREAK]" l += "
    RequiresCurrent NodeUnlocks
    [RDSCREEN_NOBREAK]" - for (var/i in selected_node.prerequisites) - l += ui_techweb_single_node(selected_node.prerequisites[i]) + for (var/i in selected_node.prereq_ids) + l += ui_techweb_single_node(SSresearch.techweb_node_by_id(i)) l += "[RDSCREEN_NOBREAK]" l += ui_techweb_single_node(selected_node, selflink=FALSE) l += "[RDSCREEN_NOBREAK]" - for (var/i in selected_node.unlocks) - l += ui_techweb_single_node(selected_node.unlocks[i]) + for (var/i in selected_node.unlock_ids) + l += ui_techweb_single_node(SSresearch.techweb_node_by_id(i)) l += "
    [RDSCREEN_NOBREAK]" return l /obj/machinery/computer/rdconsole/proc/ui_techweb_designview() //Legacy code + var/datum/design/selected_design = SSresearch.techweb_design_by_id(selected_design_id) RDSCREEN_UI_SDESIGN_CHECK var/list/l = list() - var/datum/design/D = selected_design - l += "
    [D.icon_html(usr)][D.name]
    [RDSCREEN_NOBREAK]" - if(D.build_type) + l += "
    [selected_design.icon_html(usr)][selected_design.name]
    [RDSCREEN_NOBREAK]" + if(selected_design.build_type) var/lathes = list() - if(D.build_type & IMPRINTER) + if(selected_design.build_type & IMPRINTER) lathes += "[machine_icon(/obj/machinery/rnd/production/circuit_imprinter)][RDSCREEN_NOBREAK]" - if (linked_imprinter && D.id in stored_research.researched_designs) - l += "Imprint" - if(D.build_type & PROTOLATHE) + if (linked_imprinter && stored_research.researched_designs[selected_design.id]) + l += "Imprint" + if(selected_design.build_type & PROTOLATHE) lathes += "[machine_icon(/obj/machinery/rnd/production/protolathe)][RDSCREEN_NOBREAK]" - if (linked_lathe && D.id in stored_research.researched_designs) - l += "Construct" - if(D.build_type & AUTOLATHE) + if (linked_lathe && stored_research.researched_designs[selected_design.id]) + l += "Construct" + if(selected_design.build_type & AUTOLATHE) lathes += "[machine_icon(/obj/machinery/autolathe)][RDSCREEN_NOBREAK]" - if(D.build_type & MECHFAB) + if(selected_design.build_type & MECHFAB) lathes += "[machine_icon(/obj/machinery/mecha_part_fabricator)][RDSCREEN_NOBREAK]" - if(D.build_type & BIOGENERATOR) + if(selected_design.build_type & BIOGENERATOR) lathes += "[machine_icon(/obj/machinery/biogenerator)][RDSCREEN_NOBREAK]" - if(D.build_type & LIMBGROWER) + if(selected_design.build_type & LIMBGROWER) lathes += "[machine_icon(/obj/machinery/limbgrower)][RDSCREEN_NOBREAK]" - if(D.build_type & SMELTER) + if(selected_design.build_type & SMELTER) lathes += "[machine_icon(/obj/machinery/mineral/processing_unit)][RDSCREEN_NOBREAK]" l += "Construction types:" l += lathes l += "" l += "Required materials:" - var/all_mats = D.materials + D.reagents_list + var/all_mats = selected_design.materials + selected_design.reagents_list for(var/M in all_mats) l += "* [CallMaterialName(M)] x [all_mats[M]]" l += "Unlocked by:" - for (var/node in D.unlocked_by) - l += ui_techweb_single_node(node) + for (var/i in selected_design.unlocked_by) + l += ui_techweb_single_node(SSresearch.techweb_node_by_id(i)) l += "[RDSCREEN_NOBREAK]
    " return l @@ -967,7 +969,7 @@ Nothing else in the console has ID requirements. qdel(t_disk.stored_research) t_disk.stored_research = new say("Wiping technology disk.") - if(ls["copy_tech"]) //Copy some technology la from the research holder to the disk. + if(ls["copy_tech"]) //Copy some technology from the research holder to the disk. if(QDELETED(t_disk)) say("No Technology Disk Inserted!") return @@ -1001,12 +1003,12 @@ Nothing else in the console has ID requirements. return say("Uploading technology disk.") t_disk.stored_research.copy_research_to(stored_research) - if(ls["copy_design"]) //Copy design la from the research holder to the design disk. + if(ls["copy_design"]) //Copy design from the research holder to the design disk. if(QDELETED(d_disk)) say("No Design Disk Inserted!") return var/slot = text2num(ls["copy_design"]) - var/datum/design/D = stored_research.researched_designs[ls["copy_design_ID"]] + var/datum/design/D = SSresearch.techweb_design_by_id(ls["copy_design_ID"]) if(D) var/autolathe_friendly = TRUE if(D.reagents_list.len) @@ -1033,12 +1035,12 @@ Nothing else in the console has ID requirements. linked_destroy.unload_item() screen = RDSCREEN_MENU if(ls["view_node"]) - selected_node = SSresearch.techweb_nodes[ls["view_node"]] + selected_node_id = ls["view_node"] screen = RDSCREEN_TECHWEB_NODEVIEW if(ls["view_design"]) - selected_design = SSresearch.techweb_designs[ls["view_design"]] + selected_design_id = ls["view_design"] screen = RDSCREEN_TECHWEB_DESIGNVIEW - if(ls["updt_design"]) //Uples the research holder with design la from the design disk. + if(ls["updt_design"]) //Uploads a design from disk to the techweb. if(QDELETED(d_disk)) say("No design disk found.") return @@ -1046,9 +1048,9 @@ Nothing else in the console has ID requirements. if(!n) for(var/D in d_disk.blueprints) if(D) - stored_research.add_design(D) + stored_research.add_design(D, TRUE) else - stored_research.add_design(d_disk.blueprints[n]) + stored_research.add_design(d_disk.blueprints[n], TRUE) updateUsrDialog() @@ -1077,17 +1079,17 @@ Nothing else in the console has ID requirements. /obj/machinery/computer/rdconsole/proc/rescan_views() var/compare - matching_designs.Cut() + matching_design_ids.Cut() if(searchtype == "proto") compare = PROTOLATHE else if(searchtype == "imprint") compare = IMPRINTER for(var/v in stored_research.researched_designs) - var/datum/design/D = stored_research.researched_designs[v] + var/datum/design/D = SSresearch.techweb_design_by_id(v) if(!(D.build_type & compare)) continue if(findtext(D.name,searchstring)) - matching_designs.Add(D) + matching_design_ids.Add(D.id) /obj/machinery/computer/rdconsole/proc/check_canprint(datum/design/D, buildtype) var/amount = 50 diff --git a/code/modules/research/techweb/__techweb_helpers.dm b/code/modules/research/techweb/__techweb_helpers.dm index 1e90f0f28d..6c967c0924 100644 --- a/code/modules/research/techweb/__techweb_helpers.dm +++ b/code/modules/research/techweb/__techweb_helpers.dm @@ -1,48 +1,3 @@ - -/proc/initialize_all_techweb_nodes(clearall = FALSE) - if(islist(SSresearch.techweb_nodes) && clearall) - QDEL_LIST(SSresearch.techweb_nodes) - if(islist(SSresearch.techweb_nodes_starting && clearall)) - QDEL_LIST(SSresearch.techweb_nodes_starting) - var/list/returned = list() - for(var/path in subtypesof(/datum/techweb_node)) - var/datum/techweb_node/TN = path - if(isnull(initial(TN.id))) - continue - TN = new path - if(returned[initial(TN.id)]) - stack_trace("WARNING: Techweb node ID clash with ID [initial(TN.id)] detected!") - SSresearch.errored_datums[TN] = initial(TN.id) - continue - returned[initial(TN.id)] = TN - if(TN.starting_node) - SSresearch.techweb_nodes_starting[TN.id] = TN - SSresearch.techweb_nodes = returned - verify_techweb_nodes() //Verify all nodes have ids and such. - calculate_techweb_nodes() - calculate_techweb_boost_list() - verify_techweb_nodes() //Verify nodes and designs have been crosslinked properly. - -/proc/initialize_all_techweb_designs(clearall = FALSE) - if(islist(SSresearch.techweb_designs) && clearall) - QDEL_LIST(SSresearch.techweb_designs) - var/list/returned = list() - for(var/path in subtypesof(/datum/design)) - var/datum/design/DN = path - if(isnull(initial(DN.id))) - stack_trace("WARNING: Design with null ID detected. Build path: [initial(DN.build_path)]") - continue - else if(initial(DN.id) == DESIGN_ID_IGNORE) - continue - DN = new path - if(returned[initial(DN.id)]) - stack_trace("WARNING: Design ID clash with ID [initial(DN.id)] detected!") - SSresearch.errored_datums[DN] = initial(DN.id) - continue - returned[initial(DN.id)] = DN - SSresearch.techweb_designs = returned - verify_techweb_designs() - /proc/count_unique_techweb_nodes() var/static/list/L = typesof(/datum/techweb_node) return L.len @@ -51,135 +6,10 @@ var/static/list/L = typesof(/datum/design) return L.len -/proc/get_techweb_node_by_id(id) - if(SSresearch.techweb_nodes[id]) - return SSresearch.techweb_nodes[id] - -/proc/get_techweb_design_by_id(id) - if(SSresearch.techweb_designs[id]) - return SSresearch.techweb_designs[id] - -/proc/research_node_id_error(id) - if(SSresearch.invalid_node_ids[id]) - SSresearch.invalid_node_ids[id]++ - else - SSresearch.invalid_node_ids[id] = 1 - -/proc/design_id_error(id) - if(SSresearch.invalid_design_ids[id]) - SSresearch.invalid_design_ids[id]++ - else - SSresearch.invalid_design_ids[id] = 1 - /proc/node_boost_error(id, message) WARNING("Invalid boost information for node \[[id]\]: [message]") SSresearch.invalid_node_boost[id] = message -/proc/verify_techweb_nodes() - for(var/n in SSresearch.techweb_nodes) - var/datum/techweb_node/N = SSresearch.techweb_nodes[n] - if(!istype(N)) - WARNING("Invalid research node with ID [n] detected and removed.") - SSresearch.techweb_nodes -= n - research_node_id_error(n) - for(var/p in N.prereq_ids) - var/datum/techweb_node/P = SSresearch.techweb_nodes[p] - if(!istype(P)) - WARNING("Invalid research prerequisite node with ID [p] detected in node [N.display_name]\[[N.id]\] removed.") - N.prereq_ids -= p - research_node_id_error(p) - for(var/d in N.design_ids) - var/datum/design/D = SSresearch.techweb_designs[d] - if(!istype(D)) - WARNING("Invalid research design with ID [d] detected in node [N.display_name]\[[N.id]\] removed.") - N.designs -= d - design_id_error(d) - for(var/p in N.prerequisites) - var/datum/techweb_node/P = N.prerequisites[p] - if(!istype(P)) - WARNING("Invalid research prerequisite node with ID [p] detected in node [N.display_name]\[[N.id]\] removed.") - N.prerequisites -= p - research_node_id_error(p) - for(var/u in N.unlocks) - var/datum/techweb_node/U = N.unlocks[u] - if(!istype(U)) - WARNING("Invalid research unlock node with ID [u] detected in node [N.display_name]\[[N.id]\] removed.") - N.unlocks -= u - research_node_id_error(u) - for(var/d in N.designs) - var/datum/design/D = N.designs[d] - if(!istype(D)) - WARNING("Invalid research design with ID [d] detected in node [N.display_name]\[[N.id]\] removed.") - N.designs -= d - design_id_error(d) - for(var/p in N.boost_item_paths) - if(!ispath(p)) - N.boost_item_paths -= p - node_boost_error(N.id, "[p] is not a valid path.") - var/list/points = N.boost_item_paths[p] - if(islist(points)) - for(var/i in points) - if(!isnum(points[i])) - node_boost_error(N.id, "[points[i]] is not a valid number.") - else if(!SSresearch.point_types[i]) - node_boost_error(N.id, "[i] is not a valid point type.") - else if(!isnull(points)) - N.boost_item_paths -= p - node_boost_error(N.id, "No valid list.") - CHECK_TICK - -/proc/verify_techweb_designs() - for(var/d in SSresearch.techweb_designs) - var/datum/design/D = SSresearch.techweb_designs[d] - if(!istype(D)) - stack_trace("WARNING: Invalid research design with ID [d] detected and removed.") - SSresearch.techweb_designs -= d - CHECK_TICK - -/proc/calculate_techweb_nodes() - for(var/design_id in SSresearch.techweb_designs) - var/datum/design/D = SSresearch.techweb_designs[design_id] - D.unlocked_by.Cut() - for(var/node_id in SSresearch.techweb_nodes) - var/datum/techweb_node/node = SSresearch.techweb_nodes[node_id] - node.prerequisites = list() - node.unlocks = list() - node.designs = list() - for(var/i in node.prereq_ids) - node.prerequisites[i] = SSresearch.techweb_nodes[i] - for(var/i in node.design_ids) - var/datum/design/D = SSresearch.techweb_designs[i] - node.designs[i] = D - D.unlocked_by += node - if(node.hidden) - SSresearch.techweb_nodes_hidden[node.id] = node - CHECK_TICK - generate_techweb_unlock_linking() - -/proc/generate_techweb_unlock_linking() - for(var/node_id in SSresearch.techweb_nodes) //Clear all unlock links to avoid duplication. - var/datum/techweb_node/node = SSresearch.techweb_nodes[node_id] - node.unlocks = list() - for(var/node_id in SSresearch.techweb_nodes) - var/datum/techweb_node/node = SSresearch.techweb_nodes[node_id] - for(var/prereq_id in node.prerequisites) - var/datum/techweb_node/prereq_node = node.prerequisites[prereq_id] - prereq_node.unlocks[node.id] = node - -/proc/calculate_techweb_boost_list(clearall = FALSE) - if(clearall) - SSresearch.techweb_boost_items = list() - for(var/node_id in SSresearch.techweb_nodes) - var/datum/techweb_node/node = SSresearch.techweb_nodes[node_id] - for(var/path in node.boost_item_paths) - if(!ispath(path)) - continue - if(length(SSresearch.techweb_boost_items[path])) - SSresearch.techweb_boost_items[path][node.id] = node.boost_item_paths[path] - else - SSresearch.techweb_boost_items[path] = list(node.id = node.boost_item_paths[path]) - CHECK_TICK - /proc/techweb_item_boost_check(obj/item/I) //Returns an associative list of techweb node datums with values of the boost it gives. var/list/returned = list() if(SSresearch.techweb_boost_items[I.type]) return SSresearch.techweb_boost_items[I.type] //It should already be formatted in node datum = list(point type = value) diff --git a/code/modules/research/techweb/_techweb.dm b/code/modules/research/techweb/_techweb.dm index 1e554f112f..17294fe108 100644 --- a/code/modules/research/techweb/_techweb.dm +++ b/code/modules/research/techweb/_techweb.dm @@ -5,12 +5,13 @@ //Techweb datums are meant to store unlocked research, being able to be stored on research consoles, servers, and disks. They are NOT global. /datum/techweb - var/list/datum/techweb_node/researched_nodes = list() //Already unlocked and all designs are now available. Assoc list, id = datum - var/list/datum/techweb_node/visible_nodes = list() //Visible nodes, doesn't mean it can be researched. Assoc list, id = datum - var/list/datum/techweb_node/available_nodes = list() //Nodes that can immediately be researched, all reqs met. assoc list, id = datum - var/list/datum/design/researched_designs = list() //Designs that are available for use. Assoc list, id = datum - var/list/datum/techweb_node/boosted_nodes = list() //Already boosted nodes that can't be boosted again. node datum = path of boost object. - var/list/datum/techweb_node/hidden_nodes = list() //Hidden nodes. id = datum. Used for unhiding nodes when requirements are met by removing the entry of the node. + var/list/researched_nodes = list() //Already unlocked and all designs are now available. Assoc list, id = TRUE + var/list/visible_nodes = list() //Visible nodes, doesn't mean it can be researched. Assoc list, id = TRUE + var/list/available_nodes = list() //Nodes that can immediately be researched, all reqs met. assoc list, id = TRUE + var/list/researched_designs = list() //Designs that are available for use. Assoc list, id = TRUE + var/list/custom_designs = list() //Custom inserted designs like from disks that should survive recalculation. + var/list/boosted_nodes = list() //Already boosted nodes that can't be boosted again. node id = path of boost object. + var/list/hidden_nodes = list() //Hidden nodes. id = TRUE. Used for unhiding nodes when requirements are met by removing the entry of the node. var/list/deconstructed_items = list() //items already deconstructed for a generic point boost. path = list(point_type = points) var/list/research_points = list() //Available research points. type = number var/list/obj/machinery/computer/rdconsole/consoles_accessing = list() @@ -19,13 +20,13 @@ var/largest_bomb_value = 0 var/organization = "Third-Party" //Organization name, used for display. var/list/last_bitcoins = list() //Current per-second production, used for display only. - var/list/tiers = list() //Assoc list, datum = number, 1 is available, 2 is all reqs are 1, so on + var/list/tiers = list() //Assoc list, id = number, 1 is available, 2 is all reqs are 1, so on /datum/techweb/New() for(var/i in SSresearch.techweb_nodes_starting) - var/datum/techweb_node/DN = SSresearch.techweb_nodes_starting[i] + var/datum/techweb_node/DN = SSresearch.techweb_node_by_id(i) research_node(DN, TRUE, FALSE) - hidden_nodes = SSresearch.techweb_nodes_hidden + hidden_nodes = SSresearch.techweb_nodes_hidden.Copy() return ..() /datum/techweb/admin @@ -66,23 +67,24 @@ researched_designs = null available_nodes = null visible_nodes = null + custom_designs = null + SSresearch.techwebs -= src return ..() -/datum/techweb/proc/recalculate_nodes(recalculate_designs = FALSE) +/datum/techweb/proc/recalculate_nodes(recalculate_designs = FALSE, wipe_custom_designs = FALSE) var/list/datum/techweb_node/processing = list() - for(var/i in researched_nodes) - processing[i] = researched_nodes[i] - for(var/i in visible_nodes) - processing[i] = visible_nodes[i] - for(var/i in available_nodes) - processing[i] = available_nodes[i] - for(var/i in processing) - update_node_status(processing[i]) - if(recalculate_designs) //Wipes custom added designs like from design disks or anything like that! - researched_designs = list() - for(var/i in processing) - var/datum/techweb_node/TN = processing[i] - update_node_status(TN, FALSE) + for(var/id in researched_nodes) + processing[id] = TRUE + for(var/id in visible_nodes) + processing[id] = TRUE + for(var/id in available_nodes) + processing[id] = TRUE + if(recalculate_designs) + researched_designs = custom_designs.Copy() + if(wipe_custom_designs) + custom_designs = list() + for(var/id in processing) + update_node_status(SSresearch.techweb_node_by_id(id), FALSE) CHECK_TICK for(var/v in consoles_accessing) var/obj/machinery/computer/rdconsole/V = v @@ -172,21 +174,27 @@ research_points[type] = max(0, research_points[type] - amount) return TRUE -/datum/techweb/proc/add_design_by_id(id) - return add_design(get_techweb_design_by_id(id)) +/datum/techweb/proc/add_design_by_id(id, custom = FALSE) + return add_design(SSresearch.techweb_design_by_id(id), custom) -/datum/techweb/proc/add_design(datum/design/design) +/datum/techweb/proc/add_design(datum/design/design, custom = FALSE) if(!istype(design)) return FALSE researched_designs[design.id] = design + researched_designs[design.id] = TRUE + if(custom) + custom_designs[design.id] = TRUE return TRUE -/datum/techweb/proc/remove_design_by_id(id) - return remove_design(get_techweb_design_by_id(id)) +/datum/techweb/proc/remove_design_by_id(id, custom = FALSE) + return remove_design(SSresearch.techweb_design_by_id(id), custom) -/datum/techweb/proc/remove_design(datum/design/design) +/datum/techweb/proc/remove_design(datum/design/design, custom = FALSE) if(!istype(design)) return FALSE + if(custom_designs[design.id] && !custom) + return FALSE + custom_designs -= design.id researched_designs -= design.id return TRUE @@ -200,7 +208,7 @@ return techweb_point_display_generic(research_points) /datum/techweb/proc/research_node_id(id, force, auto_update_points) - return research_node(get_techweb_node_by_id(id), force, auto_update_points) + return research_node(SSresearch.techweb_node_by_id(id), force, auto_update_points) /datum/techweb/proc/research_node(datum/techweb_node/node, force = FALSE, auto_adjust_cost = TRUE) if(!istype(node)) @@ -211,17 +219,17 @@ return FALSE if(auto_adjust_cost) remove_point_list(node.get_price(src)) - researched_nodes[node.id] = node //Add to our researched list - for(var/i in node.unlocks) - visible_nodes[i] = node.unlocks[i] - update_node_status(node.unlocks[i]) - for(var/i in node.designs) - add_design(node.designs[i]) + researched_nodes[node.id] = TRUE //Add to our researched list + for(var/id in node.unlock_ids) + visible_nodes[id] = TRUE + update_node_status(SSresearch.techweb_node_by_id(id)) + for(var/id in node.design_ids) + add_design_by_id(id) update_node_status(node) return TRUE /datum/techweb/proc/unresearch_node_id(id) - return unresearch_node(get_techweb_node_by_id(id)) + return unresearch_node(SSresearch.techweb_node_by_id(id)) /datum/techweb/proc/unresearch_node(datum/techweb_node/node) if(!istype(node)) @@ -232,9 +240,9 @@ /datum/techweb/proc/boost_with_path(datum/techweb_node/N, itempath) if(!istype(N) || !ispath(itempath)) return FALSE - LAZYINITLIST(boosted_nodes[N]) + LAZYINITLIST(boosted_nodes[N.id]) for(var/i in N.boost_item_paths[itempath]) - boosted_nodes[N][i] = max(boosted_nodes[N][i], N.boost_item_paths[itempath][i]) + boosted_nodes[N.id][i] = max(boosted_nodes[N.id][i], N.boost_item_paths[itempath][i]) if(N.autounlock_by_boost) hidden_nodes -= N.id update_node_status(N) @@ -249,13 +257,13 @@ var/tier = 0 if (!researched_nodes[node.id]) // researched is tier 0 for (var/id in node.prereq_ids) - var/prereq_tier = tiers[node.prerequisites[id]] + var/prereq_tier = tiers[id] tier = max(tier, prereq_tier + 1) - if (tier != tiers[node]) - tiers[node] = tier - for (var/id in node.unlocks) - next += node.unlocks[id] + if (tier != tiers[node.id]) + tiers[node.id] = tier + for (var/id in node.unlock_ids) + next += SSresearch.techweb_node_by_id(id) current = next /datum/techweb/proc/update_node_status(datum/techweb_node/node, autoupdate_consoles = TRUE) @@ -265,8 +273,8 @@ if(researched_nodes[node.id]) researched = TRUE var/needed = node.prereq_ids.len - for(var/i in node.prereq_ids) - if(researched_nodes[i]) + for(var/id in node.prereq_ids) + if(researched_nodes[id]) visible = TRUE needed-- if(!needed) @@ -277,15 +285,15 @@ if(hidden_nodes[node.id]) //Hidden. return if(researched) - researched_nodes[node.id] = node - for(var/i in node.designs) - add_design(node.designs[i]) + researched_nodes[node.id] = TRUE + for(var/id in node.design_ids) + add_design(SSresearch.techweb_design_by_id(id)) else if(available) - available_nodes[node.id] = node + available_nodes[node.id] = TRUE else if(visible) - visible_nodes[node.id] = node + visible_nodes[node.id] = TRUE update_tiers(node) if(autoupdate_consoles) for(var/v in consoles_accessing) @@ -296,35 +304,34 @@ //Laggy procs to do specific checks, just in case. Don't use them if you can just use the vars that already store all this! /datum/techweb/proc/designHasReqs(datum/design/D) for(var/i in researched_nodes) - var/datum/techweb_node/N = researched_nodes[i] - for(var/I in N.designs) - if(D == N.designs[I]) - return TRUE + var/datum/techweb_node/N = SSresearch.techweb_node_by_id(i) + if(N.design_ids[D.id]) + return TRUE return FALSE /datum/techweb/proc/isDesignResearched(datum/design/D) return isDesignResearchedID(D.id) /datum/techweb/proc/isDesignResearchedID(id) - return researched_designs[id] + return researched_designs[id]? SSresearch.techweb_design_by_id(id) : FALSE /datum/techweb/proc/isNodeResearched(datum/techweb_node/N) return isNodeResearchedID(N.id) /datum/techweb/proc/isNodeResearchedID(id) - return researched_nodes[id] + return researched_nodes[id]? SSresearch.techweb_node_by_id(id) : FALSE /datum/techweb/proc/isNodeVisible(datum/techweb_node/N) return isNodeResearchedID(N.id) /datum/techweb/proc/isNodeVisibleID(id) - return visible_nodes[id] + return visible_nodes[id]? SSresearch.techweb_node_by_id(id) : FALSE /datum/techweb/proc/isNodeAvailable(datum/techweb_node/N) return isNodeAvailableID(N.id) /datum/techweb/proc/isNodeAvailableID(id) - return available_nodes[id] + return available_nodes[id]? SSresearch.techweb_node_by_id(id) : FALSE /datum/techweb/specialized var/allowed_buildtypes = ALL @@ -347,11 +354,11 @@ for(var/id in node_autounlock_ids) research_node_id(id, TRUE, FALSE) for(var/id in SSresearch.techweb_designs) - var/datum/design/D = SSresearch.techweb_designs[id] + var/datum/design/D = SSresearch.techweb_design_by_id(id) if(D.build_type & design_autounlock_buildtypes) for(var/i in D.category) if(i in design_autounlock_categories) - add_design(D) + add_design_by_id(D.id) break /datum/techweb/specialized/autounlocking/autolathe @@ -376,3 +383,7 @@ /datum/techweb/specialized/autounlocking/autoylathe design_autounlock_buildtypes = AUTOYLATHE allowed_buildtypes = AUTOYLATHE + +/datum/techweb/specialized/autounlocking/autobottler + design_autounlock_buildtypes = AUTOBOTTLER + allowed_buildtypes = AUTOBOTTLER \ No newline at end of file diff --git a/code/modules/research/techweb/_techweb_node.dm b/code/modules/research/techweb/_techweb_node.dm index 875329a89c..e850158d89 100644 --- a/code/modules/research/techweb/_techweb_node.dm +++ b/code/modules/research/techweb/_techweb_node.dm @@ -1,5 +1,6 @@ //Techweb nodes are GLOBAL, there should only be one instance of them in the game. Persistant changes should never be made to them in-game. +//USE SSRESEARCH PROCS TO OBTAIN REFERENCES. DO NOT REFERENCE OUTSIDE OF SSRESEARCH OR YOU WILL FUCK UP GC. /datum/techweb_node var/id @@ -9,20 +10,82 @@ var/starting_node = FALSE //Whether it's available without any research. var/list/prereq_ids = list() var/list/design_ids = list() - var/list/datum/techweb_node/prerequisites = list() //Assoc list id = datum - var/list/datum/techweb_node/unlocks = list() //CALCULATED FROM OTHER NODE'S PREREQUISITES. Assoc list id = datum. - var/list/datum/design/designs = list() //Assoc list id = datum + var/list/unlock_ids = list() //CALCULATED FROM OTHER NODE'S PREREQUISITES. Assoc list id = TRUE. var/list/boost_item_paths = list() //Associative list, path = list(point type = point_value). var/autounlock_by_boost = TRUE //boosting this will autounlock this node. var/export_price = 0 //Cargo export price. - var/list/research_costs = 0 //Point cost to research. type = amount + var/list/research_costs = list() //Point cost to research. type = amount var/category = "Misc" //Category +/datum/techweb_node/error_node + id = "ERROR" + display_name = "ERROR" + description = "This usually means something in the database has corrupted. If it doesn't go away automatically, inform Central Command for their techs to fix it ASAP(tm)" + +/datum/techweb_node/proc/Initialize() + //Make lists associative for lookup + for(var/id in prereq_ids) + prereq_ids[id] = TRUE + for(var/id in design_ids) + design_ids[id] = TRUE + for(var/id in unlock_ids) + unlock_ids[id] = TRUE + +/datum/techweb_node/Destroy() + SSresearch.techweb_nodes -= id + return ..() + +/datum/techweb_node/serialize_list(list/options) + . = list() + VARSET_TO_LIST(., id) + VARSET_TO_LIST(., display_name) + VARSET_TO_LIST(., hidden) + VARSET_TO_LIST(., starting_node) + VARSET_TO_LIST(., assoc_list_strip_value(prereq_ids)) + VARSET_TO_LIST(., assoc_list_strip_value(design_ids)) + VARSET_TO_LIST(., assoc_list_strip_value(unlock_ids)) + VARSET_TO_LIST(., boost_item_paths) + VARSET_TO_LIST(., autounlock_by_boost) + VARSET_TO_LIST(., export_price) + VARSET_TO_LIST(., research_costs) + VARSET_TO_LIST(., category) + +/datum/techweb_node/deserialize_list(list/input, list/options) + if(!input["id"]) + return + VARSET_FROM_LIST(input, id) + VARSET_FROM_LIST(input, display_name) + VARSET_FROM_LIST(input, hidden) + VARSET_FROM_LIST(input, starting_node) + VARSET_FROM_LIST(input, prereq_ids) + VARSET_FROM_LIST(input, design_ids) + VARSET_FROM_LIST(input, unlock_ids) + VARSET_FROM_LIST(input, boost_item_paths) + VARSET_FROM_LIST(input, autounlock_by_boost) + VARSET_FROM_LIST(input, export_price) + VARSET_FROM_LIST(input, research_costs) + VARSET_FROM_LIST(input, category) + Initialize() + return src + +/datum/techweb_node/proc/on_design_deletion(datum/design/D) + prune_design_id(D.id) + +/datum/techweb_node/proc/on_node_deletion(datum/techweb_node/TN) + prune_node_id(TN.id) + +/datum/techweb_node/proc/prune_design_id(design_id) + design_ids -= design_id + +/datum/techweb_node/proc/prune_node_id(node_id) + prereq_ids -= node_id + unlock_ids -= node_id + /datum/techweb_node/proc/get_price(datum/techweb/host) if(host) var/list/actual_costs = research_costs - if(host.boosted_nodes[src]) - var/list/L = host.boosted_nodes[src] + if(host.boosted_nodes[id]) + var/list/L = host.boosted_nodes[id] for(var/i in L) if(actual_costs[i]) actual_costs[i] -= L[i] diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index fdf887d259..c0aa4a3127 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -43,7 +43,6 @@ description = "Various tools fit for basic mech units" design_ids = list("mech_drill", "mech_mscanner", "mech_extinguisher", "mech_cable_layer") - /datum/techweb_node/surplus_lims id = "surplus_lims" display_name = "Basic Prosthetics" @@ -51,8 +50,20 @@ starting_node = TRUE prereq_ids = list("biotech") design_ids = list("basic_l_arm", "basic_r_arm", "basic_r_leg", "basic_l_leg") - export_price = 5000 +/datum/techweb_node/blueprinted_bottles + id = "blueprinted_bottles" + display_name = "License Bottling" + description = "Some Branded bottles to print and export." + starting_node = TRUE + design_ids = list("gin", "wine", "whiskey", "vodka", "tequila", "patron", "rum", "kahlua", "vermouth", "goldschlager", "hcider", "cognac", "absinthe", "grappa", "sake", "fernet", "applejack", "champagne", "blazaam", "trappist", "grenadine", "autobottler") + +/datum/techweb_node/blueprinted_exports + id = "blueprinted_exports" + display_name = "License Exports" + description = "Some Branded bottles to print and export." + starting_node = TRUE + design_ids = list("gin_export", "wine_export", "whiskey_export", "vodka_export", "tequila_export", "patron_export", "rum_export", "kahlua_export", "vermouth_export", "goldschlager_export", "hcider_export", "cognac_export", "absinthe_export", "grappa_export", "sake_export", "fernet_export", "applejack_export", "champagne_export", "blazaam_export", "trappist_export", "grenadine_export") /////////////////////////Biotech///////////////////////// /datum/techweb_node/biotech @@ -82,6 +93,14 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 +/datum/techweb_node/bottle_exports + id = "bottle_exports" + display_name = "Legal Bottling" + prereq_ids = list("blueprinted_bottles") + description = "New bottles for printing and selling." + design_ids = list("minikeg", "blooddrop", "slim_gold", "white_bloodmoon", "greenroad") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 250) + /datum/techweb_node/advance_lims id = "advance_lims" display_name = "Upgraded Prosthetics" @@ -303,6 +322,15 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 +/datum/techweb_node/unregulated_bluespace + id = "unregulated_bluespace" + display_name = "Unregulated Bluespace Research" + description = "Bluespace technology using unstable or unbalanced procedures, prone to damaging the fabric of bluespace. Outlawed by galactic conventions." + prereq_ids = list("bluespace_warping", "syndicate_basic") + design_ids = list("desynchronizer") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + export_price = 2500 + /////////////////////////plasma tech///////////////////////// /datum/techweb_node/basic_plasma id = "basic_plasma" @@ -517,7 +545,7 @@ display_name = "Subdermal Implants" description = "Electronic implants buried beneath the skin." prereq_ids = list("biotech", "datatheory") - design_ids = list("implanter", "implantcase", "implant_chem", "implant_tracking", "locator") + design_ids = list("implanter", "implantcase", "implant_chem", "implant_tracking", "locator", "c38_trac") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 @@ -597,7 +625,7 @@ /datum/techweb_node/botany id = "botany" display_name = "Botanical Engineering" - description = "Botanical tools" + description = "Botanical tools." prereq_ids = list("adv_engi", "biotech") design_ids = list("diskplantgene", "portaseeder", "plantgenes", "flora_gun", "hydro_tray", "biogenerator", "seed_extractor") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750) @@ -694,12 +722,12 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750) export_price = 5000 -/datum/techweb_node/tech_shell - id = "tech_shell" - display_name = "Technological Shells" - description = "They're more technological than regular shot." +/datum/techweb_node/exotic_ammo + id = "exotic_ammo" + display_name = "Exotic Ammunition" + description = "They won't know what hit em." prereq_ids = list("weaponry", "ballistic_weapons") - design_ids = list("techshotshell") + design_ids = list("techshotshell", "c38_hotshot", "c38_iceblox") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500) export_price = 5000 @@ -1028,14 +1056,14 @@ display_name = "Alien Biological Tools" description = "Advanced biological tools." prereq_ids = list("alientech", "advance_surgerytools") - design_ids = list("alien_scalpel", "alien_hemostat", "alien_retractor", "alien_saw", "alien_drill", "alien_cautery") + design_ids = list("alien_scalpel", "alien_hemostat", "alien_retractor", "alien_saw", "alien_drill", "alien_cautery", "ayyplantgenes") 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" + description = "Alien engineering tools." prereq_ids = list("alientech", "exp_tools") design_ids = list("alien_wrench", "alien_wirecutters", "alien_screwdriver", "alien_crowbar", "alien_welder", "alien_multitool") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index 7c812da065..9c9542ed17 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -563,7 +563,7 @@ datum/status_effect/stabilized/blue/on_remove() name = "burning fingertips" desc = "You shouldn't see this." -/obj/item/hothands/is_hot() +/obj/item/hothands/get_temperature() return 290 //Below what's required to ignite plasma. /datum/status_effect/stabilized/darkpurple diff --git a/code/modules/research/xenobiology/crossbreeding/industrial.dm b/code/modules/research/xenobiology/crossbreeding/industrial.dm index 4d39d956e7..a21fddb6cf 100644 --- a/code/modules/research/xenobiology/crossbreeding/industrial.dm +++ b/code/modules/research/xenobiology/crossbreeding/industrial.dm @@ -13,8 +13,8 @@ Industrial extracts: var/itemamount = 1 //How many items to spawn /obj/item/slimecross/industrial/examine(mob/user) - ..() - to_chat(user, "It currently has [plasmaabsorbed] units of plasma floating inside the outer shell, out of [plasmarequired] units.") + . = ..() + . += "It currently has [plasmaabsorbed] units of plasma floating inside the outer shell, out of [plasmarequired] units." /obj/item/slimecross/industrial/proc/do_after_spawn(obj/item/spawned) return diff --git a/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm b/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm index 0b27b1e26f..a86db788a6 100644 --- a/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm +++ b/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm @@ -24,12 +24,9 @@ Self-sustaining extracts: A.icon = icon A.icon_state = icon_state A.color = color + A.name = "self-sustaining " + colour + " extract" return INITIALIZE_HINT_QDEL -/obj/item/autoslime/Initialize() - name = "self-sustaining " + extract.name - return ..() - /obj/item/autoslime/attack_self(mob/user) var/reagentselect = input(user, "Choose the reagent the extract will produce.", "Self-sustaining Reaction") as null|anything in extract.activate_reagents var/amount = 5 diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index 641b7e7dcb..c143c4fb2d 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -1,8 +1,8 @@ //Xenobio control console /mob/camera/aiEye/remote/xenobio - visible_icon = 1 - icon = 'icons/obj/abductor.dmi' - icon_state = "camera_target" + visible_icon = TRUE + icon = 'icons/mob/cameramob.dmi' + icon_state = "generic_camera" var/allowed_area = null /mob/camera/aiEye/remote/xenobio/Initialize() @@ -63,9 +63,9 @@ /obj/machinery/computer/camera_advanced/xenobio/CreateEye() eyeobj = new /mob/camera/aiEye/remote/xenobio(get_turf(src)) eyeobj.origin = src - eyeobj.visible_icon = 1 - eyeobj.icon = 'icons/obj/abductor.dmi' - eyeobj.icon_state = "camera_target" + eyeobj.visible_icon = TRUE + eyeobj.icon = 'icons/mob/cameramob.dmi' + eyeobj.icon_state = "generic_camera" /obj/machinery/computer/camera_advanced/xenobio/GrantActions(mob/living/user) ..() diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 2894ce2108..ab0db8c4a7 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -18,9 +18,9 @@ var/recurring = FALSE /obj/item/slime_extract/examine(mob/user) - ..() + . = ..() if(Uses > 1) - to_chat(user,"It has [Uses] uses remaining.") + . += "It has [Uses] uses remaining." /obj/item/slime_extract/attackby(obj/item/O, mob/user) if(istype(O, /obj/item/slimepotion/enhancer)) diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm index 92a637ce43..d12195cc52 100644 --- a/code/modules/ruins/lavaland_ruin_code.dm +++ b/code/modules/ruins/lavaland_ruin_code.dm @@ -135,7 +135,7 @@ id = /obj/item/card/id/syndicate/anyone implants = list(/obj/item/implant/weapons_auth) -/datum/outfit/lavaland_syndicate/post_equip(mob/living/carbon/human/H) +/datum/outfit/lavaland_syndicate/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) H.faction |= ROLE_SYNDICATE /obj/effect/mob_spawn/human/lavaland_syndicate/comms diff --git a/modular_citadel/code/modules/mining/mining_ruins.dm b/code/modules/ruins/lavalandruin_code/alien_nest.dm similarity index 61% rename from modular_citadel/code/modules/mining/mining_ruins.dm rename to code/modules/ruins/lavalandruin_code/alien_nest.dm index 66b6fd0482..ca33324a90 100644 --- a/modular_citadel/code/modules/mining/mining_ruins.dm +++ b/code/modules/ruins/lavalandruin_code/alien_nest.dm @@ -1,10 +1,3 @@ -/datum/map_template/ruin/lavaland/alien_nest - name = "Alien Nest" - id = "alien-nest" - description = "Not even Necropolis is safe from alien infestation. The competition for hosts has locked the legion and aliens in an endless conflict that can only be resolved by a PKA." - suffix = "lavaland_surface_alien_nest.dmm" - cost = 20 - //Aliens for the alien nest space ruin. /obj/effect/mob_spawn/alien/corpse/humanoid/drone mob_type = /mob/living/carbon/alien/humanoid/drone @@ -23,4 +16,4 @@ desc = "A syringe filled with a strange viscous liquid. It might be best to leave it alone." amount_per_transfer_from_this = 1 volume = 1 - list_reagents = list("xenomicrobes" = 1) \ No newline at end of file + list_reagents = list("xenomicrobes" = 1) diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm index 0d4d2b6ad6..cd641adb33 100644 --- a/code/modules/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/ruins/spaceruin_code/hilbertshotel.dm @@ -2,194 +2,194 @@ 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 + 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 + . = ..() + //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 ..() + 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!") + 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) + . = ..() + 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) + 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 + 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(activeRooms.len) + for(var/x in activeRooms) + var/datum/turf_reservation/room = activeRooms[x] + 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) + 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 + 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' + 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' + name = "Doctor Hilbert's Deathbed" + mappath = '_maps/templates/hilbertshotellore.dmm' /datum/map_template/hilbertshotelstorage - name = "Hilbert's Hotel Storage" - mappath = '_maps/templates/hilbertshotelstorage.dmm' + name = "Hilbert's Hotel Storage" + mappath = '_maps/templates/hilbertshotelstorage.dmm' //Turfs and Areas @@ -201,329 +201,329 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337) 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 + 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 + 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 + 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)) + . = ..() + A.forceMove(get_turf(parentSphere)) /turf/closed/indestructible/hoteldoor - name = "Hotel Door" - icon_state = "hoteldoor" - explosion_block = INFINITY - var/obj/item/hilbertshotel/parentSphere + 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)) + 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(!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. + return //need to be close. /turf/closed/indestructible/hoteldoor/attack_hand(mob/user) - promptExit(user) + promptExit(user) /turf/closed/indestructible/hoteldoor/attack_animal(mob/user) - promptExit(user) + promptExit(user) /turf/closed/indestructible/hoteldoor/attack_paw(mob/user) - promptExit(user) + promptExit(user) /turf/closed/indestructible/hoteldoor/attack_hulk(mob/living/carbon/human/user, does_attack_animation) - promptExit(user) + promptExit(user) /turf/closed/indestructible/hoteldoor/attack_larva(mob/user) - promptExit(user) + promptExit(user) /turf/closed/indestructible/hoteldoor/attack_slime(mob/user) - promptExit(user) + promptExit(user) /turf/closed/indestructible/hoteldoor/attack_robot(mob/user) - if(get_dist(get_turf(src), get_turf(user)) <= 1) - promptExit(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) + . = ..() + 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() + 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" + 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) + . = ..() + 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 + 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) + . = ..() + 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) + 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() + . = ..() + 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