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/RandomRuins/SpaceRuins/spacehermit.dmm b/_maps/RandomRuins/SpaceRuins/spacehermit.dmm index 341dcf7b99..f64bfa8a4e 100644 --- a/_maps/RandomRuins/SpaceRuins/spacehermit.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacehermit.dmm @@ -338,6 +338,9 @@ /obj/item/flashlight/lamp/bananalamp, /turf/open/floor/plating/asteroid, /area/ruin/unpowered) +"bt" = ( +/turf/closed/mineral/random/low_chance/earth_like, +/area/ruin/unpowered) (1,1,1) = {" aa @@ -474,13 +477,13 @@ ab ab ab ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt ab ab ab @@ -520,22 +523,22 @@ aA ab ab ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt ab ab aA @@ -569,27 +572,27 @@ 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 +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt ab aA aa @@ -620,29 +623,29 @@ ab ab 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 +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt ab aA aa @@ -666,36 +669,36 @@ aM aa aA ab +bt +bt +bt +bt ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt ab aA aa @@ -718,37 +721,37 @@ 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 +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt ae af ae -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt ab aA aa @@ -770,38 +773,38 @@ 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 +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt af aq af -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt ab aA aa @@ -822,38 +825,38 @@ aa aA aA ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt ae ae ao ae ae -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt ab aA aa @@ -874,39 +877,39 @@ aa aA aA ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt af an an an af -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt ab aA aa @@ -927,24 +930,24 @@ aA aA aA ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt ae ae bh @@ -952,13 +955,13 @@ an an ae aZ -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt ab aA aa @@ -979,24 +982,24 @@ aA aA aA ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt af aY ao @@ -1004,13 +1007,13 @@ ao ao ak ba -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt ab aA aa @@ -1031,24 +1034,24 @@ aA aA aA ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt al aj ap @@ -1056,13 +1059,13 @@ an as aj aE -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt ab aA aa @@ -1083,24 +1086,24 @@ aA aA aA ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt af ak ao @@ -1109,12 +1112,12 @@ ao ak ba ac -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt ab aA aa @@ -1134,24 +1137,24 @@ aa aA aA ab -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt ah az -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt aR ae ae @@ -1161,12 +1164,12 @@ an ae aZ ac -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt ab aA aM @@ -1186,24 +1189,24 @@ aa aA aA ab -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt ac ac -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt aR ag ag @@ -1213,12 +1216,12 @@ af at bb ac -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt ab aA aa @@ -1238,24 +1241,24 @@ aa aA aA ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt ad ac ac ac ac -ab +bt aH aJ aL -ab -ab +bt +bt aT ac ac @@ -1265,12 +1268,12 @@ ac ac ac aR -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt ab aA aa @@ -1289,14 +1292,14 @@ aa aA aA ab -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt ad au ac @@ -1306,8 +1309,8 @@ ac ac ac ac -ab -ab +bt +bt ac ac ac @@ -1317,12 +1320,12 @@ ac ac ac bg -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt ab aA aa @@ -1341,14 +1344,14 @@ aa aA aA ab -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt ad aw bs @@ -1358,9 +1361,9 @@ ac ac ac ac -ab -ab -ab +bt +bt +bt ac ac ac @@ -1368,13 +1371,13 @@ ac ac ac ac -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt ab aA aa @@ -1393,14 +1396,14 @@ aa aA aA ab -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt ad ax ac @@ -1409,9 +1412,9 @@ aF ac ac ac -ab -ab -ab +bt +bt +bt aU bd ac @@ -1420,13 +1423,13 @@ bl bm ac ac -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt ab aA aa @@ -1445,14 +1448,14 @@ aa aA aA ab -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt ad ay ac @@ -1461,9 +1464,9 @@ ac aG ac ac -ab -ab -ab +bt +bt +bt av be ac @@ -1473,12 +1476,12 @@ bn bo bo bq -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt ab aA aa @@ -1496,16 +1499,16 @@ aa aa aA ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt ac ac ac @@ -1513,9 +1516,9 @@ ac ac ac ac -ab -ab -ab +bt +bt +bt bc bf ac @@ -1525,11 +1528,11 @@ ac ac ac br -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt ab aA aa @@ -1548,26 +1551,26 @@ aa aA aA ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt ac -ab +bt ac ac ac ac ac -ab -ab +bt +bt ac ac ac @@ -1577,11 +1580,11 @@ ac ac ac ac -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt ab aA aa @@ -1599,20 +1602,20 @@ aa aa aA ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt ac ac ac @@ -1628,11 +1631,11 @@ ac ac ac ac -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt ab aA aa @@ -1651,26 +1654,26 @@ aa aa aA ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt ac ac ac -ab -ab +bt +bt ac ac ac @@ -1682,9 +1685,9 @@ ac ac ac ac -ab -ab -ab +bt +bt +bt ab aa aa @@ -1703,26 +1706,26 @@ aa aa aA ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt aK -ab -ab +bt +bt ac ac ac @@ -1734,8 +1737,8 @@ bp ac ac aR -ab -ab +bt +bt ab aA aa @@ -1756,25 +1759,25 @@ aa aa aA ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt aP ac ac @@ -1786,8 +1789,8 @@ ac ac ac aR -ab -ab +bt +bt ab aA aa @@ -1808,25 +1811,25 @@ aa aa aA ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt aQ aP ac @@ -1836,10 +1839,10 @@ ac ac ac ac -ab +bt ac -ab -ab +bt +bt ab aA aa @@ -1860,27 +1863,27 @@ 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 +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt ac ac ac @@ -1888,10 +1891,10 @@ ac aP ac bg -ab -ab -ab -ab +bt +bt +bt +bt ab aa aa @@ -1913,26 +1916,26 @@ aa aA ab ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt ac ac ac @@ -1940,9 +1943,9 @@ ac ac ac aS -ab -ab -ab +bt +bt +bt ab aA aa @@ -1966,25 +1969,25 @@ aa aA aA ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt bg ac ac @@ -1992,9 +1995,9 @@ ac ac ac aS -ab -ab -ab +bt +bt +bt ab aA aa @@ -2018,25 +2021,25 @@ aa aa aA ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt ac ac bj @@ -2044,9 +2047,9 @@ ac ac ac aS -ab -ab -ab +bt +bt +bt ab aA aa @@ -2071,24 +2074,24 @@ aa aa aA ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt aS bi ac @@ -2096,9 +2099,9 @@ ac ac aS aS -ab -ab -ab +bt +bt +bt ab aA aa @@ -2124,23 +2127,23 @@ aM aa aA ab +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +bt aS ac ac @@ -2148,8 +2151,8 @@ ac ac aS aS -ab -ab +bt +bt ab aA aa @@ -2176,20 +2179,20 @@ aa aa aA ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt ab aA aS @@ -2229,18 +2232,18 @@ aa aA aA ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt ab aA aA @@ -2282,17 +2285,17 @@ aa aA aA ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt ab aA aA @@ -2335,16 +2338,16 @@ aa aA aA ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt ab aA aa @@ -2388,16 +2391,16 @@ aa aA aA ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt ab ab aa @@ -2448,9 +2451,9 @@ ab ab ab ab -ab -ab -ab +bt +bt +bt ab aa aa @@ -2933,7 +2936,7 @@ aa aa aa aa -ab +bt aa aa aa 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..820ffd0be4 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -3,44 +3,17 @@ /turf/open/space/basic, /area/space) "aab" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 24 - }, -/obj/structure/table, -/obj/machinery/chem_dispenser/drinks/beer{ - dir = 8 - }, -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) +/turf/open/floor/plating, +/area/space/nearstation) "aac" = ( -/obj/machinery/requests_console{ - department = "Bar"; - departmentType = 2; - pixel_x = 30; - receive_ore_updates = 1 +/obj/effect/turf_decal/stripes/line{ + dir = 5 }, -/obj/machinery/camera{ - c_tag = "Bar"; - dir = 8 - }, -/obj/structure/table, -/obj/machinery/chem_dispenser/drinks{ - dir = 8 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) +/turf/open/floor/plating, +/area/space/nearstation) "aad" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -113,40 +86,30 @@ "aan" = ( /obj/machinery/hydroponics/soil, /obj/item/seeds/ambrosia, -/obj/effect/turf_decal/tile/green{ - dir = 1 +/obj/machinery/newscaster{ + pixel_y = 32 }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/plasteel, +/turf/open/floor/grass, /area/security/prison) "aao" = ( -/obj/machinery/airalarm{ - pixel_y = 23 - }, -/turf/open/floor/plating, +/obj/machinery/hydroponics/soil, +/obj/item/seeds/carrot, +/turf/open/floor/grass, /area/security/prison) "aap" = ( /obj/machinery/hydroponics/soil, -/obj/item/seeds/carrot, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aaq" = ( +/obj/item/plant_analyzer, /obj/structure/sign/warning/electricshock{ pixel_y = 32 }, +/turf/open/floor/grass, +/area/security/prison) +"aaq" = ( /obj/machinery/hydroponics/soil, -/obj/item/plant_analyzer, +/obj/item/seeds/glowshroom, +/turf/open/floor/grass, +/area/security/prison) +"aar" = ( /obj/machinery/camera{ c_tag = "Prison Common Room"; network = list("ss13","prison") @@ -158,24 +121,20 @@ /obj/effect/turf_decal/tile/green{ dir = 4 }, -/turf/open/floor/plasteel, -/area/security/prison) -"aar" = ( -/obj/machinery/hydroponics/soil, -/obj/item/seeds/glowshroom, /obj/effect/turf_decal/tile/green{ - dir = 1 + dir = 8 }, -/obj/effect/turf_decal/tile/green{ - dir = 4 +/obj/structure/sink{ + pixel_y = 20 }, /turf/open/floor/plasteel, /area/security/prison) "aas" = ( -/obj/structure/sink{ - pixel_y = 20 +/obj/structure/sign/warning/electricshock{ + pixel_y = 32 }, -/turf/open/floor/plating, +/obj/machinery/seed_extractor, +/turf/open/floor/plasteel, /area/security/prison) "aat" = ( /turf/open/floor/plasteel, @@ -194,78 +153,64 @@ /obj/machinery/light{ dir = 8 }, -/turf/open/floor/plating, +/turf/open/floor/grass, /area/security/prison) "aax" = ( -/mob/living/simple_animal/mouse/brown/Tom, -/turf/open/floor/plating, +/turf/open/floor/grass, /area/security/prison) "aay" = ( /turf/open/floor/plating, /area/security/prison) "aaz" = ( /obj/item/reagent_containers/glass/bucket, -/turf/open/floor/plating, +/turf/open/floor/grass, /area/security/prison) "aaA" = ( -/obj/machinery/seed_extractor, +/obj/machinery/vr_sleeper{ + dir = 8 + }, /turf/open/floor/plasteel, /area/security/prison) "aaB" = ( -/obj/structure/window/reinforced, -/obj/machinery/hydroponics/soil, -/obj/item/seeds/potato, +/mob/living/simple_animal/mouse/brown/Tom, +/turf/open/floor/grass, +/area/security/prison) +"aaC" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, /obj/effect/turf_decal/tile/green{ dir = 1 }, /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/green{ - dir = 8 + dir = 4 }, /turf/open/floor/plasteel, /area/security/prison) -"aaC" = ( -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/security/prison) "aaD" = ( /obj/structure/window/reinforced, /obj/machinery/hydroponics/soil, -/obj/item/seeds/grass, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/plasteel, +/obj/item/seeds/potato, +/turf/open/floor/grass, /area/security/prison) "aaE" = ( /obj/structure/window/reinforced, /obj/machinery/hydroponics/soil, -/obj/item/cultivator, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/plasteel, +/obj/item/seeds/grass, +/turf/open/floor/grass, /area/security/prison) "aaF" = ( -/obj/structure/window/reinforced, /obj/machinery/hydroponics/soil, -/obj/item/cultivator, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/plasteel, +/obj/structure/window/reinforced, +/obj/item/seeds/tower, +/turf/open/floor/grass, /area/security/prison) "aaG" = ( /obj/machinery/light{ dir = 4 }, -/obj/machinery/cryopod{ +/obj/machinery/vr_sleeper{ dir = 8 }, /turf/open/floor/plasteel, @@ -281,78 +226,49 @@ /obj/structure/chair/stool, /turf/open/floor/plasteel, /area/security/prison) -"aaK" = ( -/obj/machinery/washing_machine, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/security/prison) "aaL" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/security/prison) -"aaM" = ( /obj/machinery/computer/libraryconsole/bookmanagement, /obj/structure/table, -/obj/machinery/newscaster{ - pixel_x = -32 - }, /turf/open/floor/plasteel, /area/security/prison) +"aaM" = ( +/obj/structure/falsewall, +/turf/open/floor/plating, +/area/security/prison) "aaN" = ( -/obj/structure/table, -/obj/item/pen, -/turf/open/floor/plasteel, +/obj/structure/window/reinforced, +/obj/machinery/hydroponics/soil, +/obj/item/cultivator, +/turf/open/floor/grass, /area/security/prison) "aaO" = ( -/obj/structure/table, -/obj/item/storage/pill_bottle/dice, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, /turf/open/floor/plasteel, /area/security/prison) "aaP" = ( -/obj/structure/table, -/obj/structure/bedsheetbin, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 }, +/turf/closed/wall, +/area/security/execution/transfer) +"aaQ" = ( /obj/machinery/computer/cryopod{ dir = 8; pixel_x = 26 }, -/turf/open/floor/plasteel/cafeteria, -/area/security/prison) -"aaQ" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ +/obj/machinery/cryopod{ dir = 8 }, -/turf/open/floor/plasteel/cafeteria, +/turf/open/floor/plasteel, /area/security/prison) "aaR" = ( /obj/structure/lattice, @@ -372,50 +288,30 @@ /turf/open/space, /area/space/nearstation) "aaU" = ( -/obj/machinery/computer/arcade{ - icon_state = "arcade"; +/obj/machinery/computer/arcade/minesweeper{ dir = 4 }, /turf/open/floor/plasteel, /area/security/prison) "aaV" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen, +/obj/structure/chair/sofa/right, /turf/open/floor/plasteel, /area/security/prison) "aaW" = ( -/obj/structure/table, -/obj/item/toy/cards/deck, +/obj/structure/chair/sofa/left, /turf/open/floor/plasteel, /area/security/prison) "aaX" = ( -/obj/machinery/washing_machine, /obj/structure/window/reinforced, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ +/obj/machinery/cryopod{ dir = 8 }, -/turf/open/floor/plasteel/cafeteria, +/turf/open/floor/plasteel, /area/security/prison) "aaY" = ( -/obj/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/security/prison) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/security/execution/transfer) "aaZ" = ( /turf/closed/wall/r_wall, /area/ai_monitored/security/armory) @@ -450,11 +346,11 @@ /turf/open/floor/plasteel, /area/security/prison) "abg" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 +/obj/machinery/computer/arcade{ + dir = 4 }, -/turf/closed/wall/r_wall, -/area/security/execution/transfer) +/turf/open/floor/plasteel, +/area/security/prison) "abh" = ( /obj/machinery/holopad, /turf/open/floor/plasteel, @@ -473,6 +369,7 @@ /obj/structure/window/reinforced{ dir = 8 }, +/obj/machinery/washing_machine, /turf/open/floor/plasteel/freezer, /area/security/prison) "abk" = ( @@ -560,8 +457,7 @@ /area/security/execution/transfer) "abu" = ( /obj/machinery/door/poddoor{ - id = "executionspaceblast"; - name = "blast door" + id = "executionspaceblast" }, /turf/open/floor/plating, /area/security/execution/transfer) @@ -588,8 +484,9 @@ /turf/open/floor/plasteel/dark, /area/security/execution/transfer) "abx" = ( -/obj/machinery/vending/cola/random, -/turf/open/floor/plasteel, +/obj/structure/bedsheetbin/color, +/obj/structure/table, +/turf/open/floor/plasteel/freezer, /area/security/prison) "aby" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -652,7 +549,6 @@ "abG" = ( /obj/machinery/door/window/westleft{ base_state = "right"; - dir = 8; icon_state = "right"; name = "Unisex Showers" }, @@ -748,8 +644,7 @@ pixel_y = -3 }, /obj/machinery/camera/motion{ - c_tag = "Armory Motion Sensor"; - dir = 2 + c_tag = "Armory Motion Sensor" }, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -918,7 +813,6 @@ /area/security/execution/transfer) "acb" = ( /obj/machinery/sparker{ - dir = 2; id = "executionburn"; pixel_x = 25 }, @@ -1006,8 +900,8 @@ /area/ai_monitored/security/armory) "acm" = ( /obj/machinery/power/apc/highcap/five_k{ - dir = 4; areastring = "/area/ai_monitored/security/armory"; + dir = 4; name = "Armory APC"; pixel_x = 24 }, @@ -1095,18 +989,14 @@ /turf/open/floor/plasteel/dark, /area/security/execution/transfer) "acA" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 2 - }, +/obj/machinery/atmospherics/components/unary/outlet_injector/on, /obj/effect/turf_decal/stripes/line{ dir = 6 }, /turf/open/floor/plasteel/dark, /area/security/execution/transfer) "acB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel/dark, /area/security/execution/transfer) "acC" = ( @@ -1117,7 +1007,6 @@ }, /obj/item/radio/intercom{ desc = "Talk through this. It looks like it has been modified to not broadcast."; - dir = 2; name = "Prison Intercom (General)"; pixel_y = 24; prison_radio = 1 @@ -1147,7 +1036,6 @@ }, /obj/item/radio/intercom{ desc = "Talk through this. It looks like it has been modified to not broadcast."; - dir = 2; name = "Prison Intercom (General)"; pixel_y = 24; prison_radio = 1 @@ -1169,7 +1057,6 @@ }, /obj/item/radio/intercom{ desc = "Talk through this. It looks like it has been modified to not broadcast."; - dir = 2; name = "Prison Intercom (General)"; pixel_y = 24; prison_radio = 1 @@ -1208,13 +1095,15 @@ /turf/open/floor/plasteel, /area/security/prison) "acK" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = -12; - pixel_y = 2 +/obj/structure/mirror{ + pixel_x = 25 }, /obj/machinery/light/small{ - dir = 4 + dir = 8 + }, +/obj/structure/sink{ + dir = 4; + pixel_x = 11 }, /turf/open/floor/plasteel/freezer, /area/security/prison) @@ -1236,25 +1125,23 @@ pixel_y = -3 }, /obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/turf_decal/bot{ - dir = 2 - }, +/obj/effect/turf_decal/bot, /obj/structure/window/reinforced{ dir = 1; layer = 2.9 }, -/turf/open/floor/plasteel{ - dir = 2 - }, +/turf/open/floor/plasteel, /area/ai_monitored/security/armory) "acN" = ( -/obj/structure/chair/stool/bar, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + on = 0; + pixel_x = -7; + pixel_y = 12 }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) "acO" = ( /obj/structure/closet/l3closet/security, /obj/machinery/camera{ @@ -1275,15 +1162,16 @@ /area/crew_quarters/heads/hos) "acR" = ( /obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, /obj/item/flashlight/lamp/green{ on = 0; pixel_x = -3; pixel_y = 8 }, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, +/obj/item/pen/fountain, /turf/open/floor/carpet, /area/crew_quarters/heads/hos) "acS" = ( @@ -1435,9 +1323,7 @@ pixel_x = 3; pixel_y = -3 }, -/obj/effect/turf_decal/bot{ - dir = 2 - }, +/obj/effect/turf_decal/bot, /obj/structure/window/reinforced{ dir = 1; layer = 2.9 @@ -1445,9 +1331,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/turf/open/floor/plasteel{ - dir = 2 - }, +/turf/open/floor/plasteel, /area/ai_monitored/security/armory) "adk" = ( /obj/structure/rack, @@ -1460,9 +1344,7 @@ pixel_x = 3; pixel_y = -3 }, -/obj/effect/turf_decal/bot{ - dir = 2 - }, +/obj/effect/turf_decal/bot, /obj/structure/window/reinforced{ dir = 1; layer = 2.9 @@ -1470,9 +1352,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/turf/open/floor/plasteel{ - dir = 2 - }, +/turf/open/floor/plasteel, /area/ai_monitored/security/armory) "adl" = ( /obj/machinery/door/poddoor/shutters{ @@ -1511,15 +1391,12 @@ /turf/open/floor/carpet, /area/crew_quarters/heads/hos) "adq" = ( -/obj/structure/table/wood, -/obj/item/instrument/guitar{ - pixel_x = -7 +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/item/instrument/eguitar{ - pixel_x = 5 - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) +/turf/open/floor/plating, +/area/maintenance/fore/secondary) "adr" = ( /obj/structure/sign/warning/vacuum/external{ pixel_x = -32 @@ -1697,9 +1574,7 @@ /area/security/prison) "adK" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) "adL" = ( @@ -1728,8 +1603,8 @@ /area/crew_quarters/heads/hos) "adN" = ( /obj/machinery/power/apc{ - dir = 8; areastring = "/area/crew_quarters/heads/hos"; + dir = 8; name = "Head of Security's Office APC"; pixel_x = -24 }, @@ -1740,8 +1615,11 @@ /turf/open/floor/carpet, /area/crew_quarters/heads/hos) "adO" = ( -/obj/structure/chair/stool, /obj/effect/landmark/event_spawn, +/obj/structure/chair/comfy/brown{ + color = "#596479"; + dir = 4 + }, /turf/open/floor/plasteel, /area/security/prison) "adP" = ( @@ -1752,9 +1630,7 @@ /turf/open/floor/carpet, /area/crew_quarters/heads/hos) "adQ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) "adR" = ( @@ -2037,13 +1913,12 @@ /area/security/prison) "aer" = ( /obj/machinery/firealarm{ - dir = 2; pixel_y = 24 }, /obj/machinery/power/apc{ + areastring = "/area/security/prison"; dir = 4; name = "Prison Wing APC"; - areastring = "/area/security/prison"; pixel_x = 24 }, /obj/structure/cable{ @@ -2062,7 +1937,6 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/suit_storage_unit/security, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 8 @@ -2079,7 +1953,6 @@ /obj/structure/cable{ icon_state = "1-8" }, -/obj/machinery/suit_storage_unit/security, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 8 @@ -2142,7 +2015,8 @@ "aeB" = ( /obj/structure/table, /obj/item/stack/packageWrap, -/obj/item/pen, +/obj/item/stack/packageWrap, +/obj/item/hand_labeler, /turf/open/floor/plasteel, /area/security/main) "aeC" = ( @@ -2441,8 +2315,6 @@ /area/security/main) "afd" = ( /obj/item/radio/intercom{ - freerange = 0; - frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29 }, @@ -2550,7 +2422,7 @@ /turf/open/floor/plasteel, /area/security/main) "afn" = ( -/obj/structure/table, +/obj/machinery/suit_storage_unit/security, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "afo" = ( @@ -2921,9 +2793,8 @@ /obj/structure/closet/secure_closet/injection, /obj/structure/cable, /obj/machinery/power/apc{ - dir = 2; - name = "Prisoner Transfer Centre"; areastring = "/area/security/execution/transfer"; + name = "Prisoner Transfer Centre"; pixel_y = -27 }, /turf/open/floor/plasteel/dark, @@ -3031,9 +2902,7 @@ icon_state = "2-4" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) "agr" = ( @@ -3051,12 +2920,11 @@ /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "agu" = ( -/obj/structure/table, -/obj/machinery/recharger, /obj/machinery/airalarm{ dir = 8; pixel_x = 24 }, +/obj/machinery/suit_storage_unit/security, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "agv" = ( @@ -3082,6 +2950,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/machinery/syndicatebomb/training, /turf/open/floor/plasteel, /area/security/main) "agx" = ( @@ -3156,8 +3025,13 @@ /area/security/brig) "agE" = ( /obj/structure/table, -/obj/item/folder/red, -/obj/item/pen, +/obj/item/storage/fancy/donut_box{ + pixel_y = 10 + }, +/obj/item/storage/fancy/donut_box, +/obj/item/storage/fancy/donut_box{ + pixel_y = -10 + }, /turf/open/floor/plasteel, /area/security/main) "agF" = ( @@ -3331,8 +3205,11 @@ /turf/open/floor/plating, /area/security/warden) "agX" = ( -/obj/structure/table, -/obj/machinery/recharger, +/obj/structure/closet/secure_closet/warden, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/item/book/manual/wiki/security_space_law, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "agY" = ( @@ -3399,14 +3276,21 @@ /turf/open/floor/plasteel, /area/security/main) "ahh" = ( +/obj/item/paper_bin/bundlenatural{ + pixel_x = 6; + pixel_y = 4 + }, +/obj/item/paper_bin{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/pen/fountain, +/obj/item/folder/red, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/item/pen, /obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, /turf/open/floor/plasteel, /area/security/main) "ahi" = ( @@ -3514,8 +3398,6 @@ /area/security/brig) "ahs" = ( /obj/item/radio/intercom{ - freerange = 0; - frequency = 1459; name = "Station Intercom (General)"; pixel_y = 24 }, @@ -3560,9 +3442,9 @@ /area/security/brig) "ahv" = ( /obj/machinery/power/apc{ + areastring = "/area/security/warden"; dir = 8; name = "Brig Control APC"; - areastring = "/area/security/warden"; pixel_x = -24 }, /obj/structure/cable{ @@ -3646,9 +3528,7 @@ /area/security/main) "ahD" = ( /obj/machinery/door/window/westleft{ - base_state = "left"; dir = 4; - icon_state = "left"; name = "Brig Infirmary" }, /obj/effect/turf_decal/tile/red, @@ -3781,9 +3661,9 @@ /area/security/main) "ahN" = ( /obj/machinery/power/apc{ + areastring = "/area/security/main"; dir = 4; name = "Security Office APC"; - areastring = "/area/security/main"; pixel_x = 24 }, /obj/structure/cable{ @@ -3806,9 +3686,17 @@ /turf/open/floor/plasteel/white, /area/security/brig) "ahQ" = ( -/obj/structure/closet/secure_closet/warden, -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/table, +/obj/machinery/recharger{ + pixel_x = -6; + pixel_y = 3 + }, +/obj/machinery/recharger{ + pixel_x = 6; + pixel_y = 3 }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) @@ -3963,16 +3851,11 @@ /turf/open/floor/plasteel/white, /area/security/brig) "aie" = ( -/obj/structure/table, -/obj/item/folder/red, -/obj/item/pen, -/obj/item/hand_labeler, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/item/book/manual/wiki/security_space_law, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) +/obj/structure/closet/wardrobe/mixed, +/obj/item/clothing/shoes/jackboots, +/obj/item/coin/silver, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "aif" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -4472,7 +4355,6 @@ "aje" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/machinery/firealarm{ - dir = 2; pixel_y = 24 }, /obj/effect/turf_decal/tile/red{ @@ -4532,8 +4414,6 @@ /area/security/courtroom) "ajj" = ( /obj/item/radio/intercom{ - broadcasting = 0; - listening = 1; name = "Station Intercom (General)"; pixel_y = 20 }, @@ -4587,10 +4467,10 @@ /turf/open/floor/plasteel/dark, /area/security/courtroom) "ajq" = ( +/obj/structure/lattice/catwalk, /obj/structure/cable{ icon_state = "0-2" }, -/obj/structure/lattice/catwalk, /turf/open/space, /area/solar/port/fore) "ajr" = ( @@ -4640,7 +4520,6 @@ /area/security/brig) "ajx" = ( /obj/machinery/firealarm{ - dir = 2; pixel_y = 24 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -4657,9 +4536,9 @@ /area/security/brig) "ajy" = ( /obj/machinery/power/apc{ + areastring = "/area/security/brig"; dir = 1; name = "Brig APC"; - areastring = "/area/security/brig"; pixel_y = 24 }, /obj/structure/cable{ @@ -4737,9 +4616,7 @@ /area/security/courtroom) "ajF" = ( /obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/red{ - dir = 2 - }, +/obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel, /area/security/brig) "ajG" = ( @@ -4821,9 +4698,7 @@ "ajO" = ( /obj/structure/table/wood, /obj/item/radio/intercom{ - broadcasting = 0; dir = 8; - listening = 1; name = "Station Intercom (Court)" }, /obj/effect/turf_decal/tile/neutral{ @@ -5024,9 +4899,7 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/effect/turf_decal/tile/red{ - dir = 2 - }, +/obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel, /area/security/brig) "akh" = ( @@ -5074,9 +4947,7 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 }, -/obj/effect/turf_decal/tile/red{ - dir = 2 - }, +/obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel, /area/security/brig) "akl" = ( @@ -5579,10 +5450,10 @@ /turf/open/floor/plasteel, /area/security/brig) "alg" = ( +/obj/structure/lattice/catwalk, /obj/structure/cable{ icon_state = "0-2" }, -/obj/structure/lattice/catwalk, /turf/open/space, /area/solar/starboard/fore) "alh" = ( @@ -5700,7 +5571,6 @@ }, /obj/item/radio/intercom{ desc = "Talk through this. It looks like it has been modified to not broadcast."; - dir = 2; name = "Prison Intercom (General)"; pixel_x = -25; pixel_y = -2; @@ -5735,7 +5605,6 @@ }, /obj/item/radio/intercom{ desc = "Talk through this. It looks like it has been modified to not broadcast."; - dir = 2; name = "Prison Intercom (General)"; pixel_x = -25; pixel_y = -2; @@ -5812,9 +5681,7 @@ /turf/open/floor/plasteel, /area/security/brig) "alF" = ( -/obj/machinery/atmospherics/components/unary/tank/air{ - dir = 2 - }, +/obj/machinery/atmospherics/components/unary/tank/air, /turf/open/floor/plating, /area/maintenance/port/fore) "alG" = ( @@ -5859,22 +5726,25 @@ /turf/open/floor/plasteel, /area/security/courtroom) "alK" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/button/door{ + id = "Room Two"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 7; + pixel_y = -24; + specialfunctions = 4 }, -/obj/structure/cable{ - icon_state = "2-8" +/obj/structure/chair/comfy/brown{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/fore/secondary) +/turf/open/floor/carpet, +/area/crew_quarters/dorms) "alL" = ( /obj/structure/disposalpipe/segment, /obj/machinery/power/apc{ + areastring = "/area/security/courtroom"; dir = 8; name = "Courtroom APC"; - areastring = "/area/security/courtroom"; pixel_x = -24 }, /obj/structure/cable{ @@ -5902,14 +5772,8 @@ /turf/open/floor/plasteel, /area/security/prison) "alN" = ( -/obj/machinery/camera{ - c_tag = "Dormitory Toilets"; - dir = 1 - }, -/obj/structure/table, -/obj/structure/bedsheetbin/towel, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) +/turf/open/space/basic, +/area/space/nearstation) "alO" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -5920,8 +5784,7 @@ "alQ" = ( /obj/machinery/power/solar_control{ id = "auxsolareast"; - name = "Port Bow Solar Control"; - track = 0 + name = "Port Bow Solar Control" }, /obj/structure/cable{ icon_state = "0-4" @@ -6023,17 +5886,23 @@ /turf/open/floor/plasteel, /area/security/processing) "amd" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/button/door{ + desc = "Bolts the doors to the Private Study."; + id = "PrivateStudy"; + name = "Private Study Lock"; + pixel_x = -5; + pixel_y = 24; + req_access_txt = "28" }, -/obj/machinery/computer/arcade{ - icon_state = "arcade"; - dir = 4 +/obj/machinery/button/door{ + id = "PrivateStudy1"; + name = "Privacy Shutters"; + pixel_x = 5; + pixel_y = 24 }, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/hallway/secondary/exit) +/turf/open/floor/wood, +/area/library) "ame" = ( /obj/structure/cable{ icon_state = "1-2" @@ -6045,7 +5914,6 @@ /area/security/processing) "amf" = ( /obj/structure/bed, -/obj/item/bedsheet, /obj/structure/cable{ icon_state = "1-2" }, @@ -6053,6 +5921,7 @@ id = "Cell 1"; pixel_x = -28 }, +/obj/item/bedsheet/orange, /turf/open/floor/plasteel, /area/security/brig) "amg" = ( @@ -6064,11 +5933,11 @@ /area/security/brig) "amh" = ( /obj/structure/bed, -/obj/item/bedsheet, /obj/machinery/flasher{ id = "Cell 2"; pixel_x = -28 }, +/obj/item/bedsheet/orange, /turf/open/floor/plasteel, /area/security/brig) "ami" = ( @@ -6080,11 +5949,11 @@ /area/security/brig) "amj" = ( /obj/structure/bed, -/obj/item/bedsheet, /obj/machinery/flasher{ id = "Cell 3"; pixel_x = -28 }, +/obj/item/bedsheet/orange, /turf/open/floor/plasteel, /area/security/brig) "amk" = ( @@ -6167,7 +6036,6 @@ /obj/item/bedsheet, /obj/item/radio/intercom{ desc = "Talk through this. It looks like it has been modified to not broadcast."; - dir = 2; name = "Prison Intercom (General)"; pixel_x = 25; pixel_y = -2; @@ -6213,11 +6081,8 @@ /turf/open/floor/plating, /area/maintenance/solars/starboard/fore) "amx" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +/turf/closed/wall, +/area/crew_quarters/abandoned_gambling_den) "amy" = ( /obj/structure/chair/stool{ pixel_y = 8 @@ -6241,16 +6106,18 @@ /turf/open/floor/plating, /area/maintenance/solars/port/fore) "amB" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/computer/arcade{ - icon_state = "arcade"; - dir = 1 +/obj/structure/cable{ + icon_state = "2-8" }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/fore/secondary) "amC" = ( /turf/open/floor/plating, /area/maintenance/port/fore) @@ -6297,6 +6164,29 @@ /obj/item/trash/plate, /turf/open/floor/plating, /area/maintenance/port/fore) +"amI" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 4; + name = "Air In" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/fore/secondary) +"amJ" = ( +/obj/structure/mirror{ + pixel_y = 32 + }, +/obj/structure/sink{ + dir = 1; + pixel_y = 25 + }, +/obj/structure/toilet{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/dorms) "amK" = ( /obj/structure/sign/warning/docking, /turf/closed/wall, @@ -6317,6 +6207,19 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/security/processing) +"amN" = ( +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"amO" = ( +/obj/machinery/shower{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/dorms) +"amP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall, +/area/crew_quarters/dorms) "amQ" = ( /obj/structure/cable{ icon_state = "0-4" @@ -6462,18 +6365,21 @@ /turf/open/floor/plating, /area/maintenance/fore/secondary) "anc" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/shower{ + dir = 4 }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/fore/secondary) +/obj/item/soap, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/dorms) "and" = ( /obj/machinery/light/small{ dir = 4 }, /obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 2; + name = "2maintenance loot spawner" + }, /turf/open/floor/plating, /area/maintenance/fore/secondary) "ane" = ( @@ -6490,9 +6396,9 @@ icon_state = "0-4" }, /obj/machinery/power/apc{ + areastring = "/area/maintenance/solars/port/fore"; dir = 8; name = "Port Bow Solar APC"; - areastring = "/area/maintenance/solars/port/fore"; pixel_x = -25; pixel_y = 3 }, @@ -6563,6 +6469,13 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) +"anq" = ( +/obj/structure/sign/poster/official/twelve_gauge, +/turf/closed/wall/r_wall, +/area/ai_monitored/security/armory) +"anr" = ( +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/dorms) "ans" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -6676,15 +6589,11 @@ /turf/open/floor/plating, /area/security/courtroom) "anD" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/fore/secondary) +/turf/open/floor/carpet, +/area/crew_quarters/dorms) "anE" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -6730,6 +6639,16 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/port/fore) +"anM" = ( +/obj/structure/window/reinforced/tinted{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted{ + dir = 4 + }, +/obj/structure/curtain, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/dorms) "anN" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -6876,8 +6795,7 @@ "aoh" = ( /obj/machinery/power/solar_control{ id = "auxsolareast"; - name = "Starboard Bow Solar Control"; - track = 0 + name = "Starboard Bow Solar Control" }, /obj/structure/cable{ icon_state = "0-4" @@ -6929,6 +6847,9 @@ /obj/item/circuitboard/machine/monkey_recycler, /turf/open/floor/plating, /area/maintenance/port/fore) +"aop" = ( +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet) "aoq" = ( /obj/structure/sign/warning/vacuum/external{ pixel_y = -32 @@ -7023,9 +6944,7 @@ /turf/open/floor/plasteel, /area/hallway/primary/fore) "aoz" = ( -/obj/effect/turf_decal/tile/red{ - dir = 2 - }, +/obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel, /area/hallway/primary/fore) "aoA" = ( @@ -7034,9 +6953,7 @@ pixel_y = -29 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/red{ - dir = 2 - }, +/obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel, /area/hallway/primary/fore) "aoB" = ( @@ -7044,16 +6961,12 @@ dir = 1; pixel_y = -24 }, -/obj/effect/turf_decal/tile/red{ - dir = 2 - }, +/obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel, /area/hallway/primary/fore) "aoC" = ( /obj/machinery/vending/coffee, -/obj/effect/turf_decal/tile/red{ - dir = 2 - }, +/obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel, /area/hallway/primary/fore) "aoD" = ( @@ -7065,23 +6978,17 @@ pixel_x = 5; pixel_y = -32 }, -/obj/effect/turf_decal/tile/red{ - dir = 2 - }, +/obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel, /area/hallway/primary/fore) "aoE" = ( /obj/machinery/vending/cigarette, -/obj/effect/turf_decal/tile/red{ - dir = 2 - }, +/obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel, /area/hallway/primary/fore) "aoF" = ( /obj/machinery/vending/snack/random, -/obj/effect/turf_decal/tile/red{ - dir = 2 - }, +/obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel, /area/hallway/primary/fore) "aoG" = ( @@ -7101,27 +7008,9 @@ /turf/open/floor/plasteel/dark, /area/security/courtroom) "aoI" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/power/apc{ - dir = 2; - name = "Fitness Room APC"; - areastring = "/area/crew_quarters/fitness"; - pixel_y = -24 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/fore/secondary) +/obj/structure/fireplace, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) "aoJ" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating, @@ -7216,6 +7105,26 @@ /obj/structure/closet/emcloset, /turf/open/floor/plating, /area/maintenance/port/fore) +"aoY" = ( +/obj/structure/sign/warning/fire{ + desc = "A sign that states the labeled room's number."; + dir = 10; + icon_state = "roomnum"; + name = "Room Number 6"; + pixel_y = 24 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/washing_machine{ + pixel_x = 7; + pixel_y = 7 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "aoZ" = ( /obj/machinery/atmospherics/components/binary/valve/digital{ name = "Waste Release" @@ -7331,9 +7240,9 @@ icon_state = "0-2" }, /obj/machinery/power/apc{ + areastring = "/area/maintenance/fore/secondary"; dir = 1; name = "Fore Maintenance APC"; - areastring = "/area/maintenance/fore/secondary"; pixel_y = 24 }, /obj/structure/disposalpipe/segment{ @@ -7364,38 +7273,23 @@ /turf/open/floor/plating, /area/maintenance/fore/secondary) "apu" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/closet/secure_closet/personal/cabinet{ + desc = "Swipe your ID on the closet to claim it. First come first serve, this one is wooden and fancy. Store your stuff here."; + name = "Personal ID-Locked Closet"; + pixel_y = 15 }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, -/turf/open/floor/plating, -/area/maintenance/fore/secondary) +/turf/open/floor/carpet, +/area/crew_quarters/dorms) "apv" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Fitness Maintenance"; - req_access_txt = "12" - }, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"apw" = ( /obj/structure/cable{ icon_state = "1-2" }, /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/maintenance/fore/secondary) -"apw" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 4; - name = "Air In" - }, -/obj/effect/landmark/blobstart, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/fore/secondary) "apx" = ( @@ -7432,9 +7326,9 @@ icon_state = "0-4" }, /obj/machinery/power/apc{ + areastring = "/area/maintenance/solars/starboard/fore"; dir = 8; name = "Starboard Bow Solar APC"; - areastring = "/area/maintenance/solars/starboard/fore"; pixel_x = -25; pixel_y = 3 }, @@ -7455,8 +7349,9 @@ /turf/closed/wall/r_wall, /area/maintenance/starboard/fore) "apD" = ( -/obj/structure/closet/wardrobe/mixed, -/obj/item/clothing/shoes/jackboots, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/machinery/computer/slot_machine, +/obj/item/coin/iron, /turf/open/floor/plating, /area/maintenance/starboard/fore) "apE" = ( @@ -7472,6 +7367,15 @@ /obj/machinery/portable_atmospherics/canister/water_vapor, /turf/open/floor/plasteel, /area/janitor) +"apH" = ( +/obj/machinery/door/airlock{ + desc = "A small bathroom with a sink, toilet and shower."; + id_tag = "Bath1"; + name = "Bathroom" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet) "apI" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/atmos_waste{ dir = 1 @@ -7482,6 +7386,12 @@ "apJ" = ( /turf/closed/wall, /area/construction/mining/aux_base) +"apK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/space/nearstation) "apL" = ( /obj/structure/table, /obj/effect/spawner/lootdrop/maintenance{ @@ -7510,6 +7420,14 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/maintenance/port/fore) +"apQ" = ( +/obj/machinery/door/airlock{ + desc = "A small bathroom with a sink, toilet and shower."; + id_tag = "Bath2"; + name = "Bathroom" + }, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet) "apR" = ( /obj/item/paper/fluff/jobs/security/beepsky_mom, /turf/open/floor/plating, @@ -7520,6 +7438,18 @@ }, /turf/open/floor/plating, /area/maintenance/fore) +"apT" = ( +/obj/structure/lattice/catwalk, +/obj/item/stack/marker_beacon{ + anchored = 1; + icon_state = "markerburgundy-on"; + light_power = 3; + light_range = 3; + name = "Docking Beacon"; + picked_color = "Burgundy" + }, +/turf/open/space/basic, +/area/space/nearstation) "apU" = ( /turf/open/floor/plating, /area/security/vacantoffice/b) @@ -7536,13 +7466,21 @@ /turf/open/floor/plating, /area/maintenance/fore) "apX" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall, -/area/crew_quarters/fitness) -"apY" = ( -/obj/structure/closet/secure_closet/personal, +/obj/structure/bed, +/obj/item/bedsheet/random, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, /turf/open/floor/carpet, /area/crew_quarters/dorms) +"apY" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "maintdiy"; + name = "Security Shutters" + }, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) "apZ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 @@ -7550,12 +7488,9 @@ /turf/open/floor/wood, /area/lawoffice) "aqa" = ( -/obj/structure/table, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) +/obj/machinery/recharge_station, +/turf/open/floor/plating, +/area/maintenance/fore/secondary) "aqb" = ( /obj/structure/rack, /obj/item/storage/briefcase, @@ -7636,9 +7571,8 @@ /area/maintenance/fore/secondary) "aqk" = ( /obj/machinery/power/apc{ - dir = 2; - name = "Dormitory APC"; areastring = "/area/crew_quarters/dorms"; + name = "Dormitory APC"; pixel_y = -24 }, /obj/structure/cable{ @@ -7650,32 +7584,22 @@ /turf/open/floor/plating, /area/maintenance/fore/secondary) "aql" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 +/obj/structure/mirror{ + pixel_y = 32 }, -/obj/structure/cable{ - icon_state = "2-8" +/obj/structure/sink{ + dir = 1; + pixel_y = 25 }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/fore/secondary) -"aqm" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/machinery/light/small{ dir = 4 }, -/turf/open/floor/plating, -/area/maintenance/fore/secondary) +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/dorms) +"aqm" = ( +/obj/structure/chair/sofa/right, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) "aqn" = ( /obj/structure/bed, /obj/machinery/airalarm{ @@ -7695,11 +7619,25 @@ /turf/open/floor/carpet, /area/crew_quarters/dorms) "aqo" = ( -/obj/structure/chair/stool{ - pixel_y = 8 +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/wood, -/area/crew_quarters/dorms) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/fitness"; + name = "Fitness Room APC"; + pixel_y = -24 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/maintenance/fore/secondary) "aqp" = ( /obj/structure/rack, /obj/item/clothing/suit/fire/firefighter, @@ -7724,24 +7662,45 @@ /turf/open/floor/plating, /area/maintenance/fore/secondary) "aqr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/fore/secondary) +"aqs" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "holoprivacy"; + name = "Holodeck Shutters" + }, /turf/open/floor/plating, /area/crew_quarters/fitness) -"aqs" = ( +"aqt" = ( +/obj/machinery/door/airlock{ + desc = "A small bathroom with a sink, toilet and shower."; + id_tag = "Bath3"; + name = "Bathroom" + }, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet) +"aqu" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/crew_quarters/fitness) -"aqu" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 +/obj/machinery/door/poddoor/shutters/preopen{ + id = "holoprivacy"; + name = "Holodeck Shutters" }, -/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/crew_quarters/fitness) "aqv" = ( @@ -7785,26 +7744,47 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "aqB" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/table/glass, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen, /turf/open/floor/plating, /area/maintenance/starboard/fore) "aqC" = ( -/obj/machinery/computer/slot_machine{ - balance = 15; - money = 500 +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/structure/chair/comfy/brown{ + dir = 4 }, -/obj/item/coin/iron, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +/turf/open/floor/wood, +/area/crew_quarters/dorms) "aqD" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/item/coin/gold, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/crew_quarters/dorms) "aqE" = ( -/obj/effect/landmark/xeno_spawn, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +/obj/item/flashlight/lamp/green{ + pixel_x = -3; + pixel_y = 22 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4; + pixel_y = 5 + }, +/obj/structure/dresser{ + desc = "There's plenty of clothes here to change into! It has a surprising amount of variety, too."; + name = "Dresser"; + pixel_y = 7 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"aqF" = ( +/turf/open/floor/carpet, +/area/crew_quarters/dorms) "aqG" = ( /obj/docking_port/stationary/random{ dir = 4; @@ -7813,6 +7793,28 @@ }, /turf/open/space, /area/space/nearstation) +"aqH" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/fore/secondary) +"aqI" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/fore/secondary) "aqJ" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ @@ -7838,19 +7840,25 @@ /obj/machinery/meter, /turf/open/floor/plating, /area/maintenance/port/fore) +"aqN" = ( +/obj/structure/toilet{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/dorms) "aqO" = ( /obj/structure/closet, /obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" + lootcount = 3; + name = "3maintenance loot spawner" }, /turf/open/floor/plating, /area/maintenance/port/fore) "aqP" = ( /obj/machinery/power/apc{ + areastring = "/area/maintenance/port/fore"; dir = 1; name = "Port Bow Maintenance APC"; - areastring = "/area/maintenance/port/fore"; pixel_x = -1; pixel_y = 26 }, @@ -7879,9 +7887,9 @@ /area/security/processing) "aqT" = ( /obj/machinery/power/apc{ + areastring = "/area/security/processing"; dir = 8; name = "Labor Shuttle Dock APC"; - areastring = "/area/security/processing"; pixel_x = -24 }, /obj/structure/cable, @@ -7890,6 +7898,14 @@ }, /turf/open/floor/plating, /area/maintenance/fore) +"aqU" = ( +/obj/structure/closet/secure_closet/personal{ + desc = "Swipe your ID on this locker to claim it. You can drag it around and use it as your own personal storage area. Very useful."; + name = "Personal ID-Locked Locker"; + pixel_y = 10 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) "aqV" = ( /obj/structure/table/wood, /obj/item/paper_bin{ @@ -7958,6 +7974,13 @@ "arf" = ( /turf/closed/wall, /area/crew_quarters/dorms) +"arg" = ( +/obj/machinery/hydroponics/constructable, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/hydroponics) "arh" = ( /obj/machinery/door/airlock/maintenance{ name = "Dormitories Maintenance"; @@ -7967,60 +7990,49 @@ /turf/open/floor/plating, /area/maintenance/fore/secondary) "ari" = ( -/obj/machinery/airalarm{ - pixel_y = 23 - }, -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/wood, -/area/crew_quarters/dorms) -"arj" = ( -/turf/closed/wall, -/area/crew_quarters/fitness) -"ark" = ( -/obj/machinery/airalarm{ - pixel_y = 23 - }, -/obj/structure/closet/secure_closet/personal/cabinet, -/turf/open/floor/wood, -/area/crew_quarters/dorms) -"arl" = ( -/obj/structure/disposalpipe/junction/flip{ - dir = 2 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/light/small{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"arj" = ( +/obj/machinery/door/airlock{ + id_tag = "Room Two"; + name = "Room Seven - Luxury Suite" }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"arm" = ( +/obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"ark" = ( +/obj/structure/bed, +/obj/item/bedsheet/random, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"arl" = ( +/obj/structure/sign/poster/official/ion_rifle, +/turf/closed/wall/r_wall, +/area/ai_monitored/security/armory) +"arm" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "holoprivacy"; + name = "Holodeck Shutters" + }, /turf/open/floor/plating, /area/crew_quarters/fitness) "arn" = ( -/obj/structure/closet/athletic_mixed, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/turf/open/floor/plating, +/area/maintenance/fore/secondary) "aro" = ( /turf/open/floor/engine{ name = "Holodeck Projector Floor" @@ -8043,35 +8055,31 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "arr" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "2-8" +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/maintenance{ + name = "Dormitories Maintenance"; + req_access_txt = "12" }, /turf/open/floor/plating, -/area/maintenance/starboard/fore) +/area/maintenance/fore/secondary) "ars" = ( -/obj/machinery/power/apc{ - dir = 1; - name = "Starboard Bow Maintenance APC"; - areastring = "/area/maintenance/starboard/fore"; - pixel_y = 24 +/obj/item/flashlight/lamp/green{ + pixel_x = -3; + pixel_y = 22 }, -/obj/structure/cable{ - icon_state = "0-4" +/obj/structure/dresser{ + desc = "There's plenty of clothes here to change into! It has a surprising amount of variety, too."; + name = "Dresser"; + pixel_y = 7 }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +/turf/open/floor/wood, +/area/crew_quarters/dorms) "art" = ( -/obj/machinery/light/small{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 }, -/obj/machinery/camera{ - c_tag = "Fore Starboard Solar Access" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) "aru" = ( /obj/structure/chair/stool, /turf/open/floor/plating, @@ -8096,11 +8104,11 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "ary" = ( -/obj/structure/closet, -/obj/item/coin/iron, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/turf/open/floor/wood, +/area/crew_quarters/dorms) "arz" = ( /obj/item/coin/gold, /obj/item/coin/iron, @@ -8109,11 +8117,26 @@ "arA" = ( /obj/structure/closet, /obj/effect/spawner/lootdrop/maintenance, +/obj/item/coin/plasma, /turf/open/floor/plating, /area/maintenance/starboard/fore) "arB" = ( /turf/closed/wall/r_wall, /area/hallway/secondary/entry) +"arC" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"arD" = ( +/obj/item/radio/intercom{ + dir = 4; + name = "Station Intercom (General)"; + pixel_x = 27 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) "arE" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/effect/turf_decal/tile/yellow{ @@ -8201,14 +8224,27 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "arO" = ( -/obj/machinery/monkey_recycler, -/obj/item/reagent_containers/food/snacks/monkeycube, -/obj/item/reagent_containers/food/snacks/monkeycube, -/turf/open/floor/plating, -/area/maintenance/port/fore) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/chair/sofa, +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) "arP" = ( /turf/closed/wall, /area/maintenance/fore) +"arQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "arR" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/structure/table/wood, @@ -8281,14 +8317,15 @@ /turf/open/floor/plasteel, /area/hallway/primary/fore) "asb" = ( -/obj/structure/disposalpipe/trunk{ - dir = 8 +/obj/structure/sign/warning/fire{ + desc = "A sign that states the labeled room's number."; + dir = 5; + icon_state = "roomnum"; + name = "Room Number 7"; + pixel_y = 24 }, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/structure/chair/sofa/right, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel, @@ -8332,20 +8369,11 @@ /turf/open/floor/plasteel, /area/crew_quarters/dorms) "asg" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ +/obj/structure/chair{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /turf/open/floor/plasteel, -/area/crew_quarters/dorms) +/area/crew_quarters/fitness) "ash" = ( /obj/structure/cable{ icon_state = "4-8" @@ -8378,7 +8406,10 @@ /turf/open/floor/plating, /area/security/vacantoffice/b) "ask" = ( -/obj/structure/dresser, +/obj/machinery/light/small{ + dir = 4; + light_color = "#d8b1b1" + }, /turf/open/floor/wood, /area/crew_quarters/dorms) "asl" = ( @@ -8389,12 +8420,15 @@ /turf/open/floor/plating, /area/security/vacantoffice/b) "asm" = ( -/obj/machinery/light/small{ - dir = 1 +/obj/structure/closet/secure_closet/bar{ + req_access_txt = "25" }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/item/clothing/under/waiter, +/obj/item/clothing/under/waiter, +/obj/item/clothing/under/waiter, +/obj/item/gun/ballistic/revolver/doublebarrel, /turf/open/floor/wood, -/area/crew_quarters/dorms) +/area/crew_quarters/bar) "asn" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plating, @@ -8411,69 +8445,41 @@ /turf/open/floor/plating, /area/maintenance/fore) "asp" = ( -/obj/structure/table/wood, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/vending/wardrobe/bar_wardrobe, /turf/open/floor/wood, -/area/crew_quarters/dorms) +/area/crew_quarters/bar) "asq" = ( -/obj/machinery/camera{ - c_tag = "Fitness Room" +/obj/machinery/light, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 }, -/obj/structure/closet/masks, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/turf/open/floor/wood, +/area/crew_quarters/bar) "asr" = ( -/obj/structure/closet/boxinggloves, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/item/clothing/shoes/jackboots, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 +/obj/structure/table/wood/fancy, +/obj/item/reagent_containers/food/drinks/soda_cans/starkist{ + pixel_x = -3; + pixel_y = 5 }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "ass" = ( -/obj/structure/closet/lasertag/red, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "External Access"; + req_access_txt = "13" }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "ast" = ( -/obj/structure/closet/lasertag/blue, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/airalarm{ + pixel_y = 23 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/obj/structure/chair/sofa/left, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) "asu" = ( /obj/structure/bed, /obj/machinery/button/door{ @@ -8493,6 +8499,9 @@ lootcount = 3; name = "3maintenance loot spawner" }, +/obj/structure/light_construct{ + dir = 8 + }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "asw" = ( @@ -8528,6 +8537,10 @@ "asC" = ( /turf/open/floor/plasteel/airless, /area/space/nearstation) +"asD" = ( +/obj/machinery/light, +/turf/open/floor/wood, +/area/crew_quarters/bar) "asE" = ( /turf/closed/wall, /area/hallway/secondary/entry) @@ -8535,6 +8548,13 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/construction/mining/aux_base) +"asG" = ( +/obj/machinery/camera{ + c_tag = "Bar South"; + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) "asH" = ( /obj/structure/closet/toolcloset, /obj/effect/turf_decal/tile/yellow{ @@ -8579,40 +8599,30 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "asL" = ( -/obj/structure/bed, -/obj/machinery/button/door{ - id = "Dorm6"; - name = "Cabin Bolt Control"; - normaldoorcontrol = 1; - pixel_y = -25; - specialfunctions = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/effect/spawner/lootdrop/bedsheet, -/turf/open/floor/wood, -/area/crew_quarters/dorms) +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/space/nearstation) "asM" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 +/obj/structure/cable{ + icon_state = "1-2" }, /obj/structure/cable{ - icon_state = "1-4" + icon_state = "2-4" }, -/obj/effect/turf_decal/tile/neutral{ +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"asN" = ( +/obj/machinery/light/small{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/machinery/camera{ + c_tag = "Fore Starboard Solar Access" }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"asN" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "asO" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, @@ -8640,48 +8650,64 @@ /turf/open/floor/plating, /area/maintenance/fore) "asU" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 8; + name = "8maintenance loot spawner" + }, /turf/open/floor/plasteel, /area/security/vacantoffice/b) "asV" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 +/obj/machinery/power/apc{ + areastring = "/area/maintenance/starboard/fore"; + dir = 1; + name = "Starboard Bow Maintenance APC"; + pixel_y = 24 }, /obj/structure/cable{ - icon_state = "2-8" + icon_state = "0-8" }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "asW" = ( -/obj/machinery/light/small{ - dir = 8 +/obj/structure/table/wood, +/obj/item/storage/box/evidence, +/obj/item/hand_labeler{ + pixel_x = 5 }, -/obj/structure/rack, -/obj/item/storage/briefcase, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/item/taperecorder, /turf/open/floor/plasteel/grimy, /area/security/detectives_office) "asX" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = 25 + }, /turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/area/crew_quarters/dorms) "asY" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 +/obj/machinery/door/poddoor/shutters/preopen{ + id = "holoprivacy"; + name = "Holodeck Shutters" }, /turf/open/floor/plating, /area/crew_quarters/fitness) "asZ" = ( +/obj/structure/chair/sofa/left, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/vr_sleeper, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 + dir = 10 }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) @@ -8722,23 +8748,23 @@ /turf/open/floor/carpet, /area/crew_quarters/dorms) "atf" = ( -/obj/structure/chair/stool{ - pixel_y = 8 +/obj/machinery/camera{ + c_tag = "Bar Storage" }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 +/obj/structure/sink/kitchen{ + pixel_y = 28 }, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) +/turf/open/floor/wood, +/area/crew_quarters/bar) "atg" = ( /obj/machinery/door/airlock{ id_tag = "Dorm4"; - name = "Dorm 4" + name = "Room Three" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/dark, /area/crew_quarters/dorms) "ath" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -8769,6 +8795,17 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) +"atk" = ( +/obj/machinery/light/small, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"atl" = ( +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -23 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) "atm" = ( /turf/open/floor/wood, /area/crew_quarters/dorms) @@ -8813,7 +8850,13 @@ /turf/open/floor/plating, /area/security/vacantoffice/b) "att" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/table/wood/fancy, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/item/reagent_containers/food/drinks/britcup{ + desc = "Kingston's personal cup."; + pixel_x = 5; + pixel_y = 5 + }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "atu" = ( @@ -8857,8 +8900,22 @@ icon_state = "panelscorched" }, /area/maintenance/starboard/fore) +"atz" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/structure/closet/wardrobe/black, +/obj/item/clothing/under/skirt/black, +/obj/item/clothing/head/beret/black, +/obj/item/clothing/head/beret/black, +/obj/item/clothing/under/trendy_fit, +/obj/item/clothing/under/trendy_fit, +/obj/item/clothing/under/sundress, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) "atA" = ( /obj/structure/table, +/obj/item/paicard, /turf/open/floor/plating, /area/maintenance/starboard/fore) "atB" = ( @@ -8954,13 +9011,19 @@ /turf/closed/wall, /area/maintenance/port/fore) "atQ" = ( -/obj/machinery/door/airlock{ - id_tag = "Dorm5"; - name = "Cabin 1" +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/wood, -/area/crew_quarters/dorms) +/obj/structure/closet/wardrobe/white, +/obj/item/clothing/under/waiter, +/obj/item/clothing/under/waiter, +/obj/item/clothing/under/waiter, +/obj/structure/sign/poster/contraband/lizard{ + pixel_x = -32 + }, +/obj/item/clothing/suit/straight_jacket, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) "atR" = ( /obj/effect/landmark/carpspawn, /obj/structure/lattice, @@ -8970,10 +9033,15 @@ /turf/closed/wall, /area/space/nearstation) "atT" = ( -/obj/structure/closet, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/port/fore) +/obj/structure/table/wood/poker, +/obj/item/toy/cards/deck{ + pixel_y = 5 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) "atU" = ( /obj/structure/rack, /obj/effect/spawner/lootdrop/maintenance{ @@ -8983,44 +9051,48 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "atV" = ( -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, -/obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 + dir = 4; + pixel_y = 5 }, -/obj/effect/turf_decal/tile/neutral{ +/obj/structure/chair/sofa{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "atW" = ( /obj/structure/chair/stool, /turf/open/floor/plating, /area/maintenance/port/fore) +"atX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plating, +/area/space/nearstation) "atY" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall, /area/security/vacantoffice/b) "atZ" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Holodeck Door" +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "aua" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 +/obj/structure/bed, +/obj/machinery/button/door{ + id = "Dorm6"; + name = "Cabin Bolt Control"; + normaldoorcontrol = 1; + pixel_y = -25; + specialfunctions = 4 }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/wood, +/area/crew_quarters/dorms) "aub" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/yellow, @@ -9040,6 +9112,12 @@ }, /turf/open/floor/plasteel, /area/construction/mining/aux_base) +"aud" = ( +/obj/machinery/atmospherics/components/unary/tank/air{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "aue" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, @@ -9143,60 +9221,60 @@ /turf/open/floor/plating, /area/maintenance/fore) "aup" = ( -/obj/machinery/door/airlock{ - id_tag = "Dorm6"; - name = "Cabin 2" +/obj/structure/table/wood/fancy, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3; + pixel_y = 9 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/wood, -/area/crew_quarters/dorms) +/obj/item/reagent_containers/food/condiment/peppermill{ + dir = 1; + pixel_x = 3; + pixel_y = 9 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) "auq" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, /area/security/vacantoffice/b) "aur" = ( -/obj/machinery/door/window/eastright{ - base_state = "left"; - dir = 8; - icon_state = "left"; - name = "Fitness Ring" - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) +/obj/structure/table/wood/fancy/black, +/obj/machinery/light/small, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) "aus" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/area/crew_quarters/dorms) "aut" = ( -/obj/structure/window/reinforced{ - dir = 1 +/obj/machinery/door/airlock{ + id_tag = "Room One"; + name = "Room Six - Luxury Suite" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) +/area/crew_quarters/dorms) "auu" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 +/obj/structure/closet/secure_closet/personal/cabinet{ + desc = "Swipe your ID on the closet to claim it. First come first serve, this one is wooden and fancy. Store your stuff here."; + name = "Personal ID-Locked Closet"; + pixel_y = 15 }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/turf/open/floor/wood, +/area/crew_quarters/dorms) "auv" = ( -/obj/structure/window/reinforced{ - dir = 4 +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/structure/closet/secure_closet/personal/cabinet{ + desc = "Swipe your ID on the closet to claim it. First come first serve, this one is wooden and fancy. Store your stuff here."; + name = "Personal ID-Locked Closet"; + pixel_y = 15 }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) +/turf/open/floor/wood, +/area/crew_quarters/dorms) "auw" = ( /obj/structure/bed, /obj/machinery/airalarm{ @@ -9216,54 +9294,79 @@ /turf/open/floor/carpet, /area/crew_quarters/dorms) "aux" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/machinery/meter, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"auy" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"auy" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Holodeck Door" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"auz" = ( -/obj/machinery/camera{ - c_tag = "Holodeck" - }, -/obj/machinery/airalarm{ - pixel_y = 24 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"auA" = ( -/obj/machinery/light/small{ +/obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"auz" = ( +/obj/machinery/light/small, +/obj/machinery/atmospherics/components/unary/tank/air{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"auA" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/sign/warning/fire{ + desc = "A sign that states the labeled room's number."; + dir = 4; + icon_state = "roomnum"; + name = "Room Number 3"; + pixel_x = -30; + pixel_y = -7 + }, +/obj/effect/landmark/start/assistant, /turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/area/crew_quarters/dorms) "auB" = ( /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "holoprivacy"; + name = "Holodeck Shutters" + }, /turf/open/floor/plating, /area/crew_quarters/fitness) "auC" = ( -/obj/machinery/light/small, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "auD" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, @@ -9325,6 +9428,21 @@ }, /turf/open/floor/plasteel, /area/maintenance/department/electrical) +"auN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "auO" = ( /obj/structure/closet/emcloset, /turf/open/floor/plating, @@ -9336,37 +9454,20 @@ /turf/open/floor/plasteel, /area/construction/mining/aux_base) "auR" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) +/turf/closed/wall, +/area/crew_quarters/fitness) "auS" = ( -/obj/machinery/requests_console{ - department = "Crew Quarters"; - pixel_y = 30 - }, /obj/machinery/camera{ - c_tag = "Dormitory North" + c_tag = "Holodeck" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/airalarm{ + pixel_y = 24 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 }, /turf/open/floor/plasteel, -/area/crew_quarters/dorms) +/area/crew_quarters/fitness) "auT" = ( /obj/structure/cable{ icon_state = "4-8" @@ -9374,36 +9475,20 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "auU" = ( -/obj/machinery/firealarm{ - dir = 2; - pixel_y = 24 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) +/obj/machinery/atmospherics/components/binary/valve, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "auV" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall, /area/maintenance/port/fore) "auW" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "auX" = ( @@ -9472,13 +9557,7 @@ /turf/open/floor/plating, /area/maintenance/fore) "avg" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "avh" = ( @@ -9487,18 +9566,18 @@ }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/power/apc{ + areastring = "/area/security/vacantoffice/b"; dir = 8; name = "Vacant Office B APC"; - areastring = "/area/security/vacantoffice/b"; pixel_x = -24 }, /turf/open/floor/plating, /area/maintenance/fore) "avi" = ( /obj/machinery/power/apc{ + areastring = "/area/lawoffice"; dir = 1; name = "Law Office APC"; - areastring = "/area/lawoffice"; pixel_y = 24 }, /obj/structure/cable{ @@ -9530,43 +9609,17 @@ /turf/open/floor/plasteel, /area/hallway/primary/fore) "avl" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = -5; - pixel_y = 30 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "avm" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "avn" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, +/obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "avo" = ( @@ -9594,8 +9647,7 @@ pixel_y = 24 }, /obj/machinery/camera{ - c_tag = "Detective's Office"; - dir = 2 + c_tag = "Detective's Office" }, /turf/open/floor/plasteel/grimy, /area/security/detectives_office) @@ -9613,68 +9665,63 @@ /turf/open/floor/plating, /area/maintenance/fore) "avt" = ( -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "avu" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral{ +/obj/structure/chair/sofa/left{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"avv" = ( -/obj/structure/chair/stool{ - pixel_y = 8 - }, -/obj/effect/landmark/start/assistant, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"avw" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) +"avv" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/meter, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"avw" = ( +/obj/machinery/button/door{ + id = "Room One"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_x = -25; + specialfunctions = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) "avx" = ( -/obj/effect/spawner/structure/window, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"avy" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "holoprivacy"; + name = "Holodeck Shutters" + }, /turf/open/floor/plating, /area/crew_quarters/fitness) -"avy" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) "avz" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/computer/holodeck{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/crew_quarters/fitness) "avA" = ( -/obj/structure/window/reinforced{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" }, -/turf/open/floor/plasteel/dark, +/obj/structure/chair/sofa/right{ + dir = 1 + }, +/turf/open/floor/plasteel, /area/crew_quarters/fitness) "avB" = ( /obj/effect/spawner/structure/window/reinforced, @@ -9684,17 +9731,20 @@ /turf/open/floor/plating, /area/ai_monitored/security/armory) "avC" = ( -/obj/structure/chair{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "avD" = ( -/obj/machinery/computer/holodeck{ - dir = 4 +/obj/structure/cable{ + icon_state = "2-4" }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "avE" = ( /obj/machinery/door/poddoor/preopen{ id = "maint3" @@ -9743,9 +9793,9 @@ /area/maintenance/department/electrical) "avL" = ( /obj/machinery/power/apc{ + areastring = "/area/maintenance/department/electrical"; dir = 1; name = "Electrical Maintenance APC"; - areastring = "/area/maintenance/department/electrical"; pixel_y = 24 }, /obj/structure/cable{ @@ -9774,8 +9824,6 @@ }, /obj/item/multitool, /obj/item/radio/intercom{ - freerange = 0; - frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29 }, @@ -9807,11 +9855,17 @@ /turf/open/floor/plasteel, /area/construction/mining/aux_base) "avR" = ( -/obj/structure/table/wood, -/obj/item/storage/firstaid/regular, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) +/obj/structure/table/wood/poker, +/obj/item/clothing/mask/cigarette/cigar{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4; + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) "avS" = ( /obj/item/wrench, /turf/open/floor/plating, @@ -9889,9 +9943,9 @@ /area/maintenance/fore) "awd" = ( /obj/machinery/power/apc{ + areastring = "/area/maintenance/fore"; dir = 1; name = "Fore Maintenance APC"; - areastring = "/area/maintenance/fore"; pixel_y = 24 }, /obj/structure/cable{ @@ -10024,60 +10078,73 @@ /turf/open/floor/plating, /area/maintenance/fore/secondary) "awo" = ( -/obj/machinery/door/airlock{ - id_tag = "Dorm3"; - name = "Dorm 3" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/structure/chair/comfy/black{ dir = 4 }, -/turf/open/floor/plasteel, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = -29 + }, +/turf/open/floor/carpet, /area/crew_quarters/dorms) "awp" = ( -/obj/structure/table/wood, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/item/storage/pill_bottle/dice, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "awq" = ( -/obj/structure/chair/stool{ - pixel_y = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, -/area/crew_quarters/dorms) +/area/crew_quarters/fitness) "awr" = ( /turf/open/floor/plasteel, /area/crew_quarters/dorms) "aws" = ( -/obj/structure/table/wood, -/obj/item/coin/silver, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Door" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness) +"awt" = ( +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"awt" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 + dir = 4 }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "awu" = ( -/obj/structure/chair/stool{ - pixel_y = 8 - }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/closet/wardrobe/mixed, +/obj/item/clothing/under/kilt, +/obj/item/clothing/under/kilt, +/obj/item/clothing/under/skirt/purple, +/obj/item/clothing/head/beret, +/obj/item/clothing/head/beret, +/obj/item/clothing/head/beret, /turf/open/floor/plasteel, -/area/crew_quarters/dorms) +/area/crew_quarters/fitness) "awv" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/structure/sign/warning/fire{ + desc = "A sign that states the labeled room's number."; + dir = 8; + icon_state = "roomnum"; + name = "Room Number 4"; + pixel_y = 24 + }, +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "aww" = ( @@ -10094,48 +10161,62 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "awy" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) "awz" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ - name = "Fitness" + name = "Holodeck Door" }, -/turf/open/floor/plasteel, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, /area/crew_quarters/fitness) "awA" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/door/airlock{ + id_tag = "Dorm5"; + name = "Room Four" }, -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) "awB" = ( -/obj/effect/landmark/start/assistant, -/obj/machinery/vr_sleeper, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/wood, +/area/crew_quarters/bar) "awC" = ( -/obj/structure/table, -/obj/item/paper/fluff/holodeck/disclaimer, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/wood, +/area/crew_quarters/bar) "awD" = ( /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/starboard/fore) "awE" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3; + pixel_y = 20 + }, +/obj/item/reagent_containers/food/condiment/peppermill{ + dir = 1; + pixel_x = 3; + pixel_y = 20 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/item/reagent_containers/food/drinks/britcup, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "awF" = ( /obj/structure/closet/crate, /obj/effect/spawner/lootdrop/maintenance{ @@ -10176,26 +10257,34 @@ /area/maintenance/starboard/fore) "awK" = ( /obj/structure/table/glass, -/obj/item/pen, +/obj/item/coin/silver, /turf/open/floor/plating, /area/maintenance/starboard/fore) "awL" = ( -/obj/structure/table/glass, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 +/obj/structure/table, +/obj/item/instrument/guitar{ + pixel_x = -7 }, +/obj/item/instrument/eguitar{ + pixel_x = 5 + }, +/obj/item/instrument/violin, +/obj/item/instrument/trombone, +/obj/item/instrument/saxophone, +/obj/item/instrument/piano_synth, +/obj/item/instrument/recorder, +/obj/item/instrument/accordion, /turf/open/floor/plating, /area/maintenance/starboard/fore) "awM" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 +/obj/machinery/button/door{ + id = "maintdiy"; + name = "Shutters Control Button"; + pixel_x = -6; + pixel_y = 24 }, /turf/open/floor/plating, -/area/maintenance/starboard/fore) +/area/crew_quarters/abandoned_gambling_den) "awN" = ( /obj/structure/cable{ icon_state = "4-8" @@ -10291,6 +10380,14 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/hallway/secondary/entry) +"awX" = ( +/obj/machinery/door/airlock{ + id_tag = "Dorm6"; + name = "Room Five" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) "awY" = ( /obj/machinery/light{ dir = 1 @@ -10354,6 +10451,15 @@ }, /turf/open/floor/plasteel, /area/construction/mining/aux_base) +"axd" = ( +/obj/structure/closet, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 4; + name = "4maintenance loot spawner" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "axe" = ( /obj/machinery/sleeper{ dir = 4 @@ -10555,12 +10661,11 @@ /turf/open/floor/plasteel, /area/hallway/primary/fore) "axC" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/structure/sign/poster/official/enlist{ + pixel_y = 32 }, /turf/open/floor/plasteel, /area/hallway/primary/fore) @@ -10571,12 +10676,16 @@ /turf/closed/wall, /area/maintenance/fore/secondary) "axE" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 8; + name = "8maintenance loot spawner" }, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) "axF" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 @@ -10614,6 +10723,12 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"axJ" = ( +/obj/structure/piano{ + icon_state = "piano" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "axK" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 @@ -10621,128 +10736,189 @@ /turf/closed/wall, /area/maintenance/port/fore) "axL" = ( -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/closet/wardrobe/grey, +/obj/item/clothing/under/assistantformal, +/obj/item/clothing/under/assistantformal, +/obj/machinery/camera{ + c_tag = "Dorms East - Holodeck"; + dir = 4 + }, /turf/open/floor/plasteel, -/area/crew_quarters/dorms) +/area/crew_quarters/fitness) "axM" = ( -/obj/structure/table/wood, -/obj/item/paicard, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "axN" = ( -/obj/structure/table/wood, -/obj/item/storage/crayons, -/turf/open/floor/plasteel, +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/turf/open/floor/carpet, /area/crew_quarters/dorms) "axO" = ( -/obj/structure/chair/stool{ - pixel_y = 8 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel, +/obj/machinery/light/small, +/turf/open/floor/mineral/titanium/blue, /area/crew_quarters/dorms) "axP" = ( -/obj/structure/table/wood, -/obj/item/toy/cards/deck{ - pixel_x = 2 +/obj/structure/cable{ + icon_state = "4-8" }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/table/wood, +/obj/item/paicard, /obj/item/clothing/mask/balaclava{ pixel_x = -8; pixel_y = 8 }, +/obj/item/toy/cards/deck{ + pixel_x = 2 + }, +/obj/item/storage/crayons, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "axQ" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"axR" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Fitness" - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"axS" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ +/obj/machinery/light{ dir = 8 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) -"axT" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"axU" = ( -/obj/structure/window/reinforced, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) -"axV" = ( -/obj/structure/cable{ - icon_state = "2-4" +/obj/structure/sign/warning/fire{ + desc = "A sign that states the labeled room's number."; + dir = 1; + icon_state = "roomnum"; + name = "Room Number 2"; + pixel_x = -30; + pixel_y = -7 }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) -"axW" = ( -/obj/machinery/door/window/eastright{ - base_state = "left"; - icon_state = "left"; - name = "Fitness Ring" +"axR" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/obj/structure/window/reinforced, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) -"axX" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ dir = 1 }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) -"axY" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ +"axS" = ( +/obj/item/flashlight/lamp/green{ + pixel_x = -3; + pixel_y = 22 + }, +/obj/structure/dresser{ + desc = "There's plenty of clothes here to change into! It has a surprising amount of variety, too."; + name = "Dresser"; + pixel_y = 7 + }, +/turf/open/floor/plating, +/area/maintenance/port) +"axT" = ( +/obj/machinery/door/airlock{ + id_tag = "Dorm3"; + name = "Room Two" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"axU" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/structure/sign/warning/fire{ + desc = "A sign that states the labeled room's number."; + dir = 6; + icon_state = "roomnum"; + name = "Room Number 5"; + pixel_y = 24 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, /turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"axZ" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Holodeck Door" +/area/crew_quarters/dorms) +"axV" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"axW" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, /turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"axX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/light/small, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"axY" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/closet/toolcloset, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"axZ" = ( +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, /area/crew_quarters/fitness) "aya" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" }, /turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/area/crew_quarters/dorms) "ayb" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/structure/chair{ + dir = 8 }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) @@ -10818,9 +10994,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "ayn" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "ayo" = ( @@ -10994,14 +11168,6 @@ /turf/closed/wall/r_wall, /area/ai_monitored/storage/eva) "ayM" = ( -/obj/machinery/firealarm{ - dir = 2; - pixel_y = 24 - }, -/obj/item/clothing/head/welding, -/turf/open/floor/plasteel, -/area/ai_monitored/storage/eva) -"ayN" = ( /obj/structure/rack, /obj/machinery/light{ dir = 1 @@ -11011,8 +11177,15 @@ /obj/item/flashlight, /obj/item/flashlight, /obj/item/flashlight, +/obj/item/clothing/glasses/welding, /turf/open/floor/plasteel/dark, /area/ai_monitored/storage/eva) +"ayN" = ( +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) "ayO" = ( /obj/structure/table, /obj/item/storage/toolbox/electrical{ @@ -11026,9 +11199,9 @@ /area/ai_monitored/storage/eva) "ayP" = ( /obj/machinery/power/apc{ + areastring = "/area/ai_monitored/storage/eva"; dir = 1; name = "EVA Storage APC"; - areastring = "/area/ai_monitored/storage/eva"; pixel_y = 24 }, /obj/structure/cable{ @@ -11111,38 +11284,45 @@ /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "ayY" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 +/obj/structure/sign/poster/official/cohiba_robusto_ad, +/turf/closed/wall, +/area/lawoffice) +"ayZ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) -"ayZ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 +/obj/structure/sign/poster/contraband/pwr_game{ + pixel_x = -32 }, -/obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel, /area/hallway/primary/fore) "aza" = ( -/obj/machinery/light, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/vr_sleeper{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/crew_quarters/fitness) "azb" = ( -/obj/structure/chair/stool{ - pixel_y = 8 +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 2 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness) "azc" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 @@ -11156,47 +11336,68 @@ /turf/open/floor/plasteel, /area/crew_quarters/dorms) "azd" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/vr_sleeper{ dir = 8 }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"aze" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"azf" = ( -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"azg" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/plating, -/area/crew_quarters/fitness) -"azh" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/vr_sleeper, /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/green{ dir = 4 }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white/side{ + dir = 8 + }, +/area/crew_quarters/fitness) +"aze" = ( +/obj/machinery/vr_sleeper{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/crew_quarters/fitness) +"azf" = ( +/obj/structure/grille/broken, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/window{ + dir = 4 + }, +/obj/structure/window, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/starboard/fore) +"azg" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/button/door{ + id = "holoprivacy"; + name = "Holodeck Privacy"; + pixel_y = 24 + }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) +"azh" = ( +/obj/machinery/door/airlock{ + name = "Instrument Storage" + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/fore) "azi" = ( /obj/machinery/door/airlock/maintenance{ name = "Garden Maintenance"; @@ -11206,61 +11407,81 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "azj" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/obj/item/radio/intercom{ - name = "Station Intercom (General)"; - pixel_y = -29 +/obj/structure/closet{ + name = "Holodeck Outfits" }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/item/clothing/under/trek/Q, +/obj/item/clothing/under/trek/command/next, +/obj/item/clothing/under/trek/command/next, +/obj/item/clothing/under/trek/command/next, +/obj/item/clothing/under/trek/engsec/next, +/obj/item/clothing/under/trek/engsec/next, +/obj/item/clothing/under/trek/engsec/next, +/obj/item/clothing/under/trek/engsec/next, +/obj/item/clothing/under/trek/medsci/next, +/obj/item/clothing/under/trek/medsci/next, +/obj/item/clothing/under/trek/medsci/next, +/obj/item/clothing/under/mw2_russian_para, +/obj/item/clothing/under/mw2_russian_para, +/obj/item/clothing/under/gladiator, +/obj/item/clothing/under/gladiator, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "azk" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4; + light_color = "#d8b1b1" }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "azl" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"azm" = ( -/obj/structure/chair/stool{ - pixel_y = 8 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 }, /turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"azn" = ( -/obj/structure/table, -/obj/item/storage/firstaid/regular, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"azo" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/area/crew_quarters/dorms) +"azm" = ( +/obj/machinery/shower{ dir = 4 }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet) +"azn" = ( +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"azo" = ( +/obj/machinery/shower{ + dir = 8; + pixel_y = -4 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet) "azp" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "holoprivacy"; + name = "Holodeck Shutters" + }, /turf/open/floor/plating, /area/crew_quarters/fitness) "azq" = ( @@ -11463,6 +11684,27 @@ }, /turf/open/floor/plating, /area/maintenance/fore) +"azP" = ( +/obj/structure/table/wood, +/obj/machinery/requests_console{ + department = "Theatre"; + name = "theatre RC"; + pixel_x = -32 + }, +/obj/item/reagent_containers/food/snacks/baguette, +/obj/item/toy/dummy, +/obj/item/lipstick/random{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/lipstick/random{ + pixel_x = -2; + pixel_y = -2 + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/crew_quarters/theatre) "azQ" = ( /obj/structure/cable{ icon_state = "4-8" @@ -11501,12 +11743,9 @@ /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "azT" = ( -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 2 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) +/obj/effect/landmark/event_spawn, +/turf/closed/wall, +/area/crew_quarters/fitness) "azU" = ( /obj/structure/cable{ icon_state = "4-8" @@ -11520,27 +11759,38 @@ /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "azV" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/obj/machinery/vr_sleeper{ dir = 8 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white/side{ dir = 8 }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) +/area/crew_quarters/fitness) "azW" = ( /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "azX" = ( -/obj/machinery/door/airlock{ - name = "Unisex Showers" +/obj/machinery/vr_sleeper{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "1-2" +/obj/effect/turf_decal/tile/green{ + dir = 8 }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 4 + }, +/area/crew_quarters/fitness) "azY" = ( /obj/structure/table, /obj/item/radio/off, @@ -11560,27 +11810,26 @@ /turf/open/floor/plasteel, /area/hallway/primary/fore) "aAb" = ( -/obj/machinery/door/airlock{ - id_tag = "Dorm2"; - name = "Dorm 2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, -/area/crew_quarters/dorms) +/area/crew_quarters/fitness) "aAc" = ( /obj/effect/spawner/structure/window, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/starboard/fore) "aAd" = ( -/obj/machinery/light_switch{ - pixel_y = -25 +/obj/machinery/camera{ + c_tag = "Dorms West" }, -/obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ - dir = 8 + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) @@ -11592,46 +11841,51 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "aAf" = ( -/obj/structure/closet/wardrobe/pjs, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/vr_sleeper{ dir = 8 }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/crew_quarters/fitness) "aAg" = ( -/obj/item/radio/intercom{ - name = "Station Intercom (General)"; - pixel_y = -29 +/obj/machinery/vr_sleeper{ + dir = 4 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ dir = 8 }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 4 + }, +/area/crew_quarters/fitness) "aAh" = ( /turf/closed/wall, /area/crew_quarters/toilet) "aAi" = ( -/obj/structure/closet/wardrobe/pjs, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) +/turf/open/floor/plating, +/area/crew_quarters/fitness) "aAj" = ( /obj/structure/cable{ icon_state = "1-4" }, /obj/machinery/power/apc{ - dir = 2; - name = "Security Checkpoint APC"; areastring = "/area/security/checkpoint/auxiliary"; + name = "Security Checkpoint APC"; pixel_x = 1; pixel_y = -24 }, @@ -11640,119 +11894,77 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "aAk" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, +/obj/structure/closet/athletic_mixed, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "aAl" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/obj/structure/reagent_dispensers/water_cooler, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, +/obj/structure/closet/boxinggloves, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "aAm" = ( -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Door" }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/dark, /area/crew_quarters/fitness) "aAn" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ +/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, -/obj/machinery/light_switch{ - pixel_y = -25 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/area/crew_quarters/dorms) "aAo" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) "aAp" = ( -/obj/structure/cable{ - icon_state = "2-8" +/obj/structure/closet{ + name = "Suit Closet" }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/item/clothing/under/suit_jacket/white, +/obj/item/clothing/under/suit_jacket/tan, +/obj/item/clothing/under/suit_jacket/red, +/obj/item/clothing/under/suit_jacket/really_black, +/obj/item/clothing/under/suit_jacket/navy, +/obj/item/clothing/under/suit_jacket/green, +/obj/item/clothing/under/suit_jacket/female, +/obj/item/clothing/under/suit_jacket/checkered, +/obj/item/clothing/under/suit_jacket/charcoal, +/obj/item/clothing/under/suit_jacket/burgundy, +/obj/item/clothing/under/suit_jacket, +/obj/item/clothing/under/lawyer/black, +/obj/item/clothing/under/lawyer/blacksuit, +/obj/item/clothing/under/lawyer/blue, +/obj/item/clothing/under/lawyer/bluesuit, +/obj/item/clothing/under/lawyer/female, +/obj/item/clothing/under/lawyer/purpsuit, +/obj/item/clothing/under/lawyer/really_black, +/obj/item/clothing/under/lawyer/red, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"aAq" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"aAr" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"aAs" = ( +/obj/machinery/light/small{ + dir = 4; + light_color = "#d8b1b1" }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) -"aAr" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/cobweb, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"aAs" = ( -/obj/structure/closet, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "aAt" = ( /obj/machinery/door/poddoor/preopen{ id = "maint2" @@ -11760,12 +11972,12 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "aAu" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, /obj/machinery/door/poddoor/preopen{ id = "maint2" }, -/obj/structure/cable{ - icon_state = "1-2" - }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "aAv" = ( @@ -11777,9 +11989,9 @@ /area/maintenance/starboard/fore) "aAw" = ( /obj/machinery/power/apc{ + areastring = "/area/hydroponics/garden"; dir = 4; name = "Garden APC"; - areastring = "/area/hydroponics/garden"; pixel_x = 27; pixel_y = 2 }, @@ -11793,9 +12005,7 @@ /turf/open/floor/plasteel, /area/hydroponics/garden) "aAy" = ( -/obj/machinery/power/smes{ - charge = 0 - }, +/obj/machinery/power/smes, /obj/structure/cable{ icon_state = "0-4" }, @@ -11822,9 +12032,7 @@ /turf/closed/wall, /area/maintenance/department/electrical) "aAB" = ( -/obj/machinery/power/smes{ - charge = 0 - }, +/obj/machinery/power/smes, /obj/structure/cable{ icon_state = "0-8" }, @@ -11897,9 +12105,8 @@ /area/hydroponics/garden) "aAL" = ( /obj/machinery/power/apc{ - dir = 2; - name = "Primary Tool Storage APC"; areastring = "/area/storage/primary"; + name = "Primary Tool Storage APC"; pixel_x = 1; pixel_y = -24 }, @@ -11911,6 +12118,16 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) +"aAM" = ( +/obj/structure/mirror{ + pixel_y = 32 + }, +/obj/structure/sink{ + dir = 1; + pixel_y = 25 + }, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet) "aAN" = ( /obj/structure/cable{ icon_state = "2-8" @@ -11986,18 +12203,11 @@ /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "aAX" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, /turf/open/floor/plasteel, -/area/crew_quarters/dorms) +/area/crew_quarters/fitness) "aAY" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -12005,10 +12215,10 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "aAZ" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/urinal{ + pixel_y = 32 }, -/turf/open/floor/plasteel/freezer, +/turf/open/floor/mineral/titanium/blue, /area/crew_quarters/toilet) "aBa" = ( /turf/closed/wall/r_wall, @@ -12081,9 +12291,9 @@ /area/maintenance/fore) "aBi" = ( /obj/machinery/power/apc{ + areastring = "/area/gateway"; dir = 8; name = "Gateway APC"; - areastring = "/area/gateway"; pixel_x = -24; pixel_y = -1 }, @@ -12123,7 +12333,6 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "aBm" = ( -/obj/effect/landmark/start/assistant, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, @@ -12213,26 +12422,41 @@ /turf/open/floor/plasteel, /area/hydroponics/garden) "aBx" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/closed/wall, -/area/crew_quarters/toilet) +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel, +/area/hydroponics) "aBy" = ( -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) -"aBz" = ( -/obj/machinery/shower{ +/obj/machinery/camera{ + c_tag = "Library North" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) -"aBA" = ( -/obj/machinery/shower{ - dir = 8 +/obj/structure/chair/sofa/right, +/obj/machinery/light{ + dir = 1; + light_color = "#c1caff" }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) +/turf/open/floor/wood, +/area/library) +"aBz" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/landmark/start/assistant, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/chair/sofa/left, +/turf/open/floor/wood, +/area/library) +"aBA" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/wood, +/area/library) "aBB" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall, @@ -12248,6 +12472,12 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"aBD" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/turf/open/floor/wood, +/area/library) "aBE" = ( /obj/item/clothing/under/rank/mailman, /obj/item/clothing/head/mailman, @@ -12297,9 +12527,12 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "aBM" = ( -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel, -/area/hydroponics/garden) +/obj/structure/sign/poster/official/nanomichi_ad{ + pixel_y = 32 + }, +/obj/machinery/vending/snack/random, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) "aBN" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, @@ -12356,9 +12589,9 @@ /area/ai_monitored/nuke_storage) "aBU" = ( /obj/machinery/power/apc{ + areastring = "/area/ai_monitored/nuke_storage"; dir = 1; name = "Vault APC"; - areastring = "/area/ai_monitored/nuke_storage"; pixel_y = 25 }, /obj/structure/cable{ @@ -12480,21 +12713,27 @@ /turf/open/floor/carpet, /area/crew_quarters/cryopod) "aCe" = ( -/obj/effect/landmark/xeno_spawn, -/obj/item/bikehorn/rubberducky, -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) +/obj/effect/turf_decal/tile/blue, +/obj/structure/sign/poster/official/do_not_question{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) "aCf" = ( -/obj/machinery/camera{ - c_tag = "Theatre Storage" +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 }, -/turf/open/floor/plasteel/white/side{ - dir = 4 +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, -/area/crew_quarters/theatre) +/obj/structure/sign/poster/official/obey{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) "aCg" = ( /obj/structure/cable{ icon_state = "4-8" @@ -12502,11 +12741,14 @@ /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "aCh" = ( -/obj/machinery/vending/autodrobe, -/turf/open/floor/plasteel/white/side{ - dir = 4 +/obj/machinery/shower{ + dir = 8; + pixel_y = -4 }, -/area/crew_quarters/theatre) +/obj/effect/landmark/xeno_spawn, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet) "aCi" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -12533,32 +12775,48 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "aCm" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = -12; - pixel_y = 2 +/obj/item/radio/intercom{ + pixel_y = 25 }, -/obj/structure/mirror{ - pixel_x = -28 +/obj/machinery/camera{ + c_tag = "Theatre Stage" }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) -"aCn" = ( -/obj/structure/urinal{ - pixel_y = 32 - }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) -"aCo" = ( -/obj/structure/chair/stool{ - pixel_y = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/structure/chair/comfy/brown{ dir = 4 }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"aCn" = ( +/obj/structure/table/wood/fancy, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3; + pixel_y = 20 + }, +/obj/item/reagent_containers/food/condiment/peppermill{ + dir = 1; + pixel_x = 3; + pixel_y = 20 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"aCo" = ( +/obj/structure/closet{ + name = "Costume Closet" + }, +/obj/item/clothing/head/russobluecamohat, +/obj/item/clothing/head/russobluecamohat, +/obj/item/clothing/head/russofurhat, +/obj/item/clothing/head/russofurhat, +/obj/item/clothing/head/russofurhat, +/obj/item/clothing/head/russofurhat, +/obj/item/clothing/under/mw2_russian_para, +/obj/item/clothing/under/mw2_russian_para, +/obj/item/clothing/under/mw2_russian_para, +/obj/item/clothing/under/mw2_russian_para, +/obj/item/clothing/shoes/jackboots, +/obj/item/clothing/shoes/jackboots, +/obj/item/clothing/shoes/jackboots, +/obj/item/clothing/shoes/jackboots, /turf/open/floor/plating, /area/maintenance/starboard/fore) "aCp" = ( @@ -12575,19 +12833,11 @@ /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) "aCq" = ( -/obj/structure/table/wood, -/obj/machinery/requests_console{ - department = "Theatre"; - departmentType = 0; - name = "theatre RC"; - pixel_x = -32 - }, -/obj/item/reagent_containers/food/snacks/baguette, -/obj/item/toy/dummy, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/crew_quarters/theatre) +/obj/structure/closet/lasertag/red, +/obj/item/clothing/under/pj/red, +/obj/item/clothing/under/pj/red, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) "aCr" = ( /turf/closed/wall, /area/crew_quarters/theatre) @@ -12611,30 +12861,53 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "aCu" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "holoprivacy"; + name = "Holodeck Shutters" + }, /turf/open/floor/plating, /area/crew_quarters/fitness) "aCv" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 + dir = 5 }, /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "holoprivacy"; + name = "Holodeck Shutters" + }, /turf/open/floor/plating, /area/crew_quarters/fitness) "aCw" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 + dir = 4 }, /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "holoprivacy"; + name = "Holodeck Shutters" + }, /turf/open/floor/plating, /area/crew_quarters/fitness) +"aCx" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/wood, +/area/crew_quarters/bar) "aCy" = ( -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) "aCz" = ( /obj/structure/window/reinforced{ dir = 8 @@ -12645,18 +12918,11 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "aCA" = ( -/obj/structure/grille/broken, -/obj/structure/cable{ - icon_state = "1-8" +/obj/structure/chair/comfy/brown{ + dir = 1 }, -/obj/structure/window{ - dir = 4 - }, -/obj/structure/window, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/starboard/fore) +/turf/open/floor/wood, +/area/library) "aCB" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 @@ -12786,6 +13052,13 @@ "aCR" = ( /turf/closed/wall, /area/chapel/main) +"aCS" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/turf/open/floor/wood, +/area/library) "aCT" = ( /obj/structure/table, /obj/item/stack/sheet/metal/fifty, @@ -12797,6 +13070,23 @@ }, /turf/open/floor/plasteel, /area/construction/mining/aux_base) +"aCU" = ( +/obj/machinery/photocopier{ + pixel_x = -5; + pixel_y = -5 + }, +/turf/open/floor/wood, +/area/library) +"aCV" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/sign/poster/official/obey{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) "aCW" = ( /obj/structure/reagent_dispensers/watertank, /obj/effect/spawner/lootdrop/maintenance, @@ -12843,7 +13133,6 @@ pixel_y = 5 }, /obj/machinery/firealarm{ - dir = 2; pixel_y = 24 }, /turf/open/floor/plasteel, @@ -12854,7 +13143,6 @@ dir = 1 }, /obj/item/radio/intercom{ - broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 20 }, @@ -12897,9 +13185,14 @@ /turf/open/floor/plasteel, /area/hydroponics/garden) "aDh" = ( -/obj/machinery/vending/assist, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/sign/poster/official/space_cops{ + pixel_x = -32 + }, /turf/open/floor/plasteel, -/area/storage/primary) +/area/hallway/primary/fore) "aDi" = ( /obj/structure/window/reinforced, /turf/open/floor/plasteel/dark, @@ -12924,7 +13217,6 @@ }, /obj/machinery/requests_console{ department = "Tool Storage"; - departmentType = 0; pixel_y = 30 }, /turf/open/floor/plasteel, @@ -12951,7 +13243,6 @@ /obj/item/assembly/signaler, /obj/item/assembly/signaler, /obj/item/radio/intercom{ - broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 20 }, @@ -13008,6 +13299,10 @@ }, /turf/open/floor/circuit, /area/ai_monitored/nuke_storage) +"aDu" = ( +/obj/structure/chair/comfy/brown, +/turf/open/floor/wood, +/area/crew_quarters/bar) "aDv" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -13070,9 +13365,7 @@ /area/ai_monitored/storage/eva) "aDB" = ( /obj/machinery/suit_storage_unit/standard_unit, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "aDC" = ( @@ -13096,9 +13389,7 @@ c_tag = "EVA Storage"; dir = 1 }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "aDF" = ( @@ -13109,38 +13400,33 @@ /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "aDG" = ( -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 +/obj/machinery/door/poddoor/shutters/preopen{ + desc = "Privacy shutters for the Private Study. Stops people spying in on your game."; + id = "PrivateStudy1"; + name = "Private Study Privacy Shutters" }, -/obj/machinery/camera{ - c_tag = "Dormitory South"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) +/obj/effect/spawner/structure/window, +/turf/open/floor/wood, +/area/library) "aDH" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/pen, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/item/folder/white, -/obj/item/stamp/rd{ - pixel_x = 3; - pixel_y = -2 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/hor) +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green, +/obj/item/pen/fountain/captain, +/turf/open/floor/carpet, +/area/crew_quarters/heads/captain) "aDI" = ( /obj/structure/sign/warning/electricshock, /turf/closed/wall/r_wall, /area/ai_monitored/storage/eva) +"aDJ" = ( +/obj/machinery/door/airlock{ + desc = "Private study room where nerds are probably playing Dungeons and Dragons 13e, or a place for blood cult rituals."; + id_tag = "PrivateStudy"; + name = "Private Study" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/wood, +/area/library) "aDK" = ( /obj/machinery/door/airlock/public/glass{ name = "Cryogenics " @@ -13153,126 +13439,147 @@ /turf/open/floor/plasteel, /area/crew_quarters/cryopod) "aDL" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = -12; - pixel_y = 2 - }, -/obj/structure/sink{ - dir = 8; - pixel_x = -12; - pixel_y = 2 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) -"aDM" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) -"aDN" = ( -/obj/machinery/light/small, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) -"aDO" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/machinery/airalarm{ - pixel_y = 23 - }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) -"aDP" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) -"aDQ" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) -"aDR" = ( -/obj/structure/table/wood, -/obj/structure/mirror{ - pixel_x = -28 - }, -/obj/item/lipstick/random{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/lipstick/random{ - pixel_x = -2; - pixel_y = -2 - }, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/crew_quarters/theatre) -"aDS" = ( /obj/machinery/door/airlock{ - name = "Unisex Showers" + desc = "Private study room where nerds are probably playing Dungeons and Dragons 13e, or a place for blood cult rituals."; + id_tag = "PrivateStudy"; + name = "Private Study" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/library) +"aDM" = ( +/obj/structure/chair/sofa/right, +/obj/structure/window{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"aDN" = ( +/obj/structure/chair/sofa, +/obj/structure/window{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"aDO" = ( +/obj/structure/chair/sofa/left, +/obj/structure/window{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"aDP" = ( +/obj/structure/chair/comfy/brown{ dir = 4 }, -/obj/structure/cable{ - icon_state = "4-8" +/turf/open/floor/wood, +/area/crew_quarters/bar) +"aDQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) +/turf/open/floor/wood, +/area/crew_quarters/bar) +"aDR" = ( +/obj/structure/closet/lasertag/blue, +/obj/item/clothing/under/pj/blue, +/obj/item/clothing/under/pj/blue, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"aDS" = ( +/obj/machinery/light/small{ + dir = 4; + light_color = "#d8b1b1" + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) "aDT" = ( -/obj/machinery/light/small, -/obj/structure/cable{ - icon_state = "1-8" +/obj/structure/table/wood/fancy, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4; + pixel_y = 5 }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) +/obj/item/reagent_containers/food/snacks/burger/plain, +/turf/open/floor/wood, +/area/crew_quarters/bar) "aDU" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 +/obj/structure/table, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3; + pixel_y = 9 }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/item/reagent_containers/food/condiment/peppermill{ + dir = 1; + pixel_x = 3; + pixel_y = 9 }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) +/turf/open/floor/wood, +/area/crew_quarters/bar) "aDV" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/machinery/meter, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +/obj/structure/table/wood/fancy, +/obj/machinery/light, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3; + pixel_y = 20 + }, +/obj/item/reagent_containers/food/condiment/peppermill{ + dir = 1; + pixel_x = 3; + pixel_y = 20 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4; + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) "aDW" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/machinery/holopad, +/obj/machinery/camera{ + c_tag = "Dorms Central" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -5; + pixel_y = 30 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "aDX" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +/obj/structure/chair/sofa{ + dir = 1 + }, +/obj/structure/window, +/turf/open/floor/wood, +/area/crew_quarters/bar) "aDY" = ( -/obj/structure/chair/stool, -/obj/effect/landmark/start/mime, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/open/floor/plasteel/white/side{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/sink{ + dir = 4; + pixel_x = 11 }, -/area/crew_quarters/theatre) +/obj/structure/mirror{ + pixel_x = 25 + }, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet) "aDZ" = ( /obj/structure/cable{ icon_state = "4-8" @@ -13301,29 +13608,17 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "aEb" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Theatre Maintenance"; - req_access_txt = "46" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/structure/closet/secure_closet/personal/cabinet{ + desc = "Swipe your ID on the closet to claim it. First come first serve, this one is wooden and fancy. Store your stuff here."; + name = "Personal ID-Locked Closet"; + pixel_y = 15 }, /turf/open/floor/plating, -/area/maintenance/starboard/fore) +/area/maintenance/port) "aEc" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/crew_quarters/theatre) +/obj/structure/chair/wood/wings, +/turf/open/floor/plating, +/area/maintenance/port) "aEd" = ( /obj/structure/cable{ icon_state = "4-8" @@ -13357,9 +13652,8 @@ dir = 4 }, /obj/machinery/power/apc{ - dir = 2; - name = "Chapel APC"; areastring = "/area/chapel/main"; + name = "Chapel APC"; pixel_y = -24 }, /obj/structure/cable{ @@ -13421,11 +13715,121 @@ /obj/structure/fans/tiny, /turf/open/floor/plating, /area/chapel/main) +"aEo" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"aEp" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes/sparsegrass, +/obj/structure/flora/ausbushes/ppflowers, +/obj/structure/flora/ausbushes/ywflowers, +/obj/structure/flora/ausbushes/brflowers, +/obj/effect/spawner/structure/window, +/turf/open/floor/grass, +/area/crew_quarters/bar) +"aEq" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"aEr" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/machinery/light{ + dir = 1; + light_color = "#cee5d2" + }, +/obj/structure/table, +/obj/structure/bedsheetbin/color, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"aEs" = ( +/obj/machinery/vending/cola/red, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"aEt" = ( +/obj/machinery/computer/arcade/minesweeper, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"aEu" = ( +/obj/machinery/computer/arcade/battle, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"aEv" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/closet/wardrobe/pjs, +/obj/item/clothing/under/maid, +/obj/item/clothing/under/maid, +/obj/item/clothing/under/janimaid, +/obj/item/clothing/under/janimaid, +/obj/item/clothing/accessory/maidapron, +/obj/item/clothing/accessory/maidapron, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"aEw" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"aEx" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/head/that, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"aEy" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -9; + pixel_y = 9 + }, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3; + pixel_y = 9 + }, +/obj/item/reagent_containers/food/condiment/peppermill{ + dir = 1; + pixel_x = -3 + }, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = -9 + }, +/obj/item/sharpener{ + pixel_x = 10 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) "aEz" = ( /obj/machinery/power/apc{ + areastring = "/area/hallway/secondary/entry"; dir = 4; name = "Entry Hall APC"; - areastring = "/area/hallway/secondary/entry"; pixel_x = 24 }, /obj/structure/cable, @@ -13682,97 +14086,68 @@ /turf/closed/wall/r_wall, /area/ai_monitored/storage/eva) "aFd" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/structure/table/wood, +/obj/item/instrument/guitar{ + pixel_x = -7 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 +/obj/item/instrument/eguitar{ + pixel_x = 5 }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) +/obj/item/instrument/violin, +/turf/open/floor/wood, +/area/crew_quarters/bar) "aFe" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 +/obj/machinery/door/airlock{ + id_tag = "Dorm2"; + name = "Room One" }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"aFf" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) -"aFg" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/closed/wall, -/area/crew_quarters/toilet) -"aFh" = ( -/obj/machinery/door/airlock{ - name = "Unisex Restrooms" +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"aFf" = ( +/obj/structure/piano{ + icon_state = "piano" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) -"aFi" = ( -/obj/machinery/power/apc{ - dir = 4; - name = "Dormitory Bathrooms APC"; - areastring = "/area/crew_quarters/toilet"; - pixel_x = 26 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) -"aFj" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/blue{ +/turf/open/floor/wood, +/area/crew_quarters/bar) +"aFg" = ( +/obj/structure/chair/comfy/black{ dir = 8 }, -/turf/open/floor/plasteel, -/area/crew_quarters/theatre) +/turf/open/floor/wood, +/area/crew_quarters/bar) +"aFh" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"aFi" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"aFj" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/britcup, +/turf/open/floor/wood, +/area/crew_quarters/bar) "aFk" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ dir = 1 }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, -/area/crew_quarters/theatre) +/area/crew_quarters/bar) "aFl" = ( /obj/machinery/light/small{ dir = 8 @@ -13805,12 +14180,17 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "aFp" = ( -/obj/effect/spawner/lootdrop/maintenance, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/door/window/southright{ + name = "Bar Door"; + req_one_access_txt = "25;28" }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) "aFq" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -13843,6 +14223,20 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"aFt" = ( +/obj/structure/table/reinforced, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_x = 32 + }, +/obj/item/book/manual/wiki/barman_recipes, +/obj/item/reagent_containers/rag, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) "aFu" = ( /turf/closed/wall, /area/library) @@ -13868,15 +14262,14 @@ /area/maintenance/starboard/fore) "aFy" = ( /obj/machinery/power/apc{ - dir = 2; - name = "Chapel Office APC"; areastring = "/area/chapel/office"; + name = "Chapel Office APC"; pixel_y = -24 }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, -/area/chapel/office) +/area/maintenance/starboard/fore) "aFz" = ( /turf/open/floor/plasteel/dark, /area/chapel/main) @@ -13896,6 +14289,36 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/dark, /area/chapel/main) +"aFC" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/snacks/bluecherrycupcake{ + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"aFD" = ( +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"aFE" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 23 + }, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet) +"aFF" = ( +/obj/structure/chair/sofa{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) "aFG" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -14041,7 +14464,9 @@ /turf/open/floor/plasteel, /area/storage/primary) "aFS" = ( -/obj/effect/landmark/start/assistant, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, /turf/open/floor/plasteel, /area/storage/primary) "aFT" = ( @@ -14051,9 +14476,8 @@ /turf/open/floor/plasteel, /area/storage/primary) "aFU" = ( -/obj/effect/landmark/start/assistant, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 +/obj/structure/chair/stool{ + pixel_y = 8 }, /turf/open/floor/plasteel, /area/storage/primary) @@ -14072,8 +14496,6 @@ /area/gateway) "aFX" = ( /obj/item/radio/intercom{ - freerange = 0; - frequency = 1459; name = "Station Intercom (General)"; pixel_x = -30 }, @@ -14188,39 +14610,48 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/storage/eva) "aGk" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = -12; - pixel_y = 2 +/obj/effect/turf_decal/stripes/line{ + dir = 9 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) +/turf/open/floor/plating, +/area/space/nearstation) "aGl" = ( -/obj/machinery/light_switch{ - pixel_x = 27 +/obj/structure/closet/crate, +/obj/item/book/manual/wiki/telescience, +/obj/item/book/manual/wiki/engineering_guide, +/obj/item/book/manual/wiki/engineering_construction, +/obj/item/book/manual/wiki/atmospherics, +/obj/item/book/manual/wiki/detective, +/obj/item/book/manual/wiki/tcomms, +/obj/item/book/manual/wiki/engineering_singulo_tesla, +/obj/item/book/manual/wiki/experimentor, +/obj/item/book/manual/wiki/research_and_development, +/obj/item/book/manual/wiki/robotics_cyborgs, +/obj/item/book/manual/wiki/security_space_law, +/obj/item/book/manual/wiki/medicine, +/obj/item/book/manual/wiki/medical_cloning, +/obj/item/book/manual/wiki/infections, +/obj/item/book/manual/ripley_build_and_repair, +/obj/item/book/manual/hydroponics_pod_people, +/obj/item/book/manual/wiki/toxins, +/obj/item/book/manual/wiki/grenades, +/obj/item/book{ + desc = "An undeniably handy book."; + icon_state = "bookknock"; + name = "A Simpleton's Guide to Safe-cracking with Stethoscopes" }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) +/turf/open/floor/wood, +/area/library) "aGm" = ( -/obj/structure/toilet{ - pixel_y = 8 - }, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/hydroponics) "aGn" = ( -/obj/structure/toilet{ - pixel_y = 8 +/obj/effect/turf_decal/stripes/corner{ + dir = 1 }, -/obj/machinery/light/small{ - dir = 8 - }, -/obj/effect/landmark/blobstart, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) +/turf/open/floor/plasteel, +/area/hydroponics) "aGo" = ( /obj/structure/table, /obj/item/stack/sheet/rglass{ @@ -14240,12 +14671,11 @@ /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "aGp" = ( -/obj/machinery/light/small{ - dir = 8 +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/obj/machinery/recharge_station, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) +/turf/open/floor/plasteel, +/area/hydroponics) "aGq" = ( /obj/item/stack/sheet/plasteel{ amount = 10 @@ -14297,28 +14727,13 @@ /turf/closed/wall, /area/crew_quarters/theatre) "aGw" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/closet/secure_closet/freezer/cream_pie, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/theatre) +/obj/machinery/seed_extractor, +/turf/open/floor/plasteel/dark, +/area/hydroponics) "aGx" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/crew_quarters/toilet) +/obj/machinery/biogenerator, +/turf/open/floor/plasteel/dark, +/area/hydroponics) "aGy" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -14476,6 +14891,12 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"aGK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hydroponics) "aGL" = ( /obj/structure/cable{ icon_state = "4-8" @@ -14517,15 +14938,9 @@ /turf/closed/wall, /area/chapel/office) "aGP" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +/obj/machinery/vending/hydronutrients, +/turf/open/floor/plasteel/dark, +/area/hydroponics) "aGQ" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -14538,6 +14953,12 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"aGR" = ( +/obj/machinery/vending/hydroseeds{ + slogan_delay = 700 + }, +/turf/open/floor/plasteel/dark, +/area/hydroponics) "aGS" = ( /obj/structure/cable{ icon_state = "2-8" @@ -14629,17 +15050,33 @@ /area/hallway/secondary/entry) "aHb" = ( /obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 +/obj/item/paper_bin/bundlenatural{ + pixel_x = 6; + pixel_y = 4 }, -/obj/item/stack/packageWrap, -/turf/open/floor/wood, -/area/library) +/obj/item/paper_bin{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/pen/fountain, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/item/pen/fourcolor, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "aHc" = ( -/obj/machinery/vending/games, -/turf/open/floor/wood, -/area/library) +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/landmark/start/botanist, +/turf/open/floor/plasteel, +/area/hydroponics) "aHd" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, @@ -14665,8 +15102,7 @@ pixel_y = 28 }, /obj/machinery/camera{ - c_tag = "Chapel Office"; - dir = 2 + c_tag = "Chapel Office" }, /turf/open/floor/plasteel/grimy, /area/chapel/office) @@ -14747,6 +15183,34 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/chapel/main) +"aHr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"aHs" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"aHt" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1; + light_color = "#cee5d2" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "aHu" = ( /obj/machinery/status_display{ pixel_x = 32 @@ -14825,12 +15289,12 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/storage/eva) "aHD" = ( -/obj/structure/chair/stool{ - pixel_y = 8 +/obj/structure/chair/comfy/beige{ + dir = 8 }, /obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel, -/area/storage/primary) +/turf/open/floor/plasteel/grimy, +/area/hallway/secondary/entry) "aHE" = ( /obj/structure/table, /obj/item/weldingtool, @@ -14997,38 +15461,67 @@ /turf/open/floor/plasteel, /area/crew_quarters/dorms) "aHU" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"aHV" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"aHW" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"aHX" = ( +/obj/machinery/light{ dir = 1 }, -/obj/structure/sink{ - dir = 8; - pixel_x = -12; - pixel_y = 2 +/obj/structure/table/wood/fancy, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = -9 }, -/obj/structure/mirror{ - pixel_x = -28 +/obj/item/reagent_containers/food/condiment/peppermill{ + dir = 1; + pixel_x = -3 }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) -"aHV" = ( -/obj/machinery/door/airlock{ - name = "Unit 1" +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -9; + pixel_y = 9 }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) -"aHW" = ( -/obj/machinery/door/airlock{ - name = "Unit 2" +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3; + pixel_y = 9 }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) -"aHX" = ( -/obj/machinery/door/airlock{ - name = "Unit B" +/obj/item/reagent_containers/food/condiment/pack/ketchup{ + pixel_x = 5 }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) +/obj/item/reagent_containers/food/condiment/pack/ketchup{ + pixel_x = 5 + }, +/obj/item/reagent_containers/food/condiment/pack/ketchup{ + pixel_x = 5 + }, +/obj/item/reagent_containers/food/condiment/pack/hotsauce{ + pixel_x = 10 + }, +/obj/item/reagent_containers/food/condiment/pack/hotsauce{ + pixel_x = 10 + }, +/obj/item/reagent_containers/food/condiment/pack/mustard{ + pixel_x = 10 + }, +/obj/item/reagent_containers/food/condiment/pack/mustard{ + pixel_x = 10 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) "aHY" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 @@ -15036,23 +15529,12 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "aHZ" = ( -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -22 - }, -/obj/structure/closet/crate/wooden/toy, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/effect/turf_decal/tile/blue, +/obj/structure/sign/poster/contraband/fun_police{ + pixel_x = 32 }, /turf/open/floor/plasteel, -/area/crew_quarters/theatre) +/area/hallway/primary/fore) "aIa" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -15062,9 +15544,9 @@ /area/maintenance/starboard/fore) "aIb" = ( /obj/machinery/power/apc{ + areastring = "/area/crew_quarters/theatre"; dir = 8; name = "Theatre APC"; - areastring = "/area/crew_quarters/theatre"; pixel_x = -25 }, /obj/structure/cable, @@ -15075,9 +15557,8 @@ /area/maintenance/starboard/fore) "aIc" = ( /obj/machinery/power/apc{ - dir = 2; - name = "Bar APC"; areastring = "/area/crew_quarters/bar"; + name = "Bar APC"; pixel_y = -24 }, /obj/structure/cable, @@ -15117,18 +15598,13 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/bot{ - dir = 2 - }, -/turf/open/floor/plasteel{ - dir = 2 - }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/crew_quarters/bar) "aIh" = ( /obj/machinery/power/apc{ - dir = 2; - name = "Kitchen APC"; areastring = "/area/crew_quarters/kitchen"; + name = "Kitchen APC"; pixel_y = -24 }, /obj/structure/cable, @@ -15137,6 +15613,12 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"aIi" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) "aIj" = ( /obj/structure/cable{ icon_state = "4-8" @@ -15187,9 +15669,8 @@ /area/maintenance/starboard/fore) "aIn" = ( /obj/machinery/power/apc{ - dir = 2; - name = "Hydroponics APC"; areastring = "/area/hydroponics"; + name = "Hydroponics APC"; pixel_y = -24 }, /obj/structure/cable{ @@ -15216,21 +15697,15 @@ /turf/closed/wall, /area/hydroponics) "aIr" = ( -/obj/structure/filingcabinet, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/wood, -/area/library) +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) "aIs" = ( -/obj/structure/chair/office/dark, -/obj/machinery/camera{ - c_tag = "Library North"; - dir = 2 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 }, +/obj/structure/chair/comfy/brown, /turf/open/floor/wood, -/area/library) +/area/crew_quarters/bar) "aIt" = ( /turf/open/floor/wood, /area/library) @@ -15250,16 +15725,11 @@ /turf/open/floor/wood, /area/library) "aIw" = ( -/obj/structure/chair/office/dark, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/landmark/start/assistant, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 + dir = 9 }, /turf/open/floor/wood, -/area/library) +/area/crew_quarters/bar) "aIx" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -15270,29 +15740,35 @@ /turf/open/floor/wood, /area/library) "aIy" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/dark, -/area/chapel/office) +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/stack/packageWrap, +/obj/item/pen/fourcolor, +/turf/open/floor/wood, +/area/library) "aIz" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, /turf/open/floor/plasteel/grimy, /area/chapel/office) "aIA" = ( -/obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 5 - }, -/obj/item/storage/crayons, -/turf/open/floor/plasteel/grimy, -/area/chapel/office) -"aIB" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/bodycontainer/crematorium{ id = "crematoriumChapel" }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"aIB" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/chapel/office) "aIC" = ( @@ -15316,6 +15792,15 @@ /obj/structure/cable, /turf/open/floor/plating, /area/security/warden) +"aIG" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "aIH" = ( /obj/structure/table, /obj/item/storage/box/lights/mixed, @@ -15367,8 +15852,7 @@ /area/storage/primary) "aIO" = ( /obj/machinery/camera{ - c_tag = "Arrivals Lounge"; - dir = 2 + c_tag = "Arrivals Lounge" }, /obj/machinery/light{ dir = 1 @@ -15416,8 +15900,6 @@ /obj/structure/table/glass, /obj/item/plant_analyzer, /obj/item/radio/intercom{ - freerange = 0; - frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29 }, @@ -15577,12 +16059,13 @@ /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "aJk" = ( -/obj/machinery/door/airlock{ - name = "Theatre Backstage"; - req_access_txt = "46" +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, /turf/open/floor/plasteel, -/area/crew_quarters/theatre) +/area/crew_quarters/dorms) "aJl" = ( /obj/structure/tank_dispenser/oxygen, /obj/machinery/light{ @@ -15594,12 +16077,11 @@ /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "aJm" = ( -/obj/structure/sink/kitchen{ - pixel_y = 28 +/obj/machinery/light{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/wood, -/area/crew_quarters/bar) +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) "aJn" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -15609,8 +16091,7 @@ dir = 1 }, /obj/machinery/camera{ - c_tag = "Central Hallway North"; - dir = 2 + c_tag = "Central Hallway North" }, /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -15682,8 +16163,17 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "aJv" = ( -/obj/machinery/vending/cola/random, -/turf/open/floor/plasteel/dark, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/robust_softdrinks{ + pixel_x = -32; + pixel_y = 32 + }, +/turf/open/floor/plasteel, /area/hallway/primary/central) "aJw" = ( /turf/closed/wall, @@ -15703,6 +16193,10 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"aJz" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) "aJA" = ( /obj/machinery/door/airlock/maintenance{ name = "Kitchen Maintenance"; @@ -15734,13 +16228,12 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "aJE" = ( -/obj/item/reagent_containers/food/drinks/shaker, -/obj/item/gun/ballistic/revolver/doublebarrel, -/obj/structure/table/wood, -/obj/item/stack/spacecash/c10, -/obj/item/stack/spacecash/c100, -/turf/open/floor/wood, -/area/crew_quarters/bar) +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) "aJF" = ( /obj/machinery/newscaster{ pixel_x = 30 @@ -15767,9 +16260,6 @@ /area/chapel/office) "aJH" = ( /obj/machinery/door/window/southleft{ - base_state = "left"; - dir = 2; - icon_state = "left"; name = "Bar Delivery"; req_access_txt = "25" }, @@ -15780,11 +16270,11 @@ /turf/closed/wall, /area/crew_quarters/kitchen) "aJJ" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) +/obj/structure/table/wood, +/obj/item/folder/yellow, +/obj/item/pen/blue, +/turf/open/floor/wood, +/area/library) "aJK" = ( /obj/machinery/navbeacon{ codes_txt = "delivery;dir=2"; @@ -15792,12 +16282,8 @@ location = "Kitchen" }, /obj/structure/plasticflaps/opaque, -/obj/effect/turf_decal/bot{ - dir = 2 - }, -/turf/open/floor/plasteel{ - dir = 2 - }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/crew_quarters/kitchen) "aJL" = ( /obj/machinery/navbeacon{ @@ -15806,30 +16292,26 @@ location = "Hydroponics" }, /obj/structure/plasticflaps/opaque, -/obj/effect/turf_decal/bot{ - dir = 2 - }, -/turf/open/floor/plasteel{ - dir = 2 - }, -/area/hydroponics) -"aJM" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp{ - pixel_y = 10 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/grimy, -/area/chapel/office) -"aJN" = ( -/obj/structure/table, -/obj/item/book/manual/hydroponics_pod_people, -/obj/item/paper/guides/jobs/hydroponics, +/obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/hydroponics) +"aJM" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"aJN" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/sign/departments/security{ + pixel_x = -32; + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) "aJO" = ( /obj/structure/table, /obj/machinery/reagentgrinder, @@ -15837,30 +16319,55 @@ /area/hydroponics) "aJP" = ( /obj/structure/table/wood, -/obj/item/folder/yellow, -/obj/item/pen, -/turf/open/floor/wood, -/area/library) -"aJQ" = ( -/obj/structure/chair/office/dark{ +/obj/item/flashlight/lamp{ + pixel_y = 10 + }, +/obj/structure/disposalpipe/segment, +/obj/item/nullrod, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/wood, -/area/library) -"aJR" = ( -/obj/structure/chair/office/dark{ +/turf/open/floor/plasteel/grimy, +/area/chapel/office) +"aJQ" = ( +/obj/machinery/light{ dir = 8 }, -/turf/open/floor/wood, -/area/library) +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"aJR" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "aJS" = ( /obj/structure/table/wood, /obj/structure/disposalpipe/segment, +/obj/item/paicard, /turf/open/floor/wood, /area/library) "aJT" = ( /obj/structure/table/wood, -/obj/item/nullrod, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 5 + }, +/obj/item/storage/crayons, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, @@ -15968,9 +16475,9 @@ icon_state = "0-4" }, /obj/machinery/power/apc{ + areastring = "/area/construction/mining/aux_base"; dir = 8; name = "Auxillary Base Construction APC"; - areastring = "/area/construction/mining/aux_base"; pixel_x = -24 }, /obj/structure/cable{ @@ -15981,11 +16488,33 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) +"aKg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"aKh" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"aKi" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/structure/table, +/obj/structure/bedsheetbin/towel, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "aKj" = ( /obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral{ - dir = 2 - }, +/obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "aKk" = ( @@ -16025,22 +16554,24 @@ /turf/open/floor/plating, /area/storage/primary) "aKq" = ( -/obj/item/radio/intercom{ - pixel_y = 25 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 }, -/obj/machinery/camera{ - c_tag = "Theatre Stage"; - dir = 2 - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "aKr" = ( -/obj/machinery/airalarm{ - dir = 2; - pixel_y = 24 +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "aKs" = ( /obj/structure/disposalpipe/segment, /obj/effect/spawner/structure/window, @@ -16179,14 +16710,22 @@ /turf/open/floor/plasteel, /area/hydroponics) "aKJ" = ( -/obj/machinery/light_switch{ - pixel_y = 28 +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = -29 }, -/obj/machinery/light{ - dir = 1 +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "aKK" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/closet/secure_closet/hydroponics, @@ -16209,45 +16748,46 @@ /turf/open/floor/plasteel, /area/hydroponics) "aKM" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"aKN" = ( -/obj/structure/window/reinforced{ - dir = 4 +/obj/structure/cable{ + icon_state = "2-8" }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"aKO" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/firealarm{ - dir = 2; - pixel_y = 24 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, +/obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, -/area/crew_quarters/bar) +/area/crew_quarters/dorms) +"aKN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/chair/comfy/brown, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"aKO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/chair/comfy/black, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "aKP" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 +/obj/machinery/door/airlock{ + name = "Unisex Restrooms" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) "aKQ" = ( /obj/machinery/reagentgrinder, /obj/structure/table/wood, @@ -16257,11 +16797,13 @@ /turf/open/floor/wood, /area/crew_quarters/bar) "aKS" = ( -/obj/machinery/camera{ - c_tag = "Bar Storage" +/obj/effect/turf_decal/tile/red, +/obj/structure/sign/departments/security{ + pixel_x = 32; + pixel_y = -32 }, -/turf/open/floor/wood, -/area/crew_quarters/bar) +/turf/open/floor/plasteel, +/area/hallway/primary/fore) "aKT" = ( /obj/structure/closet/secure_closet/freezer/meat, /turf/open/floor/plasteel/showroomfloor, @@ -16272,9 +16814,6 @@ /area/hydroponics) "aKV" = ( /obj/machinery/door/window/southleft{ - base_state = "left"; - dir = 2; - icon_state = "left"; name = "Kitchen Delivery"; req_access_txt = "28" }, @@ -16314,8 +16853,9 @@ c_tag = "Chapel Crematorium"; dir = 4 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 +/obj/structure/bodycontainer/morgue, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 }, /turf/open/floor/plasteel/dark, /area/chapel/office) @@ -16384,11 +16924,9 @@ /turf/open/floor/wood, /area/library) "aLh" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/wood, -/area/library) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/crew_quarters/toilet) "aLi" = ( /obj/structure/chair/comfy/beige, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -16464,6 +17002,23 @@ }, /turf/open/floor/plasteel/dark, /area/chapel/main) +"aLs" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Dorms South"; + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "aLt" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 @@ -16547,9 +17102,9 @@ icon_state = "0-2" }, /obj/machinery/power/apc{ - name = "Port Hall APC"; areastring = "/area/hallway/primary/port"; dir = 1; + name = "Port Hall APC"; pixel_y = 26 }, /turf/open/floor/plasteel, @@ -16585,8 +17140,7 @@ /area/hallway/primary/port) "aLL" = ( /obj/machinery/camera{ - c_tag = "Port Hallway 2"; - dir = 2 + c_tag = "Port Hallway 2" }, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -16625,15 +17179,18 @@ /turf/open/floor/plasteel, /area/hallway/primary/port) "aLQ" = ( -/obj/machinery/camera{ - c_tag = "Central Hallway North-East"; - dir = 2 +/obj/structure/cable, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/toilet"; + dir = 4; + name = "Dormitory Bathrooms APC"; + pixel_x = 26 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/table/glass, +/obj/structure/bedsheetbin/towel, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet) "aLR" = ( /obj/machinery/newscaster{ pixel_y = 32 @@ -16647,10 +17204,11 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "aLS" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/plasteel/white/side{ dir = 4 }, -/turf/open/floor/wood, /area/crew_quarters/theatre) "aLT" = ( /obj/machinery/door/firedoor, @@ -16675,15 +17233,13 @@ dir = 1 }, /obj/machinery/firealarm{ - dir = 2; pixel_y = 24 }, /turf/open/floor/plasteel, /area/hallway/primary/central) "aLW" = ( /obj/machinery/camera{ - c_tag = "Central Hallway North-West"; - dir = 2 + c_tag = "Central Hallway North-West" }, /obj/machinery/airalarm{ pixel_y = 23 @@ -16743,14 +17299,12 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "aMg" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 +/obj/machinery/vending/cola/pwr_game, +/obj/structure/sign/poster/contraband/pwr_game{ + pixel_y = 32 }, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/crew_quarters/locker) "aMh" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -16787,7 +17341,6 @@ /area/crew_quarters/kitchen) "aMm" = ( /obj/machinery/firealarm{ - dir = 2; pixel_y = 24 }, /turf/open/floor/plasteel, @@ -16805,20 +17358,33 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "aMp" = ( -/obj/structure/chair/stool{ - pixel_y = 8 - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/maintenance/department/electrical) "aMq" = ( -/obj/structure/piano{ - icon_state = "piano" +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "aMr" = ( -/turf/open/floor/wood, -/area/crew_quarters/theatre) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "aMs" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -16840,41 +17406,33 @@ /turf/open/floor/plasteel, /area/hydroponics) "aMu" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ +/obj/machinery/camera{ + c_tag = "Bathrooms"; dir = 1 }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) +/obj/structure/urinal{ + pixel_y = 32 + }, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet) "aMv" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"aMw" = ( -/obj/machinery/computer/slot_machine, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"aMx" = ( -/obj/structure/chair/stool, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet) +"aMw" = ( +/obj/machinery/door/airlock{ + name = "Unisex Restrooms" }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"aMx" = ( +/obj/machinery/door/airlock{ + name = "Shower Room" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/toilet) "aMy" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -16907,13 +17465,21 @@ /turf/open/floor/plasteel, /area/hydroponics) "aMB" = ( -/obj/machinery/vending/coffee, -/turf/open/floor/wood, -/area/crew_quarters/bar) +/obj/effect/spawner/structure/window, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) "aMC" = ( -/obj/machinery/vending/cola/random, -/turf/open/floor/wood, -/area/crew_quarters/bar) +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light_switch{ + pixel_y = -25 + }, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) "aMD" = ( /obj/machinery/icecream_vat, /turf/open/floor/plasteel/showroomfloor, @@ -16939,27 +17505,28 @@ /turf/open/floor/plasteel, /area/hydroponics) "aMH" = ( -/obj/structure/chair/office/dark{ - dir = 1 +/obj/machinery/door/airlock{ + name = "Unisex Restrooms" }, -/turf/open/floor/wood, -/area/library) +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) "aMI" = ( /obj/machinery/light/small, /obj/machinery/vending/wardrobe/hydro_wardrobe, /turf/open/floor/plasteel, /area/hydroponics) "aMJ" = ( -/obj/structure/chair/office/dark{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/library) +/turf/closed/wall, +/area/crew_quarters/dorms) "aMK" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 +/obj/structure/disposalpipe/segment{ + dir = 5 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel/dark, /area/chapel/office) "aML" = ( @@ -16970,8 +17537,7 @@ /area/chapel/main) "aMM" = ( /obj/machinery/camera{ - c_tag = "Chapel North"; - dir = 2 + c_tag = "Chapel North" }, /turf/open/floor/plasteel/dark, /area/chapel/main) @@ -17038,9 +17604,11 @@ /turf/open/floor/plasteel, /area/hallway/primary/port) "aMW" = ( -/obj/structure/bodycontainer/morgue, -/turf/open/floor/plasteel/dark, -/area/chapel/office) +/obj/structure/bookcase{ + name = "Forbidden Knowledge" + }, +/turf/open/floor/carpet, +/area/library) "aMX" = ( /turf/open/floor/plasteel/grimy, /area/chapel/office) @@ -17121,6 +17689,13 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) +"aNn" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/chair/comfy/brown, +/turf/open/floor/wood, +/area/crew_quarters/bar) "aNo" = ( /obj/structure/cable{ icon_state = "1-8" @@ -17151,17 +17726,33 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "aNt" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/chair/comfy/brown{ dir = 4 }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"aNu" = ( -/obj/structure/closet/secure_closet/bar{ - req_access_txt = "25" +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, -/turf/open/floor/wood, -/area/crew_quarters/bar) +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"aNu" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/abandoned_gambling_den"; + name = "Abandoned Gambling Den APC"; + pixel_y = -24 + }, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) "aNv" = ( /obj/effect/turf_decal/plaque{ icon_state = "L4" @@ -17237,57 +17828,78 @@ /turf/open/floor/wood, /area/crew_quarters/bar) "aNF" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/item/reagent_containers/food/drinks/soda_cans/starkist{ + pixel_x = -3; + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) "aNG" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/obj/structure/chair/comfy/brown{ + dir = 8 }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, -/area/crew_quarters/bar) +/area/crew_quarters/dorms) "aNH" = ( -/obj/machinery/door/window{ - dir = 4; - name = "Theatre Stage" +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/sign/warning/fire{ + desc = "A sign that states the labeled room's number."; + icon_state = "roomnum"; + name = "Room Number 1"; + pixel_x = -30; + pixel_y = -7 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "aNI" = ( -/obj/machinery/computer/slot_machine, -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/status_display{ - pixel_x = 32 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, +/obj/structure/closet/jcloset, +/obj/item/storage/bag/trash, +/obj/item/clothing/under/janimaid, +/obj/item/clothing/under/janimaid, +/obj/item/clothing/under/janimaid, +/obj/item/clothing/under/maid, +/obj/item/clothing/under/maid, +/obj/item/clothing/under/maid, /turf/open/floor/plasteel, -/area/crew_quarters/bar) +/area/janitor) "aNJ" = ( -/obj/structure/chair/stool, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/obj/structure/table, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/obj/machinery/requests_console{ + department = "Janitorial"; + departmentType = 1; + pixel_y = -29 }, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/storage/box/lights/mixed, +/obj/item/storage/box/lights/mixed, /turf/open/floor/plasteel, -/area/crew_quarters/bar) +/area/janitor) "aNK" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 @@ -17340,6 +17952,7 @@ "aNR" = ( /obj/structure/table/wood, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/item/paicard, /turf/open/floor/carpet, /area/hallway/secondary/entry) "aNS" = ( @@ -17376,9 +17989,11 @@ /turf/open/floor/plasteel, /area/hallway/primary/port) "aNV" = ( -/obj/machinery/photocopier, -/turf/open/floor/wood, -/area/library) +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) "aNW" = ( /obj/machinery/door/airlock/public/glass{ name = "Chapel Office"; @@ -17585,6 +18200,15 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) +"aOu" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) "aOv" = ( /obj/structure/cable{ icon_state = "4-8" @@ -17709,32 +18333,56 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "aOH" = ( -/obj/structure/window/reinforced, -/turf/open/floor/wood, -/area/crew_quarters/theatre) +/obj/structure/closet/secure_closet/captains, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/item/clothing/under/captainparade, +/turf/open/floor/carpet, +/area/crew_quarters/heads/captain) "aOI" = ( /obj/structure/kitchenspike, /turf/open/floor/plasteel/showroomfloor, /area/crew_quarters/kitchen) "aOJ" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 +/obj/item/radio/intercom{ + dir = 8; + name = "Station Intercom (General)"; + pixel_x = -28 }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"aOK" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/crew_quarters/bar) -"aOL" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ +/obj/structure/closet/secure_closet/hop, +/obj/effect/turf_decal/tile/blue{ dir = 1 }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/item/clothing/suit/ianshirt, /turf/open/floor/plasteel, +/area/crew_quarters/heads/hop) +"aOK" = ( +/obj/machinery/door/airlock{ + name = "Theatre Backstage"; + req_access_txt = "46" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, /area/crew_quarters/bar) +"aOL" = ( +/obj/machinery/camera{ + c_tag = "Central Hallway North-East" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -5; + pixel_y = 30 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "aOM" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -17803,8 +18451,7 @@ "aOW" = ( /obj/machinery/hydroponics/constructable, /obj/machinery/camera{ - c_tag = "Hydroponics North"; - dir = 2 + c_tag = "Hydroponics North" }, /turf/open/floor/plasteel/dark, /area/hydroponics) @@ -17861,29 +18508,38 @@ /turf/open/floor/wood, /area/library) "aPg" = ( -/obj/structure/bookcase{ - name = "Forbidden Knowledge" - }, -/turf/open/floor/engine/cult, -/area/library) -"aPh" = ( -/obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen/invisible, -/turf/open/floor/engine/cult, -/area/library) -"aPi" = ( -/obj/structure/table/wood, -/obj/item/taperecorder, -/obj/item/camera, /obj/item/radio/intercom{ pixel_y = 25 }, -/turf/open/floor/engine/cult, +/obj/machinery/vending/wardrobe/curator_wardrobe, +/turf/open/floor/carpet, /area/library) +"aPh" = ( +/obj/structure/table/wood, +/obj/item/book/codex_gigas, +/obj/item/clothing/under/suit_jacket/red, +/obj/structure/destructible/cult/tome, +/turf/open/floor/carpet, +/area/library) +"aPi" = ( +/obj/structure/chair/comfy/brown, +/turf/open/floor/carpet, +/area/library) +"aPj" = ( +/obj/machinery/vr_sleeper{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/crew_quarters/fitness) "aPk" = ( /turf/open/floor/plasteel/chapel{ dir = 4 @@ -17958,7 +18614,6 @@ /area/hallway/secondary/entry) "aPv" = ( /obj/item/radio/intercom{ - broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 20 }, @@ -18077,6 +18732,19 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/hallway/primary/port) +"aPP" = ( +/obj/structure/reagent_dispensers/watertank/high, +/obj/structure/sign/poster/contraband/lizard{ + pixel_x = -32 + }, +/obj/structure/sign/poster/contraband/lizard{ + pixel_x = -32 + }, +/obj/structure/sign/poster/contraband/lizard{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/hydroponics) "aPQ" = ( /turf/closed/wall, /area/storage/tools) @@ -18167,39 +18835,34 @@ /turf/open/floor/plating, /area/bridge) "aPY" = ( -/obj/structure/chair/stool, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/obj/structure/table/optable{ + name = "Robotics Operating Table" }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) +/obj/effect/landmark/event_spawn, +/obj/item/tank/internals/anesthetic, +/obj/item/clothing/mask/breath, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "aPZ" = ( -/obj/structure/table, -/obj/machinery/computer/security/telescreen/entertainment{ - pixel_x = -31 - }, -/obj/item/clothing/head/hardhat/cakehat, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/obj/item/mop, +/obj/item/reagent_containers/glass/bucket, +/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6{ + pixel_x = 32 }, /turf/open/floor/plasteel, -/area/crew_quarters/bar) +/area/janitor) "aQa" = ( -/obj/structure/table, -/obj/item/kitchen/fork, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/obj/structure/reagent_dispensers/watertank, +/obj/structure/sign/poster/contraband/lusty_xenomorph{ + pixel_x = 32 }, /turf/open/floor/plasteel, -/area/crew_quarters/bar) +/area/janitor) "aQb" = ( -/obj/structure/window/reinforced, -/obj/structure/table/wood, -/obj/item/instrument/violin, -/turf/open/floor/wood, +/obj/machinery/vending/autodrobe, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, /area/crew_quarters/theatre) "aQc" = ( /obj/effect/turf_decal/tile/bar, @@ -18209,23 +18872,15 @@ /turf/open/floor/plasteel, /area/crew_quarters/bar) "aQd" = ( -/obj/structure/chair, -/obj/effect/landmark/start/assistant, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) "aQe" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/chair/stool, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) +/turf/open/floor/plating, +/area/space/nearstation) "aQf" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/green{ @@ -18340,22 +18995,24 @@ /area/library) "aQr" = ( /obj/machinery/light/small, -/obj/machinery/vending/wardrobe/curator_wardrobe, -/turf/open/floor/engine/cult, +/obj/structure/table/wood/fancy, +/turf/open/floor/carpet, /area/library) "aQs" = ( -/obj/structure/destructible/cult/tome, -/obj/item/clothing/under/suit_jacket/red, -/obj/item/book/codex_gigas, -/turf/open/floor/engine/cult, +/obj/structure/bed, +/obj/item/bedsheet/black, +/turf/open/floor/carpet, /area/library) "aQt" = ( -/obj/effect/landmark/blobstart, -/obj/structure/chair/comfy/brown{ - dir = 1 - }, -/turf/open/floor/engine/cult, -/area/library) +/obj/structure/table, +/obj/item/stack/cable_coil/random, +/obj/item/stack/cable_coil/random, +/obj/item/stack/cable_coil, +/obj/item/paper_bin/construction, +/obj/item/stack/cable_coil, +/obj/item/pen/fourcolor, +/turf/open/floor/plasteel, +/area/storage/art) "aQu" = ( /turf/open/floor/plasteel/chapel, /area/chapel/main) @@ -18491,37 +19148,67 @@ /area/crew_quarters/locker) "aQO" = ( /obj/structure/closet/wardrobe/white, +/obj/item/clothing/suit/ghost_sheet, +/obj/item/clothing/suit/ghost_sheet, +/obj/item/clothing/suit/ghost_sheet, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aQP" = ( -/obj/structure/reagent_dispensers/fueltank, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"aQQ" = ( /obj/machinery/light_switch{ pixel_y = 28 }, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) -"aQQ" = ( -/obj/structure/reagent_dispensers/watertank, +/obj/machinery/vending/cigarette, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aQR" = ( -/obj/machinery/vending/cola/random, +/obj/machinery/camera{ + c_tag = "Arrivals Bay 3 & 4"; + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/landmark/start/assistant, /turf/open/floor/plasteel, -/area/crew_quarters/locker) +/area/hallway/secondary/entry) "aQS" = ( /obj/machinery/vending/coffee, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aQT" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) +/obj/item/clothing/gloves/color/rainbow, +/obj/item/clothing/head/soft/rainbow, +/obj/item/clothing/shoes/sneakers/rainbow, +/obj/item/clothing/under/color/rainbow, +/turf/open/floor/plating, +/area/maintenance/port/fore) "aQU" = ( -/obj/machinery/vending/kink, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) +/obj/structure/sign/poster/contraband/lizard{ + pixel_x = -32 + }, +/obj/structure/sign/poster/contraband/lizard{ + pixel_x = -32 + }, +/obj/structure/sign/poster/contraband/lizard{ + pixel_x = -32 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "aQV" = ( -/obj/machinery/vending/clothing, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aQW" = ( @@ -18529,18 +19216,19 @@ /turf/open/floor/plasteel, /area/crew_quarters/locker) "aQX" = ( -/obj/machinery/firealarm{ - dir = 2; - pixel_y = 24 +/obj/machinery/vending/clothing, +/obj/structure/disposalpipe/segment{ + dir = 4 }, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aQY" = ( -/obj/structure/table, -/obj/item/stack/cable_coil/random, -/obj/item/stack/cable_coil/random, +/obj/machinery/vending/autodrobe/all_access, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/plasteel, -/area/storage/art) +/area/crew_quarters/locker) "aQZ" = ( /obj/machinery/light/small{ dir = 4 @@ -18733,47 +19421,30 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "aRu" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/structure/chair/stool, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"aRv" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"aRw" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/landmark/start/assistant, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"aRx" = ( -/obj/structure/chair{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/obj/machinery/vending/kink, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" }, /turf/open/floor/plasteel, -/area/crew_quarters/bar) +/area/crew_quarters/fitness) +"aRv" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"aRw" = ( +/obj/structure/fans/tiny/invisible, +/turf/open/space/basic, +/area/space) +"aRx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating, +/area/space/nearstation) "aRy" = ( /obj/structure/extinguisher_cabinet{ pixel_x = -5; @@ -18792,7 +19463,9 @@ /turf/open/floor/plasteel, /area/crew_quarters/bar) "aRA" = ( -/obj/machinery/vending/dinnerware, +/obj/machinery/vending/dinnerware{ + contraband = list(/obj/item/kitchen/rollingpin = 2, /obj/item/kitchen/knife/butcher = 2, /obj/item/reagent_containers/food/condiment/flour = 4) + }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) "aRB" = ( @@ -18800,8 +19473,7 @@ pixel_y = 25 }, /obj/machinery/camera{ - c_tag = "Kitchen"; - dir = 2 + c_tag = "Kitchen" }, /obj/structure/closet/secure_closet/freezer/fridge, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -18872,9 +19544,9 @@ icon_state = "1-2" }, /obj/machinery/power/apc{ + areastring = "/area/library"; dir = 4; name = "Library APC"; - areastring = "/area/library"; pixel_x = 24 }, /obj/structure/cable, @@ -18942,9 +19614,9 @@ /area/hallway/secondary/exit) "aRV" = ( /obj/machinery/power/apc{ + areastring = "/area/storage/tools"; dir = 1; name = "Auxiliary Tool Storage APC"; - areastring = "/area/storage/tools"; pixel_y = 24 }, /obj/machinery/firealarm{ @@ -18987,8 +19659,7 @@ pixel_y = 28 }, /obj/machinery/camera{ - c_tag = "Auxiliary Tool Storage"; - dir = 2 + c_tag = "Auxiliary Tool Storage" }, /obj/structure/table, /obj/item/stack/sheet/metal/fifty, @@ -19009,7 +19680,6 @@ /area/storage/tools) "aSd" = ( /obj/machinery/firealarm{ - dir = 2; pixel_y = -24 }, /turf/open/floor/plasteel, @@ -19029,26 +19699,39 @@ /turf/open/floor/plating, /area/maintenance/port) "aSh" = ( -/obj/structure/closet/wardrobe/mixed, -/obj/item/radio/intercom{ - name = "Station Intercom (General)"; - pixel_x = -27 +/obj/structure/table, +/obj/item/storage/toolbox/artistic{ + pixel_y = 10 + }, +/obj/item/storage/toolbox/artistic, +/obj/item/storage/toolbox/electrical{ + pixel_y = -10 }, /turf/open/floor/plasteel, -/area/crew_quarters/locker) +/area/storage/art) "aSi" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plasteel, /area/crew_quarters/locker) -"aSk" = ( -/obj/structure/table, -/obj/item/stack/cable_coil/random, -/obj/item/stack/cable_coil/random, -/obj/item/stack/cable_coil, -/obj/item/paper_bin/construction, -/obj/item/stack/cable_coil, +"aSj" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light, /turf/open/floor/plasteel, -/area/storage/art) +/area/crew_quarters/dorms) +"aSk" = ( +/obj/structure/table/wood, +/obj/item/camera_film, +/obj/item/camera_film, +/obj/item/taperecorder, +/obj/item/camera, +/turf/open/floor/wood, +/area/library) "aSl" = ( /obj/machinery/light_switch{ pixel_y = 28 @@ -19064,36 +19747,50 @@ /turf/open/floor/plating, /area/storage/emergency/port) "aSo" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/trunk{ dir = 4 }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"aSp" = ( -/obj/structure/chair/stool, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"aSq" = ( -/obj/structure/chair{ +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light, /turf/open/floor/plasteel, -/area/crew_quarters/bar) +/area/crew_quarters/dorms) +"aSp" = ( +/obj/structure/toilet{ + dir = 4 + }, +/obj/structure/mirror{ + pixel_y = 32 + }, +/obj/structure/sink{ + dir = 1; + pixel_y = 25 + }, +/obj/machinery/button/door{ + id = "Bath1"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 14; + pixel_y = 38; + specialfunctions = 4 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet) +"aSq" = ( +/obj/machinery/door/airlock{ + name = "Recharging Station" + }, +/turf/open/floor/plating, +/area/maintenance/fore/secondary) "aSr" = ( /turf/open/floor/plasteel, /area/storage/tools) @@ -19209,28 +19906,20 @@ /turf/open/floor/plasteel, /area/crew_quarters/bar) "aSG" = ( -/obj/structure/table/wood/poker, -/obj/item/toy/cards/deck, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/structure/fireplace, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 23 }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) +/turf/open/floor/plating, +/area/maintenance/port) "aSH" = ( -/obj/structure/chair/stool, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) +/turf/open/space, +/area/solar/starboard/aft) "aSI" = ( /obj/machinery/door/airlock/public/glass{ name = "Kitchen"; @@ -19311,13 +20000,17 @@ /turf/open/floor/plasteel/dark, /area/hydroponics) "aSS" = ( -/obj/machinery/seed_extractor, -/turf/open/floor/plasteel, -/area/hydroponics) +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/turf/open/space, +/area/solar/starboard/aft) "aST" = ( -/obj/machinery/biogenerator, -/turf/open/floor/plasteel, -/area/hydroponics) +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/space, +/area/solar/starboard/aft) "aSU" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 @@ -19339,25 +20032,19 @@ /turf/open/floor/plasteel, /area/storage/tools) "aSX" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/machinery/vending/kink, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"aSY" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/head/that{ - throwforce = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, /turf/open/floor/plasteel, -/area/crew_quarters/bar) +/area/crew_quarters/locker) +"aSY" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/space, +/area/solar/starboard/aft) "aSZ" = ( /obj/effect/landmark/start/bartender, /obj/effect/turf_decal/tile/bar, @@ -19366,6 +20053,13 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/bar) +"aTa" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/space, +/area/solar/starboard/aft) "aTb" = ( /obj/machinery/newscaster{ pixel_y = 32 @@ -19374,9 +20068,7 @@ /area/library) "aTc" = ( /obj/machinery/door/window/northright{ - base_state = "right"; dir = 8; - icon_state = "right"; name = "Library Desk Door"; req_access_txt = "37" }, @@ -19472,6 +20164,20 @@ }, /turf/open/floor/plating, /area/hallway/secondary/exit) +"aTp" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/space, +/area/solar/port/fore) +"aTq" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/space, +/area/solar/starboard/fore) "aTr" = ( /obj/machinery/door/firedoor, /obj/machinery/status_display{ @@ -19503,17 +20209,25 @@ /turf/open/floor/plating, /area/maintenance/port) "aTw" = ( -/obj/structure/closet/wardrobe/green, -/obj/machinery/light{ - dir = 8 +/obj/structure/closet/wardrobe/mixed, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = -27 }, +/obj/item/clothing/head/beret, +/obj/item/clothing/head/beret, +/obj/item/clothing/head/russobluecamohat, +/obj/item/clothing/head/russobluecamohat, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aTx" = ( -/obj/structure/chair/stool{ - pixel_y = 8 +/obj/machinery/firealarm{ + pixel_y = 24 }, -/obj/effect/landmark/start/assistant, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/vending/games, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aTy" = ( @@ -19521,45 +20235,71 @@ /turf/open/floor/plasteel, /area/crew_quarters/locker) "aTz" = ( -/obj/structure/table, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) -"aTA" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) -"aTB" = ( /obj/structure/chair/stool{ pixel_y = 8 }, /turf/open/floor/plasteel, /area/crew_quarters/locker) -"aTC" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 +"aTA" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 }, -/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"aTB" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/window{ + dir = 1 + }, +/obj/structure/window{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"aTC" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/window{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aTD" = ( -/obj/structure/closet/secure_closet/personal, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 +/obj/effect/turf_decal/tile/red{ + dir = 1 }, -/obj/machinery/camera{ - c_tag = "Locker Room East"; - dir = 8 - }, -/obj/machinery/light{ +/obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/window{ + dir = 1 + }, +/obj/structure/window{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aTE" = ( @@ -19603,6 +20343,12 @@ /area/storage/emergency/port) "aTL" = ( /obj/structure/table, +/obj/item/storage/toolbox/artistic{ + icon_state = "yellow"; + item_state = "toolbox_yellow"; + name = "Cable Toolbox"; + pixel_y = 6 + }, /obj/item/storage/toolbox/emergency, /turf/open/floor/plasteel, /area/storage/tools) @@ -19612,10 +20358,15 @@ /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) "aTN" = ( -/obj/structure/table, -/obj/item/kitchen/rollingpin, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/kitchen) +/obj/machinery/vending/dinnerware{ + contraband = list(/obj/item/reagent_containers/food/condiment/flour = 4); + desc = "This vendor is full of condiments to put on food."; + name = "\improper Condiments Vendor"; + product_ads = "Get your sauces here!;No slave labour was used to make these products!;Nanotrasen Approved?!"; + products = list(/obj/item/storage/bag/tray = 8, /obj/item/reagent_containers/food/drinks/drinkingglass = 10, /obj/item/storage/box/cups = 5, /obj/item/reagent_containers/food/condiment/pack/ketchup = 20, /obj/item/reagent_containers/food/condiment/pack/mustard = 20, /obj/item/reagent_containers/food/condiment/pack/hotsauce = 20, /obj/item/reagent_containers/food/condiment/pack/astrotame = 20, /obj/item/reagent_containers/food/condiment/saltshaker = 20, /obj/item/reagent_containers/food/condiment/peppermill = 20) + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) "aTO" = ( /obj/structure/table, /obj/item/book/manual/chef_recipes, @@ -19735,28 +20486,19 @@ /turf/open/floor/plasteel, /area/bridge) "aUf" = ( -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -22 +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "0-4" }, -/obj/machinery/camera{ - c_tag = "Bar West"; - dir = 4 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) +/turf/open/space, +/area/solar/port/aft) "aUg" = ( -/obj/structure/chair, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) +/turf/open/space, +/area/solar/port/aft) "aUh" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/eastleft{ @@ -19781,15 +20523,28 @@ /turf/open/floor/plasteel/dark, /area/hydroponics) "aUj" = ( -/obj/machinery/vending/hydronutrients, -/turf/open/floor/plasteel, -/area/hydroponics) -"aUk" = ( -/obj/machinery/vending/hydroseeds{ - slogan_delay = 700 +/obj/item/soap, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" }, -/turf/open/floor/plasteel, -/area/hydroponics) +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet) +"aUk" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/camera{ + c_tag = "VR Sleepers"; + dir = 1 + }, +/obj/machinery/light/small, +/turf/open/floor/plasteel/white/side{ + dir = 1 + }, +/area/crew_quarters/fitness) "aUl" = ( /obj/structure/chair/office/dark{ dir = 8 @@ -19814,39 +20569,71 @@ /turf/open/floor/plasteel, /area/crew_quarters/locker) "aUp" = ( +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/obj/machinery/camera{ + c_tag = "Locker Room East"; + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, /obj/structure/table, -/obj/item/clothing/head/soft/grey{ - pixel_x = -2; - pixel_y = 3 +/obj/item/reagent_containers/rag/towel/random, +/obj/item/razor, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"aUq" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) -"aUq" = ( -/obj/structure/table, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/structure/window{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ dir = 4 }, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aUr" = ( -/obj/structure/chair/stool{ - pixel_y = 8 - }, -/obj/effect/landmark/start/assistant, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aUs" = ( -/obj/structure/table, -/obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aUt" = ( @@ -19856,12 +20643,27 @@ /turf/open/floor/plasteel, /area/crew_quarters/locker) "aUu" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/window{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aUv" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 }, /turf/open/floor/plasteel, /area/crew_quarters/locker) @@ -19908,10 +20710,17 @@ /turf/open/floor/wood, /area/library) "aUC" = ( -/obj/structure/chair/comfy/black, -/obj/effect/landmark/start/assistant, -/turf/open/floor/wood, -/area/library) +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/effect/landmark/start/mime, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/crew_quarters/theatre) "aUD" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp/green{ @@ -19963,6 +20772,15 @@ dir = 1 }, /area/chapel/main) +"aUL" = ( +/obj/machinery/computer/arcade, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/exit) "aUM" = ( /obj/machinery/camera{ c_tag = "Arrivals Bay 2"; @@ -19981,11 +20799,29 @@ /turf/open/floor/wood, /area/security/vacantoffice) "aUP" = ( -/obj/machinery/airalarm{ - pixel_y = 23 +/obj/structure/toilet{ + dir = 4 }, -/turf/open/floor/wood, -/area/security/vacantoffice) +/obj/structure/mirror{ + pixel_y = 32 + }, +/obj/structure/sink{ + dir = 1; + pixel_y = 25 + }, +/obj/machinery/button/door{ + id = "Bath2"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 14; + pixel_y = 38; + specialfunctions = 4 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet) "aUQ" = ( /obj/structure/table/wood, /turf/open/floor/wood, @@ -20009,18 +20845,29 @@ /turf/open/floor/plating, /area/maintenance/port) "aUU" = ( -/obj/structure/closet/wardrobe/grey, -/obj/machinery/requests_console{ - department = "Locker Room"; - pixel_x = -32 +/obj/structure/closet/wardrobe/green, +/obj/machinery/light{ + dir = 8 }, +/obj/item/clothing/under/kilt, +/obj/item/clothing/under/kilt, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aUV" = ( -/obj/structure/chair/stool{ - pixel_y = 8 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/door/window/westright{ + name = "Red Corner" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ dir = 4 }, /turf/open/floor/plasteel, @@ -20037,17 +20884,29 @@ /turf/open/floor/plasteel, /area/crew_quarters/locker) "aUY" = ( -/obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aUZ" = ( -/obj/structure/closet/secure_closet/personal, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, +/obj/structure/table, +/obj/item/clothing/gloves/boxing/yellow, +/obj/item/clothing/gloves/boxing/green, +/obj/item/clothing/gloves/boxing/blue, +/obj/item/clothing/gloves/boxing/blue, +/obj/item/clothing/gloves/boxing, +/obj/item/clothing/gloves/boxing, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aVa" = ( @@ -20125,9 +20984,9 @@ /area/bridge) "aVh" = ( /obj/machinery/power/apc{ + areastring = "/area/hallway/primary/fore"; dir = 8; name = "Fore Primary Hallway APC"; - areastring = "/area/hallway/primary/fore"; pixel_x = -24 }, /obj/structure/cable{ @@ -20292,8 +21151,7 @@ /area/hallway/primary/central) "aVv" = ( /obj/machinery/camera{ - c_tag = "Bridge East Entrance"; - dir = 2 + c_tag = "Bridge East Entrance" }, /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -20304,40 +21162,42 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "aVw" = ( -/obj/structure/table/wood/poker, -/obj/item/clothing/mask/cigarette/cigar, -/obj/item/toy/cards/deck, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) +/obj/effect/landmark/carpspawn, +/turf/open/space/basic, +/area/space) "aVx" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "holoprivacy"; + name = "Holodeck Shutters" + }, +/turf/open/floor/plating, +/area/crew_quarters/fitness) "aVy" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/table, +/obj/item/storage/firstaid/regular{ + pixel_y = 5 }, /turf/open/floor/plasteel, -/area/crew_quarters/bar) +/area/crew_quarters/fitness) "aVz" = ( /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) "aVA" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/reagent_containers/food/snacks/pie/cream, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/kitchen) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/crew_quarters/theatre) "aVB" = ( /obj/structure/table, /obj/item/reagent_containers/food/condiment/enzyme{ @@ -20357,15 +21217,18 @@ /turf/open/floor/plating, /area/maintenance/port) "aVD" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/condiment/saltshaker{ - pixel_x = -3 +/obj/machinery/door/airlock/maintenance{ + name = "Theatre Maintenance"; + req_access_txt = "46" }, -/obj/item/reagent_containers/food/condiment/peppermill{ - pixel_x = 3 +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/kitchen) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/crew_quarters/theatre) "aVE" = ( /obj/structure/table, /obj/item/storage/box/donkpockets{ @@ -20381,6 +21244,14 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) +"aVG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/structure/table, +/obj/item/coin/gold, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) "aVH" = ( /obj/machinery/processor, /obj/machinery/firealarm{ @@ -20406,9 +21277,14 @@ /turf/open/floor/plasteel/dark, /area/hydroponics) "aVK" = ( -/obj/effect/landmark/start/botanist, -/turf/open/floor/plasteel, -/area/hydroponics) +/obj/machinery/shower{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet) "aVL" = ( /obj/structure/cable{ icon_state = "1-2" @@ -20451,10 +21327,9 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "aVP" = ( -/obj/structure/table/wood, -/obj/item/paper, -/turf/open/floor/wood, -/area/library) +/obj/machinery/vending/autodrobe/all_access, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) "aVQ" = ( /obj/structure/chair/comfy/black{ dir = 8 @@ -20463,27 +21338,32 @@ /area/library) "aVR" = ( /obj/structure/table/wood, -/obj/item/pen/red, -/obj/item/pen/blue{ - pixel_x = 5; - pixel_y = 5 +/obj/item/paper_bin/bundlenatural{ + pixel_x = 6; + pixel_y = 4 }, +/obj/item/paper_bin{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/pen/fountain, +/obj/item/pen/fourcolor, /turf/open/floor/wood, /area/library) "aVS" = ( /obj/structure/table/wood, -/obj/item/camera_film, -/obj/item/camera_film, +/obj/item/pen/red, /turf/open/floor/wood, /area/library) "aVT" = ( /obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 +/obj/item/reagent_containers/food/drinks/bottle/whiskey{ + pixel_x = 3 }, -/turf/open/floor/wood, -/area/library) +/obj/item/lighter, +/obj/item/restraints/handcuffs, +/turf/open/floor/carpet, +/area/security/detectives_office) "aVU" = ( /obj/structure/chair/stool, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -20584,6 +21464,7 @@ /area/chapel/main) "aWh" = ( /obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, +/obj/item/beacon, /turf/open/floor/plasteel, /area/hallway/secondary/exit) "aWi" = ( @@ -20626,6 +21507,14 @@ "aWn" = ( /obj/structure/closet/wardrobe/black, /obj/item/clothing/shoes/jackboots, +/obj/item/clothing/under/janimaid, +/obj/item/clothing/under/janimaid, +/obj/item/clothing/under/maid, +/obj/item/clothing/under/maid, +/obj/item/clothing/accessory/maidapron, +/obj/item/clothing/accessory/maidapron, +/obj/item/clothing/head/beret/black, +/obj/item/clothing/head/beret/black, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aWo" = ( @@ -20686,9 +21575,9 @@ /area/maintenance/port) "aWw" = ( /obj/machinery/power/apc{ + areastring = "/area/storage/art"; dir = 1; name = "Art Storage"; - areastring = "/area/storage/art"; pixel_y = 24 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -20718,9 +21607,9 @@ /area/crew_quarters/toilet/locker) "aWz" = ( /obj/machinery/power/apc{ + areastring = "/area/storage/emergency/port"; dir = 1; name = "Port Emergency Storage APC"; - areastring = "/area/storage/emergency/port"; pixel_y = 24 }, /obj/structure/cable{ @@ -20738,9 +21627,21 @@ /turf/open/floor/plating, /area/maintenance/port) "aWB" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/maintenance/port) +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) "aWC" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -20968,9 +21869,8 @@ /area/bridge) "aWW" = ( /obj/machinery/power/apc/highcap/five_k{ - dir = 2; - name = "Bridge APC"; areastring = "/area/bridge"; + name = "Bridge APC"; pixel_y = -24 }, /obj/structure/cable, @@ -21121,51 +22021,51 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "aXi" = ( -/obj/machinery/light{ +/obj/machinery/vending/clothing, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"aXj" = ( +/obj/structure/reagent_dispensers/water_cooler, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/computer/security/telescreen/entertainment{ - pixel_x = -31 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, +/obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, -/area/crew_quarters/bar) -"aXj" = ( -/obj/structure/table/reinforced, -/obj/item/lighter, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) +/area/crew_quarters/dorms) "aXk" = ( -/obj/structure/table/reinforced, -/obj/machinery/computer/security/telescreen/entertainment{ - pixel_x = 32 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/obj/item/book/manual/wiki/barman_recipes, -/obj/item/reagent_containers/rag, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/door/window/eastleft{ + name = "Blue Corner" + }, +/obj/effect/turf_decal/tile/blue{ dir = 1 }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, /turf/open/floor/plasteel, -/area/crew_quarters/bar) +/area/crew_quarters/locker) "aXl" = ( -/obj/machinery/door/window/southright{ - name = "Bar Door"; - req_one_access_txt = "25;28" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "2-8" }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/obj/structure/disposalpipe/junction, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, +/obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, -/area/crew_quarters/bar) +/area/crew_quarters/dorms) "aXm" = ( /obj/effect/landmark/start/cook, /turf/open/floor/plasteel/cafeteria, @@ -21201,29 +22101,33 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "aXr" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 }, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aXs" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 +/obj/machinery/door/airlock/maintenance{ + name = "Detective Maintenance"; + req_access_txt = "4" }, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/port) "aXt" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 2 +/obj/machinery/power/apc{ + areastring = "/area/security/detectives_office"; + dir = 4; + name = "Detective's Office APC"; + pixel_x = 24 }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; - pixel_y = 3 +/obj/structure/cable{ + icon_state = "0-8" }, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) "aXu" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -21231,20 +22135,45 @@ /turf/open/floor/carpet, /area/library) "aXv" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/window{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 }, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aXw" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 2 +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 }, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aXx" = ( -/obj/structure/closet/secure_closet/personal, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aXy" = ( @@ -21265,10 +22194,19 @@ /turf/open/floor/carpet, /area/chapel/main) "aXA" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/corner{ +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/window{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ dir = 1 }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aXB" = ( @@ -21302,19 +22240,24 @@ /turf/closed/wall, /area/quartermaster/warehouse) "aXF" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/neutral{ +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 +/obj/item/paper_bin/bundlenatural{ + pixel_x = 6; + pixel_y = 4 }, -/obj/effect/turf_decal/tile/neutral{ +/obj/item/pen/fountain{ + pixel_x = 6 + }, +/obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) +/obj/item/pen/fourcolor, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) "aXG" = ( /obj/machinery/light{ dir = 4 @@ -21327,6 +22270,10 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit) +"aXH" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "aXI" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -21376,15 +22323,16 @@ /turf/open/floor/wood, /area/security/vacantoffice) "aXO" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel, -/area/crew_quarters/bar) +/area/crew_quarters/dorms) "aXP" = ( /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, @@ -21464,9 +22412,9 @@ /area/security/vacantoffice) "aYa" = ( /obj/machinery/power/apc{ + areastring = "/area/maintenance/port"; dir = 8; name = "Port Maintenance APC"; - areastring = "/area/maintenance/port"; pixel_x = -27; pixel_y = 2 }, @@ -21495,12 +22443,12 @@ /turf/open/floor/plating, /area/maintenance/port) "aYc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, /turf/closed/wall, /area/quartermaster/warehouse) "aYd" = ( @@ -21532,19 +22480,17 @@ /area/construction) "aYh" = ( /obj/structure/disposalpipe/segment{ - dir = 4 + dir = 10 }, -/obj/machinery/light/small{ - dir = 4 +/obj/machinery/button/door{ + id = "kanyewest"; + name = "Privacy Shutters"; + pixel_y = 24 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/port) +/obj/structure/rack, +/obj/item/storage/briefcase, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) "aYi" = ( /obj/structure/closet/secure_closet/detective, /obj/structure/disposalpipe/segment{ @@ -21556,15 +22502,8 @@ /turf/open/floor/plasteel/grimy, /area/security/detectives_office) "aYj" = ( -/obj/structure/table/wood, -/obj/item/taperecorder, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/button/door{ - id = "kanyewest"; - name = "Privacy Shutters"; - pixel_y = 24 +/obj/machinery/light/small{ + dir = 8 }, /turf/open/floor/plasteel/grimy, /area/security/detectives_office) @@ -21761,9 +22700,8 @@ /area/hallway/primary/central) "aYF" = ( /obj/machinery/power/apc{ - dir = 2; - name = "Central Hall APC"; areastring = "/area/hallway/primary/central"; + name = "Central Hall APC"; pixel_y = -24 }, /obj/structure/cable, @@ -21781,28 +22719,24 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "aYH" = ( -/obj/structure/table, -/obj/item/razor, -/obj/structure/window{ - dir = 1 +/obj/structure/table/wood, +/obj/item/paper/fluff{ + info = "Renovation Notice

The bar layout for the station is very old. We've decided to give it a facelift after our partnership with IKEA Intergalactic?.
  • We added some sweet retro arcade machines and much more seating area. We removed the stage since it hasn't ever been used.
  • You can run this place like a restaurant now that you have tables. Go whip up a menu with the Chef. You have a condiments table and your Requests Console has been moved so a noticeboard can be placed there. Take tickets from customers and pin them on the noticeboard for the Chef.
  • We hope you like the new bar!"; + name = "Renovation Notice - Bar"; + pixel_x = -5; + pixel_y = 3 }, -/obj/effect/turf_decal/tile/blue{ +/obj/item/reagent_containers/food/drinks/shaker, +/obj/item/stack/spacecash/c100, +/obj/item/stack/spacecash/c100, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"aYI" = ( +/obj/structure/chair/comfy/black{ dir = 4 }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/locker) -"aYI" = ( -/obj/structure/chair/stool/bar, -/obj/effect/landmark/start/assistant, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, /turf/open/floor/plasteel, -/area/crew_quarters/bar) +/area/crew_quarters/dorms) "aYJ" = ( /obj/machinery/light_switch{ pixel_y = -25 @@ -21850,9 +22784,9 @@ /turf/open/floor/plasteel, /area/hydroponics) "aYP" = ( -/obj/structure/reagent_dispensers/watertank/high, +/obj/structure/table/wood/poker, /turf/open/floor/plasteel, -/area/hydroponics) +/area/crew_quarters/dorms) "aYQ" = ( /obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/tile/green{ @@ -21869,25 +22803,24 @@ /turf/open/floor/plasteel, /area/hydroponics) "aYS" = ( -/obj/structure/closet, -/obj/item/clothing/under/suit_jacket/female{ - pixel_x = 3; - pixel_y = 1 +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1; + pixel_x = 5 }, -/obj/item/clothing/under/suit_jacket/really_black{ - pixel_x = -2 - }, -/obj/structure/window{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ +/obj/machinery/light/small{ dir = 4 }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/structure/table/glass, +/obj/item/razor{ + pixel_x = 2; + pixel_y = 3 }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/locker) +/obj/item/reagent_containers/rag/towel/random, +/obj/item/reagent_containers/rag/towel/random, +/obj/item/reagent_containers/rag/towel/random, +/obj/item/reagent_containers/rag/towel/random, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet) "aYT" = ( /obj/machinery/camera{ c_tag = "Hydroponics South"; @@ -21907,11 +22840,17 @@ /turf/open/floor/carpet, /area/library) "aYX" = ( -/obj/structure/window/reinforced{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, /turf/open/floor/plasteel, @@ -21923,16 +22862,15 @@ /turf/open/floor/carpet, /area/library) "aYZ" = ( -/obj/structure/table/wood, -/obj/item/storage/box/evidence, -/obj/item/hand_labeler{ - pixel_x = 5 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/structure/closet/crate/freezer, +/obj/machinery/light/small{ + dir = 8 }, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) "aZa" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 @@ -21940,16 +22878,10 @@ /turf/open/floor/plasteel/grimy, /area/security/detectives_office) "aZb" = ( -/obj/machinery/camera{ - c_tag = "Bar South"; - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, +/obj/structure/table/wood/poker, +/obj/item/toy/cards/deck, /turf/open/floor/plasteel, -/area/crew_quarters/bar) +/area/crew_quarters/dorms) "aZc" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -22040,15 +22972,14 @@ /turf/open/floor/wood, /area/security/vacantoffice) "aZo" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = 11 +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet/locker) +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) "aZp" = ( /obj/structure/rack, /obj/item/electronics/apc, @@ -22083,41 +23014,77 @@ /turf/open/floor/plating, /area/maintenance/port) "aZt" = ( -/obj/structure/toilet{ - pixel_y = 8 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1; + pixel_x = 5 }, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet/locker) +/obj/machinery/light/small, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet) "aZu" = ( /obj/machinery/photocopier, /turf/open/floor/wood, /area/bridge/meeting_room) "aZv" = ( -/obj/machinery/door/airlock{ - name = "Unit 1" +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet/locker) -"aZw" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet/locker) -"aZx" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ +/obj/structure/table, +/obj/machinery/chem_dispenser/drinks/beer{ dir = 8 }, -/turf/open/floor/plasteel/cafeteria, +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"aZw" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/requests_console{ + department = "Bar"; + departmentType = 2; + pixel_x = -30; + pixel_y = 45; + receive_ore_updates = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"aZx" = ( +/obj/structure/closet{ + name = "Suit Closet" + }, +/obj/item/clothing/under/suit_jacket/white, +/obj/item/clothing/under/suit_jacket/tan, +/obj/item/clothing/under/suit_jacket/red, +/obj/item/clothing/under/suit_jacket/really_black, +/obj/item/clothing/under/suit_jacket/navy, +/obj/item/clothing/under/suit_jacket/green, +/obj/item/clothing/under/suit_jacket/female, +/obj/item/clothing/under/suit_jacket/checkered, +/obj/item/clothing/under/suit_jacket/charcoal, +/obj/item/clothing/under/suit_jacket/burgundy, +/obj/item/clothing/under/suit_jacket, +/obj/item/clothing/under/lawyer/black, +/obj/item/clothing/under/lawyer/blacksuit, +/obj/item/clothing/under/lawyer/blue, +/obj/item/clothing/under/lawyer/bluesuit, +/obj/item/clothing/under/lawyer/female, +/obj/item/clothing/under/lawyer/purpsuit, +/obj/item/clothing/under/lawyer/really_black, +/obj/item/clothing/under/lawyer/red, +/turf/open/floor/plasteel, /area/crew_quarters/locker) "aZy" = ( /obj/machinery/camera{ - c_tag = "Conference Room"; - dir = 2 + c_tag = "Conference Room" }, /turf/open/floor/wood, /area/bridge/meeting_room) @@ -22278,53 +23245,50 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "aZZ" = ( -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"baa" = ( +/obj/structure/chair/comfy/brown{ dir = 1 }, /turf/open/floor/plasteel, -/area/crew_quarters/bar) +/area/crew_quarters/dorms) "bab" = ( -/obj/machinery/light, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ +/obj/structure/chair/comfy/black{ dir = 1 }, /turf/open/floor/plasteel, -/area/crew_quarters/bar) +/area/crew_quarters/dorms) "bac" = ( -/obj/machinery/newscaster{ - pixel_y = -28 +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable{ + icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/crew_quarters/bar) +/area/crew_quarters/dorms) "bad" = ( -/obj/machinery/light, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) +/obj/structure/rack, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/effect/decal/cleanable/cobweb, +/obj/item/clothing/under/color/grey, +/turf/open/floor/plating, +/area/maintenance/port/aft) "bae" = ( -/obj/structure/noticeboard{ - pixel_y = -27 +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/disposalpipe/segment{ + dir = 5 }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "baf" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -22338,28 +23302,29 @@ /turf/open/floor/wood, /area/crew_quarters/heads/captain) "bag" = ( -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 +/obj/structure/disposalpipe/segment{ + dir = 10 }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "bah" = ( -/obj/structure/extinguisher_cabinet{ - pixel_y = -30 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "bai" = ( -/obj/machinery/light/small, +/obj/machinery/camera{ + c_tag = "Bar"; + dir = 8 + }, +/obj/structure/table, +/obj/machinery/chem_dispenser/drinks{ + dir = 8 + }, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 @@ -22455,10 +23420,9 @@ /turf/open/floor/wood, /area/library) "bat" = ( -/obj/structure/table/wood, -/obj/item/pen, -/turf/open/floor/wood, -/area/library) +/obj/structure/reagent_dispensers/keg/semen, +/turf/open/floor/plating, +/area/maintenance/bar) "bau" = ( /obj/structure/chair/comfy/black{ dir = 4 @@ -22476,15 +23440,16 @@ /turf/open/floor/wood, /area/library) "baw" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = 11 +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/item/reagent_containers/food/snacks/pie/cream, +/obj/structure/noticeboard{ + desc = "Tickets for food orders will be placed here. The Chef should make the order and hand it to a waiter, waitress or just let the barkeep serve it."; + name = "Food Orders"; + pixel_y = 26 }, -/obj/structure/mirror{ - pixel_x = 28 - }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet/locker) +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) "bax" = ( /obj/structure/chair/comfy/black{ dir = 4 @@ -22523,9 +23488,9 @@ /area/hallway/secondary/exit) "baD" = ( /obj/machinery/power/apc{ + areastring = "/area/hallway/secondary/exit"; dir = 8; name = "Escape Hallway APC"; - areastring = "/area/hallway/secondary/exit"; pixel_x = -25 }, /obj/structure/cable{ @@ -22598,9 +23563,9 @@ icon_state = "1-2" }, /obj/machinery/power/apc{ + areastring = "/area/crew_quarters/toilet/locker"; dir = 4; name = "Locker Restrooms APC"; - areastring = "/area/crew_quarters/toilet/locker"; pixel_x = 27; pixel_y = 2 }, @@ -22616,8 +23581,28 @@ /turf/open/floor/plating, /area/maintenance/port) "baO" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/freezer, +/obj/structure/toilet{ + dir = 4 + }, +/obj/structure/mirror{ + pixel_y = 32 + }, +/obj/structure/sink{ + dir = 1; + pixel_y = 25 + }, +/obj/machinery/button/door{ + id = "LockerShitter1"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 14; + pixel_y = 38; + specialfunctions = 4 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/blue, /area/crew_quarters/toilet/locker) "baP" = ( /obj/structure/table/wood, @@ -22808,24 +23793,28 @@ /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/locker) "bbr" = ( -/obj/machinery/camera{ - c_tag = "Locker Room South"; +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/window, +/obj/structure/window{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, /turf/open/floor/plasteel, /area/crew_quarters/locker) "bbs" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/light, +/obj/effect/landmark/event_spawn, +/obj/effect/landmark/xmastree, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) +/turf/open/floor/wood, +/area/crew_quarters/bar) "bbt" = ( /obj/structure/closet/crate, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -22833,9 +23822,9 @@ /area/quartermaster/warehouse) "bbu" = ( /obj/machinery/power/apc{ + areastring = "/area/crew_quarters/heads/captain"; dir = 1; name = "Captain's Office APC"; - areastring = "/area/crew_quarters/heads/captain"; pixel_y = 24 }, /obj/structure/cable{ @@ -22863,7 +23852,7 @@ /obj/machinery/door/airlock/public/glass{ name = "Diner" }, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/dark, /area/crew_quarters/bar) "bby" = ( /obj/structure/sign/barsign, @@ -22875,14 +23864,14 @@ }, /area/hallway/primary/starboard) "bbA" = ( -/obj/machinery/camera{ - c_tag = "Starboard Primary Hallway 2"; - dir = 2 +/obj/machinery/vending/assist, +/obj/structure/sign/poster/contraband/grey_tide{ + desc = "A poster promoting a regression to ape-like intelligence for Assistants, suggesting they break, loot and murder enough to make even a caveman blush."; + pixel_x = -32; + poster_item_desc = "Nanotrasen does not condone such messages. Please don't regress to ape-level intelligence as this poster suggests." }, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/hallway/primary/starboard) +/turf/open/floor/plasteel, +/area/storage/primary) "bbB" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -22931,9 +23920,9 @@ /area/hallway/secondary/exit) "bbI" = ( /obj/machinery/power/apc{ + areastring = "/area/security/vacantoffice"; dir = 8; name = "Vacant Office APC"; - areastring = "/area/security/vacantoffice"; pixel_x = -24 }, /obj/structure/cable{ @@ -22960,9 +23949,10 @@ /area/maintenance/port) "bbL" = ( /obj/machinery/door/airlock{ - name = "Unit 2" + id_tag = "LockerShitter1"; + name = "Unit 1" }, -/turf/open/floor/plasteel/freezer, +/turf/open/floor/mineral/titanium/blue, /area/crew_quarters/toilet/locker) "bbM" = ( /obj/item/book/manual/wiki/security_space_law, @@ -22970,16 +23960,20 @@ /turf/open/floor/carpet, /area/bridge/meeting_room) "bbN" = ( -/obj/machinery/washing_machine, -/obj/machinery/light, -/obj/effect/turf_decal/tile/blue{ - dir = 4 +/obj/machinery/button/door{ + id = "Bath3"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 14; + pixel_y = 38; + specialfunctions = 4 }, -/obj/effect/turf_decal/tile/blue{ +/obj/machinery/light/small{ dir = 8 }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/locker) +/obj/machinery/recharge_station, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet) "bbO" = ( /obj/machinery/washing_machine, /obj/effect/turf_decal/tile/blue{ @@ -22997,13 +23991,20 @@ /turf/open/floor/plasteel, /area/quartermaster/warehouse) "bbQ" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/bottle/whiskey{ - pixel_x = 3 +/obj/item/paper_bin/bundlenatural{ + pixel_x = 6; + pixel_y = 4 }, -/obj/item/lighter, -/turf/open/floor/carpet, -/area/security/detectives_office) +/obj/item/paper_bin{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/pen/fountain, +/obj/structure/table, +/obj/item/pen/fourcolor, +/obj/item/stamp/hop, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/hop) "bbR" = ( /turf/open/floor/plasteel, /area/quartermaster/office) @@ -23020,12 +24021,19 @@ /turf/open/floor/carpet, /area/security/detectives_office) "bbU" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Detective Maintenance"; - req_access_txt = "4" +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, -/turf/open/floor/plating, -/area/maintenance/port) +/obj/effect/turf_decal/tile/blue, +/obj/structure/window, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) "bbV" = ( /obj/machinery/firealarm{ dir = 8; @@ -23181,31 +24189,46 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bcr" = ( -/obj/machinery/camera{ - c_tag = "Starboard Primary Hallway"; - dir = 2 +/obj/machinery/smartfridge/disks{ + pixel_y = 2 + }, +/obj/structure/table, +/obj/item/radio/intercom{ + pixel_y = 25 }, /turf/open/floor/plasteel, -/area/hallway/primary/starboard) +/area/hydroponics) "bcs" = ( /obj/machinery/firealarm{ - dir = 2; pixel_y = 24 }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bct" = ( -/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/structure/mirror{ + pixel_x = 28 + }, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/locker) "bcu" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Locker Room Maintenance"; - req_access_txt = "12" +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/port) +/obj/structure/window, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) "bcv" = ( /obj/structure/extinguisher_cabinet{ pixel_x = -5; @@ -23214,13 +24237,26 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bcw" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/window, +/obj/structure/window{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel, /area/crew_quarters/locker) "bcx" = ( /obj/machinery/camera{ - c_tag = "Starboard Primary Hallway 5"; - dir = 2 + c_tag = "Starboard Primary Hallway 5" }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) @@ -23293,12 +24329,13 @@ /turf/open/floor/plating, /area/maintenance/port) "bcJ" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 +/obj/machinery/door/airlock{ + desc = "To keep the station within regulations, space IKEA requires one storage cupboard for their Nanotrasen partnership to continue."; + id_tag = "MaintDorm1"; + name = "Furniture Storage" }, -/obj/structure/closet/crate/freezer, -/turf/open/floor/plasteel, -/area/quartermaster/warehouse) +/turf/open/floor/plasteel/dark, +/area/maintenance/port) "bcK" = ( /obj/structure/rack, /obj/effect/spawner/lootdrop/maintenance, @@ -23326,12 +24363,21 @@ /turf/open/floor/carpet, /area/bridge/meeting_room) "bcO" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = 11 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet/locker) +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/theatre) "bcP" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 @@ -23351,21 +24397,20 @@ /turf/open/floor/plasteel, /area/quartermaster/warehouse) "bcS" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/effect/landmark/blobstart, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/locker) +"bcT" = ( +/obj/structure/window/reinforced{ + dir = 8 }, +/obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/light/small{ - dir = 4 +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, /turf/open/floor/plasteel, -/area/quartermaster/warehouse) -"bcT" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/quartermaster/warehouse) +/area/crew_quarters/locker) "bcU" = ( /obj/structure/table/wood, /turf/open/floor/wood, @@ -23379,6 +24424,14 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/grimy, /area/security/detectives_office) +"bcW" = ( +/obj/structure/table/wood, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/wood, +/area/security/vacantoffice) "bcX" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -23410,18 +24463,14 @@ /area/bridge/meeting_room) "bdb" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white/side{ - dir = 2 - }, +/turf/open/floor/plasteel/white/side, /area/hallway/primary/starboard) "bdc" = ( /obj/structure/extinguisher_cabinet{ pixel_y = -30 }, /obj/machinery/light, -/turf/open/floor/plasteel/white/corner{ - dir = 2 - }, +/turf/open/floor/plasteel/white/corner, /area/hallway/primary/starboard) "bdd" = ( /obj/machinery/vending/cola/random, @@ -23655,11 +24704,32 @@ /turf/open/floor/plating, /area/maintenance/port) "bdE" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/obj/structure/closet/crate/wooden/toy, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ dir = 8 }, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) +/obj/structure/sign/poster/contraband/clown{ + pixel_y = -32 + }, +/obj/structure/sign/poster/contraband/clown{ + pixel_y = -32 + }, +/obj/structure/sign/poster/contraband/clown{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/theatre) "bdF" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -23683,8 +24753,15 @@ /turf/open/floor/carpet, /area/bridge/meeting_room) "bdJ" = ( -/obj/machinery/door/airlock{ - name = "Unit 3" +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/structure/mirror{ + pixel_x = 28 }, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/locker) @@ -23696,15 +24773,20 @@ /turf/open/floor/carpet, /area/bridge/meeting_room) "bdL" = ( -/obj/effect/landmark/blobstart, -/obj/item/clothing/suit/ianshirt, -/obj/structure/closet, -/turf/open/floor/plating, -/area/maintenance/port) +/obj/machinery/camera{ + c_tag = "Locker Room South"; + dir = 8 + }, +/obj/structure/closet/secure_closet/personal, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) "bdM" = ( -/obj/item/latexballon, -/turf/open/floor/plating, -/area/maintenance/port) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) "bdN" = ( /obj/machinery/door/airlock/medical{ name = "Morgue"; @@ -23752,9 +24834,9 @@ /area/quartermaster/warehouse) "bdT" = ( /obj/machinery/power/apc{ + areastring = "/area/maintenance/disposal"; dir = 8; name = "Disposal APC"; - areastring = "/area/maintenance/disposal"; pixel_x = -24 }, /obj/structure/cable{ @@ -23769,13 +24851,39 @@ /obj/structure/closet/crate/medical, /turf/open/floor/plasteel, /area/quartermaster/warehouse) +"bdV" = ( +/obj/structure/toilet{ + dir = 4 + }, +/obj/structure/mirror{ + pixel_y = 32 + }, +/obj/structure/sink{ + dir = 1; + pixel_y = 25 + }, +/obj/machinery/button/door{ + id = "LockerShitter2"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 14; + pixel_y = 38; + specialfunctions = 4 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet/locker) "bdW" = ( -/obj/item/clothing/gloves/color/rainbow, -/obj/item/clothing/head/soft/rainbow, -/obj/item/clothing/shoes/sneakers/rainbow, -/obj/item/clothing/under/color/rainbow, -/turf/open/floor/plating, -/area/maintenance/port) +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) "bdX" = ( /obj/item/storage/fancy/donut_box, /obj/structure/table, @@ -23835,9 +24943,8 @@ /area/ai_monitored/turret_protected/ai_upload) "bed" = ( /obj/machinery/power/apc/highcap/five_k{ - dir = 2; - name = "Upload APC"; areastring = "/area/ai_monitored/turret_protected/ai_upload"; + name = "Upload APC"; pixel_y = -24 }, /obj/structure/cable, @@ -23871,9 +24978,7 @@ /obj/item/aiModule/supplied/oxygen, /obj/item/aiModule/zeroth/oneHuman, /obj/machinery/door/window{ - base_state = "left"; dir = 8; - icon_state = "left"; name = "High-Risk Modules"; req_access_txt = "20" }, @@ -23991,12 +25096,12 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bev" = ( -/obj/machinery/light, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/structure/chair/stool{ + pixel_y = 8 }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "bew" = ( /obj/structure/cable{ icon_state = "2-4" @@ -24087,9 +25192,7 @@ /area/quartermaster/sorting) "beG" = ( /obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/red{ - dir = 2 - }, +/obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel, /area/hallway/secondary/exit) "beH" = ( @@ -24258,14 +25361,17 @@ /area/medical/morgue) "beZ" = ( /obj/machinery/mineral/stacking_unit_console{ - dir = 2; machinedir = 8 }, /turf/closed/wall, /area/maintenance/disposal) "bfa" = ( -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet/locker) +/obj/structure/chair/sofa/left{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/wood, +/area/crew_quarters/bar) "bfb" = ( /obj/structure/sign/warning/vacuum/external{ pixel_y = 32 @@ -24278,9 +25384,9 @@ /area/chapel/main) "bfc" = ( /obj/machinery/power/apc{ + areastring = "/area/crew_quarters/locker"; dir = 1; name = "Locker Room APC"; - areastring = "/area/crew_quarters/locker"; pixel_y = 24 }, /obj/structure/cable{ @@ -24299,9 +25405,17 @@ /turf/open/floor/plating, /area/maintenance/port) "bfe" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/port) +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/window{ + dir = 1 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/locker) "bff" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 @@ -24343,9 +25457,8 @@ dir = 9 }, /obj/machinery/power/apc{ - dir = 2; - name = "Cargo Bay APC"; areastring = "/area/quartermaster/storage"; + name = "Cargo Bay APC"; pixel_x = 1; pixel_y = -24 }, @@ -24531,9 +25644,8 @@ /area/hallway/primary/starboard) "bfP" = ( /obj/machinery/power/apc{ - dir = 2; - name = "Starboard Primary Hallway APC"; areastring = "/area/hallway/primary/starboard"; + name = "Starboard Primary Hallway APC"; pixel_y = -24 }, /obj/structure/cable, @@ -24681,13 +25793,17 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bgi" = ( -/obj/machinery/camera{ - c_tag = "Arrivals Bay 3 & 4"; - dir = 1 +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/space_up{ + pixel_y = -32 }, -/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, -/area/hallway/secondary/entry) +/area/hallway/primary/central) "bgj" = ( /obj/machinery/conveyor{ dir = 8; @@ -24702,6 +25818,13 @@ }, /turf/open/floor/plating, /area/maintenance/disposal) +"bgl" = ( +/obj/machinery/door/airlock{ + id_tag = "LockerShitter2"; + name = "Unit 2" + }, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet/locker) "bgm" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 @@ -24723,9 +25846,9 @@ icon_state = "1-2" }, /obj/machinery/power/apc{ + areastring = "/area/science/robotics/mechbay"; dir = 4; name = "Mech Bay APC"; - areastring = "/area/science/robotics/mechbay"; pixel_x = 26 }, /obj/structure/cable{ @@ -24752,18 +25875,16 @@ /turf/open/floor/plating, /area/maintenance/port) "bgr" = ( -/obj/machinery/door/airlock{ - name = "Unit 4" +/obj/machinery/camera{ + c_tag = "Locker Room Toilets"; + dir = 8 }, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/locker) "bgs" = ( -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet/locker) +/obj/item/chair/wood, +/turf/open/floor/plating, +/area/maintenance/port) "bgt" = ( /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, @@ -24793,6 +25914,11 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/port) +"bgx" = ( +/obj/structure/closet/wardrobe/cargotech, +/obj/item/radio/headset/headset_cargo, +/turf/open/floor/plasteel, +/area/quartermaster/storage) "bgy" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 @@ -24993,9 +26119,9 @@ /area/hallway/primary/central) "bgZ" = ( /obj/machinery/power/apc{ + areastring = "/area/medical/chemistry"; dir = 1; name = "Chemistry APC"; - areastring = "/area/medical/chemistry"; pixel_y = 24 }, /obj/structure/cable{ @@ -25019,11 +26145,9 @@ /area/medical/chemistry) "bhc" = ( /obj/machinery/camera{ - c_tag = "Chemistry"; - dir = 2 + c_tag = "Chemistry" }, /obj/machinery/firealarm{ - dir = 2; pixel_y = 24 }, /obj/machinery/chem_heater, @@ -25065,8 +26189,7 @@ /area/security/checkpoint/medical) "bhj" = ( /obj/machinery/camera{ - c_tag = "Security Post - Medbay"; - dir = 2 + c_tag = "Security Post - Medbay" }, /obj/machinery/requests_console{ department = "Security"; @@ -25143,9 +26266,9 @@ /area/medical/morgue) "bhp" = ( /obj/machinery/power/apc{ + areastring = "/area/medical/morgue"; dir = 1; name = "Morgue APC"; - areastring = "/area/medical/morgue"; pixel_y = 24 }, /obj/structure/cable{ @@ -25355,6 +26478,11 @@ }, /turf/open/floor/plating, /area/maintenance/disposal) +"bhK" = ( +/obj/structure/table/wood/fancy/royalblue, +/obj/item/crowbar/red, +/turf/open/floor/plating, +/area/maintenance/port) "bhL" = ( /obj/machinery/mineral/stacking_machine{ input_dir = 1; @@ -25384,12 +26512,32 @@ }, /turf/open/floor/plating, /area/maintenance/port) -"bhQ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +"bhP" = ( +/obj/structure/closet/crate, +/obj/item/stack/sheet/mineral/wood/fifty{ + amount = 20 }, -/turf/closed/wall, -/area/crew_quarters/toilet/locker) +/turf/open/floor/plating, +/area/maintenance/port) +"bhQ" = ( +/obj/structure/closet, +/obj/item/stack/tile/carpet/royalblue{ + amount = 24 + }, +/obj/item/stack/tile/carpet/green{ + amount = 24 + }, +/obj/item/stack/tile/carpet/purple{ + amount = 24 + }, +/obj/item/stack/tile/carpet/orange{ + amount = 24 + }, +/obj/item/stack/tile/wood{ + amount = 24 + }, +/turf/open/floor/plating, +/area/maintenance/port) "bhR" = ( /obj/structure/grille, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -25450,7 +26598,6 @@ /area/quartermaster/storage) "bhZ" = ( /obj/machinery/door/window/eastleft{ - dir = 4; icon_state = "right"; name = "Incoming Mail"; req_access_txt = "50" @@ -25472,8 +26619,6 @@ dir = 8 }, /obj/item/radio/intercom{ - freerange = 0; - frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29 }, @@ -25627,9 +26772,16 @@ /turf/open/floor/plasteel/white, /area/medical/chemistry) "bit" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/obj/machinery/light, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/bedsheetbin/color, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/locker) "biu" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, @@ -25767,6 +26919,19 @@ "biL" = ( /turf/open/floor/plasteel/white, /area/science/robotics/lab) +"biM" = ( +/obj/machinery/button/door{ + desc = "Alright, GAMER! Want to take your PWRGAME addiction to the MAX? Just smash this button with your chubby chetto encrusted hands an- oh, you broke the switch. Good job, idiot."; + id = "RIPFUN"; + name = "Powerful Gamer Toggle"; + normaldoorcontrol = 1; + pixel_x = -24; + pixel_y = 7; + specialfunctions = 4 + }, +/obj/structure/table_frame/wood, +/turf/open/floor/plating, +/area/maintenance/port) "biN" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -25779,11 +26944,9 @@ "biO" = ( /obj/machinery/camera{ c_tag = "Robotics Lab"; - dir = 2; network = list("ss13","rd") }, /obj/machinery/button/door{ - dir = 2; id = "robotics"; name = "Shutters Control Button"; pixel_x = 6; @@ -25830,8 +26993,7 @@ /area/science/research) "biS" = ( /obj/machinery/camera{ - c_tag = "Research Division Access"; - dir = 2 + c_tag = "Research Division Access" }, /obj/structure/sink{ dir = 4; @@ -25877,12 +27039,10 @@ "biX" = ( /obj/machinery/camera{ c_tag = "Research and Development"; - dir = 2; network = list("ss13","rd"); pixel_x = 22 }, /obj/machinery/button/door{ - dir = 2; id = "rnd"; name = "Shutters Control Button"; pixel_x = -6; @@ -25902,6 +27062,10 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/starboard) +"biZ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plating, +/area/maintenance/port) "bja" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -26133,6 +27297,10 @@ /obj/structure/closet/wardrobe/black, /turf/open/floor/plating, /area/maintenance/central) +"bjD" = ( +/obj/structure/bed, +/turf/open/floor/plating, +/area/maintenance/port) "bjE" = ( /obj/machinery/airalarm{ dir = 4; @@ -26268,9 +27436,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, -/obj/effect/turf_decal/tile/blue{ - dir = 2 - }, +/obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bjV" = ( @@ -26283,6 +27449,11 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"bjW" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/table/wood/fancy/purple, +/turf/open/floor/plating, +/area/maintenance/port) "bjX" = ( /obj/structure/table, /obj/machinery/recharger{ @@ -26327,8 +27498,8 @@ "bkb" = ( /obj/machinery/camera{ c_tag = "Medbay Morgue"; - network = list("ss13","medbay"); - dir = 8 + dir = 8; + network = list("ss13","medbay") }, /obj/machinery/airalarm{ dir = 8; @@ -26344,10 +27515,23 @@ /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, /area/storage/emergency/starboard) +"bke" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/junction/flip, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "bkf" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, /area/storage/emergency/starboard) +"bkg" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/maintenance/port) "bkh" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/circuit, @@ -26372,7 +27556,6 @@ "bkj" = ( /obj/structure/closet/emcloset, /obj/machinery/airalarm{ - dir = 2; pixel_y = 24 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -26388,6 +27571,22 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/white, /area/science/robotics/lab) +"bkl" = ( +/obj/effect/turf_decal/tile/blue{ + alpha = 255 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + alpha = 255; + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "bkm" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 @@ -26708,9 +27907,9 @@ /area/maintenance/central) "bkX" = ( /obj/machinery/power/apc{ + areastring = "/area/bridge/meeting_room"; dir = 4; name = "Conference Room APC"; - areastring = "/area/bridge/meeting_room"; pixel_x = 24 }, /obj/structure/cable{ @@ -26867,8 +28066,8 @@ /obj/structure/table/reinforced, /obj/machinery/camera{ c_tag = "Medbay Foyer"; - network = list("ss13","medbay"); - dir = 8 + dir = 8; + network = list("ss13","medbay") }, /obj/machinery/cell_charger, /turf/open/floor/plasteel/white, @@ -26881,9 +28080,9 @@ icon_state = "4-8" }, /obj/machinery/power/apc{ + areastring = "/area/storage/emergency/starboard"; dir = 1; name = "Starboard Emergency Storage APC"; - areastring = "/area/storage/emergency/starboard"; pixel_y = 24 }, /obj/structure/cable{ @@ -26896,9 +28095,9 @@ /area/maintenance/department/medical/morgue) "blp" = ( /obj/machinery/power/apc{ + areastring = "/area/security/checkpoint/medical"; dir = 8; name = "Medbay Security APC"; - areastring = "/area/security/checkpoint/medical"; pixel_x = -25 }, /obj/structure/cable{ @@ -26945,12 +28144,9 @@ /turf/open/floor/plasteel, /area/science/robotics/mechbay) "blt" = ( -/obj/machinery/recharge_station, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/robotics/mechbay) +/obj/structure/sign/poster/contraband/tools, +/turf/closed/wall, +/area/storage/primary) "blu" = ( /obj/machinery/computer/mech_bay_power_console{ dir = 4 @@ -27047,8 +28243,6 @@ /obj/item/healthanalyzer, /obj/item/healthanalyzer, /obj/item/radio/intercom{ - freerange = 0; - frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29 }, @@ -27110,6 +28304,17 @@ /obj/effect/landmark/start/roboticist, /turf/open/floor/plasteel, /area/science/robotics/lab) +"blN" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + alpha = 255; + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "blO" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, @@ -27302,6 +28507,16 @@ }, /turf/open/floor/plasteel, /area/quartermaster/sorting) +"bml" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/port) "bmm" = ( /obj/structure/cable{ icon_state = "1-2" @@ -27484,7 +28699,6 @@ "bmJ" = ( /obj/item/radio/intercom{ broadcasting = 1; - freerange = 0; frequency = 1485; listening = 0; name = "Station Intercom (Medbay)"; @@ -27643,6 +28857,38 @@ }, /turf/closed/wall/r_wall, /area/science/robotics/mechbay) +"bnd" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + alpha = 255; + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bne" = ( +/obj/machinery/button/door{ + desc = "A remote control switch for the genetics doors."; + id = "GeneticsDoor"; + name = "Genetics Exit Button"; + normaldoorcontrol = 1; + pixel_x = 8; + pixel_y = 24 + }, +/obj/structure/table, +/obj/item/book/manual/wiki/medical_cloning{ + pixel_y = 6 + }, +/obj/item/storage/box/rxglasses{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/box/bodybags, +/obj/item/pen, +/turf/open/floor/plasteel/white, +/area/medical/genetics) "bnf" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 @@ -27731,9 +28977,9 @@ }, /obj/item/stock_parts/scanning_module, /obj/machinery/power/apc{ + areastring = "/area/science/lab"; dir = 4; name = "Research Lab APC"; - areastring = "/area/science/lab"; pixel_x = 26 }, /obj/structure/cable{ @@ -27779,8 +29025,12 @@ /turf/closed/wall, /area/maintenance/starboard) "bnt" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/structure/rack, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 3; + name = "3maintenance loot spawner" }, /turf/open/floor/plating, /area/maintenance/starboard/aft) @@ -27946,9 +29196,7 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bnN" = ( -/obj/effect/turf_decal/tile/red{ - dir = 2 - }, +/obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel, /area/hallway/primary/central) "bnO" = ( @@ -28076,10 +29324,15 @@ /turf/open/floor/carpet, /area/crew_quarters/heads/captain) "bnZ" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green, -/turf/open/floor/carpet, -/area/crew_quarters/heads/captain) +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=HOP"; + location = "CHE" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "boa" = ( /obj/structure/toilet{ dir = 4 @@ -28170,7 +29423,6 @@ pixel_y = -22 }, /obj/machinery/requests_console{ - announcementConsole = 0; department = "Medbay"; departmentType = 1; name = "Medbay RC"; @@ -28221,6 +29473,12 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"bop" = ( +/obj/structure/closet/wardrobe/white, +/obj/item/clothing/under/kilt, +/obj/item/clothing/under/janimaid, +/turf/open/floor/plasteel/white, +/area/medical/genetics) "boq" = ( /obj/structure/bed/roller, /obj/effect/turf_decal/tile/blue, @@ -28239,15 +29497,25 @@ "bos" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/power/apc{ + areastring = "/area/science/robotics/lab"; dir = 8; name = "Robotics Lab APC"; - areastring = "/area/science/robotics/lab"; pixel_x = -25 }, /obj/structure/cable, /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/white, /area/science/robotics/lab) +"bot" = ( +/obj/structure/closet/wardrobe/grey, +/obj/item/clothing/head/beret/black, +/obj/item/clothing/head/beret/black, +/obj/item/clothing/head/beret, +/obj/item/clothing/head/beret, +/obj/item/clothing/under/assistantformal, +/obj/item/clothing/under/skirt/black, +/turf/open/floor/plasteel/white, +/area/medical/genetics) "bou" = ( /turf/open/floor/plasteel, /area/science/robotics/lab) @@ -28402,9 +29670,7 @@ /turf/open/floor/plasteel/dark, /area/science/robotics/lab) "boM" = ( -/turf/open/floor/plasteel/white/corner{ - dir = 2 - }, +/turf/open/floor/plasteel/white/corner, /area/science/research) "boN" = ( /obj/effect/turf_decal/tile/brown{ @@ -28414,9 +29680,7 @@ /area/quartermaster/office) "boO" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white/side{ - dir = 2 - }, +/turf/open/floor/plasteel/white/side, /area/science/research) "boP" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -28492,20 +29756,16 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "boY" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/vending/cola/black, +/obj/structure/sign/poster/contraband/sun_kist{ + pixel_y = 32 }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) +/turf/open/floor/wood, +/area/crew_quarters/bar) "boZ" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/northleft{ dir = 8; - icon_state = "left"; name = "Reception Window" }, /obj/machinery/door/window/brigdoor{ @@ -28513,7 +29773,6 @@ dir = 4; icon_state = "rightsecure"; name = "Head of Personnel's Desk"; - req_access = null; req_access_txt = "57" }, /obj/structure/disposalpipe/segment{ @@ -28619,13 +29878,18 @@ /turf/open/floor/carpet, /area/crew_quarters/heads/captain) "bpk" = ( -/obj/structure/closet/secure_closet/captains, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 +/obj/machinery/camera{ + c_tag = "Genetics Cloning"; + dir = 4; + network = list("ss13","medbay") }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/captain) +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, +/obj/structure/closet/secure_closet/personal/patient, +/turf/open/floor/plasteel/white, +/area/medical/genetics) "bpl" = ( /obj/structure/table/wood, /obj/item/storage/box/matches, @@ -28801,9 +30065,9 @@ /area/medical/chemistry) "bpG" = ( /obj/machinery/power/apc{ + areastring = "/area/medical/genetics"; dir = 1; name = "Genetics APC"; - areastring = "/area/medical/genetics"; pixel_y = 24 }, /obj/structure/cable{ @@ -28817,7 +30081,6 @@ /obj/item/radio/headset/headset_medsci, /obj/machinery/requests_console{ department = "Genetics"; - departmentType = 0; name = "Genetics Requests Console"; pixel_y = 30 }, @@ -28982,6 +30245,12 @@ }, /turf/open/floor/plasteel/dark, /area/science/robotics/lab) +"bqb" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 1 + }, +/turf/open/space/basic, +/area/space/nearstation) "bqc" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel/white, @@ -29183,16 +30452,14 @@ icon_state = "0-4" }, /obj/machinery/power/apc{ + areastring = "/area/engine/gravity_generator"; dir = 8; name = "Gravity Generator APC"; - areastring = "/area/engine/gravity_generator"; pixel_x = -25; pixel_y = 1 }, /obj/structure/table, -/obj/item/paper/guides/jobs/engi/gravity_gen{ - layer = 3 - }, +/obj/item/paper/guides/jobs/engi/gravity_gen, /obj/item/pen/blue, /obj/item/radio/intercom{ name = "Station Intercom (General)"; @@ -29348,8 +30615,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay West"; - network = list("ss13","medbay"); - dir = 2 + network = list("ss13","medbay") }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -29454,9 +30720,7 @@ /obj/structure/cable{ icon_state = "1-8" }, -/obj/effect/turf_decal/tile/blue{ - dir = 2 - }, +/obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bri" = ( @@ -29487,6 +30751,12 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel/white, /area/medical/genetics) +"brl" = ( +/obj/structure/shuttle/engine/heater{ + dir = 1 + }, +/turf/closed/wall/mineral/titanium, +/area/space/nearstation) "brm" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -29533,7 +30803,6 @@ "brq" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/button/door{ - dir = 2; id = "robotics2"; name = "Shutters Control Button"; pixel_x = 24; @@ -29574,7 +30843,6 @@ /area/science/research) "bru" = ( /obj/machinery/firealarm{ - dir = 2; pixel_y = 24 }, /obj/structure/disposalpipe/segment{ @@ -29641,29 +30909,22 @@ /obj/item/pen, /obj/machinery/camera{ c_tag = "Experimentor Lab"; - dir = 2; network = list("ss13","rd") }, /obj/item/hand_labeler, /obj/item/stack/packageWrap, -/turf/open/floor/plasteel/white/side{ - dir = 2 - }, +/turf/open/floor/plasteel/white/side, /area/science/explab) "brA" = ( /obj/structure/table, /obj/item/paper_bin{ pixel_y = 6 }, -/turf/open/floor/plasteel/white/corner{ - dir = 2 - }, +/turf/open/floor/plasteel/white/corner, /area/science/explab) "brB" = ( /obj/structure/closet/l3closet/scientist, -/turf/open/floor/plasteel/white/side{ - dir = 2 - }, +/turf/open/floor/plasteel/white/side, /area/science/explab) "brC" = ( /obj/structure/table, @@ -29673,9 +30934,7 @@ pixel_y = 23 }, /obj/item/radio/off, -/turf/open/floor/plasteel/white/side{ - dir = 2 - }, +/turf/open/floor/plasteel/white/side, /area/science/explab) "brD" = ( /obj/structure/closet/emcloset, @@ -29815,6 +31074,9 @@ "brS" = ( /turf/open/floor/plasteel, /area/crew_quarters/heads/hop) +"brT" = ( +/turf/open/floor/plating, +/area/space/nearstation) "brU" = ( /obj/structure/sign/warning/electricshock{ pixel_y = -32 @@ -29944,7 +31206,6 @@ /area/teleporter) "bsk" = ( /obj/machinery/firealarm{ - dir = 2; pixel_y = 24 }, /obj/machinery/light{ @@ -29957,8 +31218,6 @@ /area/teleporter) "bsl" = ( /obj/item/radio/intercom{ - broadcasting = 0; - listening = 1; name = "Station Intercom (General)"; pixel_y = 20 }, @@ -30011,10 +31270,7 @@ dir = 4 }, /obj/item/radio/intercom{ - broadcasting = 0; - freerange = 0; frequency = 1485; - listening = 1; name = "Station Intercom (Medbay)"; pixel_y = -30 }, @@ -30042,17 +31298,14 @@ /area/medical/medbay/central) "bst" = ( /obj/item/radio/intercom{ - broadcasting = 0; - freerange = 0; frequency = 1485; - listening = 1; name = "Station Intercom (Medbay)"; pixel_x = 30 }, /obj/machinery/camera{ c_tag = "Medbay East"; - network = list("ss13","medbay"); dir = 8; + network = list("ss13","medbay"); pixel_y = -22 }, /turf/open/floor/plasteel/white, @@ -30110,6 +31363,9 @@ dir = 9 }, /area/science/research) +"bsB" = ( +/turf/closed/wall/mineral/titanium, +/area/space/nearstation) "bsC" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel/white, @@ -30162,9 +31418,9 @@ /area/science/explab) "bsI" = ( /obj/machinery/power/apc{ + areastring = "/area/science/explab"; dir = 4; name = "Experimentation Lab APC"; - areastring = "/area/science/explab"; pixel_x = 26 }, /obj/structure/cable, @@ -30213,12 +31469,8 @@ /turf/open/floor/plasteel/dark, /area/science/robotics/lab) "bsP" = ( -/obj/structure/table/optable{ - name = "Robotics Operating Table" - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) +/turf/open/floor/plating/foam, +/area/space/nearstation) "bsQ" = ( /turf/open/floor/plasteel/dark, /area/science/robotics/lab) @@ -30289,8 +31541,7 @@ dir = 4 }, /obj/machinery/camera{ - c_tag = "Research Division North"; - dir = 2 + c_tag = "Research Division North" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -30332,7 +31583,6 @@ /area/science/research) "btf" = ( /obj/machinery/requests_console{ - announcementConsole = 0; department = "Medbay"; departmentType = 1; name = "Medbay RC"; @@ -30355,9 +31605,9 @@ /turf/open/floor/plasteel/white, /area/science/research) "bti" = ( -/obj/structure/closet/secure_closet/personal/patient, -/turf/open/floor/plasteel/white, -/area/medical/genetics) +/obj/effect/spawner/structure/window/shuttle, +/turf/open/floor/plating, +/area/space/nearstation) "btj" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -30368,9 +31618,9 @@ /turf/open/floor/plasteel/white, /area/science/explab) "btk" = ( -/obj/structure/closet/wardrobe/white, -/turf/open/floor/plasteel/white, -/area/medical/genetics) +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/space/nearstation) "btl" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plasteel/white, @@ -30431,7 +31681,6 @@ pixel_y = -8 }, /obj/machinery/button/door{ - dir = 2; id = "QMLoaddoor2"; layer = 4; name = "Loading Doors"; @@ -30504,11 +31753,16 @@ /turf/open/floor/plasteel, /area/science/research) "bty" = ( -/obj/structure/chair{ - dir = 8 +/obj/structure/chair/sofa/right, +/obj/structure/window{ + dir = 1 }, -/turf/open/floor/plasteel, -/area/quartermaster/office) +/obj/structure/sign/poster/contraband/pwr_game{ + pixel_x = -32 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/wood, +/area/crew_quarters/bar) "btz" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/brown{ @@ -30518,8 +31772,7 @@ /area/hallway/primary/central) "btA" = ( /obj/machinery/camera{ - c_tag = "Research Division West"; - dir = 2 + c_tag = "Research Division West" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -30550,13 +31803,21 @@ "btD" = ( /obj/structure/table, /obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 + pixel_x = 1; + pixel_y = 9 }, /obj/item/pen, -/obj/item/stamp/hop, -/turf/open/floor/plasteel, -/area/crew_quarters/heads/hop) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/item/folder/white, +/obj/item/pen/fountain, +/obj/item/stamp/rd{ + pixel_x = 3; + pixel_y = -2 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/heads/hor) "btE" = ( /obj/structure/cable{ icon_state = "1-2" @@ -30591,9 +31852,9 @@ /area/teleporter) "btI" = ( /obj/machinery/power/apc{ + areastring = "/area/teleporter"; dir = 8; name = "Teleporter APC"; - areastring = "/area/teleporter"; pixel_x = -24 }, /obj/structure/cable{ @@ -30679,7 +31940,6 @@ /area/medical/medbay/central) "btS" = ( /obj/machinery/firealarm{ - dir = 2; pixel_y = 24 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -30763,9 +32023,8 @@ "buc" = ( /obj/machinery/light, /obj/machinery/power/apc{ - dir = 2; - name = "Cargo Office APC"; areastring = "/area/quartermaster/office"; + name = "Cargo Office APC"; pixel_x = 1; pixel_y = -24 }, @@ -30773,9 +32032,7 @@ icon_state = "0-4" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/brown{ - dir = 2 - }, +/obj/effect/turf_decal/tile/brown, /turf/open/floor/plasteel, /area/quartermaster/office) "bud" = ( @@ -30820,6 +32077,10 @@ }, /turf/open/floor/plasteel/white, /area/medical/genetics) +"buh" = ( +/obj/structure/girder, +/turf/open/floor/plating, +/area/space/nearstation) "bui" = ( /obj/machinery/airalarm{ dir = 1; @@ -30986,10 +32247,16 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/maintenance/starboard) +"buA" = ( +/obj/structure/frame/computer{ + dir = 1 + }, +/turf/open/floor/plating, +/area/space/nearstation) "buB" = ( /obj/machinery/conveyor_switch/oneway{ - id = "QMLoad"; - dir = 8 + dir = 8; + id = "QMLoad" }, /turf/open/floor/plasteel, /area/quartermaster/storage) @@ -31068,12 +32335,12 @@ /turf/open/floor/plasteel, /area/quartermaster/office) "buJ" = ( -/obj/structure/chair{ - dir = 8 +/obj/structure/chair/sofa, +/obj/structure/window{ + dir = 1 }, -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/quartermaster/office) +/turf/open/floor/wood, +/area/crew_quarters/bar) "buK" = ( /obj/machinery/light{ dir = 4 @@ -31341,20 +32608,12 @@ /turf/open/floor/plasteel/white, /area/medical/sleeper) "bvn" = ( -/obj/machinery/button/door{ - desc = "A remote control switch for the genetics doors."; - id = "GeneticsDoor"; - name = "Genetics Exit Button"; - normaldoorcontrol = 1; - pixel_x = 8; - pixel_y = 24 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/obj/structure/table, -/obj/item/book/manual/wiki/medical_cloning{ - pixel_y = 6 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall, +/area/maintenance/port) "bvo" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -31462,8 +32721,8 @@ "bvB" = ( /obj/machinery/camera{ c_tag = "Genetics Access"; - network = list("ss13","medbay"); dir = 8; + network = list("ss13","medbay"); pixel_y = -22 }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ @@ -31514,6 +32773,20 @@ }, /turf/open/floor/plasteel, /area/quartermaster/qm) +"bvG" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/light/small, +/obj/structure/extinguisher_cabinet{ + pixel_x = 5; + pixel_y = -32 + }, +/turf/open/floor/plasteel/white/side{ + dir = 1 + }, +/area/crew_quarters/fitness) "bvH" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 @@ -31735,20 +33008,10 @@ /area/hallway/primary/central) "bwi" = ( /obj/item/radio/intercom{ - dir = 8; - name = "Station Intercom (General)"; - pixel_x = -28 + pixel_x = -25 }, -/obj/structure/closet/secure_closet/hop, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/heads/hop) +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet) "bwj" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -31925,8 +33188,7 @@ /obj/structure/table/glass, /obj/machinery/camera{ c_tag = "Medbay Cryogenics"; - network = list("ss13","medbay"); - dir = 2 + network = list("ss13","medbay") }, /obj/item/reagent_containers/glass/beaker/cryoxadone, /obj/item/reagent_containers/glass/beaker/cryoxadone, @@ -31942,24 +33204,17 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bwL" = ( -/obj/machinery/camera{ - c_tag = "Genetics Cloning"; - network = list("ss13","medbay"); +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/obj/structure/closet/wardrobe/miner, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/structure/table, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -24 - }, -/obj/item/storage/box/rxglasses{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/box/bodybags, -/obj/item/pen, -/turf/open/floor/plasteel/white, -/area/medical/genetics) +/obj/item/radio/headset/headset_cargo/mining, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) "bwM" = ( /obj/structure/cable{ icon_state = "1-2" @@ -32006,6 +33261,10 @@ dir = 9 }, /area/science/research) +"bwP" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/closed/wall, +/area/maintenance/port) "bwQ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -32188,6 +33447,14 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/aft) +"bxh" = ( +/obj/structure/table, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 4; + name = "4maintenance loot spawner" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "bxi" = ( /obj/machinery/computer/aifixer{ dir = 8 @@ -32275,9 +33542,7 @@ pixel_x = 25; req_access_txt = "47" }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel/white, /area/science/explab) "bxt" = ( @@ -32624,6 +33889,7 @@ pixel_x = -3; pixel_y = 7 }, +/obj/item/pen/fountain, /turf/open/floor/plasteel, /area/quartermaster/qm) "byh" = ( @@ -32793,9 +34059,9 @@ /area/quartermaster/qm) "byA" = ( /obj/machinery/power/apc{ + areastring = "/area/quartermaster/qm"; dir = 1; name = "Quartermaster APC"; - areastring = "/area/quartermaster/qm"; pixel_y = 24 }, /obj/structure/cable{ @@ -32849,9 +34115,9 @@ /area/quartermaster/miningdock) "byF" = ( /obj/machinery/power/apc{ + areastring = "/area/quartermaster/miningdock"; dir = 1; name = "Mining Dock APC"; - areastring = "/area/quartermaster/miningdock"; pixel_y = 24 }, /obj/structure/cable{ @@ -33016,6 +34282,9 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "byV" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, /obj/structure/extinguisher_cabinet{ pixel_x = 5; pixel_y = -32 @@ -33084,7 +34353,6 @@ /obj/item/stack/packageWrap, /obj/item/pen, /obj/machinery/requests_console{ - announcementConsole = 0; department = "Medbay"; departmentType = 1; name = "Medbay RC"; @@ -33209,8 +34477,8 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4; external_pressure_bound = 140; - pressure_checks = 0; - name = "server vent" + name = "server vent"; + pressure_checks = 0 }, /turf/open/floor/circuit/telecomms/server, /area/science/server) @@ -33247,14 +34515,13 @@ "bzy" = ( /obj/machinery/camera{ c_tag = "Server Room"; - dir = 2; network = list("ss13","rd"); pixel_x = 22 }, /obj/machinery/power/apc{ + areastring = "/area/science/server"; dir = 1; name = "Server Room APC"; - areastring = "/area/science/server"; pixel_y = 25 }, /obj/structure/cable{ @@ -33340,18 +34607,14 @@ name = "Central Access" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/yellow{ - dir = 2 - }, +/obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel, /area/hallway/primary/central) "bzH" = ( /obj/structure/table, /obj/item/hemostat, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/white/side{ - dir = 2 - }, +/turf/open/floor/plasteel/white/side, /area/medical/sleeper) "bzI" = ( /obj/structure/disposalpipe/segment, @@ -33378,9 +34641,7 @@ /turf/open/floor/plasteel/white, /area/medical/sleeper) "bzL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel/white, /area/crew_quarters/heads/hor) "bzM" = ( @@ -33452,9 +34713,7 @@ /area/quartermaster/qm) "bzU" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/effect/turf_decal/tile/blue{ - dir = 2 - }, +/obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel/white, /area/medical/sleeper) "bzV" = ( @@ -33561,11 +34820,11 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bAj" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=HOP"; - location = "CHE" +/obj/structure/disposalpipe/trunk{ + dir = 1 }, -/turf/open/floor/plasteel, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/dark, /area/hallway/primary/central) "bAk" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ @@ -33613,9 +34872,9 @@ icon_state = "4-8" }, /obj/machinery/power/apc{ + areastring = "/area/security/checkpoint/supply"; dir = 1; name = "Cargo Security APC"; - areastring = "/area/security/checkpoint/supply"; pixel_x = 1; pixel_y = 24 }, @@ -33644,8 +34903,8 @@ }, /obj/machinery/camera{ c_tag = "Medbay Treatment Center"; - network = list("ss13","medbay"); - dir = 8 + dir = 8; + network = list("ss13","medbay") }, /turf/open/floor/plasteel, /area/medical/sleeper) @@ -33856,9 +35115,7 @@ "bAP" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/yellow{ - dir = 2 - }, +/obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bAQ" = ( @@ -34013,6 +35270,10 @@ /obj/structure/cable{ icon_state = "1-8" }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = -29 + }, /turf/open/floor/plasteel, /area/hallway/primary/central) "bBh" = ( @@ -34182,13 +35443,8 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bBz" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, +/obj/machinery/vending/cola/space_up, +/turf/open/floor/plasteel/dark, /area/hallway/primary/central) "bBA" = ( /obj/structure/cable{ @@ -34200,14 +35456,20 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bBB" = ( -/obj/structure/cable{ - icon_state = "1-8" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/obj/structure/disposalpipe/segment{ - dir = 9 +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 }, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/crew_quarters/fitness) "bBC" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -34235,9 +35497,7 @@ "bBF" = ( /obj/machinery/portable_atmospherics/scrubber, /obj/item/storage/firstaid/toxin, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/line, /obj/machinery/airalarm/unlocked{ pixel_y = 24 }, @@ -34257,19 +35517,14 @@ /turf/closed/wall, /area/quartermaster/miningdock) "bBI" = ( -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/obj/structure/closet/wardrobe/miner, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, +/obj/structure/table, +/obj/item/stack/packageWrap, +/obj/item/stack/packageWrap, +/obj/item/hand_labeler, /turf/open/floor/plasteel, -/area/quartermaster/miningdock) +/area/hallway/secondary/service) "bBJ" = ( /obj/machinery/firealarm{ - dir = 2; pixel_y = 24 }, /turf/open/floor/plasteel/white, @@ -34288,6 +35543,14 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"bBM" = ( +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 4; + name = "4maintenance loot spawner" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "bBN" = ( /turf/closed/wall, /area/crew_quarters/heads/cmo) @@ -34347,6 +35610,18 @@ }, /turf/open/floor/circuit/telecomms/server, /area/science/server) +"bBT" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) "bBU" = ( /obj/machinery/atmospherics/pipe/simple{ dir = 9 @@ -34408,9 +35683,8 @@ /area/security/checkpoint/science) "bCa" = ( /obj/machinery/power/apc{ - dir = 2; - name = "Science Security APC"; areastring = "/area/security/checkpoint/science"; + name = "Science Security APC"; pixel_y = -24 }, /obj/structure/cable, @@ -34472,9 +35746,9 @@ /area/maintenance/port/aft) "bCf" = ( /obj/machinery/power/apc{ + areastring = "/area/crew_quarters/heads/hor"; dir = 8; name = "RD Office APC"; - areastring = "/area/crew_quarters/heads/hor"; pixel_x = -25 }, /obj/structure/cable, @@ -34578,9 +35852,7 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/yellow{ - dir = 2 - }, +/obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bCq" = ( @@ -34657,9 +35929,20 @@ /turf/open/floor/plating, /area/maintenance/aft) "bCA" = ( -/obj/machinery/vending/cigarette, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "bCB" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -34685,9 +35968,7 @@ "bCD" = ( /obj/structure/table, /obj/item/retractor, -/turf/open/floor/plasteel/white/side{ - dir = 2 - }, +/turf/open/floor/plasteel/white/side, /area/medical/sleeper) "bCE" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -34722,12 +36003,14 @@ /turf/open/floor/plasteel/white, /area/medical/sleeper) "bCI" = ( -/obj/structure/chair/office/dark{ +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ dir = 4 }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/wood, -/area/library) +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) "bCJ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -34744,8 +36027,7 @@ /obj/structure/closet/secure_closet/medical3, /obj/machinery/camera{ c_tag = "Medbay Storage"; - network = list("ss13","medbay"); - dir = 2 + network = list("ss13","medbay") }, /turf/open/floor/plasteel/white, /area/medical/sleeper) @@ -34762,7 +36044,13 @@ /turf/open/floor/plasteel/white, /area/medical/sleeper) "bCO" = ( -/obj/machinery/bloodbankgen, +/obj/structure/table, +/obj/item/storage/box/bodybags{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/box/rxglasses, +/obj/item/hand_labeler, /turf/open/floor/plasteel/white, /area/medical/sleeper) "bCP" = ( @@ -34796,35 +36084,22 @@ /turf/open/floor/plasteel/white, /area/medical/sleeper) "bCT" = ( -/obj/structure/table, -/obj/item/storage/belt/medical{ - pixel_y = 2 - }, -/obj/item/storage/belt/medical{ - pixel_y = 2 - }, -/obj/item/storage/belt/medical{ - pixel_y = 2 - }, -/obj/item/clothing/neck/stethoscope, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/bloodbankgen, /turf/open/floor/plasteel/white, /area/medical/sleeper) "bCU" = ( /obj/item/radio/intercom{ - broadcasting = 0; - freerange = 0; frequency = 1485; - listening = 1; name = "Station Intercom (Medbay)"; pixel_x = -30 }, /obj/machinery/camera{ c_tag = "Medbay South"; - network = list("ss13","medbay"); - dir = 4 + dir = 4; + network = list("ss13","medbay") }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) @@ -34947,7 +36222,6 @@ /obj/item/pen, /obj/machinery/requests_console{ department = "Mining"; - departmentType = 0; pixel_x = -30 }, /obj/machinery/light{ @@ -34995,9 +36269,7 @@ pixel_x = 24 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/yellow{ - dir = 2 - }, +/obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bDq" = ( @@ -35019,9 +36291,15 @@ /turf/open/floor/plasteel, /area/janitor) "bDs" = ( -/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, /turf/open/floor/plasteel, -/area/janitor) +/area/hallway/primary/starboard) "bDt" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 @@ -35039,6 +36317,13 @@ /turf/open/floor/plating, /area/maintenance/aft) "bDv" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"bDw" = ( /obj/structure/table, /obj/item/flashlight{ pixel_x = 1; @@ -35053,14 +36338,15 @@ /obj/machinery/status_display/ai{ pixel_x = -32 }, -/turf/open/floor/plating, -/area/storage/tech) -"bDw" = ( -/obj/structure/table, -/obj/item/screwdriver{ - pixel_y = 16 +/obj/machinery/power/apc{ + areastring = "/area/storage/tech"; + dir = 1; + name = "Tech Storage APC"; + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "0-2" }, -/obj/item/wirecutters, /turf/open/floor/plating, /area/storage/tech) "bDx" = ( @@ -35073,33 +36359,28 @@ /turf/open/floor/plating, /area/storage/tech) "bDy" = ( -/obj/machinery/camera{ - c_tag = "Tech Storage"; - dir = 2 - }, -/obj/machinery/power/apc{ - dir = 1; - name = "Tech Storage APC"; - areastring = "/area/storage/tech"; - pixel_y = 24 - }, -/obj/structure/cable{ - icon_state = "0-2" +/obj/structure/table, +/obj/item/screwdriver{ + pixel_y = 16 }, +/obj/item/wirecutters, /turf/open/floor/plating, /area/storage/tech) "bDz" = ( -/obj/machinery/airalarm{ - pixel_y = 23 +/obj/structure/table, +/obj/item/aicard, +/obj/item/aiModule/reset, +/obj/structure/cable{ + icon_state = "1-2" }, /turf/open/floor/plating, /area/storage/tech) "bDA" = ( /obj/structure/disposalpipe/segment, /obj/machinery/power/apc{ + areastring = "/area/medical/sleeper"; dir = 4; name = "Treatment Center APC"; - areastring = "/area/medical/sleeper"; pixel_x = 26 }, /obj/structure/cable{ @@ -35126,9 +36407,6 @@ /turf/open/floor/plasteel/white, /area/medical/sleeper) "bDD" = ( -/obj/structure/sign/warning/nosmoking{ - pixel_x = -28 - }, /obj/structure/bed, /obj/item/bedsheet/medical, /obj/effect/turf_decal/tile/blue{ @@ -35142,8 +36420,8 @@ }, /obj/machinery/camera{ c_tag = "Medbay Recovery Room"; - network = list("ss13","medbay"); - dir = 8 + dir = 8; + network = list("ss13","medbay") }, /obj/machinery/iv_drip, /turf/open/floor/plasteel/white, @@ -35161,9 +36439,7 @@ /area/medical/medbay/central) "bDG" = ( /obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/yellow{ - dir = 2 - }, +/obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bDH" = ( @@ -35179,8 +36455,9 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bDJ" = ( -/obj/item/storage/box/lights/mixed, -/obj/item/storage/box/lights/mixed, +/obj/structure/sign/poster/contraband/lizard{ + pixel_x = -32 + }, /turf/open/floor/plasteel, /area/janitor) "bDK" = ( @@ -35194,8 +36471,17 @@ /turf/open/floor/plasteel, /area/janitor) "bDL" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, /turf/open/floor/plasteel, -/area/janitor) +/area/crew_quarters/fitness) "bDM" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, @@ -35209,11 +36495,15 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bDO" = ( -/obj/structure/cable{ - icon_state = "2-4" +/obj/machinery/vending/snack/orange, +/obj/machinery/light{ + dir = 1 }, -/turf/open/floor/plating, -/area/maintenance/aft) +/obj/structure/sign/poster/contraband/donut_corp{ + pixel_y = 32 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) "bDP" = ( /obj/machinery/navbeacon{ codes_txt = "delivery;dir=8"; @@ -35287,6 +36577,13 @@ }, /turf/open/floor/plasteel/white, /area/medical/sleeper) +"bDX" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) "bDY" = ( /obj/structure/cable{ icon_state = "4-8" @@ -35415,8 +36712,8 @@ }, /obj/machinery/camera{ c_tag = "Chief Medical Office"; - network = list("ss13","medbay"); dir = 8; + network = list("ss13","medbay"); pixel_y = -22 }, /obj/effect/turf_decal/tile/blue{ @@ -35433,7 +36730,6 @@ "bEn" = ( /obj/machinery/camera{ c_tag = "Xenobiology Test Chamber"; - dir = 2; network = list("xeno","rd") }, /obj/machinery/light{ @@ -35456,9 +36752,9 @@ /area/science/storage) "bEq" = ( /obj/machinery/power/apc{ + areastring = "/area/science/research"; dir = 8; name = "Misc Research APC"; - areastring = "/area/science/research"; pixel_x = -25 }, /obj/structure/cable{ @@ -35488,9 +36784,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel/white, /area/science/mixing) "bEv" = ( @@ -35498,9 +36792,7 @@ /obj/machinery/light_switch{ pixel_y = 28 }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel/white, /area/science/mixing) "bEw" = ( @@ -35508,9 +36800,7 @@ /obj/item/radio/intercom{ pixel_y = 25 }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel/white, /area/science/mixing) "bEx" = ( @@ -35519,17 +36809,13 @@ dir = 8 }, /obj/machinery/firealarm{ - dir = 2; pixel_y = 24 }, /obj/machinery/camera{ c_tag = "Toxins Lab West"; - dir = 2; network = list("ss13","rd") }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel/white, /area/science/mixing) "bEy" = ( @@ -35537,9 +36823,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel/white, /area/science/mixing) "bEz" = ( @@ -35685,15 +36969,8 @@ /turf/open/floor/plasteel, /area/quartermaster/miningdock) "bER" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, +/obj/structure/rack, +/obj/effect/spawner/lootdrop/techstorage/rnd, /turf/open/floor/plating, /area/storage/tech) "bES" = ( @@ -35743,9 +37020,12 @@ /turf/open/floor/plating, /area/storage/tech) "bEX" = ( -/obj/structure/table, -/obj/item/aicard, -/obj/item/aiModule/reset, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, /turf/open/floor/plating, /area/storage/tech) "bEY" = ( @@ -35841,18 +37121,20 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "bFk" = ( -/obj/item/mop, -/obj/item/reagent_containers/glass/bucket, -/turf/open/floor/plasteel, -/area/janitor) +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) "bFl" = ( /obj/structure/cable{ icon_state = "1-2" }, /obj/machinery/power/apc{ + areastring = "/area/janitor"; dir = 8; name = "Custodial Closet APC"; - areastring = "/area/janitor"; pixel_x = -24 }, /obj/structure/cable{ @@ -35890,9 +37172,7 @@ /area/maintenance/aft) "bFq" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/yellow{ - dir = 2 - }, +/obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bFr" = ( @@ -35986,21 +37266,14 @@ /turf/open/floor/plasteel, /area/medical/sleeper) "bFC" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/condiment/peppermill{ - pixel_x = 5; - pixel_y = -2 +/obj/structure/door_assembly/door_assembly_mai, +/obj/item/electronics/airlock, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/item/reagent_containers/food/condiment/saltshaker{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) "bFD" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -36067,6 +37340,9 @@ "bFJ" = ( /obj/structure/bed, /obj/item/bedsheet/medical, +/obj/structure/sign/warning/nosmoking{ + pixel_x = -28 + }, /turf/open/floor/plasteel/white, /area/medical/sleeper) "bFK" = ( @@ -36221,12 +37497,8 @@ /obj/machinery/doppler_array/research/science{ dir = 4 }, -/obj/effect/turf_decal/bot{ - dir = 2 - }, -/turf/open/floor/plasteel{ - dir = 2 - }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/science/mixing) "bGe" = ( /turf/closed/wall, @@ -36235,6 +37507,22 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating/airless, /area/science/test_area) +"bGg" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"bGh" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/starboard/fore) "bGi" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -36318,8 +37606,7 @@ /area/storage/tech) "bGs" = ( /obj/machinery/camera{ - c_tag = "Secure Tech Storage"; - dir = 2 + c_tag = "Secure Tech Storage" }, /obj/structure/cable{ icon_state = "1-2" @@ -36344,11 +37631,12 @@ /turf/open/floor/plating, /area/storage/tech) "bGw" = ( -/obj/structure/rack, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 }, -/obj/effect/spawner/lootdrop/techstorage/rnd, /turf/open/floor/plating, /area/storage/tech) "bGx" = ( @@ -36379,18 +37667,14 @@ /turf/open/floor/plasteel/white, /area/science/mixing) "bGB" = ( -/obj/structure/table, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/machinery/requests_console{ - department = "Janitorial"; - departmentType = 1; - pixel_y = -29 +/obj/structure/cable{ + icon_state = "2-4" }, -/obj/item/reagent_containers/spray/cleaner, -/turf/open/floor/plasteel, -/area/janitor) +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "bGC" = ( /obj/structure/cable{ icon_state = "4-8" @@ -36513,9 +37797,7 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/yellow{ - dir = 2 - }, +/obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bGP" = ( @@ -36541,15 +37823,34 @@ /area/maintenance/aft) "bGR" = ( /obj/structure/table, -/obj/item/hand_labeler, -/obj/item/storage/box/rxglasses, -/obj/item/storage/box/bodybags{ - pixel_x = 3; - pixel_y = 3 +/obj/item/storage/belt/medical{ + pixel_y = 2 }, -/obj/item/gun/syringe, +/obj/item/storage/belt/medical{ + pixel_y = 2 + }, +/obj/item/storage/belt/medical{ + pixel_y = 2 + }, +/obj/item/clothing/neck/stethoscope, /turf/open/floor/plasteel/white, /area/medical/sleeper) +"bGS" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "bGT" = ( /obj/structure/table, /obj/item/folder/white, @@ -36646,9 +37947,9 @@ /area/maintenance/aft) "bHe" = ( /obj/machinery/power/apc{ + areastring = "/area/science/storage"; dir = 8; name = "Toxins Storage APC"; - areastring = "/area/science/storage"; pixel_x = -25 }, /obj/structure/cable{ @@ -36668,6 +37969,22 @@ }, /turf/open/floor/plasteel/white, /area/science/research) +"bHg" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/sign/departments/restroom{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "bHh" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -36703,9 +38020,7 @@ "bHl" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/yellow{ - dir = 2 - }, +/obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bHm" = ( @@ -36761,9 +38076,7 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/corner{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, /area/science/mixing) "bHt" = ( @@ -36796,6 +38109,16 @@ }, /turf/open/floor/plating, /area/science/test_area) +"bHx" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/structure/table, +/obj/item/kitchen/rollingpin, +/obj/item/shovel/spade, +/obj/item/reagent_containers/glass/bucket, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) "bHy" = ( /obj/structure/closet/crate, /obj/machinery/light/small{ @@ -36827,6 +38150,19 @@ }, /turf/open/floor/plasteel, /area/quartermaster/miningdock) +"bHB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/table, +/obj/item/storage/box/beakers{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/storage/box/beakers{ + pixel_x = 2; + pixel_y = 2 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) "bHC" = ( /obj/effect/landmark/blobstart, /turf/open/floor/plating, @@ -36842,12 +38178,17 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "bHF" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/wood, -/area/crew_quarters/theatre) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "bHG" = ( /obj/structure/rack, /obj/machinery/light/small{ @@ -36924,9 +38265,7 @@ /turf/open/floor/plating, /area/storage/tech) "bHP" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 2 - }, +/obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bHQ" = ( @@ -36969,9 +38308,9 @@ /area/maintenance/aft) "bHV" = ( /obj/machinery/power/apc{ + areastring = "/area/maintenance/aft"; dir = 8; name = "Aft Maintenance APC"; - areastring = "/area/maintenance/aft"; pixel_x = -24 }, /obj/structure/cable{ @@ -37000,6 +38339,18 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"bHZ" = ( +/obj/structure/table, +/obj/item/book/manual/hydroponics_pod_people{ + pixel_x = -4; + pixel_y = 5 + }, +/obj/item/paper/guides/jobs/hydroponics{ + pixel_x = -5; + pixel_y = 3 + }, +/turf/open/floor/plasteel, +/area/hydroponics) "bIa" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -37031,8 +38382,8 @@ }, /obj/machinery/camera{ c_tag = "Surgery Operating"; - network = list("ss13","medbay"); dir = 1; + network = list("ss13","medbay"); pixel_x = 22 }, /obj/machinery/light, @@ -37130,6 +38481,9 @@ /obj/item/clothing/glasses/hud/health, /obj/item/clothing/glasses/hud/health, /obj/item/clothing/glasses/hud/health, +/obj/item/hand_labeler, +/obj/item/stack/packageWrap, +/obj/item/stack/packageWrap, /turf/open/floor/plasteel/white, /area/medical/sleeper) "bIk" = ( @@ -37471,9 +38825,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 }, -/obj/effect/turf_decal/stripes/corner{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, /area/science/mixing) "bIV" = ( @@ -37869,6 +39221,10 @@ }, /turf/closed/wall, /area/science/storage) +"bJS" = ( +/obj/structure/sign/departments/restroom, +/turf/closed/wall, +/area/crew_quarters/toilet) "bJT" = ( /obj/machinery/vending/cigarette, /turf/open/floor/plasteel/white, @@ -37951,9 +39307,9 @@ /area/science/mixing) "bKa" = ( /obj/machinery/power/apc{ + areastring = "/area/science/mixing"; dir = 4; name = "Toxins Lab APC"; - areastring = "/area/science/mixing"; pixel_x = 26 }, /obj/structure/cable, @@ -38249,9 +39605,9 @@ icon_state = "0-8" }, /obj/machinery/power/apc{ + areastring = "/area/medical/medbay/central"; dir = 4; name = "Medbay APC"; - areastring = "/area/medical/medbay/central"; pixel_x = 24 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -38328,9 +39684,9 @@ /area/medical/medbay/central) "bKS" = ( /obj/machinery/power/apc{ + areastring = "/area/crew_quarters/heads/cmo"; dir = 1; name = "CM Office APC"; - areastring = "/area/crew_quarters/heads/cmo"; pixel_y = 24 }, /obj/structure/cable{ @@ -38374,9 +39730,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/science/xenobiology) "bKX" = ( @@ -38405,9 +39759,7 @@ pixel_y = 2 }, /obj/structure/table/reinforced, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/science/xenobiology) "bKZ" = ( @@ -38428,18 +39780,14 @@ name = "Test Chamber"; req_access_txt = "55" }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/science/xenobiology) "bLb" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/science/xenobiology) "bLc" = ( @@ -38449,9 +39797,7 @@ /obj/item/clothing/glasses/science, /obj/item/clothing/glasses/science, /obj/structure/table, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/science/xenobiology) "bLd" = ( @@ -38565,10 +39911,18 @@ dir = 8 }, /turf/open/floor/plating{ - luminosity = 2; - initial_gas_mix = "o2=0.01;n2=0.01" + initial_gas_mix = "o2=0.01;n2=0.01"; + luminosity = 2 }, /area/science/test_area) +"bLs" = ( +/obj/structure/reagent_dispensers/keg/milk, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"bLt" = ( +/obj/structure/reagent_dispensers/keg/gargle, +/turf/open/floor/wood, +/area/crew_quarters/bar) "bLu" = ( /obj/structure/rack, /obj/effect/spawner/lootdrop/maintenance, @@ -38593,6 +39947,10 @@ /obj/item/stock_parts/subspace/treatment, /obj/item/stock_parts/subspace/treatment, /obj/item/stock_parts/subspace/treatment, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, /turf/open/floor/plating, /area/storage/tech) "bLy" = ( @@ -38624,6 +39982,10 @@ /obj/item/clothing/gloves/color/yellow, /obj/item/t_scanner, /obj/item/multitool, +/obj/machinery/camera{ + c_tag = "Tech Storage"; + dir = 1 + }, /turf/open/floor/plating, /area/storage/tech) "bLB" = ( @@ -38655,9 +40017,8 @@ "bLF" = ( /obj/structure/filingcabinet/filingcabinet, /obj/machinery/power/apc{ - dir = 2; - name = "Delivery Office APC"; areastring = "/area/quartermaster/sorting"; + name = "Delivery Office APC"; pixel_x = 1; pixel_y = -24 }, @@ -38854,9 +40215,9 @@ /area/science/misc_lab) "bMg" = ( /obj/machinery/power/apc{ + areastring = "/area/science/xenobiology"; dir = 8; name = "Xenobiology APC"; - areastring = "/area/science/xenobiology"; pixel_x = -25 }, /obj/structure/cable{ @@ -38897,7 +40258,6 @@ "bMm" = ( /obj/machinery/monkey_recycler, /obj/machinery/firealarm{ - dir = 2; pixel_y = 24 }, /obj/effect/turf_decal/stripes/line{ @@ -38963,7 +40323,6 @@ /area/science/mixing) "bMw" = ( /obj/machinery/sparker/toxmix{ - dir = 2; pixel_x = 25 }, /obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/toxins_mixing_output{ @@ -39038,6 +40397,10 @@ }, /turf/open/floor/plating/airless, /area/science/test_area) +"bMF" = ( +/obj/structure/reagent_dispensers/keg/mead, +/turf/open/floor/wood, +/area/crew_quarters/bar) "bMG" = ( /obj/structure/cable{ icon_state = "1-2" @@ -39100,7 +40463,6 @@ /area/engine/atmos) "bMP" = ( /obj/machinery/firealarm{ - dir = 2; pixel_y = 24 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -39141,9 +40503,7 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bMV" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/visible{ - dir = 2 - }, +/obj/machinery/atmospherics/pipe/manifold/supply/visible, /obj/machinery/meter/atmos/distro_loop, /turf/open/floor/plasteel, /area/engine/atmos) @@ -39172,6 +40532,13 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) +"bNa" = ( +/obj/machinery/door/firedoor, +/obj/structure/sign/departments/evac{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) "bNb" = ( /obj/item/airlock_painter, /obj/structure/lattice, @@ -39336,9 +40703,7 @@ /turf/open/floor/engine, /area/science/mixing) "bNw" = ( -/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_toxmix{ - dir = 2 - }, +/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_toxmix, /turf/open/floor/engine, /area/science/mixing) "bNx" = ( @@ -39403,9 +40768,7 @@ /turf/open/floor/plating/airless, /area/science/test_area) "bNF" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating/airless, /area/science/test_area) "bNG" = ( @@ -39443,11 +40806,30 @@ /turf/open/floor/plasteel, /area/quartermaster/office) "bNL" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, /obj/machinery/airalarm{ - pixel_y = 23 + dir = 1; + pixel_y = -22 }, /turf/open/floor/plating, /area/construction) +"bNM" = ( +/obj/machinery/light, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/sign/directions/evac{ + dir = 4; + pixel_y = -25 + }, +/obj/structure/sign/directions/science{ + dir = 4; + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) "bNN" = ( /obj/structure/cable{ icon_state = "1-2" @@ -39469,8 +40851,6 @@ dir = 6 }, /obj/item/radio/intercom{ - freerange = 0; - frequency = 1459; name = "Station Intercom (General)"; pixel_x = -30 }, @@ -39491,8 +40871,7 @@ pixel_y = 23 }, /obj/machinery/camera{ - c_tag = "Atmospherics Monitoring"; - dir = 2 + c_tag = "Atmospherics Monitoring" }, /obj/machinery/light{ dir = 4 @@ -39659,8 +41038,7 @@ /obj/structure/closet/emcloset, /obj/machinery/camera{ c_tag = "Virology Airlock"; - network = list("ss13","medbay"); - dir = 2 + network = list("ss13","medbay") }, /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -39772,7 +41150,6 @@ /area/tcommsat/computer) "bOE" = ( /obj/machinery/sparker/toxmix{ - dir = 2; pixel_x = 25 }, /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxins_mixing_input{ @@ -39847,12 +41224,21 @@ /area/quartermaster/office) "bOM" = ( /obj/structure/table, -/obj/item/paper_bin, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 +/obj/item/clothing/head/welding{ + pixel_x = -3; + pixel_y = 7 }, +/obj/item/clothing/head/welding{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/item/multitool, +/obj/item/clothing/glasses/welding, /turf/open/floor/plasteel, -/area/tcommsat/computer) +/area/engine/atmos) "bON" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -39863,9 +41249,9 @@ /area/security/detectives_office) "bOO" = ( /obj/machinery/power/apc{ + areastring = "/area/security/checkpoint/engineering"; dir = 8; name = "Engineering Security APC"; - areastring = "/area/security/checkpoint/engineering"; pixel_x = -24 }, /obj/structure/cable{ @@ -39946,7 +41332,6 @@ /obj/effect/turf_decal/delivery, /obj/machinery/door/window/northleft{ dir = 4; - icon_state = "left"; name = "Atmospherics Desk"; req_access_txt = "24" }, @@ -40178,6 +41563,13 @@ }, /turf/open/floor/plasteel/white, /area/medical/virology) +"bPv" = ( +/obj/machinery/door/firedoor, +/obj/structure/sign/departments/evac{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) "bPw" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 @@ -40413,6 +41805,36 @@ }, /turf/open/floor/plasteel, /area/tcommsat/computer) +"bPR" = ( +/obj/structure/sign/mining{ + pixel_y = 7 + }, +/turf/closed/wall, +/area/quartermaster/miningdock) +"bPS" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/departments/custodian{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bPT" = ( +/obj/structure/reagent_dispensers/foamtank, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/box, +/turf/open/floor/plasteel, +/area/engine/atmos) "bPU" = ( /obj/item/shard, /turf/open/floor/plating, @@ -40781,7 +42203,6 @@ /obj/item/clothing/ears/earmuffs, /obj/machinery/camera{ c_tag = "Testing Lab North"; - dir = 2; network = list("ss13","rd") }, /turf/open/floor/plasteel, @@ -40790,7 +42211,6 @@ /obj/machinery/requests_console{ department = "Science"; departmentType = 2; - dir = 2; name = "Science Requests Console"; pixel_y = 30; receive_ore_updates = 1 @@ -40821,6 +42241,21 @@ }, /turf/open/floor/engine, /area/science/misc_lab) +"bQX" = ( +/obj/structure/reagent_dispensers/watertank/high, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/box, +/turf/open/floor/plasteel, +/area/engine/atmos) "bQY" = ( /obj/structure/table/reinforced, /obj/item/integrated_circuit_printer, @@ -40841,6 +42276,50 @@ /obj/item/stack/sheet/metal/ten, /turf/open/floor/plasteel/white, /area/science/circuit) +"bRb" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/sign/departments/engineering{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bRc" = ( +/obj/structure/sign/poster/contraband/space_cola{ + pixel_x = -32 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"bRd" = ( +/obj/structure/sign/poster/contraband/space_up{ + pixel_x = -32; + pixel_y = 32 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"bRe" = ( +/obj/machinery/computer/slot_machine{ + balance = 15; + money = 500; + pixel_x = -5 + }, +/obj/structure/sign/poster/contraband/robust_softdrinks{ + pixel_x = -32 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"bRf" = ( +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "bRg" = ( /obj/structure/rack, /obj/effect/spawner/lootdrop/maintenance{ @@ -40954,7 +42433,6 @@ /obj/machinery/door/firedoor/heavy, /obj/machinery/door/window/northleft{ dir = 4; - icon_state = "left"; name = "Atmospherics Desk"; req_access_txt = "24" }, @@ -41339,6 +42817,14 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/floor/plating, /area/maintenance/port/aft) +"bSr" = ( +/obj/structure/sign/poster/official/fruit_bowl{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/primary/starboard) "bSs" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, @@ -41353,6 +42839,18 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/tcommsat/computer) +"bSu" = ( +/obj/machinery/camera{ + c_tag = "Starboard Primary Hallway 2" + }, +/obj/structure/sign/poster/contraband/eat{ + pixel_y = 32; + poster_item_desc = "This poster promotes obesity, it also promotes giving the Chef a reason to keep their job." + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/primary/starboard) "bSv" = ( /obj/machinery/camera{ c_tag = "Construction Area"; @@ -41456,20 +42954,13 @@ /area/engine/atmos) "bSF" = ( /obj/structure/table, -/obj/item/clothing/head/welding{ - pixel_x = -3; - pixel_y = 7 +/obj/item/paper_bin, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 }, -/obj/item/clothing/head/welding{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/item/multitool, +/obj/item/pen/fountain, /turf/open/floor/plasteel, -/area/engine/atmos) +/area/tcommsat/computer) "bSG" = ( /obj/structure/table, /obj/item/stack/sheet/metal/fifty, @@ -41510,6 +43001,12 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/engine/atmos) +"bSL" = ( +/obj/structure/sign/poster/contraband/red_rum{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) "bSM" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 @@ -41525,6 +43022,15 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/engine/atmos) +"bSO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/sign/poster/official/cohiba_robusto_ad{ + pixel_y = -32 + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) "bSP" = ( /obj/machinery/atmospherics/pipe/manifold/cyan/visible{ dir = 4 @@ -41608,9 +43114,9 @@ /area/medical/virology) "bSX" = ( /obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/medical/virology"; dir = 1; name = "Virology APC"; - areastring = "/area/medical/virology"; pixel_y = 24 }, /obj/structure/cable{ @@ -41626,6 +43132,15 @@ /obj/machinery/vending/medical, /turf/open/floor/plasteel/white, /area/medical/virology) +"bSZ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/structure/sign/poster/contraband/have_a_puff{ + pixel_y = -32 + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) "bTa" = ( /obj/machinery/door/window/northleft{ dir = 4; @@ -41807,6 +43322,13 @@ /obj/item/pen, /turf/open/floor/plasteel/white, /area/science/circuit) +"bTq" = ( +/obj/structure/sign/poster/contraband/smoke{ + desc = "This poster reminds us all that the Detective is a parasite. Year after year, they must get replacement lungs because of their addiction. "; + pixel_y = -32 + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) "bTr" = ( /obj/structure/cable{ icon_state = "1-2" @@ -41815,6 +43337,68 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"bTs" = ( +/obj/structure/sign/poster/official/help_others{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"bTt" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/maintenance/port) +"bTu" = ( +/obj/machinery/recharge_station, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/sign/poster/official/state_laws{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/science/robotics/mechbay) +"bTv" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/sign/poster/official/ian{ + pixel_x = 32; + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bTw" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/sign/poster/official/love_ian{ + pixel_x = 32; + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bTx" = ( +/obj/effect/turf_decal/bot, +/obj/structure/sign/poster/official/pda_ad{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bTy" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/sign/poster/contraband/hacking_guide{ + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/maintenance/aft) "bTz" = ( /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" @@ -41900,9 +43484,9 @@ /area/tcommsat/computer) "bTJ" = ( /obj/machinery/power/apc{ - name = "Aft Hall APC"; areastring = "/area/hallway/primary/aft"; dir = 8; + name = "Aft Hall APC"; pixel_x = -25; pixel_y = 1 }, @@ -42223,6 +43807,21 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/port/aft) +"bUw" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/free_drone{ + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "bUx" = ( /obj/structure/disposalpipe/junction/yjunction{ dir = 1 @@ -42252,11 +43851,27 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"bUA" = ( +/obj/machinery/door/poddoor/preopen{ + id = "Engineering"; + name = "engineering security door" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/shower{ + dir = 8 + }, +/obj/structure/sign/warning/enginesafety{ + pixel_x = 32 + }, +/obj/structure/sign/poster/official/safety_eye_protection{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "bUB" = ( /obj/machinery/power/apc{ - dir = 2; - name = "Telecomms Monitoring APC"; areastring = "/area/tcommsat/computer"; + name = "Telecomms Monitoring APC"; pixel_y = -24 }, /obj/structure/cable{ @@ -42401,6 +44016,7 @@ /area/engine/atmos) "bUU" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/obj/machinery/atmospherics/miner/n2o, /turf/open/floor/engine/n2o, /area/engine/atmos) "bUV" = ( @@ -42413,6 +44029,13 @@ }, /turf/open/floor/engine/n2o, /area/engine/atmos) +"bUX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/sign/poster/official/safety_eye_protection, +/turf/closed/wall/r_wall, +/area/engine/engineering) "bUY" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -42508,7 +44131,6 @@ /area/hallway/primary/aft) "bVg" = ( /obj/item/radio/intercom{ - broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 20 }, @@ -42631,10 +44253,12 @@ }, /turf/open/space, /area/space/nearstation) +"bVw" = ( +/obj/structure/sign/poster/official/safety_eye_protection, +/turf/closed/wall/r_wall, +/area/engine/engineering) "bVx" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 2 - }, +/obj/machinery/atmospherics/components/unary/outlet_injector/on, /turf/open/floor/plating/airless, /area/maintenance/port/aft) "bVy" = ( @@ -42706,6 +44330,19 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"bVH" = ( +/obj/machinery/camera{ + c_tag = "Engineering Storage"; + dir = 4 + }, +/obj/machinery/rnd/production/protolathe/department/engineering, +/obj/structure/sign/poster/contraband/power{ + desc = "Lord Singuloth must feed. Annoyingly, it's really easy for people to sabotage containment and let Lord Singuloth eat the entire station.. For this reason, Nanotrasen prefers Supermatter reactors."; + pixel_x = -32; + poster_item_desc = "This poster depicts Lord Singuloth. Nanotrasen doesn't approve. Nanotrasen wants Supermatter over Singularities, as they are usually much safer." + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "bVI" = ( /turf/closed/wall/r_wall, /area/tcommsat/server) @@ -42716,6 +44353,12 @@ /obj/machinery/vending/snack/random, /turf/open/floor/plasteel, /area/engine/break_room) +"bVL" = ( +/obj/machinery/shower{ + dir = 8 + }, +/turf/open/floor/plasteel/freezer, +/area/security/prison) "bVM" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, @@ -42899,6 +44542,13 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/medical/virology) +"bWk" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel, +/area/quartermaster/office) "bWl" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -42956,9 +44606,7 @@ /turf/open/floor/plasteel, /area/science/misc_lab) "bWq" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 2 - }, +/obj/machinery/atmospherics/components/binary/pump, /turf/open/floor/plasteel, /area/science/misc_lab) "bWr" = ( @@ -43037,9 +44685,9 @@ dir = 1 }, /obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/tcommsat/server"; dir = 1; name = "Telecomms Server APC"; - areastring = "/area/tcommsat/server"; pixel_y = 25 }, /obj/structure/cable{ @@ -43153,8 +44801,6 @@ /area/security/checkpoint/engineering) "bWR" = ( /obj/item/radio/intercom{ - freerange = 0; - frequency = 1459; name = "Station Intercom (General)"; pixel_x = -30 }, @@ -43444,6 +45090,17 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/science/circuit) +"bXu" = ( +/obj/machinery/camera{ + c_tag = "Bar West"; + dir = 4 + }, +/obj/machinery/computer/arcade/orion_trail, +/obj/structure/sign/poster/official/foam_force_ad{ + pixel_x = -32 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) "bXv" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -43608,6 +45265,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/item/cartridge/atmos, /turf/open/floor/plasteel, /area/engine/atmos) "bXS" = ( @@ -43615,23 +45273,15 @@ dir = 4 }, /obj/machinery/portable_atmospherics/canister, -/obj/effect/turf_decal/bot{ - dir = 2 - }, -/turf/open/floor/plasteel{ - dir = 2 - }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/engine/atmos) "bXT" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 }, -/obj/effect/turf_decal/bot{ - dir = 2 - }, -/turf/open/floor/plasteel{ - dir = 2 - }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/engine/atmos) "bXU" = ( /obj/machinery/atmospherics/pipe/manifold/yellow/visible{ @@ -43770,12 +45420,8 @@ /area/science/misc_lab) "bYk" = ( /obj/structure/reagent_dispensers/fueltank, -/obj/effect/turf_decal/bot{ - dir = 2 - }, -/turf/open/floor/plasteel{ - dir = 2 - }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/science/misc_lab) "bYl" = ( /obj/structure/disposalpipe/segment, @@ -43790,12 +45436,8 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/effect/turf_decal/bot{ - dir = 2 - }, -/turf/open/floor/plasteel{ - dir = 2 - }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/science/misc_lab) "bYn" = ( /obj/structure/disposalpipe/segment, @@ -43934,18 +45576,13 @@ /turf/open/floor/plasteel, /area/tcommsat/computer) "bYG" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ +/obj/structure/chair{ dir = 8 }, +/obj/machinery/light, +/obj/effect/landmark/start/assistant, /turf/open/floor/plasteel, -/area/hallway/primary/aft) +/area/quartermaster/office) "bYH" = ( /turf/closed/wall, /area/engine/break_room) @@ -43954,9 +45591,7 @@ dir = 4; pixel_x = 24 }, -/obj/effect/turf_decal/tile/yellow{ - dir = 2 - }, +/obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bYJ" = ( @@ -44043,6 +45678,7 @@ /area/engine/atmos) "bYU" = ( /obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/atmospherics/miner/toxins, /turf/open/floor/engine/plasma, /area/engine/atmos) "bYV" = ( @@ -44118,6 +45754,22 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/engine/break_room) +"bZf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) "bZg" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -44253,13 +45905,17 @@ /area/engine/break_room) "bZz" = ( /obj/structure/table, -/obj/machinery/cell_charger, /obj/machinery/light_switch{ pixel_x = -23 }, /obj/machinery/light{ dir = 8 }, +/obj/item/book/manual/wiki/engineering_hacking{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/book/manual/wiki/engineering_construction, /turf/open/floor/plasteel, /area/engine/break_room) "bZA" = ( @@ -44324,9 +45980,9 @@ /area/engine/break_room) "bZF" = ( /obj/machinery/power/apc{ + areastring = "/area/engine/atmos"; dir = 8; name = "Atmospherics APC"; - areastring = "/area/engine/atmos"; pixel_x = -24 }, /obj/structure/cable{ @@ -44510,6 +46166,15 @@ }, /turf/open/floor/plasteel, /area/science/misc_lab) +"cab" = ( +/obj/structure/table, +/obj/item/storage/pill_bottle/dice{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/reagent_containers/food/snacks/cherrycupcake, +/turf/open/floor/wood, +/area/crew_quarters/bar) "cac" = ( /obj/structure/chair/stool, /turf/open/floor/plating, @@ -44552,6 +46217,18 @@ }, /turf/open/floor/circuit/telecomms/mainframe, /area/tcommsat/server) +"caj" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/soda_cans/starkist{ + pixel_x = 5; + pixel_y = 7 + }, +/obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb{ + pixel_x = -3; + pixel_y = 2 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) "cak" = ( /obj/machinery/telecomms/hub/preset, /obj/effect/turf_decal/tile/neutral{ @@ -44589,6 +46266,18 @@ }, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) +"cam" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchen"; + name = "kitchen shutters" + }, +/obj/item/reagent_containers/food/snacks/bluecherrycupcake{ + pixel_y = 5 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) "can" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -44687,13 +46376,20 @@ /area/hallway/primary/aft) "caw" = ( /obj/structure/table, +/obj/item/storage/box/lights/mixed, /obj/item/clothing/glasses/meson, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -22 +/obj/item/clothing/glasses/meson, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 }, /turf/open/floor/plasteel, -/area/engine/break_room) +/area/engine/engineering) "cax" = ( /obj/structure/closet/wardrobe/black, /obj/effect/decal/cleanable/cobweb, @@ -44730,6 +46426,18 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/security/checkpoint/engineering) +"caB" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchen"; + name = "kitchen shutters" + }, +/obj/item/reagent_containers/food/snacks/cheesynachos{ + pixel_y = 5 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) "caC" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -44858,9 +46566,7 @@ /obj/machinery/atmospherics/components/binary/valve{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/maintenance/aft) "caQ" = ( @@ -44997,9 +46703,9 @@ /area/science/misc_lab) "cbd" = ( /obj/machinery/power/apc{ + areastring = "/area/science/misc_lab"; dir = 4; name = "Testing Lab APC"; - areastring = "/area/science/misc_lab"; pixel_x = 26 }, /obj/structure/cable{ @@ -45097,13 +46803,11 @@ /turf/open/floor/plating, /area/tcommsat/computer) "cbp" = ( -/obj/structure/closet/secure_closet/engineering_chief{ - req_access_txt = "0" - }, +/obj/structure/closet/secure_closet/engineering_chief, /obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/crew_quarters/heads/chief"; dir = 4; name = "CE Office APC"; - areastring = "/area/crew_quarters/heads/chief"; pixel_x = 24 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ @@ -45167,16 +46871,14 @@ dir = 8; pixel_y = -22 }, -/obj/effect/turf_decal/tile/yellow{ - dir = 2 - }, +/obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel, /area/hallway/primary/aft) "cbu" = ( /obj/machinery/power/apc{ + areastring = "/area/engine/break_room"; dir = 8; name = "Engineering Foyer APC"; - areastring = "/area/engine/break_room"; pixel_x = -24 }, /obj/structure/cable{ @@ -45193,33 +46895,37 @@ /turf/open/floor/plating, /area/maintenance/starboard/aft) "cbw" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 8; + sortType = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" }, /turf/open/floor/plating, /area/maintenance/port/aft) "cbx" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 + dir = 10 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "1-8" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"cby" = ( /obj/structure/cable{ icon_state = "1-2" }, +/turf/open/floor/plating, +/area/maintenance/port/aft) +"cby" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, /turf/open/floor/plating, /area/maintenance/port/aft) "cbz" = ( @@ -45416,6 +47122,11 @@ }, /turf/open/floor/plasteel, /area/science/misc_lab) +"cbX" = ( +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/obj/machinery/atmospherics/miner/carbon_dioxide, +/turf/open/floor/engine/co2, +/area/engine/atmos) "cbY" = ( /obj/structure/table/reinforced, /obj/item/multitool, @@ -45469,10 +47180,10 @@ /turf/open/space, /area/solar/port/aft) "ccd" = ( -/obj/structure/closet, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/port/aft) +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/machinery/atmospherics/miner/nitrogen, +/turf/open/floor/engine/n2, +/area/engine/atmos) "cce" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -45635,11 +47346,9 @@ /turf/open/floor/plating, /area/maintenance/starboard/aft) "ccu" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 5 + icon_state = "1-2" }, /turf/open/floor/plating, /area/maintenance/port/aft) @@ -45684,8 +47393,9 @@ /turf/open/floor/plasteel, /area/engine/atmos) "ccB" = ( -/obj/machinery/portable_atmospherics/canister/carbon_dioxide, -/turf/open/floor/engine/co2, +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/machinery/atmospherics/miner/oxygen, +/turf/open/floor/engine/o2, /area/engine/atmos) "ccC" = ( /obj/machinery/air_sensor/atmos/carbon_tank, @@ -45717,6 +47427,11 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/aft) +"ccH" = ( +/obj/structure/table, +/obj/item/paper/fluff/holodeck/disclaimer, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) "ccI" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -45799,13 +47514,23 @@ /area/science/xenobiology) "ccR" = ( /obj/machinery/portable_atmospherics/pump, -/obj/effect/turf_decal/bot{ - dir = 2 - }, -/turf/open/floor/plasteel{ - dir = 2 - }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/science/misc_lab) +"ccS" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/window, +/obj/structure/sign/poster/official/high_class_martini{ + pixel_x = -32 + }, +/obj/effect/landmark/start/assistant, +/obj/structure/chair/sofa/left{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) "ccT" = ( /obj/machinery/light{ dir = 4 @@ -45893,38 +47618,30 @@ /turf/open/floor/plasteel, /area/tcommsat/computer) "cdh" = ( -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 8; - sortType = 4 +/obj/structure/lattice/catwalk, +/obj/item/stack/marker_beacon{ + anchored = 1; + icon_state = "markerburgundy-on"; + light_power = 3; + light_range = 3; + name = "Docking Beacon"; + picked_color = "Burgundy" }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, -/area/maintenance/port/aft) +/area/space/nearstation) "cdi" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, +/obj/structure/grille, +/obj/structure/lattice, /turf/open/floor/plating, -/area/maintenance/port/aft) +/area/space/nearstation) "cdj" = ( -/obj/structure/cable{ - icon_state = "1-8" +/obj/structure/closet/crate/bin, +/obj/effect/turf_decal/stripes/line{ + dir = 10 }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) +/obj/item/cartridge/atmos, +/turf/open/floor/engine, +/area/engine/engineering) "cdk" = ( /obj/machinery/computer/atmos_alert, /obj/effect/turf_decal/tile/neutral{ @@ -45949,6 +47666,7 @@ /obj/item/paper/monitorkey, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/item/pen/fountain, /turf/open/floor/plasteel, /area/crew_quarters/heads/chief) "cdn" = ( @@ -45993,9 +47711,9 @@ /area/maintenance/starboard/aft) "cds" = ( /obj/machinery/power/apc{ + areastring = "/area/maintenance/starboard/aft"; dir = 8; name = "Starboard Quarter Maintenance APC"; - areastring = "/area/maintenance/starboard/aft"; pixel_x = -25 }, /obj/structure/cable{ @@ -46162,6 +47880,13 @@ }, /turf/open/floor/plating, /area/maintenance/aft) +"cdM" = ( +/obj/structure/window, +/obj/structure/chair/sofa/right{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) "cdN" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -46176,6 +47901,15 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"cdP" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) "cdQ" = ( /obj/structure/closet/emcloset, /obj/effect/decal/cleanable/cobweb, @@ -46187,12 +47921,8 @@ /area/maintenance/starboard/aft) "cdS" = ( /obj/machinery/portable_atmospherics/scrubber, -/obj/effect/turf_decal/bot{ - dir = 2 - }, -/turf/open/floor/plasteel{ - dir = 2 - }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/science/misc_lab) "cdT" = ( /obj/effect/turf_decal/stripes/line{ @@ -46220,9 +47950,9 @@ /area/maintenance/starboard/aft) "cdW" = ( /obj/machinery/power/apc{ + areastring = "/area/maintenance/port/aft"; dir = 8; name = "Port Quarter Maintenance APC"; - areastring = "/area/maintenance/port/aft"; pixel_x = -25; pixel_y = 1 }, @@ -46239,6 +47969,13 @@ }, /turf/open/floor/plasteel/white, /area/science/research) +"cdY" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) "cdZ" = ( /obj/machinery/telecomms/processor/preset_two, /turf/open/floor/plasteel/dark/telecomms, @@ -46313,16 +48050,18 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cek" = ( -/obj/machinery/door/poddoor/preopen{ - id = "Engineering"; - name = "engineering security door" - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/shower{ - dir = 8 +/obj/structure/closet/wardrobe/grey, +/obj/machinery/requests_console{ + department = "Locker Room"; + pixel_x = -32 }, +/obj/item/clothing/under/assistantformal, +/obj/item/clothing/under/assistantformal, +/obj/item/clothing/under/assistantformal, +/obj/item/clothing/under/color/grey, +/obj/item/clothing/under/color/grey, /turf/open/floor/plasteel, -/area/engine/engineering) +/area/crew_quarters/locker) "cel" = ( /obj/machinery/door/poddoor/preopen{ id = "Engineering"; @@ -46399,6 +48138,18 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) +"ceu" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) "cev" = ( /obj/effect/spawner/structure/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -46529,12 +48280,8 @@ /area/maintenance/starboard/aft) "ceP" = ( /obj/machinery/portable_atmospherics/canister, -/obj/effect/turf_decal/bot{ - dir = 2 - }, -/turf/open/floor/plasteel{ - dir = 2 - }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/science/misc_lab) "ceQ" = ( /obj/structure/cable{ @@ -46604,18 +48351,18 @@ "cfa" = ( /obj/structure/rack, /obj/item/storage/belt/utility, -/obj/item/wrench, -/obj/item/weldingtool, -/obj/item/clothing/head/welding{ - pixel_x = -3; - pixel_y = 5 - }, /obj/effect/turf_decal/tile/yellow{ dir = 1 }, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/item/weldingtool/largetank, +/obj/item/clothing/head/welding{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/item/clothing/glasses/welding, /turf/open/floor/plasteel, /area/engine/engineering) "cfb" = ( @@ -46658,6 +48405,16 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/port/aft) +"cff" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) "cfg" = ( /obj/structure/cable{ icon_state = "1-4" @@ -46734,10 +48491,9 @@ /area/maintenance/aft) "cfr" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 2; external_pressure_bound = 140; - pressure_checks = 0; - name = "killroom vent" + name = "killroom vent"; + pressure_checks = 0 }, /obj/machinery/camera{ c_tag = "Xenobiology Kill Room"; @@ -46801,14 +48557,33 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"cfB" = ( -/obj/structure/closet/secure_closet/engineering_personal, -/obj/effect/turf_decal/tile/yellow, +"cfA" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, /obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"cfB" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"cfC" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ dir = 4 }, /turf/open/floor/plasteel, -/area/engine/engineering) +/area/crew_quarters/fitness) "cfD" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/airlock/maintenance{ @@ -46821,6 +48596,18 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/port/aft) +"cfE" = ( +/obj/machinery/button/door{ + desc = "Bolts the doors to the Private Study."; + id = "PrivateStudy"; + name = "Private Study Lock"; + pixel_x = 25; + pixel_y = 25; + req_access_txt = ""; + req_one_access_txt = "28;63" + }, +/turf/open/floor/wood, +/area/library) "cfF" = ( /obj/machinery/suit_storage_unit/ce, /obj/effect/turf_decal/stripes/line{ @@ -46855,17 +48642,15 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/chief) "cfI" = ( -/obj/structure/closet/secure_closet/engineering_personal, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 +/obj/structure/cable{ + icon_state = "1-8" }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 +/obj/structure/disposalpipe/segment{ + dir = 9 }, +/obj/effect/landmark/start/assistant, /turf/open/floor/plasteel, -/area/engine/engineering) +/area/hallway/primary/central) "cfJ" = ( /obj/machinery/light/small{ dir = 1 @@ -46929,6 +48714,14 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) +"cfS" = ( +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 8; + name = "8maintenance loot spawner" + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "cfT" = ( /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 9 @@ -46941,6 +48734,17 @@ }, /turf/closed/wall, /area/maintenance/disposal/incinerator) +"cfV" = ( +/obj/structure/table, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/obj/item/stack/packageWrap, +/obj/item/stack/packageWrap, +/obj/item/hand_labeler, +/turf/open/floor/plasteel, +/area/engine/break_room) "cfW" = ( /obj/structure/cable{ icon_state = "1-2" @@ -46953,9 +48757,8 @@ /area/maintenance/aft) "cfX" = ( /obj/machinery/power/apc{ - dir = 2; - name = "Incinerator APC"; areastring = "/area/maintenance/disposal/incinerator"; + name = "Incinerator APC"; pixel_y = -24 }, /obj/structure/cable, @@ -47064,7 +48867,6 @@ /area/science/xenobiology) "cgl" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - dir = 2; external_pressure_bound = 120; name = "killroom vent" }, @@ -47094,11 +48896,11 @@ /turf/open/floor/plating, /area/maintenance/starboard/aft) "cgp" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 +/obj/structure/rack, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 4; + name = "4maintenance loot spawner" }, /turf/open/floor/plating, /area/maintenance/starboard/aft) @@ -47136,9 +48938,8 @@ /turf/open/floor/plating, /area/maintenance/starboard/aft) "cgu" = ( -/obj/structure/rack, -/obj/effect/decal/cleanable/cobweb/cobweb2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/maintenance/starboard/aft) "cgv" = ( @@ -47236,6 +49037,17 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"cgH" = ( +/obj/structure/closet/secure_closet/engineering_personal, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/item/clothing/under/overalls, +/obj/item/clothing/under/overalls, +/obj/item/radio/headset/headset_eng, +/turf/open/floor/plasteel, +/area/engine/engineering) "cgI" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 @@ -47263,6 +49075,34 @@ }, /turf/open/floor/engine, /area/engine/engineering) +"cgM" = ( +/obj/structure/closet/secure_closet/engineering_personal, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/item/clothing/under/overalls, +/obj/item/clothing/under/overalls, +/obj/item/radio/headset/headset_eng, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cgN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/structure/closet/secure_closet/engineering_electrical, +/obj/item/storage/toolbox/artistic{ + icon_state = "yellow"; + item_state = "toolbox_yellow"; + name = "Cable Toolbox"; + pixel_y = 6 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "cgO" = ( /obj/structure/rack, /obj/item/lighter, @@ -47283,6 +49123,19 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/chief) +"cgP" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/closet/secure_closet/engineering_welding, +/obj/item/clothing/glasses/welding, +/obj/item/clothing/glasses/welding, +/obj/item/clothing/glasses/welding, +/turf/open/floor/plasteel, +/area/engine/engineering) "cgQ" = ( /obj/machinery/camera{ c_tag = "Engineering East"; @@ -47483,7 +49336,6 @@ dir = 1 }, /obj/machinery/atmospherics/components/binary/pump{ - dir = 2; name = "atmospherics mix pump" }, /turf/open/floor/plasteel, @@ -47723,12 +49575,10 @@ /turf/open/space, /area/solar/port/aft) "chM" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/solar/port/aft) +/obj/structure/closet/secure_closet/engineering_personal, +/obj/item/radio/headset/headset_eng, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) "chN" = ( /obj/structure/cable{ icon_state = "4-8" @@ -47788,6 +49638,22 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"chU" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/artistic{ + icon_state = "yellow"; + item_state = "toolbox_yellow"; + name = "Cable Toolbox"; + pixel_y = 6 + }, +/obj/item/storage/toolbox/artistic{ + icon_state = "yellow"; + item_state = "toolbox_yellow"; + name = "Cable Toolbox"; + pixel_y = -4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) "chV" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -47806,6 +49672,22 @@ }, /turf/open/floor/engine, /area/engine/engineering) +"chW" = ( +/obj/item/wrench, +/obj/structure/rack, +/obj/item/weldingtool/hugetank, +/obj/item/clothing/head/welding{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/item/clothing/head/welding{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/item/clothing/glasses/welding, +/obj/item/clothing/glasses/welding, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) "chX" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -47822,6 +49704,10 @@ /obj/machinery/shieldgen, /turf/open/floor/plating, /area/engine/engineering) +"chZ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/crew_quarters/locker) "cia" = ( /obj/effect/turf_decal/bot{ dir = 1 @@ -47834,6 +49720,14 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) +"cib" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 8; + name = "8maintenance loot spawner" + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "cic" = ( /obj/effect/turf_decal/bot{ dir = 1 @@ -47856,9 +49750,9 @@ }, /obj/structure/reagent_dispensers/watertank, /obj/machinery/power/apc/highcap/fifteen_k{ + areastring = "/area/engine/engineering"; dir = 1; name = "Engineering APC"; - areastring = "/area/engine/engineering"; pixel_y = 25 }, /obj/structure/cable{ @@ -47900,6 +49794,10 @@ "cig" = ( /turf/closed/wall, /area/engine/engineering) +"cih" = ( +/obj/effect/spawner/lootdrop/keg, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "cii" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -47955,6 +49853,13 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/chief) +"cil" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/light_construct{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "cim" = ( /turf/open/floor/plasteel, /area/crew_quarters/heads/chief) @@ -48026,6 +49931,12 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/engine/atmos) +"ciw" = ( +/obj/structure/light_construct{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "cix" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible, /turf/closed/wall/r_wall, @@ -48115,8 +50026,10 @@ }, /area/maintenance/starboard/aft) "ciK" = ( -/obj/structure/rack, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, /turf/open/floor/plating, /area/maintenance/starboard/aft) "ciL" = ( @@ -48169,17 +50082,16 @@ /obj/machinery/power/solar_control{ dir = 4; id = "portsolar"; - name = "Port Quarter Solar Control"; - track = 0 + name = "Port Quarter Solar Control" }, /obj/structure/cable, /turf/open/floor/plating, /area/maintenance/solars/port/aft) "ciR" = ( /obj/machinery/power/apc{ + areastring = "/area/maintenance/solars/port/aft"; dir = 4; name = "Port Quarter Solar APC"; - areastring = "/area/maintenance/solars/port/aft"; pixel_x = 23; pixel_y = 2 }, @@ -48204,22 +50116,27 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/port/aft) +"ciV" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/light_construct{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "ciW" = ( /obj/effect/landmark/blobstart, /turf/open/floor/plating, /area/engine/engineering) "ciX" = ( -/obj/structure/closet/crate, -/obj/item/stack/sheet/metal/fifty, -/obj/item/stack/rods/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/electronics/airlock, -/obj/item/electronics/airlock, -/obj/item/stock_parts/cell/high/plus, -/obj/item/stack/sheet/mineral/plasma{ - amount = 30 +/obj/machinery/light{ + dir = 1 }, -/turf/open/floor/plating, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, /area/engine/engineering) "ciY" = ( /obj/machinery/door/poddoor{ @@ -48695,6 +50612,11 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/heads/chief) +"cjZ" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/turf/open/floor/plasteel, +/area/engine/engineering) "cka" = ( /obj/machinery/door/poddoor/preopen{ id = "testlab"; @@ -48804,14 +50726,22 @@ /turf/closed/wall, /area/maintenance/starboard/aft) "ckp" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/rack, /obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" + lootcount = 3; + name = "3maintenance loot spawner" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"ckq" = ( +/obj/structure/table, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/rods/fifty, +/turf/open/floor/plasteel, +/area/engine/engineering) "ckr" = ( /obj/structure/reagent_dispensers/fueltank, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -48828,9 +50758,9 @@ /area/maintenance/solars/starboard/aft) "ckt" = ( /obj/machinery/power/apc{ + areastring = "/area/maintenance/solars/starboard/aft"; dir = 8; name = "Starboard Quarter Solar APC"; - areastring = "/area/maintenance/solars/starboard/aft"; pixel_x = -26; pixel_y = 3 }, @@ -48904,6 +50834,14 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) +"ckE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/maintenance{ + name = "Locker Room Maintenance"; + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/maintenance/port) "ckF" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, @@ -48928,6 +50866,15 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) +"ckJ" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 2; + name = "2maintenance loot spawner" + }, +/obj/item/storage/toolbox/electrical, +/turf/open/floor/plating, +/area/maintenance/department/medical/morgue) "ckK" = ( /obj/structure/tank_dispenser, /obj/effect/turf_decal/bot{ @@ -48992,10 +50939,27 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/heads/chief) +"ckP" = ( +/obj/structure/noticeboard{ + pixel_y = -27 + }, +/obj/structure/chair/sofa/right{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) "ckQ" = ( /obj/structure/closet/cardboard, /turf/open/floor/plasteel, /area/quartermaster/warehouse) +"ckR" = ( +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance, +/obj/item/coin/gold, +/obj/item/coin/gold, +/obj/item/coin/gold, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "ckS" = ( /obj/structure/closet/cardboard, /turf/open/floor/plating, @@ -49069,9 +51033,7 @@ /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) "cle" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 2 - }, +/obj/machinery/atmospherics/pipe/simple/general/visible, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) "clf" = ( @@ -49185,13 +51147,10 @@ /turf/open/floor/plating, /area/maintenance/starboard/aft) "cls" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, +/turf/closed/wall, /area/maintenance/starboard/aft) "clt" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -49325,6 +51284,12 @@ }, /turf/open/floor/plasteel/dark, /area/engine/engine_smes) +"clH" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "clI" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -49339,23 +51304,33 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/engine/engineering) -"clM" = ( -/obj/structure/table, -/obj/item/crowbar/large, -/obj/item/storage/box/lights/mixed, -/obj/item/clothing/glasses/meson, -/obj/item/clothing/glasses/meson, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 +"clK" = ( +/obj/structure/closet/crate, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/rods/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/electronics/airlock, +/obj/item/electronics/airlock, +/obj/item/stock_parts/cell/high/plus, +/obj/item/stack/sheet/mineral/plasma{ + amount = 30 }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel, +/obj/item/lightreplacer, +/obj/item/lightreplacer, +/turf/open/floor/plating, /area/engine/engineering) +"clL" = ( +/obj/structure/table, +/obj/effect/spawner/lootdrop/maintenance, +/obj/item/coin/silver, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"clM" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance, +/obj/item/coin/silver, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "clN" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/yellow{ @@ -49364,13 +51339,21 @@ /turf/open/floor/plasteel, /area/engine/engineering) "clO" = ( -/obj/machinery/vr_sleeper, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/landmark/start/janitor, +/mob/living/simple_animal/hostile/lizard{ + name = "Wags-His-Tail"; + real_name = "Wags-His-Tail" }, /turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/area/janitor) +"clP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/maintenance/port) "clQ" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -49378,21 +51361,9 @@ /turf/open/floor/plasteel, /area/engine/engineering) "clR" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/structure/table, -/obj/item/book/manual/wiki/engineering_hacking{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/book/manual/wiki/engineering_construction, -/obj/item/clothing/glasses/meson, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) +/obj/machinery/portable_atmospherics/pump, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "clS" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/machinery/rnd/production/techfab/department/security, @@ -49403,28 +51374,30 @@ /turf/open/floor/plasteel, /area/security/main) "clT" = ( -/obj/machinery/portable_atmospherics/canister/nitrogen, -/turf/open/floor/engine/n2, -/area/engine/atmos) +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "clU" = ( /turf/open/floor/engine/n2, /area/engine/atmos) "clV" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/engine/o2, -/area/engine/atmos) +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "clW" = ( /turf/open/floor/engine/o2, /area/engine/atmos) "clX" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/landmark/xmastree, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ +/obj/machinery/light{ dir = 1 }, +/obj/item/radio/intercom{ + pixel_y = 25 + }, /turf/open/floor/plasteel, -/area/crew_quarters/bar) +/area/hallway/primary/central) "clY" = ( /obj/effect/landmark/xeno_spawn, /turf/open/floor/engine/air, @@ -49432,17 +51405,28 @@ "clZ" = ( /turf/open/floor/engine/air, /area/engine/atmos) +"cma" = ( +/obj/machinery/hydroponics/constructable, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = 29 + }, +/turf/open/floor/plasteel/dark, +/area/hydroponics) "cmb" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/maintenance/disposal/incinerator) "cmc" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 2 +/obj/machinery/camera{ + c_tag = "Starboard Primary Hallway" }, -/turf/closed/wall/r_wall, -/area/maintenance/disposal/incinerator) +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) "cmd" = ( /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) @@ -49506,15 +51490,27 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) +"cmm" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/condiment/flour, +/obj/item/kitchen/rollingpin, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) "cmn" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) +/obj/structure/table/wood, +/obj/item/storage/pill_bottle/dice, +/turf/open/floor/plasteel, +/area/security/prison) "cmo" = ( /obj/structure/rack, /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"cmp" = ( +/obj/structure/table/wood, +/obj/item/toy/cards/deck, +/turf/open/floor/plasteel, +/area/security/prison) "cmq" = ( /obj/effect/landmark/xeno_spawn, /obj/structure/disposalpipe/segment, @@ -49523,21 +51519,18 @@ }, /area/maintenance/starboard/aft) "cmr" = ( -/obj/structure/closet/toolcloset, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 +/obj/structure/chair/comfy/brown{ + dir = 8 }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) +/turf/open/floor/plasteel, +/area/security/prison) "cms" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/structure/chair/comfy/brown{ + color = "#66b266"; + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) +/turf/open/floor/plasteel, +/area/security/prison) "cmt" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -49564,8 +51557,7 @@ /obj/machinery/power/solar_control{ dir = 1; id = "starboardsolar"; - name = "Starboard Quarter Solar Control"; - track = 0 + name = "Starboard Quarter Solar Control" }, /obj/structure/cable{ icon_state = "0-4" @@ -49645,6 +51637,13 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/engine/engineering) +"cmE" = ( +/obj/structure/chair/comfy/brown{ + color = "#596479"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/prison) "cmF" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -49673,6 +51672,34 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) +"cmH" = ( +/obj/item/electropack/shockcollar, +/obj/item/assembly/signaler, +/turf/open/floor/plating, +/area/security/prison) +"cmI" = ( +/obj/structure/bed, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/plating, +/area/security/prison) +"cmJ" = ( +/obj/machinery/door/airlock/external{ + name = "External Access"; + req_access_txt = "13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"cmK" = ( +/obj/machinery/door/airlock/external{ + name = "External Access"; + req_access_txt = "13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "cmL" = ( /obj/structure/cable{ icon_state = "4-8" @@ -49722,9 +51749,7 @@ /turf/open/floor/plasteel, /area/construction) "cmY" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 2 - }, +/obj/machinery/atmospherics/components/binary/pump/on, /obj/machinery/light/small{ dir = 8 }, @@ -49874,9 +51899,6 @@ /area/engine/engine_smes) "cnr" = ( /obj/machinery/door/window/southleft{ - base_state = "left"; - dir = 2; - icon_state = "left"; name = "Engineering Delivery"; req_access_txt = "10" }, @@ -49968,7 +51990,6 @@ /area/maintenance/aft) "cnF" = ( /obj/machinery/atmospherics/components/binary/pump/on{ - dir = 2; name = "Waste Out" }, /obj/structure/disposalpipe/segment{ @@ -49993,11 +52014,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"cnJ" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "cnK" = ( /obj/structure/cable{ icon_state = "1-2" @@ -50387,39 +52403,18 @@ pixel_x = 3; pixel_y = -3 }, -/obj/effect/turf_decal/bot{ - dir = 2 - }, +/obj/effect/turf_decal/bot, /obj/structure/window/reinforced{ dir = 1; layer = 2.9 }, -/turf/open/floor/plasteel{ - dir = 2 - }, +/turf/open/floor/plasteel, /area/ai_monitored/security/armory) "coT" = ( /obj/machinery/atmospherics/pipe/simple/general/visible, /obj/machinery/meter, /turf/open/floor/engine, /area/science/misc_lab) -"coZ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/structure/closet/secure_closet/engineering_electrical, -/turf/open/floor/plasteel, -/area/engine/engineering) -"cpa" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/structure/closet/secure_closet/engineering_welding, -/turf/open/floor/plasteel, -/area/engine/engineering) "cpb" = ( /obj/structure/closet/emcloset, /obj/machinery/light/small{ @@ -50481,9 +52476,7 @@ /turf/open/floor/plasteel, /area/engine/engine_smes) "cpk" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, /area/engine/engine_smes) "cpl" = ( @@ -50539,13 +52532,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"cps" = ( -/obj/structure/table, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/glass/fifty, -/turf/open/floor/plasteel, -/area/engine/engineering) "cpt" = ( /obj/structure/table, /obj/item/clothing/gloves/color/yellow, @@ -50645,7 +52631,6 @@ "cpO" = ( /obj/structure/lattice, /obj/machinery/atmospherics/components/binary/pump/on{ - dir = 2; name = "Incinerator Output Pump" }, /turf/open/space, @@ -50669,9 +52654,8 @@ "cpS" = ( /obj/structure/cable, /obj/machinery/power/apc{ - dir = 2; - name = "SMES room APC"; areastring = "/area/engine/engine_smes"; + name = "SMES room APC"; pixel_y = -24 }, /obj/effect/turf_decal/stripes/line{ @@ -50702,25 +52686,12 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/engine/engine_smes) -"cpV" = ( -/obj/machinery/camera{ - c_tag = "Engineering Storage"; - dir = 4 - }, -/obj/machinery/rnd/production/protolathe/department/engineering, -/turf/open/floor/plasteel, -/area/engine/engineering) "cpW" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, /turf/open/floor/plasteel, /area/engine/engineering) -"cpX" = ( -/obj/structure/table, -/obj/item/stack/rods/fifty, -/turf/open/floor/plasteel, -/area/engine/engineering) "cpY" = ( /obj/structure/cable{ icon_state = "2-8" @@ -50902,13 +52873,6 @@ /obj/machinery/door/poddoor/incinerator_atmos_main, /turf/open/floor/engine/vacuum, /area/maintenance/disposal/incinerator) -"cqu" = ( -/obj/machinery/door/airlock/external{ - name = "External Access"; - req_access_txt = "13" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "cqv" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/plating, @@ -51022,11 +52986,6 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) -"cqJ" = ( -/obj/structure/cable, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/solar/starboard/aft) "cqK" = ( /obj/structure/table, /obj/effect/spawner/lootdrop/maintenance{ @@ -51041,12 +53000,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"cqM" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "cqN" = ( /obj/structure/table, /obj/item/stack/sheet/metal/fifty, @@ -51076,10 +53029,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"cqQ" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plasteel, -/area/engine/engineering) "cqR" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plasteel, @@ -51128,7 +53077,6 @@ /area/engine/supermatter) "crb" = ( /obj/machinery/atmospherics/components/binary/pump{ - dir = 2; name = "Gas to Chamber" }, /obj/effect/decal/cleanable/dirt, @@ -51155,12 +53103,6 @@ }, /turf/open/floor/plating, /area/engine/engineering) -"cri" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "crk" = ( /obj/structure/lattice/catwalk, /turf/open/space, @@ -51249,9 +53191,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/corner{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "crz" = ( @@ -51542,14 +53482,6 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/simple, /turf/open/space, /area/space/nearstation) -"csy" = ( -/obj/structure/table, -/obj/item/weldingtool, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "csA" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "engsm"; @@ -51567,13 +53499,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat_interior) -"csE" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/solar/starboard/aft) "csH" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -51659,27 +53584,6 @@ }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat_interior) -"csY" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/structure/cable, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/solar/starboard/aft) -"csZ" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/solar/starboard/aft) "cta" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -52031,9 +53935,9 @@ icon_state = "0-8" }, /obj/machinery/power/apc{ + areastring = "/area/ai_monitored/turret_protected/aisat_interior"; dir = 4; name = "MiniSat Foyer APC"; - areastring = "/area/ai_monitored/turret_protected/aisat_interior"; pixel_x = 27 }, /obj/structure/chair, @@ -52098,8 +54002,6 @@ "cud" = ( /obj/machinery/turretid{ control_area = "/area/ai_monitored/turret_protected/aisat_interior"; - enabled = 1; - icon_state = "control_standby"; name = "Antechamber Turret Control"; pixel_y = -24; req_access = null; @@ -52178,7 +54080,6 @@ /area/ai_monitored/turret_protected/aisat/service) "cun" = ( /obj/machinery/atmospherics/components/binary/pump{ - dir = 2; name = "Mix to MiniSat" }, /obj/effect/turf_decal/stripes/line, @@ -52190,9 +54091,7 @@ dir = 8; pixel_x = -24 }, -/obj/effect/turf_decal/stripes/corner{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat/atmos) "cup" = ( @@ -52344,8 +54243,6 @@ }, /obj/machinery/turretid{ control_area = "/area/ai_monitored/turret_protected/aisat/atmos"; - enabled = 1; - icon_state = "control_standby"; name = "Atmospherics Turret Control"; pixel_x = -27; req_access = null; @@ -52371,8 +54268,6 @@ }, /obj/machinery/turretid{ control_area = "/area/ai_monitored/turret_protected/aisat/service"; - enabled = 1; - icon_state = "control_standby"; name = "Service Bay Turret Control"; pixel_x = 27; req_access = null; @@ -52461,9 +54356,9 @@ /area/ai_monitored/turret_protected/aisat/atmos) "cuM" = ( /obj/machinery/power/apc{ + areastring = "/area/ai_monitored/turret_protected/aisat/atmos"; dir = 8; name = "MiniSat Atmospherics APC"; - areastring = "/area/ai_monitored/turret_protected/aisat/atmos"; pixel_x = -27 }, /obj/structure/cable{ @@ -52587,9 +54482,9 @@ /area/ai_monitored/turret_protected/aisat/service) "cuX" = ( /obj/machinery/power/apc{ + areastring = "/area/ai_monitored/turret_protected/aisat/service"; dir = 4; name = "MiniSat Service Bay APC"; - areastring = "/area/ai_monitored/turret_protected/aisat/service"; pixel_x = 27 }, /obj/structure/cable{ @@ -52674,8 +54569,6 @@ }, /obj/machinery/turretid{ control_area = "/area/ai_monitored/turret_protected/aisat/hallway"; - enabled = 1; - icon_state = "control_standby"; name = "Chamber Hallway Turret Control"; pixel_x = 32; pixel_y = -24; @@ -52793,23 +54686,18 @@ "cvx" = ( /obj/effect/landmark/start/ai/secondary, /obj/item/radio/intercom{ - anyai = 1; freerange = 1; listening = 0; name = "Custom Channel"; pixel_y = 28 }, /obj/item/radio/intercom{ - broadcasting = 0; freerange = 1; - listening = 1; name = "Common Channel"; pixel_x = -27; pixel_y = 5 }, /obj/item/radio/intercom{ - anyai = 1; - broadcasting = 0; freerange = 1; frequency = 1447; name = "Private Channel"; @@ -52832,23 +54720,18 @@ "cvA" = ( /obj/effect/landmark/start/ai/secondary, /obj/item/radio/intercom{ - anyai = 1; freerange = 1; listening = 0; name = "Custom Channel"; pixel_y = 28 }, /obj/item/radio/intercom{ - broadcasting = 0; freerange = 1; - listening = 1; name = "Common Channel"; pixel_x = 27; pixel_y = 5 }, /obj/item/radio/intercom{ - anyai = 1; - broadcasting = 0; freerange = 1; frequency = 1447; name = "Private Channel"; @@ -53044,9 +54927,9 @@ "cwa" = ( /obj/structure/cable, /obj/machinery/power/apc{ + areastring = "/area/ai_monitored/turret_protected/aisat/hallway"; dir = 4; name = "MiniSat Chamber Hallway APC"; - areastring = "/area/ai_monitored/turret_protected/aisat/hallway"; pixel_x = 27 }, /turf/open/floor/circuit, @@ -53243,13 +55126,6 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai) -"cwy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table_frame, -/obj/item/wirerod, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "cwz" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -53309,9 +55185,8 @@ icon_state = "0-8" }, /obj/machinery/power/apc/highcap/five_k{ - dir = 2; - name = "AI Chamber APC"; areastring = "/area/ai_monitored/turret_protected/ai"; + name = "AI Chamber APC"; pixel_y = -24 }, /obj/machinery/flasher{ @@ -53451,14 +55326,6 @@ }, /turf/open/floor/plating, /area/security/processing) -"cxW" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/external{ - name = "External Access"; - req_access_txt = "13" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "cxY" = ( /obj/machinery/camera{ c_tag = "Arrivals Escape Pod 1"; @@ -53737,15 +55604,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, /area/hallway/secondary/exit) -"czP" = ( -/obj/structure/chair/stool/bar, -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) "czQ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/disposalpipe/segment, @@ -53992,15 +55850,6 @@ /obj/structure/closet/secure_closet/freezer/kitchen/maintenance, /turf/open/floor/plating, /area/maintenance/port/aft) -"cAz" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) "cAA" = ( /obj/machinery/light/small{ dir = 1 @@ -54046,9 +55895,8 @@ icon_state = "4-8" }, /obj/machinery/power/apc{ - dir = 2; - name = "Head of Personnel APC"; areastring = "/area/crew_quarters/heads/hop"; + name = "Head of Personnel APC"; pixel_y = -24 }, /obj/structure/cable{ @@ -54076,14 +55924,6 @@ /obj/machinery/light/small, /turf/open/floor/plating, /area/maintenance/port/aft) -"cAL" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/mob/living/simple_animal/hostile/lizard{ - name = "Wags-His-Tail"; - real_name = "Wags-His-Tail" - }, -/turf/open/floor/plasteel, -/area/janitor) "cAN" = ( /obj/machinery/door/airlock/maintenance{ name = "Security Maintenance"; @@ -54122,23 +55962,18 @@ "cAS" = ( /obj/effect/landmark/start/ai, /obj/item/radio/intercom{ - broadcasting = 0; freerange = 1; - listening = 1; name = "Common Channel"; pixel_x = -27; pixel_y = -9 }, /obj/item/radio/intercom{ - anyai = 1; freerange = 1; listening = 0; name = "Custom Channel"; pixel_y = -31 }, /obj/item/radio/intercom{ - anyai = 1; - broadcasting = 0; freerange = 1; frequency = 1447; name = "Private Channel"; @@ -54233,7 +56068,6 @@ "cBb" = ( /obj/machinery/camera/motion{ c_tag = "MiniSat AI Chamber South"; - dir = 2; network = list("aicore") }, /turf/open/floor/circuit, @@ -54265,7 +56099,6 @@ "cBf" = ( /obj/machinery/camera{ c_tag = "MiniSat External South"; - dir = 2; network = list("minisat"); start_active = 1 }, @@ -54315,14 +56148,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"cBn" = ( -/obj/machinery/camera{ - c_tag = "Locker Room Toilets"; - dir = 8 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet/locker) "cBo" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/wood, @@ -54398,7 +56223,6 @@ /area/science/xenobiology) "cBA" = ( /obj/machinery/button/massdriver{ - dir = 2; id = "toxinsdriver"; pixel_y = 24 }, @@ -54537,18 +56361,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat/hallway) -"cBT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) -"cBU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "cBV" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security{ @@ -54623,31 +56435,6 @@ }, /turf/closed/wall, /area/security/detectives_office) -"cCl" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"cCm" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"cCn" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/power/apc{ - dir = 4; - name = "Detective's Office APC"; - areastring = "/area/security/detectives_office"; - pixel_x = 24 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/maintenance/port) "cCo" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -55184,7 +56971,6 @@ "cEu" = ( /obj/machinery/camera{ c_tag = "Supermatter Chamber"; - dir = 2; network = list("engine"); pixel_x = 23 }, @@ -55379,7 +57165,6 @@ icon_state = "1-4" }, /obj/machinery/atmospherics/components/binary/pump{ - dir = 2; name = "Cooling Loop Bypass" }, /turf/open/floor/engine, @@ -55544,7 +57329,6 @@ }, /obj/machinery/camera{ c_tag = "Engineering Supermatter Aft"; - dir = 2; network = list("ss13","engine"); pixel_x = 23 }, @@ -55596,13 +57380,6 @@ }, /turf/open/floor/plasteel/dark, /area/engine/engineering) -"cGd" = ( -/obj/structure/closet/crate/bin, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/engine, -/area/engine/engineering) "cGe" = ( /obj/structure/cable{ icon_state = "2-8" @@ -55651,10 +57428,6 @@ /obj/machinery/light, /turf/open/floor/plasteel/dark, /area/engine/engineering) -"cGl" = ( -/obj/structure/closet/secure_closet/engineering_personal, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "cGr" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -55910,7 +57683,6 @@ /area/science/robotics/mechbay) "cHF" = ( /obj/machinery/button/door{ - dir = 2; id = "Skynet_launch"; name = "Mech Bay Door Control"; pixel_x = 6; @@ -56259,9 +58031,9 @@ /area/quartermaster/sorting) "cNL" = ( /obj/machinery/power/apc{ + areastring = "/area/maintenance/central"; dir = 1; name = "Central Maintenance APC"; - areastring = "/area/maintenance/central"; pixel_y = 24 }, /obj/structure/cable{ @@ -56296,9 +58068,9 @@ /area/maintenance/starboard) "cNS" = ( /obj/machinery/power/apc{ + areastring = "/area/maintenance/starboard"; dir = 4; name = "Starboard Maintenance APC"; - areastring = "/area/maintenance/starboard"; pixel_x = 26 }, /obj/structure/cable{ @@ -56427,12 +58199,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"cSz" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/chapel/main) "cSA" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -56525,7 +58291,6 @@ "cSM" = ( /obj/machinery/computer/station_alert, /obj/item/radio/intercom{ - broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 20 }, @@ -56724,7 +58489,6 @@ icon_state = "4-8" }, /obj/machinery/requests_console{ - announcementConsole = 0; department = "Engineering"; departmentType = 4; name = "Engineering RC"; @@ -56743,9 +58507,9 @@ icon_state = "1-2" }, /obj/machinery/power/apc{ + areastring = "/area/maintenance/central/secondary"; dir = 8; name = "Central Maintenance APC"; - areastring = "/area/maintenance/central/secondary"; pixel_x = -24 }, /obj/structure/cable{ @@ -56769,12 +58533,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"cTI" = ( -/obj/machinery/door/airlock/maintenance/abandoned{ - req_access_txt = "12" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "cTJ" = ( /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" @@ -56805,9 +58563,9 @@ /area/medical/morgue) "cTM" = ( /obj/machinery/power/apc{ + areastring = "/area/maintenance/department/medical/morgue"; dir = 4; name = "Morgue Maintenance APC"; - areastring = "/area/maintenance/department/medical/morgue"; pixel_x = 26 }, /obj/structure/cable{ @@ -57012,13 +58770,6 @@ icon_state = "wood-broken4" }, /area/maintenance/bar) -"fGf" = ( -/obj/machinery/smartfridge/disks{ - pixel_y = 2 - }, -/obj/structure/table, -/turf/open/floor/plasteel, -/area/hydroponics) "fKl" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/landmark/event_spawn, @@ -57029,17 +58780,10 @@ dir = 4 }, /obj/machinery/firealarm{ - dir = 2; pixel_y = 24 }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) -"gbq" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/construction) "gbT" = ( /obj/structure/table, /obj/item/stack/sheet/metal/fifty, @@ -57055,18 +58799,6 @@ "gjl" = ( /turf/closed/wall, /area/quartermaster/warehouse) -"gsz" = ( -/obj/machinery/camera{ - c_tag = "Fitness Room South"; - dir = 1 - }, -/obj/machinery/vr_sleeper, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) "gwd" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -57095,12 +58827,6 @@ }, /turf/open/floor/wood, /area/maintenance/bar) -"gOZ" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/turf/open/floor/plating, -/area/crew_quarters/fitness) "gWd" = ( /obj/structure/cable{ icon_state = "1-4" @@ -57125,9 +58851,9 @@ icon_state = "1-2" }, /obj/machinery/power/apc{ + areastring = "/area/quartermaster/warehouse"; dir = 4; name = "Cargo Warehouse APC"; - areastring = "/area/quartermaster/warehouse"; pixel_x = 26 }, /obj/structure/cable{ @@ -57135,12 +58861,6 @@ }, /turf/open/floor/plating, /area/maintenance/port) -"hwu" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-24" - }, -/turf/open/floor/plasteel, -/area/security/prison) "hEm" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-22" @@ -57247,12 +58967,6 @@ /obj/machinery/rnd/production/techfab/department/cargo, /turf/open/floor/plasteel, /area/quartermaster/office) -"jnR" = ( -/obj/machinery/atmospherics/components/binary/valve{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "jqv" = ( /obj/structure/chair/wood/normal{ dir = 1 @@ -57303,15 +59017,6 @@ }, /turf/open/floor/wood, /area/maintenance/port/aft) -"jMY" = ( -/obj/structure/table, -/obj/item/stack/cable_coil{ - pixel_x = 3; - pixel_y = -7 - }, -/obj/item/stack/cable_coil, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "jSO" = ( /obj/machinery/light{ dir = 4 @@ -57330,14 +59035,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"khb" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/obj/structure/table, -/obj/item/kitchen/rollingpin, -/turf/open/floor/plasteel, -/area/hallway/secondary/service) "khB" = ( /obj/machinery/door/airlock/external{ req_access_txt = "13" @@ -57382,14 +59079,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/service) -"kQk" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/department/medical/morgue) "kQq" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ @@ -57429,14 +59118,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/science/circuit) -"mjr" = ( -/obj/machinery/vending/wardrobe/bar_wardrobe, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"moD" = ( -/obj/effect/landmark/barthpot, -/turf/open/floor/wood, -/area/library) "mpI" = ( /obj/structure/table/wood, /turf/open/floor/wood{ @@ -57492,8 +59173,8 @@ /area/engine/engineering) "nxv" = ( /obj/machinery/power/apc{ - name = "Construction Area APC"; areastring = "/area/construction"; + name = "Construction Area APC"; pixel_y = -24 }, /obj/structure/cable{ @@ -57522,6 +59203,10 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"nWU" = ( +/obj/machinery/smartfridge/organ/preloaded, +/turf/closed/wall, +/area/medical/sleeper) "oce" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 @@ -57548,7 +59233,6 @@ /area/science/circuit) "oKh" = ( /obj/structure/chair/wood/normal{ - icon_state = "wooden_chair"; dir = 8 }, /turf/open/floor/wood, @@ -57589,9 +59273,7 @@ pixel_y = -3 }, /obj/item/radio/intercom{ - freerange = 0; frequency = 1485; - listening = 1; name = "Station Intercom (Medbay)"; pixel_x = 30 }, @@ -57660,12 +59342,6 @@ /obj/item/reagent_containers/food/drinks/beer, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"rsp" = ( -/obj/machinery/atmospherics/components/unary/tank/air{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "rBq" = ( /obj/item/clothing/head/kitty, /obj/item/clothing/under/maid, @@ -57724,12 +59400,6 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/maintenance/department/medical/morgue) -"sxs" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/table, -/obj/item/shovel/spade, -/turf/open/floor/plasteel, -/area/hallway/secondary/service) "sAM" = ( /turf/open/floor/wood{ icon_state = "wood-broken6" @@ -57809,7 +59479,6 @@ dir = 4 }, /obj/machinery/firealarm{ - dir = 2; pixel_y = 24 }, /turf/open/floor/carpet, @@ -57824,10 +59493,6 @@ /obj/item/restraints/handcuffs/fake, /turf/open/floor/plating, /area/maintenance/bar) -"tyO" = ( -/obj/item/clothing/under/color/grey, -/turf/open/floor/plating, -/area/maintenance/bar) "tMl" = ( /obj/effect/turf_decal/loading_area, /turf/open/floor/plasteel/showroomfloor, @@ -57877,16 +59542,6 @@ /obj/item/flashlight, /turf/open/floor/plasteel/dark, /area/engine/engineering) -"uhH" = ( -/obj/item/wrench, -/obj/item/weldingtool, -/obj/item/clothing/head/welding{ - pixel_x = -3; - pixel_y = 5 - }, -/obj/structure/rack, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "ujF" = ( /obj/machinery/cryopod{ dir = 4 @@ -57940,9 +59595,7 @@ /turf/open/floor/plasteel, /area/science/circuit) "uPT" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 2 - }, +/obj/machinery/atmospherics/pipe/simple/general/visible, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, @@ -57993,13 +59646,6 @@ }, /turf/open/floor/wood, /area/maintenance/bar) -"vpY" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/machinery/meter, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "vsM" = ( /obj/machinery/power/apc/auto_name/south, /obj/structure/cable, @@ -58111,11 +59757,6 @@ }, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) -"wUY" = ( -/obj/structure/table, -/obj/item/reagent_containers/glass/bucket, -/turf/open/floor/plasteel, -/area/hallway/secondary/service) "xgF" = ( /obj/structure/chair/stool/bar, /turf/open/floor/wood{ @@ -64199,6 +65840,11 @@ aaa aaa aaa aaa +cdh +aaa +aaa +aaa +cdh aaa aaa aaa @@ -64211,12 +65857,7 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa +aVw aaa aaa aaa @@ -64450,23 +66091,23 @@ aaa aaa aaa aaa +cdh +aaa +cdh aaa aaa aaa +gXs aaa aaa aaa +gXs aaa aaa aaa +cdh aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +cdh aaa aaa aaa @@ -64707,23 +66348,23 @@ aaa aaa aaa aaa +gXs +aaa +gXs aaa aaa +gXs +apv +gXs +gXs +gXs +apv +gXs aaa aaa +gXs aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +gXs aaa aaa aaa @@ -64963,25 +66604,25 @@ aaa aaa aaa aaa +apv +apv +gXs +aag +apv +gXs +gXs aaa aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aae -aaa +gXs +gXs +apv +apv +aQd +aag +apv aaa aaa aaa @@ -65220,25 +66861,25 @@ aaa aaa aaa aaa +aGk +aQe +aaa +aQe +aRx +gXs +aoV aaa aaa aaa aaa aaa aaa +gXs +aGk +aQe aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aQe +aRx aaa aaa aaa @@ -65477,10 +67118,11 @@ aaa aaa aaa aaa -aaa +aab aaa cpe aaa +asL aaa aaa aaa @@ -65490,12 +67132,11 @@ aaa aaa aaa aaa -aaa -aaa +aab aaa cwV aaa -aaa +asL aaa aaa aaa @@ -65733,14 +67374,12 @@ aaa aaa aaa aae -aaf +alN +gXs aaa aaa aaa -aaa -aaa -aaa -aae +gXs aaa aaa aaa @@ -65750,9 +67389,11 @@ aaa aaa aaa aaa +gXs aaa aaa aaa +gXs aaa aaa aaa @@ -65990,14 +67631,12 @@ aaa aaa aaa aaa -aaf -aaa -aaa -aaa -aaa -aaa -aaa -aaa +alN +gXs +aaa +aaa +aaa +gXs aaa aaa aaa @@ -66007,9 +67646,11 @@ aaa aaa aaa aaa +gXs aaa aaa aaa +gXs aaa aaa aaa @@ -66247,14 +67888,12 @@ aaa aaa aaa aaa -aaf -aaa -aaa -aaa -aaa -aaa -aaa -aaa +alN +gXs +aaa +aaa +aaa +gXs aaa aaa aaa @@ -66264,9 +67903,11 @@ aaa aaa aaa aaa +gXs aaa aaa aaa +gXs aaa aaa aaa @@ -66504,11 +68145,12 @@ aaa aaa aaa aaa -aaf -aaa +alN +gXs aaa cqq aaa +gXs aaa aaa aaa @@ -66518,12 +68160,11 @@ aaa aaa aaa aaa -aaa -aaa +gXs aaa cqq aaa -aaa +gXs aaa aaa aaa @@ -66761,7 +68402,7 @@ aaf aaf aaf aaa -aaf +alN arB asE cyb @@ -68834,7 +70475,7 @@ aaa awW aOh ayl -ayl +bRf aRY awW aaa @@ -68846,7 +70487,7 @@ awW awZ ayl ayl -bgi +aQR awW aaa aaa @@ -71411,7 +73052,7 @@ aUO aUy aWm aWf -aUQ +bcW czK bhN bcl @@ -71694,7 +73335,7 @@ aaa aaa aaa aaa -aae +aaa aaa aaa aaa @@ -71950,7 +73591,7 @@ aaa aaa aaa aaa -aaa +aae aaa aaa aaa @@ -72178,7 +73819,7 @@ aPa aQn ayl czK -aUP +aUO aUO aXL aXZ @@ -72429,7 +74070,7 @@ aHy ayl aKk aLA -aNf +aHD aNf aLA aQD @@ -74455,8 +76096,8 @@ ady ady ady ady -ady ajq +aTp ajW akB alh @@ -74481,7 +76122,7 @@ aBG aAQ aAQ aAQ -aBM +aAQ aAQ aKn aLE @@ -74497,11 +76138,11 @@ aXQ aXQ aXQ aXQ -aXQ -aXQ -aXQ -aXQ -bhQ +aPz +aPz +bcJ +aPz +bkg bjj bkF aaa @@ -74751,14 +76392,14 @@ aPA aPA aPA aXQ -aZt +baO aXQ -aZt -aXQ -aZt -aXQ -aZt -bhQ +bdV +aPz +axS +bgs +biM +bkg bjj bkF aaa @@ -75003,20 +76644,20 @@ aNm aOl aPA aQO -aSh aTw aUU +cek aWn aXQ -aZv -aXQ bbL aXQ -bdJ -aXQ -bgr -bhQ -bjj +bgl +aPz +aEb +bhK +biZ +bvn +bml bkF aaa aaa @@ -75241,7 +76882,7 @@ alU amC arM alU -atT +avc asO avV atO @@ -75249,7 +76890,7 @@ ayw atN aAV aBQ -aDh +bbA aDo aFQ aHe @@ -75266,13 +76907,13 @@ aUn aTy aWy aYe -aZw -aZw bbq -bct -bfa -bfa -bhQ +bcS +aPz +aEc +bhP +bjD +bkg bjk bkE aaa @@ -75516,20 +77157,20 @@ aLk aNo aOo aPA -aQQ +aQS aQN aSV aUo aUX aXp -baO -aZo -baw -bcO -baw -cBn -bgs +bct +bdJ +bgr +aPz +aSG bhQ +bjW +bwP bjk bkF aaa @@ -75773,20 +77414,20 @@ aLE aLE aOn aPA -aQP +aQQ aQN -aTx -aUV +aTz +aUt aWo aXQ aXQ aXQ aXQ -aXQ -aXQ -aXQ -aXQ -bhQ +aPz +aPz +aPz +aPz +bkg bjk aPz aaa @@ -75830,7 +77471,7 @@ ccb ccb ccb aaa -chL +aUf aaa ccb ccb @@ -76022,26 +77663,26 @@ aAY aBQ aDl bxk -aFS +aDo aDo aIX -aBQ +blt aLE aLE aOp aPA -aQR +aMg aQN -aTA -aUq +aQN +aUt aWq -aXs -aYH -aZx +aQN +aQN +aQN +aQN +bfe bbO aPA -bdM -aPz bgt bhS bjk @@ -76087,7 +77728,7 @@ aaa aaf aaa aaa -chL +aUg aaa aaa aaf @@ -76289,16 +77930,16 @@ aOl aPC aQN aQN -aTz -aUp -aWq -aXr -aZx +aTB +aUq +aUV +aXv +bbr +aQN +aQN cBh -bbN +bit aPA -bdL -aPz bgt bhR bjk @@ -76344,7 +77985,7 @@ aaf aaf aaf aaf -chM +aUg aaf aaf aaf @@ -76537,25 +78178,25 @@ aBQ aDn aDo aDo -aHD +aFU aIZ aBQ aLE aLE aOq aPD -aQT -aQT +aQV +aQN aTC -aUs +aUr aUY -aXv -aYS -aZx +aXw +bbU +aQN +aQN +bfe bbO aPA -bdM -aPz aSg bhT bjk @@ -76785,7 +78426,7 @@ amC amC amC alU -aqO +avc amC atJ atO @@ -76796,23 +78437,23 @@ aDo aDo aDo aIY -aBQ +blt aLE aLE aOl aPA -aQS +aQX aQN -aTB +aTC aUr -aWq -aXt +aYX +aXx +bcu +aQN +aQN aPA aPA aPA -aPA -aPA -aPz bel bfI bgq @@ -77039,7 +78680,7 @@ aaf alU alU alU -alU +amC amC alU atM @@ -77050,7 +78691,7 @@ aAY aBQ aDp aDo -aFU +aFS aDo aJb aKp @@ -77058,15 +78699,15 @@ aLE aLE aOl aPE -aQV +aQY +aQN +aTC +aUs +aWB +aXx +bcu +aQN aQN -aSi -aUu -aWq -aXw -aZB -aZB -aZB aZB aPA bfc @@ -77295,8 +78936,8 @@ alU aaf aaH alU -arO -alU +aQT +amC amC avc atO @@ -77315,15 +78956,15 @@ aLH aLE aOl aPA -aQU +aSX +aQN +aTD +aUu +aXk +aXA +bcw aQN aQN -aUt -aWq -aXw -aZA -aZA -aZA aZA aPA aWv @@ -77572,17 +79213,17 @@ aLK aLK aOr aPA -aQX -aQN +aTx aQN +aSi aUv aWp -aXA -aYX -aYX -aYX -bbs -bcw +aTy +aTy +aTy +aTy +bcT +chZ bfd bgw aZE @@ -77829,18 +79470,18 @@ aLJ aLE aOl aPA -aQW -aQW -aTD -aQW +aTA +aQN +aUp aUZ -aXx +aXr aYU aYU aYU -bbr -bcu -bfe +aYU +aYU +ckE +bTt aYb aZE bjm @@ -78090,14 +79731,14 @@ aPG aPG aPG aPG +aZx +aQW +aQW +aQW +aQW +bdL aPA -aPA -aPA -aPA -aPA -aPA -aPA -aWv +clP aYb aZE bjp @@ -78343,19 +79984,19 @@ aLL bDe aOl aPF -aQY -aSk +aSh +aQt aTE aPG -aWu -aYa -aZD -aZD -hcE -aZD -aZD -bff -bfk +aPA +aPA +aPA +aPA +aPA +aPA +aPA +aWv +aYb aZE bjo bjr @@ -78604,17 +80245,17 @@ aRa aRa aTG aPG -aWw -aYc -aZF -aZF -aZF -aZF -aZF -aZF -bgy +aWu +aYa +aZD +aZD +hcE +aZD +aZD +bff +bfk aZE -bjr +bgx bjr ama bmh @@ -78656,7 +80297,7 @@ bHE bUs ceY bCq -bHE +bJP bUs bHE bLu @@ -78861,15 +80502,15 @@ aQZ aRa aTF aPG -aSX -aWC -baS -aZI -baS -baS -bdS -bdU -ckQ +aWw +aYc +aZF +aZF +aZF +aZF +aZF +aZF +bgy gjl bjq bjr @@ -79123,7 +80764,7 @@ aXJ bgA aZp baY -bcJ +aYZ bcF bfg bgA @@ -79412,7 +81053,7 @@ aoV bCq bHE bHE -bSq +bad cdb bCq bVE @@ -79637,7 +81278,7 @@ aXM bfi cBi bbS -bcS +bdM bbt bfi beD @@ -79891,14 +81532,14 @@ aTH aPK aWz aWC +baS +baS +baS +bcR +baS +baS +baS gjl -gjl -gjl -bcT -gjl -gjl -gjl -aZE bju biv bmf @@ -79939,14 +81580,14 @@ mrR dKP odx rBq -tur +bat bCq bUs bLv aaa bLv bJf -ccd +cfS bCq aaa aaa @@ -80146,16 +81787,16 @@ aRc aSm aTJ aPK -cCl -aYh -cCm -cCm -cCm -cCn -aPz +aWA +aWC +baS +aZI +baS bdW -aSg -aZE +bdS +bdU +ckQ +gjl bgz biT boU @@ -80166,7 +81807,7 @@ bbR btu bbR bOL -bxy +bPR byF bwW bGm @@ -80403,11 +82044,11 @@ aPK aSm aTI aPK -aWB +aXs cCj apd apd -bbU +apd cCk apd aZK @@ -80452,7 +82093,7 @@ iiW dfL dKP mqZ -tyO +tur wfR bCq bUs @@ -80660,9 +82301,9 @@ aPK aSn aTK aPK -apd -cCj -asW +aXt +aZo +aYj baW bLE bLG @@ -80921,8 +82562,8 @@ apd aYi aqW aqW -bbQ -bLG +aVT +bSO apd aZH aZK @@ -81200,7 +82841,7 @@ bwY byJ bwe bAc -bBI +bwL bGn bGn bGn @@ -81436,7 +83077,7 @@ aWG aZa baX bcH -bdE +bSZ apd aZH bnL @@ -81634,9 +83275,9 @@ aaa aaa aaa aaa -aaa -aaa -aaa +gXs +gXs +brT abc abu abu @@ -81719,7 +83360,7 @@ bCq bHD bJe bCq -bLu +cib bHE bHE bHE @@ -81890,10 +83531,10 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa +gXs +aai +aai +aai abb abt aca @@ -81946,11 +83587,11 @@ aSa aSr aSr apd -aYZ +asW bLE aqW aqW -bLE +bTq apd beA bqp @@ -82148,9 +83789,9 @@ aaa aaa aaa aaa -aaa -aaa -aaa +aai +cmH +aay abe abw acc @@ -82203,7 +83844,7 @@ aTL aTP aWD apd -aYj +aYh aZL baU baU @@ -82219,8 +83860,8 @@ bnJ bbR bbR bbR -bty -buJ +bWk +bYG bwe bxE byM @@ -82404,10 +84045,10 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa +gXs +aai +cmI +aay abd abv acb @@ -82511,8 +84152,8 @@ bLw bLw bLw caq -cbw -ccu +bCA +bHE ciT bCq bSs @@ -82662,11 +84303,11 @@ aaa aaa aaf aaf -aaH -aai -aai -abg -aby +ctv +acd +aaM +aaP +aaY aby aby aby @@ -82768,10 +84409,10 @@ bVI bVI bVI bTA -bEP -cdi -bCq -bCq +bHF +bHE +bHE +bHE bHE bHE cmD @@ -82779,7 +84420,7 @@ cnr cnU chD cpq -cpV +bVH cqw cqO crp @@ -82920,10 +84561,10 @@ aaf aaf aai aai -aai -aaU abf -abx +aat +aaU +abg acd acC ada @@ -83025,8 +84666,8 @@ bWB bWB bVI cax -cbx -cdh +cbw +cby ciU cjK ckA @@ -83177,7 +84818,7 @@ aai aai aai aaI -aaM +aat aat aat aat @@ -83244,12 +84885,12 @@ aYl bBi aLY bnN -boY +bTv bqw aJq aJq aYl -aKF +bTw aLX aJq aJq @@ -83282,8 +84923,8 @@ cdd cea bVI caz -cby -cdj +cbx +ccu cdv cem cem @@ -83432,8 +85073,8 @@ aaf aai aan aaw -aaB -aat +aaD +aaL aaJ aat abh @@ -83687,9 +85328,9 @@ aaa aag aaa aak -aap -aay -aaD +aao +aaz +aaE aat aat aat @@ -83726,7 +85367,7 @@ ats atY auo axy -ayN +ayM azE aAW aCa @@ -83763,7 +85404,7 @@ bqy cBr bqy buK -bqy +bTx aJw aJq aJq @@ -83795,10 +85436,10 @@ bWB bWB cec bVI -cay +bUw ccw chY -ciX +clK cjM ckB ckB @@ -83809,7 +85450,7 @@ coH cgR cgR cqx -cqR +cgR crp crJ crT @@ -83944,9 +85585,9 @@ aaa aag aaf aaj -aao -aax -aaC +aap +aaB +aaF aat aat adO @@ -83983,7 +85624,7 @@ atu cCi awg axy -ayM +ayN azs aAR aBP @@ -84063,10 +85704,10 @@ ckC ccw cnX coH -cps -cpX +cjZ +ckq cqz -cqQ +cqR ccw crH crT @@ -84201,13 +85842,13 @@ aaa aag aaa aal -aar -aay -aaF -aat -aaO -aaW +aaq +aax +aaN aat +aaV +cmn +cms abB acf abM @@ -84277,11 +85918,11 @@ bqA brW btB buM -bwi +aOJ bmr aMm aJq -bBi +byV bCs bCs bEY @@ -84458,13 +86099,13 @@ aaa aag aaf aaj -aaq -aay -aaE -aaJ -aaN -aaV +aar +aaC +aaO aat +aaW +cmp +cmE aat acd abL @@ -84540,11 +86181,11 @@ aMn aJq bBi bCs -bDv +bDw +bDz +bFb bEX bFa -bHH -bFa bKt bLx bCs @@ -84715,13 +86356,13 @@ aaa aag aaa aal -aat -aay +aau aat aat -aaJ aat aat +cmr +aat abD acd acd @@ -84789,7 +86430,7 @@ bnR bpe bqB bqq -btD +bbQ buO bwk bmr @@ -84973,7 +86614,7 @@ aag aaf aaj aas -aaz +aat aat aat aat @@ -85021,7 +86662,7 @@ aGq aHO aJl ayW -aJq +clV aJq aOE aJn @@ -85054,7 +86695,7 @@ byP aJq bBi bCs -bDw +bDy bEZ bGv bHH @@ -85066,7 +86707,7 @@ bNJ bNJ bKx cjL -gbq +bNL bNI bUz bVJ @@ -85232,9 +86873,9 @@ aam aav aav aav -aaL -aaQ -aaY +aav +aav +aav aav abE acg @@ -85311,7 +86952,7 @@ byR bnM bBl bCs -bDz +bFa bFa bFa bHH @@ -85319,7 +86960,7 @@ bFa bFa bFa bCs -bNL +bNJ bNJ apV cjL @@ -85358,7 +86999,7 @@ cEL cFb cFu cFI -cGd +cdj cGs cGr ccw @@ -85486,14 +87127,14 @@ aaa aag aaf aai -aau +aaA aaA aaG -aaK -aaP +aaA +aaQ aaX -hwu -aat +abj +abG acd acD acY @@ -85568,10 +87209,10 @@ byQ aJq aJq bCs -bDy -bFb -bGw +bFa +bFa bER +bGw bJk bFa bLA @@ -85603,7 +87244,7 @@ cTa ceZ clQ cgR -cgx +bUX coM cpv cqb @@ -85618,11 +87259,11 @@ cqb cAo cGt cgx -jMY +chU csd cHa csd -uhH +chW ccw aaa aaT @@ -85749,8 +87390,8 @@ aai aai aai aai -abj -abG +abx +abF acd acd acd @@ -85823,7 +87464,7 @@ aaa aJn aXf aJq -byV +aJq bCs bAM bFa @@ -85842,7 +87483,7 @@ bNI bEP bVJ bVJ -bOM +bSF bQd bQP bSt @@ -86007,7 +87648,7 @@ aaa aaf aai abi -abF +bVL ach acK adf @@ -86528,11 +88169,11 @@ cpg acv adi adi -aaZ +arl aeW agQ ahv -ahQ +agX aiI aiH ajB @@ -86545,7 +88186,7 @@ anw anz aov aph -aph +ayY ard ard ard @@ -86785,7 +88426,7 @@ acl ajC acL adi -aaZ +anq agp agT ahx @@ -86800,7 +88441,7 @@ afM amR anw anz -aov +aJN apk anw anw @@ -86809,9 +88450,9 @@ anw aVh avj awl -axC -ayY -azZ +ayZ +aCf +aDh azZ azZ azZ @@ -87314,7 +88955,7 @@ agj amS anx anz -aoz +aKS apm aqd anA @@ -87323,9 +88964,9 @@ atd anA avk awk -axE -ayZ -aAa +aCe +aCV +aHZ aBu aAa aAa @@ -87560,7 +89201,7 @@ aeY agt agt ahz -aie +ahQ aiN ajc ajI @@ -87648,7 +89289,7 @@ bYH bYH bVg bXn -bYG +bRb cfb cfF cfb @@ -87656,7 +89297,7 @@ cik cjg cjU cfb -clM +caw cfz cgR ccw @@ -87882,7 +89523,7 @@ aJq bBu bCv bAT -bDL +bDJ bDq bCv bJs @@ -87901,7 +89542,7 @@ bWO bXK bYH bZz -caw +cfV bYH bVo bXq @@ -88140,7 +89781,7 @@ bBt bCv bDH bFf -bGB +aNJ bCv bJs bKy @@ -88329,7 +89970,7 @@ adg aeu alt agu -agX +agt ahB aij agn @@ -88346,14 +89987,14 @@ aoB aod aqe arf -aqa -atf +aqU +awy arf -aqa -atf +aqU +awy arf -aqa -atf +aqU +awy dgz tqg ujF @@ -88603,13 +90244,13 @@ aoz aod aqe arf -apY +ari ate arf -apY +ari ath arf -apY +ari ath dgz fvY @@ -88650,9 +90291,9 @@ bsh bqH aJq aJq -aXf +bPS bCv -bDJ +aNI bCt bGD bCv @@ -88687,7 +90328,7 @@ ckO ckH cja cny -ccw +bVw cip cnx cDx @@ -88898,7 +90539,7 @@ bjF blc bmz bnY -bpk +aOH bqJ bsj btI @@ -88941,7 +90582,7 @@ ciq cfb cfb cfb -clR +ciX cgR cgR cMm @@ -89111,7 +90752,7 @@ akY afM amp aiX -anA +axC anz aoC aod @@ -89121,19 +90762,19 @@ asd atg arf asd -awo +axT arf asd -aAb +aFe dgz iVU aDK vHj eVC dgz +aBM +aEs aJv -aKG -aMg bHt aOE aJn @@ -89167,7 +90808,7 @@ aJq aXf bCv bAU -cAL +clO bFg bFs bJt @@ -89374,18 +91015,18 @@ aoF apo aqh arh -asg +auA atj aul -auR +axQ atj -aul +azl +aNH +atj +aJQ azc atj -aAX -azc -atj -aFe +aMq aul aHT aJy @@ -89411,7 +91052,7 @@ bim bjG aZV bmB -bnZ +aDH bpl bqH bsl @@ -89424,8 +91065,8 @@ aLY bBx bCv apG -bFk -bDs +aPZ +aQa bCv bJs bHo @@ -89634,15 +91275,15 @@ aun asf ati auk -aux -avt -axL +arQ +aus +aJk bbl -azT -auk -auk -aDG -aFd +avt +aJR +aya +aLs +aMr auk aHH aJg @@ -89692,8 +91333,8 @@ bNT bOV bQj bRw -bSF -bOd +bOM +bPT bTP bRA bWQ @@ -89709,12 +91350,12 @@ cap ctR ccn cdo -cek +bUA ccw cet cfd -cfB -cfI +cgH +cgM cgQ cjS cjN @@ -89727,7 +91368,7 @@ cEW cse cse csu -cGl +chM ccw aaa aaa @@ -89891,15 +91532,15 @@ arf arf arf arf -auU -avG +arf +auC +aKg awr awr -azV +aKr +aAh aAh aAh -aFg -aFh aAh aAh aAh @@ -89933,7 +91574,7 @@ btL buY buY bqH -aJq +clV aJq aXf bCv @@ -89950,7 +91591,7 @@ bOV bQo bRz bSH -bOd +bQX bTP bRA bWQ @@ -90145,23 +91786,23 @@ aoG cSA aqe arf -aqo -asp +auu +atm +atm arf -auS -avv -awu -awr aAd +auW +awr +aXH +aXO aAh -aCm -aDL -aFf -aGk -aHU -alN +aSp aAh -aLQ +aUP +aAh +bbN +aAh +aOL aJq aOE aJn @@ -90194,7 +91835,7 @@ aJq aJq bBy bzs -bDO +bTy bFl bGH bHU @@ -90207,7 +91848,7 @@ bOV bQj bRy bSG -bOd +bPT bUK bVT bWR @@ -90402,23 +92043,23 @@ aoH cSA aqe arf -asm +aqC blU -atQ -avg -awp -axN +blU +awA +auy +aKh awr -aAg +awr +aKJ aAh -aDO -aDQ -aFi -aGl -aBy -aBy +apH aAh -aMn +apQ +aAh +aqt +aAh +clX aJq aOE aJn @@ -90487,7 +92128,7 @@ clU clU bOh ccw -coZ +cgN cgU cgU cDK @@ -90659,21 +92300,21 @@ ajo cSA aqe arf -ari +aqD +ask asu aun -auW -avR -axM -awu -aAf +awv +aKg +aYI +awr +bHg aAh -aCn -aDM -aGx -aAh -aAh -aBy +aop +bwi +aop +aop +aop aAh aMm aJq @@ -90706,7 +92347,7 @@ bqH bqH aJq bHt -bBz +bgi bzs bzs bFm @@ -90740,11 +92381,11 @@ bMQ aaf bQA ckU -clT +ccd cmU bOh ccw -cpa +cgP cjc cqo cDL @@ -90919,19 +92560,19 @@ arf arf arf arf -avm -aws -axP -azb -aAi -aAh -aCn -aDM -aGx -aGm -aHV -aBy -aAh +arf +auC +aKN +aYP +baa +aKM +aKP +aFE +aDY +aLQ +aYS +aop +aMw aJq aJq aJq @@ -90962,9 +92603,9 @@ bva bwu bwu bwu -bwu -bBB -aJv +bke +cfI +bBz bzs bFp bGJ @@ -91173,21 +92814,21 @@ ajo app aqi arf -ask +ars +atm atm arf -avl -awq -axO -aza +aHt +aKO +aZb +bab +aSj aAh aAh aAh -aDS -aGx aAh aAh -aDN +aMu aAh aMo aNC @@ -91219,7 +92860,7 @@ aJq aJq aJq aJq -bAj +bnZ aJq aKG bzs @@ -91430,22 +93071,22 @@ ajo aps aqk arf -asm +auv +blU aHw -aup -avn -awv -axX -aze +awX +axR +aKq +aZZ +awr +bac aAh -aBz -aBz -aDU -aGx -aGn -aHW -aBy +aVK +azm +azm aAh +aAZ +bJS aJq aJq aJq @@ -91476,9 +93117,9 @@ aJq aJq bxL byX -aJq -aJq -bCA +aXh +bmE +bAj bzs bCC bDA @@ -91687,31 +93328,31 @@ ajo apr aqj arf -ark -asL +ary +ask +aua aun -avu -awt -axV -azd -azX -aAZ -aCe -aDT -aGx +axU +awr +awr +axW +aHb +aLh +aUj +aMv +aMv +aMx +aZt aAh -aAh -aBy -aAh -aCr -aCr -aCr aJC +aJC +aJC +aQg bYP -aQg aJC aQg aJC +aJC aQg aJC aJC @@ -91768,7 +93409,7 @@ bMQ aaf bQA ckX -clV +ccB cmV bOh cig @@ -91942,35 +93583,35 @@ ajp ajp ajo apt -aqm -arj -arj -arj -arj -avx -awz -axR -avx +arn +arf +arf +arf +arf +arf +asX +awr +awr +avG +axP aAh -aBA -aBA -aDP -aBx -aGp -aHX -aBy +aCh +azo +azo aAh -aMq -adq -aQb -aPZ -aRu -aQc -aUf -aQc -aXi -aQc -amB +aAM +aMH +bRc +bRe +bty +aFj +ccS +bXu +aKR +aFd +aDM +cab +bfa aJC bcq bcq @@ -92199,16 +93840,17 @@ ajo aoa ajo apt -aql -apv -arl -asM -atV -avw -awy -axQ -azj -arj +aqr +aoJ +aoJ +aoJ +aoJ +arr +auN +awr +awr +avG +aNt aAh aAh aAh @@ -92216,19 +93858,18 @@ aAh aAh aAh aAh -aAh -aMp -aMr -aOH -aPY -aQc -aRx -aQc -aQc -aPY -aQc -aZZ -aJC +aKR +aKR +buJ +aDU +aDX +aEt +aKR +aFf +aDN +aDU +aFF +aQg aYV aYV aYV @@ -92456,35 +94097,35 @@ ahT anb ahT anZ -apu -arj -asb -asV -aus -aus -awA -axT -azl -aAl -arj -aCq -aDR +aqo +arf +arf +arf +arf +arf +aDW +avl +avm +avg +awE +aCr +azP aFl aGD -aHZ +bdE aCr -aKJ -aMr -aMr -aOH -aQc -aQd -aQa -aRv -aPY -aVw -aPY -bac +boY +bRd +aKR +aDO +aFC +cdM +aEu +aKR +aFg +aDO +caj +ckP aJC aYV aYV @@ -92706,44 +94347,44 @@ aif aif aif aif -aif -aif -alK -aif bkV -anc -anD -aoI -apX -arn -asN -aur -avy -avy -axS -azk -aAk -arj -aCf -aDY -aFj +adq +amB +aif +aif +apw +aqH +aqI +arf +apu +atl +avw +aut +axM +avx +avn +awp +aNG +aCr +aLS +aUC aGr aHI -aJk -aMr -aMr -aNt -aOH -aQc -aQc -aSq -aQc -aQc -aPY -aQc -bab +aOK +aKR +aKR +aKR +aKR +aKR +aKR +aKR +aKR +aKR +aKR +aKR +asq aJC -aYV +bSL aYV ber bfF @@ -92955,11 +94596,7 @@ abp afo abp abp -ahn -ahn -aiA -aiA -aiA +aSq ahn aiA aiA @@ -92971,38 +94608,42 @@ aod ahn apx ahn -arj -asr -asN -aut -avz -aXF -axU -azn -aAn -arj -aCh -aEc -aFk -aGw +ahn +ahn +ahn +ahn +arf +aoI +aqF +awo +arf +aoY +awr +awr +awt +aXj +aCr +aQb +aVA +bcO aHK aCr -aKr -aMr -bHF -aOH -aQc -aQc -aSo -clX -aVx -aQc -aQc -aQc +bDO +aKR +aKR +aDP +aDP +aEo +aKR +aKR +aKR +aDP +aKR +aKR bbx aYV aYV -aYV +bTs bfF bhd bis @@ -93208,16 +94849,12 @@ aaf aaf aaf abp -aaa +aRw afp -aaa +aRw abp -aaa -aaa -aaa -aaf -aaf -aaf +aqa +ahn aaa aaf aaf @@ -93226,36 +94863,40 @@ ahn anE aod aoK -apw +amI aqp -arj -asq -asN -aut -avz -avz -axU -azm -aAm -arj +ahn +anc +anr +anM +aqF +aqF +aqF +aur +aun +aEr +awr +awr +awt +aSo aCr -aEb aCr +aVD aGv aCr aCr -aKq -aLS -aNF -aOH -aQc -aQc -aSH -aQc -aQc -aRx -aQc -aQc +aCm +aKR +aDu +aDT +aDV +aEp +aHX +aKR +aIs +atT +aFD +aKR aQg aYV aYV @@ -93280,7 +94921,7 @@ bvj bvj bvd bFu -bvj +nWU bvj bvd bKH @@ -93469,12 +95110,8 @@ aaa aaa aaa adR -aaa -aaa -aaa -aaf -aaf -aaa +ahn +ahn aaa aaa aaa @@ -93485,43 +95122,47 @@ aoe aoL apy aqq -arj -ast -asN -auv -avA -avA -axW -azo -aAp +ahn +aql +aqN +arf +aqE +ark +aqF +axN +arf +aKi +avm +aAn +aIG +aXl aBC aCt aEA -aCt aGz aIb aCr -aKN -aMv -aNH -aOJ -aQc -aPY -aSG -aPY -aUg -bFC -aRw -aQc +aCn +aKR +aKR +axV +aFh +arC +aKR +aKR +aNn +avR +aFD +aKR bbx aYV aYV bet bfH bhf +bkl bhh -bhh -bhh +bkl bmJ bof bpu @@ -93721,15 +95362,11 @@ aaa aaa aaa aaa +gXs aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa +gXs aaa aaa aaa @@ -93742,43 +95379,47 @@ ahn ahn ahn ahn -arj -ass -asX -auu -att -att -att -azf +ahn +arf +arf +arf +asd +arf +arf +arf +arf +aMJ +azn aAo -apX +aJz +amP aBB aBB aBB aGy aIa cNE -aKM -aMu -aNG -aKM -aKM -aKM -aSp -aQc -aQc -aSq -aQc -bad +aQP +awB +awB +aDQ +aFi +awB +awB +awB +aIi +aOu +aKR +asD bby aYV aYV bet bfG bhe -bit +blN bjS -bli +bnd bli boe bli @@ -93978,15 +95619,11 @@ aaa aaa aaa aaa +gXs aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa +gXs aaa aaa aaa @@ -93996,37 +95633,41 @@ aaa aag aag aag -aaa -aaa -aaf -arj -clO -asZ -aua -clO -awB -axY -azh -gsz -arj -aaf -aaa +arf +amJ +axO +arf +apu +acN +amP +atz +axL +atQ +awu +aEv +azj +aAb +aAr +amN +amN +aza +azX alP aGI aId aJD -aKP -aMx -aNJ -aQe -aOL -aOL -aOL -aOL -aOL -aOL -aXO -aZb +aCx +awC +awC +bbs +aHW +awC +awC +awC +awC +aIw +aKR +asG aJC aYV aYV @@ -94235,10 +95876,11 @@ aaa aaa aaa aaa -aaa +aab aaa aqG aaa +asL aaa aaa aaa @@ -94248,44 +95890,43 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aqr -arm -arm -asY +arf +amO +anr +anM +aqF +alK +arf +axZ +amN atZ -auB -auB -atZ -azg -azp -azp -aCu -aaf +amN +amN +bBB +cdP +ceu +cfA +amN +azb +aUk alP aGH aIc aJC -aKO -aMw -aNI -aMw -aOK -acN -acN -acN -acN -acN -aQc -bae +aCy +aTN +aDS +aKR +aKR +aEq +aEq +aEq +aEq +aEq +aKR +aKR aJC -bcr +cmc aYV bet bfG @@ -94328,7 +95969,7 @@ bYU bXW bOh cbH -ccB +cbX cbH bOh aaf @@ -94492,6 +96133,11 @@ aaa aaa aaa aaa +aac +apK +aaa +apK +atX aaa aaa aaa @@ -94501,30 +96147,25 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aqs -aro -aro -aro -aro -aro -aro -aro -aro -aro -aro -aCv -aaa +arf +arf +arf +arf +aoI +anD +arj +art +amN +amN +amN +amN +bDL +amN +aAX +cfB +amN +azd +aAf alP aGJ aIe @@ -94534,13 +96175,13 @@ aJC aJC aJC aJC -aXj -aVy -aSY -aVy -aVy -aYI -bah +aXF +aEw +aEx +aEw +aNF +aEq +aHU aJC aYV bdo @@ -94749,8 +96390,11 @@ aaa aaa aaa aaa -aaa -aae +apv +apv +gXs +apv +apv aaa aaa aaa @@ -94762,42 +96406,39 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aqs -aro -aro -aro -aro -aro -aro -aro -aro -aro -aro -aCv -aaf +arf +aqm +aqF +axX +arf +asb +asr +avu +amN +amN +bDL +amN +aAX +cfB +amN +aze +aAg alP aGJ aIe -aJE -aKQ +asm aLU -aNu +aKQ +aYH aJC aPw -aQc +aZw aQc aSZ aQc -aVy -czP -bag +aFk +aEq +aHV aJC aYV aYV @@ -95007,6 +96648,9 @@ aaa aaa aaa aaa +gXs +aaa +gXs aaa aaa aaa @@ -95019,26 +96663,23 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aqs -aro -aro -aro -aro -aro -aro -aro -aro -aro -aro -aCv -aaa +arf +ast +arD +apX +arf +arO +aup +atV +amN +asg +bZf +cdY +cff +cfC +amN +azb +bvG alP aGA aHS @@ -95052,9 +96693,9 @@ aRz aSF aQc aQc -aXl -aQc -bai +aFp +aKR +atk aJC aYV aYV @@ -95264,9 +96905,9 @@ aaa aaa aaa aaa +apT aaa -aaa -aaa +apT aaa aaa aaa @@ -95279,43 +96920,43 @@ aaa aae aaa aaa -aaa -aaa -aaa -aaa -aqs -aro -aro -aro -aro -aro -aro -aro -aro -aro -aro -aCv -aaf +arf +arf +arf +arf +arf +asZ +att +avA +awq +aVy +aVG +amN +aRu +aVP +aXi +azV +aPj alP aGL aHM -aJm +asp aKz -mjr +bLs aND aJC -aab +aZv aRg aQc -aac -aQc -aXk -aQc +bai aQc +aFt +aKR +aKR aJC aYV aYV -bev +bNM bfK bhi bhi @@ -95513,6 +97154,7 @@ aaa aaa aaa aaa +aae aaa aaa aaa @@ -95538,34 +97180,33 @@ aaa aaa aaa aaa -aaa -aaa +gXs aqs -aro -aro -aro -aro -aro -aro -aro -aro -aro -aro +asY +asY +auB +aws +avy +avy +aws +azp +aCu +aCu aCv -aaa +auR alP aGL aIe aJC -aKS -aMC +atf +bLt aJC aJC aJI aJI aSI aJI -aVA +baw aJI aYK aJI @@ -95795,27 +97436,27 @@ aaa aaa aaa aaa -aaa -aaa +gXs +gXs aqu -arm -arm -arm -auy -auB -auB -axZ -azp -azp -azp +aro +aro +aro +aro +aro +aro +aro +aro +aro +aro aCw -aaf +aaa alP aGL aIg aJH aKR -aMB +bMF aJC aOP aJI @@ -95826,7 +97467,7 @@ aVz aVz aYJ aJI -bbz +bSr aYV aYV aYV @@ -96051,22 +97692,22 @@ aaa aaa aaa aaa +gXs +gXs aaa +aqu +aro +aro +aro +aro +aro +aro +aro +aro +aro +aro +aCw aaf -aaf -aaf -arj -arj -arj -auA -avD -awC -ayb -arj -alP -alP -aaa -aaa alP aGL aIe @@ -96307,23 +97948,23 @@ aaa aaa aaa aaa +gXs +gXs +aaa +aaa +aqu +aro +aro +aro +aro +aro +aro +aro +aro +aro +aro +aCw aaa -aaf -aaf -aaf -aaf -aaf -aaf -arj -auz -avC -avC -aya -arj -arA -alP -alP -alP alP aGN aIh @@ -96343,7 +97984,7 @@ baj bbz aYV bdp -aYV +bDv bfK bfK bfK @@ -96396,7 +98037,7 @@ cle cli uPT cmY -cmc +cme cop cmd cmd @@ -96563,24 +98204,24 @@ aaa aaa aaa aaa +gXs +gXs aaa +aaa +aaa +aqu +aro +aro +aro +aro +aro +aro +aro +aro +aro +aro +aCw aaf -aaf -aaa -aaa -aaa -aaa -aaf -arj -auB -auB -arj -gOZ -arj -anf -anf -rsp -rsp alP aGB aIf @@ -96592,11 +98233,11 @@ aON aQk aRD aSM -aVD +aEy aVE aXm aVz -bak +cam bbz aYV bdp @@ -96819,25 +98460,25 @@ aaa aaa aaa aaa -aaa -aaf -aaf -aaa -aaa -aaa -aaa -aaa -aaf -aaa gXs -aoV -alP -anf -anf -anf -anf -aDW -aDV +gXs +aaa +aaa +aaa +aaa +aqu +aro +aro +aro +aro +aro +aro +aro +aro +aro +aro +aCw +aaa alP aGL aHY @@ -96849,7 +98490,7 @@ aOM aQj aRB aSL -aTN +cmm cCq aVz cAg @@ -97075,7 +98716,6 @@ aaa aaa aaa aaa -aaa aaf aaf aaa @@ -97083,18 +98723,19 @@ aaa aaa aaa aaa -aaa -aaf -aaa -gXs -aoV -alP -awD -anf -anf -anf -aCy -jnR +arm +asY +asY +asY +awz +avy +avy +aAm +aCu +aCu +aCu +aVx +auR alP aGL avI @@ -97110,7 +98751,7 @@ aTO cCq aVz aVz -bak +caB bbz aYV bdp @@ -97126,8 +98767,8 @@ boo bqQ bhg bua -bvn -bwL +bne +bpk bxX bsL bua @@ -97331,7 +98972,6 @@ aaS aaS aaS aaS -aaa aaf aaf aaa @@ -97339,21 +98979,22 @@ aaa aaa aaa aaa -aaf -aaf -alO -alO -alO +aaa +aaa +aaa +aaa +auR +azg +avz +ccH +aAX +aAp +aAk +aAl +aCq +aDR alP -alP -alP -alP -alP -alP -alP -vpY -aFn -aGP +aGJ avI aJI aJI @@ -97368,7 +99009,7 @@ aVF aVF aYM aJI -bbA +bSu aYV bdr bdb @@ -97589,26 +99230,26 @@ aaf aaa aaS aaf +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaf -aaa -aaa -aaa -aaa -aaa -aag -alO -arp -alO -awD -anf -anf -awD -anf -aoP -alP -aBE -alP -aDX +aaf +auR +auS +ayb +azk +atZ +amN +amN +aAs +amN +amN alP aGJ avI @@ -97640,7 +99281,7 @@ boq boq brj bpE -btk +bop bum bvq bzn @@ -97845,22 +99486,22 @@ adS aeG aaa aaS +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaf -aaa -aaa -aaa -aaa -aaa -aaa -aag -cxW -anf -aqv -anf -anf -anf -aEl -anf +aaf +alO +auR +auR +auR +azT +aAi cVb cVb cVb @@ -97897,7 +99538,7 @@ bpE bpE bpE bpE -bti +bot bul bvp bzm @@ -98111,11 +99752,11 @@ aaa aaa aag alO -alO +arp alO anf -auC -alP +anf +anf anf anf cVb @@ -98137,7 +99778,7 @@ aSR aUi aVJ aOX -aYP +aPP bal bam aYV @@ -98366,20 +100007,20 @@ aaa aaa aaa aaa -aaa -aaa -aaa -alO -aqy -anf -alP -awE +aag +ass anf +aqv +ayf +aux +auU +avv +avC cVb vCb -wUY -khb -sxs +bBI +bHx +bHB tal aCI aIj @@ -98623,15 +100264,15 @@ aaf aaf aaf aaf -aaf -apC -apC -apC -apC -apC -apC +aag +alO +anf +alO +aud +auz alP anf +aCG cVb cVb cVb @@ -98644,12 +100285,12 @@ aIq aKK aMy aIp -aOX +arg aQm -aRJ -aRJ -aRJ -aVK +aBx +aGp +aGp +aHc aRJ aRJ aRJ @@ -98882,18 +100523,18 @@ aof aof aof aof -arq -asv -atv -auD -apC -awF -anf alP -arA -anf +alP +alP +alP +alP +awF +aCG +alP +bBM +aBE aCz -asw +aQU aCJ aGT aIn @@ -98903,10 +100544,10 @@ aMt aIp aOW aQm -aRJ -aSS -aUj -aRJ +aGm +aGw +aGP +aHr aRJ aYQ cBg @@ -99139,35 +100780,35 @@ aoh aoN apA aof -ars -anf -arx -anf -apC +arq +asv +atv +auD +alP aoQ -cqM -asw -asw -asw -aCA -anf -aFp +avD +ayg +ayg +ayg +azf +aFn +aAq aGW anf aIp -fGf +bcr aMA aIp aOX aQm -aRJ -aST -aUk -aRJ +aGm +aGx +aGR +aHr aRJ aYQ bam -aYV +bBT aYV aYV aYV @@ -99384,10 +101025,10 @@ adU adU adU adU -adU -adU -adU alg +aTq +aTq +aTq acx amv ane @@ -99396,11 +101037,11 @@ aog aoM apz aqw -arr +asM asw asw auE -apC +alP awG auF alP @@ -99417,14 +101058,14 @@ aMz aNQ aOX aQm -aRJ -aRJ -aRJ -aRJ +aGn +aGK +aGK +aHs aRJ aYR ban -aYV +bCI aYV aYV bez @@ -99481,7 +101122,7 @@ bAw cmk cnf bzs -aaa +aaf aaa aaa aaa @@ -99653,22 +101294,22 @@ aoi aoO apB aqx -art +asN anf anf auF -apC +alP awH auF alP -aAr -anf +axd +aBF alP aaa aFq aGX aIp -aJO +bHZ aKU aME aNN @@ -99681,13 +101322,13 @@ aXo aXo aYO bap -aYV +bCI aYV bci beB bfS bfS -kQk +ckJ ipA gbT cTO @@ -99910,35 +101551,35 @@ aof aof aof aof -anf +asV aoP atw auF -apC +alP aoP auF azr -anf +aRv atw alP alP aFo aGV aIp -aJN +aJO aLd aMN aNQ aOZ aOX aOX -aOX +cma aUz aVM aOX aYT bam -aYV +bDs baR bcb bdl @@ -99995,7 +101636,7 @@ bAw bAw clp aag -aaa +apv aaa aaa aaa @@ -100171,9 +101812,9 @@ anf anf aty auF -apC alP -auF +aAt +aAu alP alP alP @@ -100252,7 +101893,7 @@ bPn bPn bPn aag -aaa +gXs aaa aaa aaa @@ -100424,16 +102065,16 @@ aaa aaa apC anf -anf +aRv alP atx auF -apC +alP auD auF -alP -aAs -anf +apE +axJ +awL alP aCG aFr @@ -100507,9 +102148,9 @@ czY cOT aaa aaa +gXs aaa -aaa -aaa +gXs aaa aaa aaa @@ -100685,13 +102326,13 @@ alP alP apE auG -apC -aoP +alP +clM auF apE anf anf -alP +azh aCG aDZ aFu @@ -100764,9 +102405,9 @@ czY cOT aaa aaa +gXs aaa -aaa -aaa +gXs aaa aaa aaa @@ -100952,12 +102593,12 @@ aCB aEB aFs bbE -aIr +amd bav aLf -aIt -aNS -aPb +aCU +aDG +aRO aQp aRN aIt @@ -100979,7 +102620,7 @@ bls bfT boD bpY -bsP +aPY box btw buT @@ -101020,11 +102661,11 @@ cQB czY cOT aaa -aaa -aaa -aaa -aaa -aaa +apv +apv +apv +apv +apv aaa aaa aaa @@ -101197,24 +102838,24 @@ apC alP alP alP -anf +ciw auH avF awI ayc +ciV asw -aAu asw aCD aEa aFv aGG aIu -aJQ -bCI +aBA aIt aIt -aPb +aDG +aRO aIt aRN aIt @@ -101460,17 +103101,17 @@ avE anf anf awD -aAt +anf aty aCC aDZ +anf aFu -aFu -aIs -aJP -aLg -aMH +aBy +aJJ +aCA aIt +aDJ aYW aYW aYW @@ -101489,7 +103130,7 @@ cHJ cHL blw bjP -blt +bTu bfT boG bqa @@ -101537,10 +103178,10 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa +bsP +bti +btk +buh aaa aaa aaa @@ -101722,12 +103363,12 @@ alP aCE aDZ aFu -aHc -aIw +aFu +aBz aJS -aJS -aMJ +aCS aNP +aDL aOS aOS aOS @@ -101790,15 +103431,15 @@ cOT cQB cAa cOT +gXs +bqb +brl aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bsP +bsP +bsP +buh aaa aaa aaa @@ -101966,7 +103607,7 @@ aaf aaf alO aqA -anf +arz alP anf anf @@ -101975,25 +103616,25 @@ awJ anf alP aAv -anf +cih aCE aDZ aFu -aHb +aIy aIv -aJR -aJR +aBD aIt aIt +aDG +aRO +aIt aPd aIt -aRO -aRO -aUC -aVP +aPb +aIt aXu aYW -bat +aVS bbD aYV aXq @@ -102048,14 +103689,14 @@ czU czZ cOT aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +apv +brT +brT +bsP +bsP +bsP +buA +bti aaa aaa aaa @@ -102239,15 +103880,15 @@ aFu aHd aIx aJF -aLh +aQq +aNS +aDG +aRO aIt -aNV aPd aIt -aRO -aRO +aPb aIt -aVQ aXu aYW aVQ @@ -102304,15 +103945,15 @@ cOT cgm czY cOT +gXs +bqb +brl +bsB +brT +brT aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bsB aaa aaa aaa @@ -102477,8 +104118,8 @@ aaf aaf aaa aaa -alO -apD +alP +aie aEl anf arx @@ -102492,22 +104133,22 @@ alP alP aCF aDZ +alP aFw aFw aFw aFw aFw -aFw -aFw +aFu aPf aQq aRP +cfE aIt aIt -moD aWd aXV -aIt +aGl bbD aYV aXq @@ -102564,11 +104205,11 @@ cNW aaa aaa aaa -aaa -aaa -aaa -aaa -aaa +bsB +bsB +bti +bsP +gXs aaa aaa aaa @@ -102734,15 +104375,15 @@ aaa aaf aaf aaa -alP +alO anf anf arw -asA -asA +bxh +clL anf alP -awL +aqB anf anf apE @@ -102751,17 +104392,17 @@ aCH aED aFy aGO -aIB -aJJ +aIA +aJM aKZ -aMW aFw aFu aFu aFu +aFu aTc aUD -aVS +aSk aYW aYW bax @@ -102825,10 +104466,10 @@ aaa aaa aaa aaa -cOT -cOT -cOT -aag +aaa +aaa +aaa +aaa aaa aaa aaa @@ -103008,17 +104649,17 @@ aCk aEC aFx aGM -aIy +aIB aJG -cAz aMK aFw -aPg +aMW +aPi aQr aFu aTb aIt -aVR +aLg aYW aYW aUD @@ -103079,13 +104720,13 @@ aaa aaa aaa aaa +apv +apv +apv +apv aaa aaa aaa -cOT -cOe -cqu -aag aaa aaa aaa @@ -103247,16 +104888,16 @@ aaa aaa aaa aaa +gXs alP -alP -alP -aqB -arx -anf -anf -anf -alP -awM +apD +ayf +bev +cil +aFn +aFn +aBB +bGB ayg ayg ayg @@ -103269,9 +104910,9 @@ aFw aLo aLb aFw -aFw -aPi -aQt +aPg +aYW +aYW aRQ aIt aUF @@ -103332,17 +104973,17 @@ cOT cgm czY cOT -aaf -aaf -aaf -aaf -aaf -cNW -cNW -cOT -cqu -cOT -aag +aaa +aaa +aaa +aaa +gXs +aaa +aaa +gXs +aaa +aaa +aaa aaa aaa aaa @@ -103503,13 +105144,13 @@ aaa aaa aaa aaa -aaa -alP -aoP -alP -alP -apE -alP +amx +amx +amx +amx +aMB +amx +amx atB alP alP @@ -103523,16 +105164,16 @@ aEd aFw aHf aIz -aJM +aJP aLa -cBZ aFw aPh +aYW aQs aFu aTd aUE -aVT +aVR aYW aYW aZd @@ -103592,13 +105233,13 @@ cOT aaa aaa aaa -aaf -aaf -cNW -cwy -cmn -cmn -cOT +aaa +gXs +aaa +aaa +gXs +aaa +aaa aaa aaa aaa @@ -103753,36 +105394,35 @@ aaa aaa aaa aaa -aaf -aaf -aaf -aaf -alP -alP -alP -alP -alP -anf -anf -anf -anf -anf -anf -aty -anf -awx +aaa +aaa +aaa +aaa +aaa +aaa +aaa +amx +axE +aIr +aJm +aNV +bDX +bFC +bGg +bGh +bGg +bGS avI asA apE -arx aCo +aCG aEf aFw aGU aIC aJU aLe -aMX aFw aCR aCR @@ -103790,6 +105430,7 @@ aCR aCR aCR aCR +aCR aWe aWe aCR @@ -103852,10 +105493,10 @@ cNW cNW cNW cNW -cmn -cmn -cmn cOT +cOT +aag +aaa aaa aaa aaa @@ -104014,15 +105655,15 @@ aaa aaa aaa aaa -alO -amx -anf -anf -anf -anf -alP -alP -alP +aaa +aaa +aaa +apY +aIr +aIr +aIr +aIr +aMC asB asB asB @@ -104036,13 +105677,13 @@ aCK aEf aFw aHg -aIA +cBZ aJT aLc -aMX aFw aFz aFz +aFz aRR aTe aUG @@ -104106,14 +105747,14 @@ cko clq cmq ciI -cnJ -cri -cTI -cmn -cBT -cBU -cOT -aaa +bae +cmJ +cOe +cOe +cmK +aag +gXs +apv aaa aaa aaa @@ -104271,15 +105912,15 @@ aaa aaa aaa aaa -alP -alP -alP -alP -alP -anf -alP -aqD -arz +aaa +aaa +aaa +apY +aIr +aIr +aIr +aIr +aNu asB atD auJ @@ -104296,8 +105937,8 @@ aGY aII aJW aMX -aMX aNW +aFz aPl aQv aPl @@ -104363,13 +106004,13 @@ cNW cOx cBL cOe -cOe cvO cNW cNW -cNW -cNW -cNW +cOT +cOT +aag +aaa aaa aaa aaa @@ -104526,17 +106167,17 @@ aaa aaa aaa aaa -aaf -aaf -aaf -aaf -aaf -aaf -alP -anf -alP -aqC -ary +aaa +aaa +aaa +aaa +aaa +amx +aIr +aIr +aIr +aIr +aIr asB atC auI @@ -104554,7 +106195,7 @@ aHi aJV aFw aFw -aFw +aFz aPk aQu aPk @@ -104619,9 +106260,9 @@ cNW cNW cNW cNW -cNW cOe -csy +bag +clH cko cAf aaa @@ -104788,12 +106429,12 @@ aaa aaa aaa aaa -aaf -alP -anf -alP -alP -alP +apY +aIr +aIr +aIr +aIr +aIr asB atE auI @@ -104803,7 +106444,7 @@ avM azv aAA asB -cSz +aCE aEi aFw aHl @@ -104871,14 +106512,14 @@ ceO cNW cgm chw -ciK +cgp cjC +cgu ckp cls -cmr -cNW cOe -cmo +cOe +cou cNW aaf aaf @@ -105043,20 +106684,20 @@ aaa aaa aaa aaa -aaf -aaf -aaf -alP -anf -apE -anf -anf +aaa +aaa +apY +aIr +aIr +aIr +aIr +aIr asB asB asB avL awR -auI +aMp azu aAz asB @@ -105096,7 +106737,7 @@ buo bvJ bCk byo -aDH +btD bxP bCf bvK @@ -105126,16 +106767,16 @@ bQZ cdR ceN cNW -cgp +axY chv ciJ cbf -cbf +ciK clr -bnt -cNW +bah cOe -cou +cOe +bMB cOT aaa aaa @@ -105302,12 +106943,12 @@ aaa aaa aaa aaa -aaf -alP -aoQ -alP -aqE -arA +amx +awM +aIr +aJE +aIr +bFk asB atG auL @@ -105389,10 +107030,10 @@ cNW cNW cNW clt -bnt -cNW +cQw cOe -bMB +cOe +bNA cOT aaa aaa @@ -105558,13 +107199,13 @@ aaa aaa aaa aaa -aaf -aaf -alP -alP -alP -alP -alP +aaa +amx +amx +amx +amx +amx +amx asB atF auK @@ -105645,11 +107286,11 @@ chx cNW aaa cNW -cgr -cms +clt +cQw +cNW +cNW cNW -cOe -bNA cNW aaf aaf @@ -105850,9 +107491,9 @@ aXB aZh baB aCR -bcq +bNa bdx -bcq +bPv bgc bgc biX @@ -105903,10 +107544,10 @@ cOT aaa cOT clt -bnt +cQw +cOe cOe cOe -cNW cNW aaa aaa @@ -106161,18 +107802,18 @@ aaa cOT clt cQw -cNW -cNW -cNW -aaa -aaa -aaS -aaS -aaS -aaS -aaS -aaS -aaS +cOe +cOe +cOe +cOe +sQX +cdi +cdi +cdi +cdi +cdi +cdi +cdi aaS aaS aba @@ -106358,7 +107999,7 @@ aCR aCR aCR aTl -amd +aUL aVW aXD aZj @@ -106411,17 +108052,17 @@ ccT bSc bSc cfu -cgu +bnt chA cNW aaa cNW clt cQw -aaf -aaf -aaf -aaf +cOe +cOe +cOe +cNW aaf aaS aaa @@ -106675,10 +108316,10 @@ cNW cNW clt cQw -aaa -aaa -aaa -aaa +cOe +cOe +cOe +cNW aaa aaS aaa @@ -106924,18 +108565,18 @@ cbZ bSl cmo cNW -cOx +ckR cNW chC ciL cOe cOe clv -cmt -aaa -aaa -aaa -aaa +cQw +cNW +cNW +cNW +cNW aaa aba aaf @@ -107191,7 +108832,7 @@ clu cmt aaa aaa -aaa +gXs aaa aaa aaf @@ -107705,7 +109346,7 @@ cjD cjD cnj aaa -aaa +gXs aaa aaa aaf @@ -107976,7 +109617,7 @@ crD aaa aaa aaa -csZ +aSY aaa aaa aaa @@ -108223,18 +109864,18 @@ cyU cpi cpi cpi -cqJ +aSH +aSS crk crk crk crk crk +aST +aSH +aSS crk -crk -csE -cpi -csY -cpi +aST cpi cpi ctB @@ -108490,7 +110131,7 @@ crF aaa aaa aaa -csZ +aTa aaa aaa aaa @@ -108971,8 +110612,8 @@ cbf cbf cbf cbf -cbf bYr +cbf clr cad cbi @@ -109229,7 +110870,7 @@ cNW cNW cNW cNW -cNW +clR clt cac cbh @@ -109495,7 +111136,7 @@ cbf cbf ceT cNW -cOe +clT chH cNW aaf diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index e500c85640..ac7d291b2f 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, @@ -103817,10 +103794,10 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "dsI" = ( -/obj/structure/sign/warning/nosmoking, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/machinery/smartfridge/organ/preloaded, /turf/closed/wall, /area/medical/surgery) "dsJ" = ( @@ -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,11 +127413,25 @@ /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, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) +"mMC" = ( +/obj/structure/sign/warning/nosmoking, +/turf/closed/wall, +/area/medical/surgery) "mQE" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -127607,6 +127616,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 +127726,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 +127880,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{ @@ -174891,7 +174923,7 @@ dkv dma dma dma -dma +mMC dsI dro dvz @@ -179430,10 +179462,10 @@ aaa aaa aaa aaa -aaa -ajr -aad -aad +aeH +aFm +aIc +aFm aFm aFm aFm @@ -179687,10 +179719,10 @@ aaa aaa aaa aaa -aaa -ajr -aaa -aad +aeH +aFm +mEy +bbt aFm aMc aNx @@ -179944,10 +179976,10 @@ aaa aaa aaa aaa -aaa -aad -aaa -aad +aeH +aFm +oNW +tmZ aFm aKV aNy @@ -180202,11 +180234,11 @@ aaa ajr ajr aad -aad -aaa -aad aFm -aMd +pEq +hlc +gUV +hlc aNz aPh aQZ @@ -180459,10 +180491,10 @@ aaa ajr aad aad -aad -aad -aad aFn +mvf +aJA +aJA aMe aNA aPi @@ -180717,7 +180749,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..0e6feb67c6 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" = ( @@ -62796,6 +62776,9 @@ "cro" = ( /obj/structure/bed/roller, /obj/machinery/iv_drip, +/obj/structure/sign/warning/nosmoking{ + pixel_x = -28 + }, /turf/open/floor/plasteel/white, /area/medical/surgery) "crq" = ( @@ -63316,9 +63299,6 @@ dir = 1; pixel_y = -22 }, -/obj/structure/sign/warning/nosmoking{ - pixel_x = -28 - }, /obj/machinery/iv_drip, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -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" @@ -83979,6 +83997,10 @@ }, /turf/open/floor/plating, /area/maintenance/port) +"qnB" = ( +/obj/machinery/smartfridge/organ/preloaded, +/turf/closed/wall, +/area/medical/surgery) "qqg" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 @@ -84241,6 +84263,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 @@ -104201,7 +104233,7 @@ cia cia cpX cia -cia +qnB cia ceu dyg @@ -106416,10 +106448,10 @@ aaa aaa aaf aaa -aaa -aaa -aaf -aaa +aax +aax +aaF +aax aax abj aaR @@ -106673,12 +106705,12 @@ aaa aaa aaf aaf -aaf -aaf -aaf -aaf aay -abk +odR +hYs +abC +uEa +hYs abC abC acr @@ -106930,13 +106962,13 @@ aaa aaa aaf aaa -aaa -aaf -aaa -aaa aax abl -abD +pzu +ghT +aax +jVj +aaR aaR aaI acF @@ -107189,7 +107221,7 @@ aaa aaa aax aax -aaF +aax aax aax abm diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index a7ab212bd6..bd3d72dc85 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -42880,6 +42880,12 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) +"uvp" = ( +/obj/machinery/smartfridge/organ/preloaded{ + pixel_y = 2 + }, +/turf/closed/wall, +/area/medical/medbay/zone3) "uxJ" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -81595,7 +81601,7 @@ aSh bcf bcW blt -aSh +uvp aOL bfA bfX diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 9ae92b26d4..9f1c1824cd 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" = ( @@ -37773,6 +37749,9 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/light_switch{ + pixel_x = -22 + }, /turf/open/floor/plasteel/white, /area/medical/surgery) "bIp" = ( @@ -38852,10 +38831,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -26 - }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, @@ -39329,15 +39304,16 @@ /obj/item/clothing/gloves/color/latex, /obj/item/clothing/mask/surgical, /obj/item/clothing/suit/apron/surgical, -/obj/machinery/light_switch{ - pixel_x = -22 - }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -26 + }, /turf/open/floor/plasteel/white, /area/medical/surgery) "bLN" = ( @@ -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 @@ -55661,6 +55674,10 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"jdA" = ( +/obj/machinery/smartfridge/organ/preloaded, +/turf/closed/wall, +/area/medical/surgery) "jeq" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -58617,6 +58634,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 +60979,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 +62197,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 +62226,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 +81597,8 @@ aaa aaa adR aaa -abI -aaa +aem +aem aem aem aem @@ -81804,8 +81855,8 @@ aaa adR aaa aem -aem -aem +aeo +aeC aeT afn agy @@ -82060,9 +82111,9 @@ aaa aaa adR abI -aem -aeo -aeC +aen +aep +aeD aeU aeU afC @@ -82317,9 +82368,9 @@ aaa aaa adR aaa -aen -aep -aeD +aem +aeq +aeE aeU afo afD @@ -82574,9 +82625,9 @@ aaa aaa adR abI -aem -aeq -aeE +aen +aer +aeF aeU afp afE @@ -82831,9 +82882,9 @@ aaa aaa adR aaa -aen -aer -aeF +aem +aes +aeG aeV afq afF @@ -83088,10 +83139,10 @@ aaa aaa adR abI -aem -aes -aeG -aeU +aen +aet +aeH +vtz afo afG aeU @@ -83345,10 +83396,10 @@ aaa aaa adR aaa -aen -aet -aeH -aeH +aem +aeu +cJd +pED aeH afH aeH @@ -83603,8 +83654,8 @@ aaa adR abI aem -aeu -aeI +agy +agy lGp aeU aae @@ -83860,9 +83911,9 @@ aaa adR aaa aem -aem -aem aeW +yhs +hyl afr agy agc @@ -84116,11 +84167,11 @@ aaa aaa adR aaa -abI -aaa aem aeX -afs +dqi +yff +yff agy agd agp @@ -84372,8 +84423,6 @@ aaa aaa aaa aaa -aed -adR abI aem aem @@ -84385,6 +84434,8 @@ aem aem aem aem +aem +aem ahL ahL ahL @@ -84630,9 +84681,9 @@ aaa aaa aaa aaa -aaa -aaa -aaa +aed +adR +abI aaa aaa aaa @@ -92174,7 +92225,7 @@ bFU bFU bIn bJt -bFU +jdA bFU bFU bFU 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/map_files/generic/City_of_Cogs.dmm b/_maps/map_files/generic/City_of_Cogs.dmm index e1e7659ce3..1195ad62c5 100644 --- a/_maps/map_files/generic/City_of_Cogs.dmm +++ b/_maps/map_files/generic/City_of_Cogs.dmm @@ -379,15 +379,6 @@ /obj/item/camera, /turf/open/indestructible/clock_spawn_room, /area/reebe/city_of_cogs) -"Nz" = ( -/obj/structure/table/bronze, -/obj/item/implantcase, -/obj/item/implantcase, -/obj/item/implantcase, -/obj/item/implanter, -/obj/item/storage/backpack/duffelbag/sec/surgery, -/turf/open/floor/clockwork/reebe, -/area/reebe/city_of_cogs) "NH" = ( /obj/structure/table/bronze, /obj/item/taperecorder, @@ -409,10 +400,6 @@ "WT" = ( /turf/closed/wall/clockwork, /area/reebe) -"Yy" = ( -/obj/structure/table/optable, -/turf/open/floor/clockwork/reebe, -/area/reebe/city_of_cogs) (1,1,1) = {" zb @@ -33918,7 +33905,7 @@ ab ai bE aj -Yy +aj aj aj aA @@ -34175,7 +34162,7 @@ ab ah al aj -Nz +aj aj aC ah 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/emergency_raven.dmm b/_maps/shuttles/emergency_raven.dmm index 2c04837c79..05446968e7 100644 --- a/_maps/shuttles/emergency_raven.dmm +++ b/_maps/shuttles/emergency_raven.dmm @@ -56,7 +56,7 @@ /turf/open/floor/plasteel/dark, /area/shuttle/escape) "ah" = ( -/obj/machinery/computer/shuttle, +/obj/machinery/computer/emergency_shuttle, /turf/open/floor/plasteel/dark, /area/shuttle/escape) "ai" = ( 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/admin.dm b/code/__DEFINES/admin.dm index b875998f0a..bded562a3c 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -69,6 +69,7 @@ #define ADMIN_PUNISHMENT_BSA "Bluespace Artillery Device" #define ADMIN_PUNISHMENT_FIREBALL "Fireball" #define ADMIN_PUNISHMENT_ROD "Immovable Rod" +#define ADMIN_PUNISHMENT_SUPPLYPOD_QUICK "Supply Pod (Quick)" #define ADMIN_PUNISHMENT_SUPPLYPOD "Supply Pod" #define ADMIN_PUNISHMENT_MAZING "Puzzle" #define ADMIN_PUNISHMENT_PIE "Cream Pie" 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,15C telecommunications. also used for xenobiology slime killrooms +#define AIRLESS_ATMOS "TEMP=2.7" //space +#define FROZEN_ATMOS "o2=22;n2=82;TEMP=180" //-93.15C 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..52a2d56697 100644 --- a/code/__DEFINES/cargo.dm +++ b/code/__DEFINES/cargo.dm @@ -11,23 +11,25 @@ #define STYLE_FRUIT 11 #define STYLE_INVISIBLE 12 #define STYLE_GONDOLA 13 +#define STYLE_SEETHROUGH 14 #define POD_ICON_STATE 1 #define POD_NAME 2 #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."),\ + list("", "", "")\ ) \ No newline at end of file diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 3664da4a5d..2d40d91023 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -98,6 +98,7 @@ //the define for visible message range in combat #define COMBAT_MESSAGE_RANGE 3 +#define DEFAULT_MESSAGE_RANGE 7 //Shove knockdown lengths (deciseconds) #define SHOVE_KNOCKDOWN_SOLID 30 diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 4d32252062..4f56b07fe7 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -5,6 +5,17 @@ #define COMPONENT_INCOMPATIBLE 1 #define COMPONENT_NOTRANSFER 2 +#define ELEMENT_INCOMPATIBLE 1 // Return value to cancel attaching + +// /datum/element flags +/// Causes the detach proc to be called when the host object is being deleted +#define ELEMENT_DETACH (1 << 0) +/** + * Only elements created with the same arguments given after `id_arg_index` share an element instance + * The arguments are the same when the text and number values are the same and all other values have the same ref + */ +#define ELEMENT_BESPOKE (1 << 1) + // How multiple components of the exact same type are handled in the same datum #define COMPONENT_DUPE_HIGHLANDER 0 //old component is deleted (default) @@ -28,7 +39,7 @@ #define COMSIG_COMPONENT_ADDED "component_added" //when a component is added to a datum: (/datum/component) #define COMSIG_COMPONENT_REMOVING "component_removing" //before a component is removed from a datum because of RemoveComponent: (/datum/component) #define COMSIG_PARENT_PREQDELETED "parent_preqdeleted" //before a datum's Destroy() is called: (force), returning a nonzero value will cancel the qdel operation -#define COMSIG_PARENT_QDELETED "parent_qdeleted" //after a datum's Destroy() is called: (force, qdel_hint), at this point none of the other components chose to interrupt qdel and Destroy has been called +#define COMSIG_PARENT_QDELETING "parent_qdeleting" //just before a datum's Destroy() is called: (force), at this point none of the other components chose to interrupt qdel and Destroy will be called // /atom signals #define COMSIG_PARENT_ATTACKBY "atom_attackby" //from base of atom/attackby(): (/obj/item, /mob/living, params) @@ -72,11 +83,16 @@ #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, 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 +114,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,7 +132,16 @@ #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_HEAR "movable_hear" //from base of atom/movable/Hear(): (message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) +#define COMSIG_MOVABLE_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, atom/movable/source) + #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 HEARING_SOURCE 8*/ #define COMSIG_MOVABLE_DISPOSING "movable_disposing" //called when the movable is added to a disposal holder object for disposal movement: (obj/structure/disposalholder/holder, obj/machinery/disposal/source) #define COMSIG_MOVABLE_TELEPORTED "movable_teleported" //from base of do_teleport(): (channel, turf/origin, turf/destination) @@ -123,8 +149,10 @@ #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) @@ -132,6 +160,7 @@ #define COMSIG_MOB_HUD_CREATED "mob_hud_created" //from base of mob/create_mob_hud(): () #define COMSIG_MOB_ATTACK_HAND "mob_attack_hand" //from base of #define COMSIG_MOB_ITEM_ATTACK "mob_item_attack" //from base of /obj/item/attack(): (mob/M, mob/user) + #define COMPONENT_ITEM_NO_ATTACK 1 #define COMSIG_MOB_ITEM_AFTERATTACK "mob_item_afterattack" //from base of obj/item/afterattack(): (atom/target, mob/user, proximity_flag, click_parameters) #define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged" //from base of mob/RangedAttack(): (atom/A, params) #define COMSIG_MOB_THROW "mob_throw" //from base of /mob/throw_item(): (atom/target) @@ -149,6 +178,8 @@ #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) @@ -295,3 +326,11 @@ //Ouch my toes! #define CALTROP_BYPASS_SHOES 1 #define CALTROP_IGNORE_WALKERS 2 + +//Xenobio hotkeys +#define COMSIG_XENO_SLIME_CLICK_CTRL "xeno_slime_click_ctrl" //from slime CtrlClickOn(): (/mob) +#define COMSIG_XENO_SLIME_CLICK_ALT "xeno_slime_click_alt" //from slime AltClickOn(): (/mob) +#define COMSIG_XENO_SLIME_CLICK_SHIFT "xeno_slime_click_shift" //from slime ShiftClickOn(): (/mob) +#define COMSIG_XENO_TURF_CLICK_SHIFT "xeno_turf_click_shift" //from turf ShiftClickOn(): (/mob) +#define COMSIG_XENO_TURF_CLICK_CTRL "xeno_turf_click_alt" //from turf AltClickOn(): (/mob) +#define COMSIG_XENO_MONKEY_CLICK_CTRL "xeno_monkey_click_ctrl" //from monkey CtrlClickOn(): (/mob) 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/flags.dm b/code/__DEFINES/flags.dm index 9e8a4f71c2..55962bf78c 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -32,6 +32,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define TESLA_IGNORE_1 (1<<13) // TESLA_IGNORE grants immunity from being targeted by tesla-style electricity #define INITIALIZED_1 (1<<14) //Whether /atom/Initialize() has already run for the object #define ADMIN_SPAWNED_1 (1<<15) //was this spawned by an admin? used for stat tracking stuff. +#define PREVENT_CONTENTS_EXPLOSION_1 (1<<16) /// should not get harmed if this gets caught by an explosion? //turf-only flags #define NOJAUNT_1 (1<<0) 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 2e29497a02..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) @@ -508,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..94c2c372f0 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 @@ -24,23 +25,22 @@ #define NO_MAT_REDEMPTION (1<<5) //Stops you from putting things like an RCD or other items into an ORM or protolathe for materials. #define DROPDEL (1<<6) //When dropped, it calls qdel on itself #define NOBLUDGEON (1<<7) //when an item has this it produces no "X has been hit by Y with Z" message in the default attackby() -#define ABSTRACT (1<<8) //for all things that are technically items but used for various different stuff +#define ABSTRACT (1<<8) //for all things that are technically items but used for various different stuff #define IMMUTABLE_SLOW (1<<9) //When players should not be able to change the slowdown of the item (Speed potions, ect) #define SURGICAL_TOOL (1<<10) //Tool commonly used for surgery: won't attack targets in an active surgical operation on help intent (in case of mistakes) -#define NO_UNIFORM_REQUIRED (1<<11) //Can be worn on certain slots (currently belt and id) that would otherwise require an uniform. +#define NO_UNIFORM_REQUIRED (1<<11) //Can be worn on certain slots (currently belt and id) that would otherwise require an uniform. // Flags for the clothing_flags var on /obj/item/clothing #define LAVAPROTECT (1<<0) #define STOPSPRESSUREDAMAGE (1<<1) //SUIT and HEAD items which stop pressure damage. To stop you taking all pressure damage you must have both a suit and head item with this flag. #define BLOCK_GAS_SMOKE_EFFECT (1<<2) //blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY! -#define ALLOWINTERNALS (1<<3) //mask allows internals +#define ALLOWINTERNALS (1<<3) //mask allows internals #define NOSLIP (1<<4) //prevents from slipping on wet floors, in space etc #define THICKMATERIAL (1<<5) //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body. #define VOICEBOX_TOGGLABLE (1<<6) //The voicebox in this clothing can be toggled. #define VOICEBOX_DISABLED (1<<7) //The voicebox is currently turned off. -#define SNUG_FIT (1<<8) //Prevents knock-off from things like hat-throwing. -#define ANTI_TINFOIL_MANEUVER (1<<9) //Hats with negative effects when worn (i.e the tinfoil hat). +#define IGNORE_HAT_TOSS (1<<8) //Hats with negative effects when worn (i.e the tinfoil hat). // Flags for the organ_flags var on /obj/item/organ @@ -49,4 +49,4 @@ #define ORGAN_FAILING (1<<2) //Failing organs perform damaging effects until replaced or fixed #define ORGAN_EXTERNAL (1<<3) //Was this organ implanted/inserted/etc, if true will not be removed during species change. #define ORGAN_VITAL (1<<4) //Currently only the brain -#define ORGAN_NO_SPOIL (1<<5) //Do not spoil under any circumstances \ No newline at end of file +#define ORGAN_NO_SPOIL (1<<5) //Do not spoil under any circumstances 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/say.dm b/code/__DEFINES/say.dm index af06a5a2d0..beeee22df9 100644 --- a/code/__DEFINES/say.dm +++ b/code/__DEFINES/say.dm @@ -75,8 +75,16 @@ #define LINGHIVE_LING 2 #define LINGHIVE_LINK 3 +//whether the emote is visible or audible. +#define EMOTE_VISIBLE 1 +#define EMOTE_AUDIBLE 2 + //Don't set this very much higher then 1024 unless you like inviting people in to dos your server with message spam #define MAX_MESSAGE_LEN 2048 //Citadel edit: What's the WORST that could happen? #define MAX_NAME_LEN 42 #define MAX_BROADCAST_LEN 512 #define MAX_CHARTER_LEN 80 + +// Audio/Visual Flags. Used to determine what sense are required to notice a message. +#define MSG_VISUAL (1<<0) +#define MSG_AUDIBLE (1<<1) \ No newline at end of file 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..f9360117bb 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 // /////////// @@ -56,6 +58,8 @@ #define MAX_MANIA_SEVERITY 100 //how high the mania severity can go #define MANIA_DAMAGE_TO_CONVERT 90 //how much damage is required before it'll convert affected targets +#define STATUS_EFFECT_CHOKINGSTRAND /datum/status_effect/strandling //Choking Strand + #define STATUS_EFFECT_HISWRATH /datum/status_effect/his_wrath //His Wrath. #define STATUS_EFFECT_SUMMONEDGHOST /datum/status_effect/cultghost //is a cult ghost and can't use manifest runes @@ -74,6 +78,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..14dbd97ffa 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,9 +118,11 @@ #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" +#define TRAIT_STRONG_GRABBER "strong_grabber" +#define TRAIT_CALCIUM_HEALER "calcium_healer" +#define TRAIT_MAGIC_CHOKE "magic_choke" #define TRAIT_CAPTAIN_METABOLISM "captain-metabolism" #define TRAIT_ABDUCTOR_TRAINING "abductor-training" #define TRAIT_ABDUCTOR_SCIENTIST_TRAINING "abductor-scientist-training" @@ -160,6 +163,7 @@ #define TRAIT_FRIENDLY "friendly" #define TRAIT_ASSBLASTUSA "assblastusa" #define TRAIT_CULT_EYES "cult_eyes" +#define TRAIT_FREESPRINT "free_sprinting" // common trait sources @@ -179,6 +183,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 +197,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 +217,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" 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/__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..f7131e63fa 100644 --- a/code/__HELPERS/cmp.dm +++ b/code/__HELPERS/cmp.dm @@ -23,6 +23,9 @@ GLOBAL_VAR_INIT(cmp_field, "name") /proc/cmp_records_dsc(datum/data/record/a, datum/data/record/b) return sorttext(a.fields[GLOB.cmp_field], b.fields[GLOB.cmp_field]) +/proc/cmp_filter_data_priority(list/A, list/B) + return A["priority"] - B["priority"] + /proc/cmp_ckey_asc(client/a, client/b) return sorttext(b.ckey, a.ckey) @@ -84,3 +87,12 @@ 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_uplink_items_dsc(datum/uplink_item/A, datum/uplink_item/B) + return sorttext(initial(B.name), initial(A.name)) + +/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/global_lists.dm b/code/__HELPERS/global_lists.dm index 7852251230..a7bf5da17f 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -97,6 +97,16 @@ var/datum/emote/E = new path() E.emote_list[E.key] = E + //Uplink Items + for(var/path in subtypesof(/datum/uplink_item)) + var/datum/uplink_item/I = path + if(!initial(I.item)) //We add categories to a separate list. + GLOB.uplink_categories |= initial(I.category) + continue + GLOB.uplink_items += path + //(sub)typesof entries are listed by the order they are loaded in the code, so we'll have to rearrange them here. + GLOB.uplink_items = sortList(GLOB.uplink_items, /proc/cmp_uplink_items_dsc) + init_subtypes(/datum/crafting_recipe, GLOB.crafting_recipes) //creates every subtype of prototype (excluding prototype) and adds it to list L. 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 fb7a29c907..b899d7f6ab 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -314,7 +314,12 @@ parts += "[FOURSPACES]Threat left: [mode.threat]" parts += "[FOURSPACES]Executed rules:" 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" + parts += "[FOURSPACES]Other threat changes:" + 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]]" return parts.Join("
    ") /client/proc/roundend_report_file() 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..e0cf8ebdd5 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -142,8 +142,7 @@ GLOBAL_LIST_INIT(bitfields, list( "THICKMATERIAL" = THICKMATERIAL, "VOICEBOX_TOGGLABLE" = VOICEBOX_TOGGLABLE, "VOICEBOX_DISABLED" = VOICEBOX_DISABLED, - "SNUG_FIT" = SNUG_FIT, - "ANTI_TINFOIL_MANEUVER" = ANTI_TINFOIL_MANEUVER, + "IGNORE_HAT_TOSS" = IGNORE_HAT_TOSS, ), "tesla_flags" = list( "TESLA_MOB_DAMAGE" = TESLA_MOB_DAMAGE, @@ -193,7 +192,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..e2705ad49f 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) @@ -46,10 +46,15 @@ GLOBAL_LIST_INIT(ai_core_display_screens, list( ":thinking:", "Alien", "Angel", + "Angryface", + "AtlantisCZE", "Banned", "Bliss", "Blue", - "Clown", + "Boy", + "Boy-Malf", + "Girl", + "Girl-Malf", "Database", "Dorf", "Firewall", @@ -61,26 +66,44 @@ GLOBAL_LIST_INIT(ai_core_display_screens, list( "Hades", "Heartline", "Helios", + "Hotdog", + "Hourglass", "House", "Inverted", + "Jack", "Matrix", "Monochrome", + "Mothman", "Murica", "Nanotrasen", "Not Malf", + "Patriot", + "Pirate", "President", - "Random", "Rainbow", - "Red", + "Clown", + "Random", + "Ravensdale", "Red October", + "Red", + "Royal", + "Searif", + "Serithi", + "SilveryFerret", + "Smiley", "Static", "Syndicat Meow", "TechDemon", + "Terminal", "Text", "Too Deep", "Triumvirate", "Triumvirate-M", - "Weird")) + "Wasp", + "Weird", + "Xerxes", + "Yes-Man" + )) /proc/resolve_ai_icon(input) if(!input || !(input in GLOB.ai_core_display_screens)) 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/objects.dm b/code/_globalvars/lists/objects.dm index 14c752613b..fa68fab85f 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -19,6 +19,8 @@ GLOBAL_LIST(chemical_reagents_list) //list of all /datum/reagent datums index GLOBAL_LIST_EMPTY(materials_list) //list of all /datum/material datums indexed by material id. GLOBAL_LIST_EMPTY(tech_list) //list of all /datum/tech datums indexed by id. GLOBAL_LIST_EMPTY(surgeries_list) //list of all surgeries by name, associated with their path. +GLOBAL_LIST_EMPTY(uplink_items) //list of all uplink item typepaths, ascendingly sorted by their initial name. +GLOBAL_LIST_EMPTY(uplink_categories) //list of all uplink categories, listed by the order they are loaded in code. Be careful. GLOBAL_LIST_EMPTY(crafting_recipes) //list of all table craft recipes GLOBAL_LIST_EMPTY(rcd_list) //list of Rapid Construction Devices. GLOBAL_LIST_EMPTY(apcs_list) //list of all Area Power Controller machines, separate from machines for powernet speeeeeeed. 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/_globalvars/lists/typecache.dm b/code/_globalvars/lists/typecache.dm index 96807214f2..1ec3de0bc5 100644 --- a/code/_globalvars/lists/typecache.dm +++ b/code/_globalvars/lists/typecache.dm @@ -10,3 +10,5 @@ GLOBAL_LIST_INIT(typecache_living, typecacheof(/mob/living)) GLOBAL_LIST_INIT(typecache_stack, typecacheof(/obj/item/stack)) GLOBAL_LIST_INIT(typecache_machine_or_structure, typecacheof(list(/obj/machinery, /obj/structure))) + +GLOBAL_LIST_INIT(freezing_objects, typecacheof(list(/obj/structure/closet/crate/freezer, /obj/structure/closet/secure_closet/freezer, /obj/structure/bodycontainer, /obj/item/autosurgeon, /obj/machinery/smartfridge/organ))) //list of all cold objects, that freeze organs when inside 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/ai.dm b/code/_onclick/ai.dm index 7a495b95e7..2a8289697b 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -114,7 +114,8 @@ /mob/living/silicon/ai/CtrlClickOn(var/atom/A) A.AICtrlClick(src) /mob/living/silicon/ai/AltClickOn(var/atom/A) - A.AIAltClick(src) + if(!A.AIAltClick(src)) + altclick_listed_turf(A) /* The following criminally helpful code is just the previous code cleaned up; @@ -125,9 +126,10 @@ /* Atom Procs */ /atom/proc/AICtrlClick() return + /atom/proc/AIAltClick(mob/living/silicon/ai/user) - AltClick(user) - return + return AltClick(user) + /atom/proc/AIShiftClick() return /atom/proc/AICtrlShiftClick() @@ -151,6 +153,7 @@ shock_perm(usr) else shock_restore(usr) + return TRUE /obj/machinery/door/airlock/AIShiftClick() // Opens and closes doors! if(obj_flags & EMAGGED) @@ -185,10 +188,12 @@ return toggle_on() add_fingerprint(usr) + return TRUE /* Holopads */ /obj/machinery/holopad/AIAltClick(mob/living/silicon/ai/user) hangup_all_calls() + return TRUE // // Override TurfAdjacent for AltClicking diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 58eabbdbcf..4c477f3872 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 /* @@ -354,8 +353,17 @@ Unused except for AI */ /mob/proc/AltClickOn(atom/A) - A.AltClick(src) - return + if(!A.AltClick(src)) + altclick_listed_turf(A) + +/mob/proc/altclick_listed_turf(atom/A) + var/turf/T = get_turf(A) + if(T == A.loc || T == A) + if(T == listed_turf) + listed_turf = null + else if(TurfAdjacent(T)) + listed_turf = T + client.statpanel = T.name /mob/living/carbon/AltClickOn(atom/A) if(!stat && mind && iscarbon(A) && A != src) @@ -367,18 +375,7 @@ ..() /atom/proc/AltClick(mob/user) - SEND_SIGNAL(src, COMSIG_CLICK_ALT, user) - var/turf/T = get_turf(src) - if(T && user.TurfAdjacent(T)) - user.listed_turf = T - user.client.statpanel = T.name - -// Use this instead of /mob/proc/AltClickOn(atom/A) where you only want turf content listing without additional atom alt-click interaction -/atom/proc/AltClickNoInteract(mob/user, atom/A) - var/turf/T = get_turf(A) - if(T && user.TurfAdjacent(T)) - user.listed_turf = T - user.client.statpanel = T.name + . = SEND_SIGNAL(src, COMSIG_CLICK_ALT, user) /mob/proc/TurfAdjacent(turf/T) return T.Adjacent(src) diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 7f63b74945..a2d566d566 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -110,7 +110,8 @@ /mob/living/silicon/robot/CtrlClickOn(atom/A) A.BorgCtrlClick(src) /mob/living/silicon/robot/AltClickOn(atom/A) - A.BorgAltClick(src) + if(!A.BorgAltClick(src)) + altclick_listed_turf(A) /atom/proc/BorgCtrlShiftClick(mob/living/silicon/robot/user) //forward to human click if not overridden CtrlShiftClick(user) @@ -154,20 +155,17 @@ ..() /atom/proc/BorgAltClick(mob/living/silicon/robot/user) - AltClick(user) - return + return AltClick(user) /obj/machinery/door/airlock/BorgAltClick(mob/living/silicon/robot/user) // Eletrifies doors. Forwards to AI code. if(get_dist(src,user) <= user.interaction_range) - AIAltClick() - else - ..() + return AIAltClick() + return ..() /obj/machinery/turretid/BorgAltClick(mob/living/silicon/robot/user) //turret lethal on/off. Forwards to AI code. if(get_dist(src,user) <= user.interaction_range) - AIAltClick() - else - ..() + return AIAltClick() + return ..() /* As with AI, these are not used in click code, diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index 2b5af9ddb8..d2508b3e8e 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -125,6 +125,7 @@ moved = FALSE user.update_action_buttons(TRUE) to_chat(user, "Action button positions have been reset.") + return TRUE /obj/screen/movable/action_button/hide_toggle/proc/InitialiseIcon(datum/hud/owner_hud) 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 3a45e9bf60..9cb0c52b9a 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -39,23 +39,12 @@ if(..()) return TRUE user.changeNext_move(CLICK_CD_MELEE) - if(user.a_intent == INTENT_HARM && stat == DEAD && (butcher_results || guaranteed_butcher_results)) //can we butcher it? - var/datum/component/butchering/butchering = I.GetComponent(/datum/component/butchering) - if(butchering && butchering.butchering_enabled) - to_chat(user, "You begin to butcher [src]...") - playsound(loc, butchering.butcher_sound, 50, TRUE, -1) - if(do_mob(user, src, butchering.speed) && Adjacent(I)) - butchering.Butcher(user, src) - return 1 - 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 return I.attack(src, user) /obj/item/proc/attack(mob/living/M, mob/living/user) - SEND_SIGNAL(src, COMSIG_ITEM_ATTACK, M, user) + if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK, M, user) & COMPONENT_ITEM_NO_ATTACK) + return SEND_SIGNAL(user, COMSIG_MOB_ITEM_ATTACK, M, user) if(item_flags & NOBLUDGEON) return diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index 299d7f64f8..f76a745fd2 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -31,7 +31,7 @@ ShiftClickOn(A) return if(modifiers["alt"]) - AltClickNoInteract(src, A) + altclick_listed_turf(A) return if(modifiers["ctrl"]) CtrlClickOn(A) 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 6ba6a7b177..8d4de0c091 100644 --- a/code/controllers/subsystem/chat.dm +++ b/code/controllers/subsystem/chat.dm @@ -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/dcs.dm b/code/controllers/subsystem/dcs.dm index c1e101a0e7..faf95fd319 100644 --- a/code/controllers/subsystem/dcs.dm +++ b/code/controllers/subsystem/dcs.dm @@ -1,6 +1,27 @@ -SUBSYSTEM_DEF(dcs) +PROCESSING_SUBSYSTEM_DEF(dcs) name = "Datum Component System" - flags = SS_NO_INIT | SS_NO_FIRE + flags = SS_NO_INIT + var/list/elements_by_type = list() -/datum/controller/subsystem/dcs/Recover() +/datum/controller/subsystem/processing/dcs/Recover() comp_lookup = SSdcs.comp_lookup + +/datum/controller/subsystem/processing/dcs/proc/GetElement(datum/element/eletype, ...) + var/element_id = eletype + + if(initial(eletype.element_flags) & ELEMENT_BESPOKE) + var/list/fullid = list("[eletype]") + for(var/i in initial(eletype.id_arg_index) to length(args)) + var/argument = args[i] + if(istext(argument) || isnum(argument)) + fullid += "[argument]" + else + fullid += "[REF(argument)]" + element_id = fullid.Join("&") + + . = elements_by_type[element_id] + if(.) + return + if(!ispath(eletype, /datum/element)) + CRASH("Attempted to instantiate [eletype] as a /datum/element") + . = elements_by_type[element_id] = new eletype \ No newline at end of file diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index eec9f63a12..f8ca1e7eae 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -98,7 +98,7 @@ SUBSYSTEM_DEF(garbage) state = SS_RUNNING break - + /datum/controller/subsystem/garbage/proc/HandleQueue(level = GC_QUEUE_CHECK) @@ -266,8 +266,8 @@ SUBSYSTEM_DEF(garbage) D.gc_destroyed = GC_CURRENTLY_BEING_QDELETED var/start_time = world.time var/start_tick = world.tick_usage + SEND_SIGNAL(D, COMSIG_PARENT_QDELETING, force) // Let the (remaining) components know about the result of Destroy var/hint = D.Destroy(arglist(args.Copy(2))) // Let our friend know they're about to get fucked up. - SEND_SIGNAL(D, COMSIG_PARENT_QDELETED, force, hint) // Let the (remaining) components know about the result of Destroy if(world.time != start_time) I.slept_destroy++ else 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..ef63338a67 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)), @@ -87,7 +87,7 @@ SUBSYSTEM_DEF(traumas) "skeletons" = typecacheof(list(/obj/item/organ/tongue/bone, /obj/item/clothing/suit/armor/bone, /obj/item/stack/sheet/bone, /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton, /obj/effect/decal/remains/human)), - "conspiracies" = typecacheof(list(/obj/item/clothing/under/rank/captain, /obj/item/clothing/under/rank/head_of_security, + "conspiracies" = typecacheof(list(/obj/item/clothing/under/rank/captain, /obj/item/clothing/under/rank/head_of_security, /obj/item/clothing/under/rank/chief_engineer, /obj/item/clothing/under/rank/chief_medical_officer, /obj/item/clothing/under/rank/head_of_personnel, /obj/item/clothing/under/rank/research_director, /obj/item/clothing/under/rank/head_of_security/grey, /obj/item/clothing/under/rank/head_of_security/alt, @@ -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/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..37aee6df7e 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_RAW_MESSAGE] = target_phrase.Replace(hearing_args[HEARING_RAW_MESSAGE], "$1") diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm index 5bbc5de4a5..9005a788b7 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,13 +144,13 @@ 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) -/mob/camera/imaginary_friend/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) - to_chat(src, compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode)) +/mob/camera/imaginary_friend/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source) + to_chat(src, compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode, FALSE, source)) /mob/camera/imaginary_friend/proc/friend_talk(message) message = capitalize(trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))) @@ -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..235417d62c 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_RAW_MESSAGE] = quoted_spoken_message.Replace(hearing_args[HEARING_RAW_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..80a1bd2470 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_RAW_MESSAGE] = reg.Replace(hearing_args[HEARING_RAW_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..a1284319f1 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_RAW_MESSAGE] if(findtext(message, codeword)) - message = replacetext(message, codeword, "[codeword]") + hearing_args[HEARING_RAW_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/_component.dm b/code/datums/components/_component.dm index fbe94cbb9e..f938a70308 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -184,6 +184,7 @@ // The type arg is casted so initial works, you shouldn't be passing a real instance into this /datum/proc/GetComponent(datum/component/c_type) + RETURN_TYPE(c_type) if(initial(c_type.dupe_mode) == COMPONENT_DUPE_ALLOWED) stack_trace("GetComponent was called to get a component of which multiple copies could be on an object. This can easily break and should be changed. Type: \[[c_type]\]") var/list/dc = datum_components 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/butchering.dm b/code/datums/components/butchering.dm index 372fa8e283..1518a84456 100644 --- a/code/datums/components/butchering.dm +++ b/code/datums/components/butchering.dm @@ -4,8 +4,9 @@ var/bonus_modifier = 0 //percentage increase to bonus item chance var/butcher_sound = 'sound/weapons/slice.ogg' //sound played when butchering var/butchering_enabled = TRUE + var/can_be_blunt = FALSE -/datum/component/butchering/Initialize(_speed, _effectiveness, _bonus_modifier, _butcher_sound, disabled) +/datum/component/butchering/Initialize(_speed, _effectiveness, _bonus_modifier, _butcher_sound, disabled, _can_be_blunt) if(_speed) speed = _speed if(_effectiveness) @@ -16,6 +17,22 @@ butcher_sound = _butcher_sound if(disabled) butchering_enabled = FALSE + if(_can_be_blunt) + can_be_blunt = _can_be_blunt + if(isitem(parent)) + RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/onItemAttack) + +/datum/component/butchering/proc/onItemAttack(obj/item/source, mob/living/M, mob/living/user) + if(user.a_intent == INTENT_HARM && M.stat == DEAD && (M.butcher_results || M.guaranteed_butcher_results)) //can we butcher it? + if(butchering_enabled && (can_be_blunt || source.get_sharpness())) + INVOKE_ASYNC(src, .proc/startButcher, source, M, user) + return COMPONENT_ITEM_NO_ATTACK + +/datum/component/butchering/proc/startButcher(obj/item/source, mob/living/M, mob/living/user) + to_chat(user, "You begin to butcher [M]...") + playsound(M.loc, butcher_sound, 50, TRUE, -1) + if(do_mob(user, M, speed) && M.Adjacent(source)) + Butcher(user, M) /datum/component/butchering/proc/Butcher(mob/living/butcher, mob/living/meat) var/turf/T = meat.drop_location() @@ -50,3 +67,23 @@ /datum/component/butchering/proc/ButcherEffects(mob/living/meat) //extra effects called on butchering, override this via subtypes return + +///Special snowflake component only used for the recycler. +/datum/component/butchering/recycler + +/datum/component/butchering/recycler/Initialize(_speed, _effectiveness, _bonus_modifier, _butcher_sound, disabled, _can_be_blunt) + if(!istype(parent, /obj/machinery/recycler)) //EWWW + return COMPONENT_INCOMPATIBLE + . = ..() + if(. == COMPONENT_INCOMPATIBLE) + return + RegisterSignal(parent, COMSIG_MOVABLE_CROSSED, .proc/onCrossed) + +/datum/component/butchering/recycler/proc/onCrossed(datum/source, mob/living/L) + if(!istype(L)) + return + var/obj/machinery/recycler/eater = parent + if(eater.safety_mode || (eater.stat & (BROKEN|NOPOWER))) //I'm so sorry. + return + if(L.stat == DEAD && (L.butcher_results || L.guaranteed_butcher_results)) + Butcher(parent, L) \ No newline at end of file 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/earhealing.dm b/code/datums/components/earhealing.dm deleted file mode 100644 index bd3d57480d..0000000000 --- a/code/datums/components/earhealing.dm +++ /dev/null @@ -1,30 +0,0 @@ -// An item worn in the ear slot with this component will heal your ears each -// Life() tick, even if normally your ears would be too damaged to heal. - -/datum/component/earhealing - var/mob/living/carbon/wearer - -/datum/component/earhealing/Initialize() - if(!isitem(parent)) - return COMPONENT_INCOMPATIBLE - RegisterSignal(parent, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED), .proc/equippedChanged) - -/datum/component/earhealing/proc/equippedChanged(datum/source, mob/living/carbon/user, slot) - if (slot == SLOT_EARS && istype(user)) - if (!wearer) - START_PROCESSING(SSobj, src) - wearer = user - else - if (wearer) - STOP_PROCESSING(SSobj, src) - wearer = null - -/datum/component/earhealing/process() - if (!wearer) - STOP_PROCESSING(SSobj, src) - return - if(!HAS_TRAIT(wearer, TRAIT_DEAF)) - var/obj/item/organ/ears/ears = wearer.getorganslot(ORGAN_SLOT_EARS) - if (ears) - ears.deaf = max(ears.deaf - 1, (ears.damage < ears.maxHealth ? 0 : 1)) // Do not clear deafness if our ears are too damaged - ears.damage = max(ears.damage - 0.1, 0) diff --git a/code/datums/components/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..a0e6f97de0 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) @@ -245,11 +248,11 @@ var/datum/hud/hud = owner.hud_used screen_obj = new hud.infodisplay += screen_obj - RegisterSignal(hud, COMSIG_PARENT_QDELETED, .proc/unmodify_hud) + RegisterSignal(hud, COMSIG_PARENT_QDELETING, .proc/unmodify_hud) 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..422d73520e 100644 --- a/code/datums/components/rotation.dm +++ b/code/datums/components/rotation.dm @@ -98,14 +98,15 @@ 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)) return BaseRot(user, rotation) + return TRUE /datum/component/simple_rotation/proc/WrenchRot(datum/source, obj/item/I, mob/living/user) if(!can_be_rotated.Invoke(user,default_rotation_direction) || !can_user_rotate.Invoke(user,default_rotation_direction)) 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..76a9b2e6aa 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -57,7 +57,7 @@ var/screen_start_x = 4 //These two are where the storage starts being rendered, screen_loc wise. var/screen_start_y = 2 //End - + var/limited_random_access = FALSE //Quick if statement in accessible_items to determine if we care at all about what people can access at once. var/limited_random_access_stack_position = 0 //If >0, can only access top items var/limited_random_access_stack_bottom_up = FALSE //If TRUE, above becomes bottom items @@ -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) @@ -646,9 +647,9 @@ if(M == viewing) to_chat(usr, "You put [I] [insert_preposition]to [parent].") else if(in_range(M, viewing)) //If someone is standing close enough, they can tell what it is... - viewing.show_message("[M] puts [I] [insert_preposition]to [parent].", 1) + viewing.show_message("[M] puts [I] [insert_preposition]to [parent].", MSG_VISUAL) else if(I && I.w_class >= 3) //Otherwise they can only see large or normal items from a distance... - viewing.show_message("[M] puts [I] [insert_preposition]to [parent].", 1) + viewing.show_message("[M] puts [I] [insert_preposition]to [parent].", MSG_VISUAL) /datum/component/storage/proc/update_icon() if(isobj(parent)) @@ -761,7 +762,7 @@ if(!isliving(user) || !user.CanReach(parent)) return if(check_locked(source, user, TRUE)) - return + return TRUE var/atom/A = parent if(!quickdraw) @@ -769,19 +770,20 @@ user_show_to_mob(user) if(rustle_sound) playsound(A, "rustle", 50, 1, -5) - return + return TRUE - if(!user.incapacitated()) + if(user.can_hold_items() && !user.incapacitated()) var/obj/item/I = locate() in real_location() if(!I) return A.add_fingerprint(user) remove_from_storage(I, get_turf(user)) if(!user.put_in_hands(I)) - to_chat(user, "You fumble for [I] and it falls on the floor.") - return + user.visible_message("[user] fumbles with the [parent], letting [I] fall on the floor.", \ + "You fumble with [parent], letting [I] fall on the floor.") + return TRUE user.visible_message("[user] draws [I] from [parent]!", "You draw [I] from [parent].") - return + return TRUE /datum/component/storage/proc/action_trigger(datum/signal_source, datum/action/source) gather_mode_switch(source.owner) diff --git a/code/datums/components/virtual_reality.dm b/code/datums/components/virtual_reality.dm index f8f0679e9b..7bad836e47 100644 --- a/code/datums/components/virtual_reality.dm +++ b/code/datums/components/virtual_reality.dm @@ -12,7 +12,7 @@ return COMPONENT_INCOMPATIBLE var/mob/vr_M = parent mastermind = M.mind - RegisterSignal(M, list(COMSIG_MOB_DEATH, COMSIG_PARENT_QDELETED), .proc/game_over) + RegisterSignal(M, list(COMSIG_MOB_DEATH, COMSIG_PARENT_QDELETING), .proc/game_over) RegisterSignal(M, COMSIG_MOB_KEY_CHANGE, .proc/switch_player) RegisterSignal(mastermind, COMSIG_MIND_TRANSFER, .proc/switch_player) you_die_in_the_game_you_die_for_real = yolo @@ -32,7 +32,7 @@ current_mind = M.mind quit_action.Grant(M) RegisterSignal(quit_action, COMSIG_ACTION_TRIGGER, .proc/revert_to_reality) - RegisterSignal(M, list(COMSIG_MOB_DEATH, COMSIG_PARENT_QDELETED), .proc/game_over) + RegisterSignal(M, list(COMSIG_MOB_DEATH, COMSIG_PARENT_QDELETING), .proc/game_over) RegisterSignal(M, COMSIG_MOB_GHOSTIZE, .proc/be_a_quitter) RegisterSignal(M, COMSIG_MOB_KEY_CHANGE, .proc/pass_me_the_remote) RegisterSignal(current_mind, COMSIG_MIND_TRANSFER, .proc/pass_me_the_remote) @@ -42,7 +42,7 @@ /datum/component/virtual_reality/UnregisterFromParent() quit_action.Remove(parent) - UnregisterSignal(parent, list(COMSIG_MOB_DEATH, COMSIG_PARENT_QDELETED, COMSIG_MOB_KEY_CHANGE, COMSIG_MOB_GHOSTIZE)) + UnregisterSignal(parent, list(COMSIG_MOB_DEATH, COMSIG_PARENT_QDELETING, COMSIG_MOB_KEY_CHANGE, COMSIG_MOB_GHOSTIZE)) UnregisterSignal(current_mind, COMSIG_MIND_TRANSFER) UnregisterSignal(quit_action, COMSIG_ACTION_TRIGGER) current_mind = null 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/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/dna.dm b/code/datums/dna.dm index 8a3fd82cb9..ccc5d97cf8 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -254,7 +254,6 @@ if(icon_update) update_body() update_hair() - update_body_parts() update_mutations_overlay()// no lizard with human hulk overlay please. diff --git a/code/datums/dog_fashion.dm b/code/datums/dog_fashion.dm index c798f35218..b9e774aa50 100644 --- a/code/datums/dog_fashion.dm +++ b/code/datums/dog_fashion.dm @@ -174,3 +174,13 @@ /datum/dog_fashion/back/deathsquad name = "Trooper REAL_NAME" desc = "That's not red paint. That's real corgi blood." + +/datum/dog_fashion/head/colour + name = "Stylish REAL_NAME" + desc = "From the tips of their paws to the top of their head, they look like a made bed." + emote_see = list("tries to tap dances.","looks sadly at others outfits...","barks at bad fashion!") + +/datum/dog_fashion/head/telegram + name = "Messenger REAL_NAME" + desc = "Dont shoot the messenger..." + emote_see = list("licks an envelope.","looks ready to set off to send a letter...","works on barking!") diff --git a/code/datums/elements/_element.dm b/code/datums/elements/_element.dm new file mode 100644 index 0000000000..8f9b97db22 --- /dev/null +++ b/code/datums/elements/_element.dm @@ -0,0 +1,39 @@ +/datum/element + var/element_flags = NONE + /** + * The index of the first attach argument to consider for duplicate elements + * Is only used when flags contains ELEMENT_BESPOKE + * This is infinity so you must explicitly set this + */ + var/id_arg_index = INFINITY + +/datum/element/proc/Attach(datum/target) + if(type == /datum/element) + return ELEMENT_INCOMPATIBLE + if(element_flags & ELEMENT_DETACH) + RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/Detach) + +/datum/element/proc/Detach(datum/source, force) + UnregisterSignal(source, COMSIG_PARENT_QDELETING) + +/datum/element/Destroy(force) + if(!force) + return QDEL_HINT_LETMELIVE + SSdcs.elements_by_type -= type + return ..() + +//DATUM PROCS + +/datum/proc/AddElement(eletype, ...) + var/datum/element/ele = SSdcs.GetElement(arglist(args)) + args[1] = src + if(ele.Attach(arglist(args)) == ELEMENT_INCOMPATIBLE) + CRASH("Incompatible [eletype] assigned to a [type]! args: [json_encode(args)]") + +/** + * Finds the singleton for the element type given and detaches it from src + * You only need additional arguments beyond the type if you're using ELEMENT_BESPOKE + */ +/datum/proc/RemoveElement(eletype, ...) + var/datum/element/ele = SSdcs.GetElement(arglist(args)) + ele.Detach(src) \ No newline at end of file diff --git a/code/datums/components/cleaning.dm b/code/datums/elements/cleaning.dm similarity index 79% rename from code/datums/components/cleaning.dm rename to code/datums/elements/cleaning.dm index 5324a87fee..e4fb3edd48 100644 --- a/code/datums/components/cleaning.dm +++ b/code/datums/elements/cleaning.dm @@ -1,13 +1,15 @@ -/datum/component/cleaning - dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS +/datum/element/cleaning/Attach(datum/target) + . = ..() + if(!ismovableatom(target)) + return ELEMENT_INCOMPATIBLE + RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/Clean) -/datum/component/cleaning/Initialize() - if(!ismovableatom(parent)) - return COMPONENT_INCOMPATIBLE - RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED), .proc/Clean) +/datum/element/cleaning/Detach(datum/target) + . = ..() + UnregisterSignal(target, COMSIG_MOVABLE_MOVED) -/datum/component/cleaning/proc/Clean() - var/atom/movable/AM = parent +/datum/element/cleaning/proc/Clean(datum/source) + var/atom/movable/AM = source var/turf/T = AM.loc SEND_SIGNAL(T, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) for(var/A in T) @@ -43,4 +45,4 @@ cleaned_human.clean_blood() cleaned_human.wash_cream() cleaned_human.regenerate_icons() - to_chat(cleaned_human, "[src] cleans your face!") \ No newline at end of file + to_chat(cleaned_human, "[src] cleans your face!") diff --git a/code/datums/elements/earhealing.dm b/code/datums/elements/earhealing.dm new file mode 100644 index 0000000000..7477742673 --- /dev/null +++ b/code/datums/elements/earhealing.dm @@ -0,0 +1,37 @@ + +/datum/element/earhealing + element_flags = ELEMENT_DETACH + var/list/user_by_item = list() + +/datum/element/earhealing/New() + START_PROCESSING(SSdcs, src) + +/datum/element/earhealing/Attach(datum/target) + . = ..() + if(!isitem(target)) + return ELEMENT_INCOMPATIBLE + + RegisterSignal(target, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED), .proc/equippedChanged) + +/datum/element/earhealing/Detach(datum/target) + . = ..() + UnregisterSignal(target, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED)) + user_by_item -= target + +/datum/element/earhealing/proc/equippedChanged(datum/source, mob/living/carbon/user, slot) + if(slot == SLOT_EARS && istype(user)) + user_by_item[source] = user + else + user_by_item -= source + +/datum/element/earhealing/process() + for(var/i in user_by_item) + var/mob/living/carbon/user = user_by_item[i] + if(HAS_TRAIT(user, TRAIT_DEAF)) + continue + var/obj/item/organ/ears/ears = user.getorganslot(ORGAN_SLOT_EARS) + if(!ears) + continue + ears.deaf = max(ears.deaf - 0.25, (ears.damage < ears.maxHealth ? 0 : 1)) // Do not clear deafness if our ears are too damaged + ears.damage = max(ears.damage - 0.025, 0) + CHECK_TICK 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/emotes.dm b/code/datums/emotes.dm index 6c91cc3a7d..f0fca5db5a 100644 --- a/code/datums/emotes.dm +++ b/code/datums/emotes.dm @@ -1,6 +1,3 @@ -#define EMOTE_VISIBLE 1 -#define EMOTE_AUDIBLE 2 - /datum/emote var/key = "" //What calls the emote var/key_third_person = "" //This will also call the emote diff --git a/code/datums/explosion.dm b/code/datums/explosion.dm index b3c57e4838..7be4489e86 100644 --- a/code/datums/explosion.dm +++ b/code/datums/explosion.dm @@ -198,7 +198,7 @@ GLOBAL_LIST_EMPTY(explosions) var/list/items = list() for(var/I in T) var/atom/A = I - if (!A.prevent_content_explosion()) //The atom/contents_explosion() proc returns null if the contents ex_acting has been handled by the atom, and TRUE if it hasn't. + if (!(A.flags_1 & PREVENT_CONTENTS_EXPLOSION_1)) //The atom/contents_explosion() proc returns null if the contents ex_acting has been handled by the atom, and TRUE if it hasn't. items += A.GetAllContents() for(var/O in items) var/atom/A = O 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 5cf03e2684..0ded5f9912 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -91,7 +91,10 @@ if(current) // remove ourself from our old body's mind variable current.mind = null SStgui.on_transfer(current, new_character) - + if(iscarbon(current)) + var/mob/living/carbon/C = current + if(C.combatmode) + C.toggle_combat_mode(TRUE, TRUE) if(!language_holder) var/datum/language_holder/mob_holder = new_character.get_language_holder(shadow = FALSE) language_holder = mob_holder.copy(src) diff --git a/code/datums/mood_events/drug_events.dm b/code/datums/mood_events/drug_events.dm index 469bf80979..1a681a8a4d 100644 --- a/code/datums/mood_events/drug_events.dm +++ b/code/datums/mood_events/drug_events.dm @@ -53,3 +53,63 @@ mood_change = -20 timeout = 300 //special_screen_obj = "mood_happiness_bad" Originally in tg + +/datum/mood_event/eigenstate + mood_change = -3 + description = "Where the hell am I? Is this an alternative dimension ?\n" + +/datum/mood_event/enthrall + mood_change = 5 + +/datum/mood_event/enthrall/add_effects(message) + description = "[message]\n" + +/datum/mood_event/enthrallpraise + mood_change = 10 + timeout = 1 MINUTES + +/datum/mood_event/enthrallpraise/add_effects(message) + description = "[message]\n" + +/datum/mood_event/enthrallscold + mood_change = -10 + timeout = 1 MINUTES + +/datum/mood_event/enthrallscold/add_effects(message) + description = "[message]\n"//aaa I'm not kinky enough for this + +/datum/mood_event/enthrallmissing1 + mood_change = -5 + +/datum/mood_event/enthrallmissing1/add_effects(message) + description = "[message]\n" + +/datum/mood_event/enthrallmissing2 + mood_change = -10 + +/datum/mood_event/enthrallmissing2/add_effects(message) + description = "[message]\n" + +/datum/mood_event/enthrallmissing3 + mood_change = -15 + +/datum/mood_event/enthrallmissing3/add_effects(message) + description = "[message]\n" + +/datum/mood_event/enthrallmissing4 + mood_change = -25 + +/datum/mood_event/enthrallmissing4/add_effects(message) + description = "[message]\n" + +/datum/mood_event/InLove + mood_change = 10 + +/datum/mood_event/InLove/add_effects(message) + description = "[message]\n" + +/datum/mood_event/MissingLove + mood_change = -10 + +/datum/mood_event/MissingLove/add_effects(message) + description = "[message]\n" diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index f747c563ad..94a64c3bd4 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" @@ -176,3 +176,25 @@ /datum/mood_event/revenant_blight/add_effects() description = "Just give up, [pick("no one will miss you", "there is nothing you can do to help", "even a clown would be more useful than you", "does it even matter in the end?")]...\n" + +/datum/mood_event/plushjack + description = "I have butchered a plush recently.\n" + mood_change = -1 + timeout = 2 MINUTES + +/datum/mood_event/plush_nostuffing + description = "A plush I tried to pet had no stuffing...\n" + mood_change = -1 + timeout = 2 MINUTES + +//Cursed stuff below + +/datum/mood_event/emptypred + description = "I had to let someone out.\n" + mood_change = -2 + timeout = 1 MINUTES + +/datum/mood_event/emptyprey + description = "It feels quite cold out here.\n" + mood_change = -2 + timeout = 1 MINUTES diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index 422ec4476c..9ae7ba2289 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 @@ -113,3 +113,38 @@ /datum/mood_event/happy_empath/add_effects(var/mob/happytarget) description = "[happytarget.name]'s happiness is infectious!\n" + +/datum/mood_event/headpat + description = "Headpats are nice.\n" + mood_change = 2 + timeout = 2 MINUTES + +/datum/mood_event/hugbox + description = "I hugged a box of hugs recently.\n" + mood_change = 1 + timeout = 2 MINUTES + +/datum/mood_event/plushpet + description = "I pet a plush recently.\n" + mood_change = 1 + timeout = 3000 + +/datum/mood_event/plushplay + description = "I've played with plushes recently.\n" + mood_change = 3 + timeout = 3000 + +//Cursed stuff below. + +/datum/mood_event/orgasm + description = "I came!\n" //funny meme haha + mood_change = 3 + timeout = 100 SECONDS + +/datum/mood_event/fedpred + description = "I've devoured someone!\n" + mood_change = 3 + +/datum/mood_event/fedprey + description = "It feels quite cozy in here.\n" + mood_change = 3 diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm index 85cecca489..3d07e6066f 100644 --- a/code/datums/mutations/hulk.dm +++ b/code/datums/mutations/hulk.dm @@ -5,7 +5,7 @@ get_chance = 15 lowest_value = 256 * 12 text_gain_indication = "Your muscles hurt!" - species_allowed = list("human") //no skeleton/lizard hulk + species_allowed = list("fly") //no skeleton/lizard hulk health_req = 25 /datum/mutation/human/hulk/on_acquiring(mob/living/carbon/human/owner) 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/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..d1196a7753 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -481,7 +481,7 @@ deltimer(timerid) -//Kindle: Used by servants of Ratvar. 10-second knockdown, reduced by 1 second per 5 damage taken while the effect is active. +//Kindle: Used by servants of Ratvar. 10-second knockdown, reduced by 1 second per 5 damage taken while the effect is active. Does not take into account Oxy-damage /datum/status_effect/kindle id = "kindle" status_type = STATUS_EFFECT_UNIQUE @@ -489,6 +489,7 @@ duration = 100 alert_type = /obj/screen/alert/status_effect/kindle var/old_health + var/old_oxyloss /datum/status_effect/kindle/tick() owner.Knockdown(15, TRUE, FALSE, 15) @@ -498,7 +499,9 @@ C.stuttering = max(5, C.stuttering) if(!old_health) old_health = owner.health - var/health_difference = old_health - owner.health + if(!old_oxyloss) + old_oxyloss = owner.getOxyLoss() + var/health_difference = old_health - owner.health - CLAMP(owner.getOxyLoss() - old_oxyloss,0, owner.getOxyLoss()) if(!health_difference) return owner.visible_message("The light in [owner]'s eyes dims as [owner.p_theyre()] harmed!", \ @@ -506,6 +509,7 @@ health_difference *= 2 //so 10 health difference translates to 20 deciseconds of stun reduction duration -= health_difference old_health = owner.health + old_oxyloss = owner.getOxyLoss() /datum/status_effect/kindle/on_remove() owner.visible_message("The light in [owner]'s eyes fades!", \ @@ -541,6 +545,38 @@ icon_state = "ichorial_stain" alerttooltipstyle = "clockcult" + +//GOLEM GANG + +/datum/status_effect/strandling //get it, strand as in durathread strand + strangling = strandling hahahahahahahahahahhahahaha i want to die + id = "strandling" + status_type = STATUS_EFFECT_UNIQUE + alert_type = /obj/screen/alert/status_effect/strandling + +/datum/status_effect/strandling/on_apply() + ADD_TRAIT(owner, TRAIT_MAGIC_CHOKE, "dumbmoron") + return ..() + +/datum/status_effect/strandling/on_remove() + REMOVE_TRAIT(owner, TRAIT_MAGIC_CHOKE, "dumbmoron") + return ..() + +/obj/screen/alert/status_effect/strandling + name = "Choking strand" + desc = "A magical strand of Durathread is wrapped around your neck, preventing you from breathing! Click this icon to remove the strand." + icon_state = "his_grace" + alerttooltipstyle = "hisgrace" + +/obj/screen/alert/status_effect/strandling/Click(location, control, params) + . = ..() + to_chat(mob_viewer, "You attempt to remove the durathread strand from around your neck.") + if(do_after(mob_viewer, 35, null, mob_viewer)) + if(isliving(mob_viewer)) + var/mob/living/L = mob_viewer + to_chat(mob_viewer, "You succesfuly remove the durathread strand.") + L.remove_status_effect(STATUS_EFFECT_CHOKINGSTRAND) + + datum/status_effect/pacify id = "pacify" status_type = STATUS_EFFECT_REPLACE @@ -567,8 +603,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 +611,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 +618,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/good.dm b/code/datums/traits/good.dm index 80a5f24250..09a4f0b060 100644 --- a/code/datums/traits/good.dm +++ b/code/datums/traits/good.dm @@ -101,21 +101,6 @@ H.equip_to_slot(musicaltuner, SLOT_IN_BACKPACK) H.regenerate_icons() -/datum/quirk/night_vision - name = "Night Vision" - desc = "You can see slightly more clearly in full darkness than most people." - value = 1 - mob_trait = TRAIT_NIGHT_VISION - gain_text = "The shadows seem a little less dark." - lose_text = "Everything seems a little darker." - -/datum/quirk/night_vision/on_spawn() - var/mob/living/carbon/human/H = quirk_holder - var/obj/item/organ/eyes/eyes = H.getorgan(/obj/item/organ/eyes) - if(!eyes || eyes.lighting_alpha) - return - eyes.Insert(H) //refresh their eyesight and vision - /datum/quirk/photographer name = "Photographer" desc = "You know how to handle a camera, shortening the delay between each shot." 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..7de5707032 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) @@ -312,9 +316,6 @@ to_chat(user, "You can't move while buckled to [src]!") return -/atom/proc/prevent_content_explosion() - return FALSE - /atom/proc/contents_explosion(severity, target) return //For handling the effects of explosions on contents that would not normally be effected @@ -563,7 +564,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 +657,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) @@ -808,8 +809,7 @@ Proc for attack log creation, because really why not // Filter stuff /atom/movable/proc/add_filter(name,priority,list/params) - if(!filter_data) - filter_data = list() + LAZYINITLIST(filter_data) var/list/p = params.Copy() p["priority"] = priority filter_data[name] = p @@ -817,7 +817,7 @@ Proc for attack log creation, because really why not /atom/movable/proc/update_filters() filters = null - sortTim(filter_data,associative = TRUE) + filter_data = sortTim(filter_data, /proc/cmp_filter_data_priority, TRUE) for(var/f in filter_data) var/list/data = filter_data[f] var/list/arguments = data.Copy() @@ -832,4 +832,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/data_huds.dm b/code/game/data_huds.dm index 65a7c6a954..1a57cf5051 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -189,7 +189,13 @@ if(tod) var/tdelta = round(world.time - timeofdeath) if(tdelta < (DEFIB_TIME_LIMIT * 10)) - holder.icon_state = "huddefib" + var/obj/item/organ/heart/He = getorgan(/obj/item/organ/heart) + if(He) + holder.icon_state = "huddefib" + if(He.organ_flags & ORGAN_FAILING) + holder.icon_state = "huddefibheart" + else + holder.icon_state = "huddefibheart" return holder.icon_state = "huddead" else diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index 76e6268977..a76e8234ba 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -339,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() @@ -353,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/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm index ca009f76ad..67ea855466 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 @@ -190,33 +236,39 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) return rule.round_result() return ..() +/datum/game_mode/dynamic/generate_report() + return "Mysterious signals that demonstrate strange dynamics have been detected in your sector. Watch out for oddities." + /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 +277,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 +298,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 +311,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 +331,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 +343,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 +370,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 +401,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 +412,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 +429,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 +445,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 +474,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", verbose = TRUE) 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 +549,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 +561,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", verbose = TRUE) + 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]", verbose = TRUE) if(rule.flags & HIGHLANDER_RULESET) highlander_executed = TRUE else if(rule.flags & ONLY_RULESET) @@ -519,54 +643,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 +659,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 +738,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 +801,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()) @@ -721,16 +818,19 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) /// Refund threat, but no more than threat_level. /datum/game_mode/dynamic/proc/refund_threat(regain) threat = min(threat_level,threat+regain) + log_threat("[regain] refunded. Threat is now [threat].", verbose = TRUE) /// Generate threat and increase the threat_level if it goes beyond, capped at 100 /datum/game_mode/dynamic/proc/create_threat(gain) threat = min(100, threat+gain) if(threat > threat_level) threat_level = threat + log_threat("[gain] created. Threat is now [threat] and threat level is now [threat_level].", verbose = TRUE) /// Expend threat, can't fall under 0. /datum/game_mode/dynamic/proc/spend_threat(cost) threat = max(threat-cost,0) + log_threat("[cost] spent. Threat is now [threat].", verbose = TRUE) /// Turns the value generated by lorentz distribution to threat value between 0 and 100. /datum/game_mode/dynamic/proc/lorentz_to_threat(x) 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..06efc113da 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))) @@ -86,11 +94,8 @@ var/list/possible_candidates = list() possible_candidates.Add(dead_players) possible_candidates.Add(list_observers) - send_applications(possible_candidates) - if(assigned.len > 0) - return TRUE - else - return FALSE + var/application_successful = send_applications(possible_candidates) + return assigned.len > 0 && application_successful /// This sends a poll to ghosts if they want to be a ghost spawn from a ruleset. /datum/dynamic_ruleset/midround/from_ghosts/proc/send_applications(list/possible_volunteers = list()) @@ -100,30 +105,23 @@ 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.") - mode.refund_threat(cost) - mode.threat_log += "[worldtime2text()]: Rule [name] refunded [cost] (no applications)" - mode.executed_rules -= src - return + 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.") + return FALSE message_admins("[candidates.len] players volunteered for the ruleset [name].") log_game("DYNAMIC: [candidates.len] players volunteered for [name].") review_applications() + return TRUE /// Here is where you can check if your ghost applicants are valid for the ruleset. /// Called by send_applications(). /datum/dynamic_ruleset/midround/from_ghosts/proc/review_applications() for (var/i = 1, i <= required_candidates, i++) if(candidates.len <= 0) - 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.executed_rules -= src break var/mob/applicant = pick(candidates) candidates -= applicant @@ -145,7 +143,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 +175,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 +223,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 +254,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 +276,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 +302,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 +328,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 +341,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 +378,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 +408,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 +466,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 +497,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 abca269eeb..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 @@ -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,10 +171,9 @@ /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 @@ -188,8 +184,25 @@ 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 @@ -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/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/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/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,16 +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) - GLOB.clockwork_vitality += 50 * starter_servants //some starter Vitality to help recover from initial fuck ups + 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 @@ -604,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 + antag_cap = list(1,1,1,2,2,2,3,3,3,4) /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)) - + 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 @@ -669,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/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..520721560a 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -12,6 +12,7 @@ density = FALSE state_open = TRUE circuit = /obj/item/circuitboard/machine/sleeper + req_access = list(ACCESS_CMO) //Used for reagent deletion and addition of non medicines var/efficiency = 1 var/min_health = -25 var/list/available_chems @@ -28,9 +29,27 @@ /obj/machinery/sleeper/Initialize() . = ..() + create_reagents(500, NO_REACT) occupant_typecache = GLOB.typecache_living update_icon() reset_chem_buttons() + RefreshParts() + add_inital_chems() + +/obj/machinery/sleeper/on_deconstruction() + var/obj/item/reagent_containers/sleeper_buffer/buffer = new (loc) + buffer.volume = reagents.maximum_volume + buffer.reagents.maximum_volume = reagents.maximum_volume + reagents.trans_to(buffer.reagents, reagents.total_volume) + +/obj/machinery/sleeper/proc/add_inital_chems() + for(var/i in available_chems) + var/datum/reagent/R = reagents.has_reagent(i) + if(!R) + reagents.add_reagent(i, (20)) + continue + if(R.volume < 20) + reagents.add_reagent(i, (20 - R.volume)) /obj/machinery/sleeper/RefreshParts() var/E @@ -47,6 +66,11 @@ available_chems |= possible_chems[i] reset_chem_buttons() + //Total container size 500 - 2000u + if(reagents) + reagents.maximum_volume = (500*E) + + /obj/machinery/sleeper/update_icon() icon_state = initial(icon_state) if(state_open) @@ -81,7 +105,42 @@ if (. & EMP_PROTECT_SELF) return if(is_operational() && occupant) + var/datum/reagent/R = pick(reagents.reagent_list) + inject_chem(R.id, occupant) open_machine() + //Is this too much? + if(severity == EMP_HEAVY) + var/chem = pick(available_chems) + available_chems -= chem + available_chems += get_random_reagent_id() + reset_chem_buttons() + +/obj/machinery/sleeper/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/reagent_containers/sleeper_buffer)) + var/obj/item/reagent_containers/sleeper_buffer/SB = I + if((SB.reagents.total_volume + reagents.total_volume) < reagents.maximum_volume) + SB.reagents.trans_to(reagents, SB.reagents.total_volume) + visible_message("[user] places the [SB] into the [src].") + qdel(SB) + return + else + SB.reagents.trans_to(reagents, SB.reagents.total_volume) + visible_message("[user] adds as much as they can to the [src] from the [SB].") + return + if(istype(I, /obj/item/reagent_containers)) + var/obj/item/reagent_containers/RC = I + if(RC.reagents.total_volume == 0) + to_chat(user, "The [I] is empty!") + for(var/datum/reagent/R in RC.reagents.reagent_list) + if((obj_flags & EMAGGED) || (allowed(usr))) + break + if(!istype(R, /datum/reagent/medicine)) + visible_message("The [src] gives out a hearty boop and rejects the [I]. The Sleeper's screen flashes with a pompous \"Medicines only, please.\"") + return + RC.reagents.trans_to(reagents, 1000) + visible_message("[user] adds as much as they can to the [src] from the [I].") + return + /obj/machinery/sleeper/MouseDrop_T(mob/target, mob/user) if(user.stat || user.lying || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !user.IsAdvancedToolUser()) @@ -122,16 +181,18 @@ open_machine() /obj/machinery/sleeper/AltClick(mob/user) + . = ..() if(!user.canUseTopic(src, !issilicon(user))) return if(state_open) close_machine() else open_machine() + return TRUE /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) @@ -141,18 +202,24 @@ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "sleeper", name, 375, 550, master_ui, state) + ui = new(user, src, ui_key, "sleeper", name, 550, 700, master_ui, state) ui.open() /obj/machinery/sleeper/ui_data() var/list/data = list() data["occupied"] = occupant ? 1 : 0 data["open"] = state_open + data["efficiency"] = efficiency + data["current_vol"] = reagents.total_volume + data["tot_capacity"] = reagents.maximum_volume data["chems"] = list() for(var/chem in available_chems) - var/datum/reagent/R = GLOB.chemical_reagents_list[chem] - data["chems"] += list(list("name" = R.name, "id" = R.id, "allowed" = chem_allowed(chem))) + var/datum/reagent/R = reagents.has_reagent(chem) + R = GLOB.chemical_reagents_list[chem] + data["synthchems"] += list(list("name" = R.name, "id" = R.id, "synth_allowed" = synth_allowed(chem))) + for(var/datum/reagent/R in reagents.reagent_list) + data["chems"] += list(list("name" = R.name, "id" = R.id, "vol" = R.volume, "purity" = R.purity, "allowed" = chem_allowed(R.id))) data["occupant"] = list() var/mob/living/mob_occupant = occupant @@ -184,8 +251,15 @@ if(mob_occupant.reagents && mob_occupant.reagents.reagent_list.len) for(var/datum/reagent/R in mob_occupant.reagents.reagent_list) data["occupant"]["reagents"] += list(list("name" = R.name, "volume" = R.volume)) + data["occupant"]["failing_organs"] = list() + var/mob/living/carbon/C = mob_occupant + if(C) + for(var/obj/item/organ/Or in C.getFailingOrgans()) + if(istype(Or, /obj/item/organ/brain)) + continue + data["occupant"]["failing_organs"] += list(list("name" = Or.name)) + if(mob_occupant.has_dna()) // Blood-stuff is mostly a copy-paste from the healthscanner. - var/mob/living/carbon/C = mob_occupant var/blood_id = C.get_blood_id() if(blood_id) data["occupant"]["blood"] = list() // We can start populating this list. @@ -196,7 +270,7 @@ blood_type = R.name else blood_type = blood_id - data["occupant"]["blood"]["maxBloodVolume"] = BLOOD_VOLUME_NORMAL + data["occupant"]["blood"]["maxBloodVolume"] = (BLOOD_VOLUME_NORMAL*C.blood_ratio) data["occupant"]["blood"]["currentBloodVolume"] = C.blood_volume data["occupant"]["blood"]["dangerBloodVolume"] = BLOOD_VOLUME_SAFE data["occupant"]["blood"]["bloodType"] = blood_type @@ -216,24 +290,49 @@ . = TRUE if("inject") var/chem = params["chem"] + var/amount = text2num(params["volume"]) if(!is_operational() || !mob_occupant) return if(mob_occupant.health < min_health && chem != "epinephrine") return - if(inject_chem(chem, usr)) + if(inject_chem(chem, usr, amount)) . = TRUE if(scrambled_chems && prob(5)) to_chat(usr, "Chemical system re-route detected, results may not be as expected!") + if("synth") + var/chem = params["chem"] + if(!is_operational()) + return + reagents.add_reagent(chem_buttons[chem], 10) //other_purity = 0.75 for when the mechanics are in + if("purge") + var/chem = params["chem"] + if(allowed(usr)) + if(!is_operational()) + return + reagents.remove_reagent(chem, 10) + return + if(chem in available_chems) + if(!is_operational()) + return + /*var/datum/reagent/R = reagents.has_reagent(chem) //For when purity effects are in + if(R.purity < 0.8)*/ + reagents.remove_reagent(chem, 10) + else + visible_message("Access Denied.") + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + /obj/machinery/sleeper/emag_act(mob/user) . = ..() + obj_flags |= EMAGGED scramble_chem_buttons() to_chat(user, "You scramble the sleeper's user interface!") return TRUE -/obj/machinery/sleeper/proc/inject_chem(chem, mob/user) - if((chem in available_chems) && chem_allowed(chem)) - occupant.reagents.add_reagent(chem_buttons[chem], 10) //emag effect kicks in here so that the "intended" chem is used for all checks, for extra FUUU +//trans to +/obj/machinery/sleeper/proc/inject_chem(chem, mob/user, volume = 10) + if(chem_allowed(chem)) + reagents.trans_id_to(occupant, chem, volume)//emag effect kicks in here so that the "intended" chem is used for all checks, for extra FUUU if(user) log_combat(user, occupant, "injected [chem] into", addition = "via [src]") return TRUE @@ -246,6 +345,14 @@ var/occ_health = mob_occupant.health > min_health || chem == "epinephrine" return amount && occ_health +/obj/machinery/sleeper/proc/synth_allowed(chem) + var/datum/reagent/R = reagents.has_reagent(chem) + if(!R) + return TRUE + if(R.volume < 50) + return TRUE + return FALSE + /obj/machinery/sleeper/proc/reset_chem_buttons() scrambled_chems = FALSE LAZYINITLIST(chem_buttons) diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index e2dcf552c1..ff7383cd9e 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -454,20 +454,20 @@ Class Procs: /obj/machinery/examine(mob/user) . = ..() if(stat & BROKEN) - to_chat(user, "It looks broken and non-functional.") + . += "It looks broken and non-functional." if(!(resistance_flags & INDESTRUCTIBLE)) if(resistance_flags & ON_FIRE) - to_chat(user, "It's on fire!") + . += "It's on fire!" var/healthpercent = (obj_integrity/max_integrity) * 100 switch(healthpercent) if(50 to 99) - to_chat(user, "It looks slightly damaged.") + . += "It looks slightly damaged." if(25 to 50) - to_chat(user, "It appears heavily damaged.") + . += "It appears heavily damaged." if(0 to 25) - to_chat(user, "It's falling apart!") + . += "It's falling apart!" if(user.research_scanner && component_parts) - to_chat(user, display_parts(user, TRUE)) + . += display_parts(user, TRUE) //called on machinery construction (i.e from frame to machinery) but not on initialization /obj/machinery/proc/on_construction() 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..b41910f010 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() @@ -132,8 +132,8 @@ ..() if(!user.canUseTopic(src)) return - else - eject_part(user) + eject_part(user) + return TRUE /obj/machinery/aug_manipulator/power_change() ..() 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/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..e8e15ff586 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)) @@ -132,12 +133,13 @@ ..() /obj/structure/frame/computer/AltClick(mob/user) - ..() + . = ..() if(!isliving(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return if(anchored) to_chat(usr, "You must unwrench [src] before rotating it!") - return + return TRUE setDir(turn(dir, -90)) + return TRUE 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 9539dc281d..3bdb635d39 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." @@ -29,7 +34,8 @@ 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 @@ -44,10 +50,11 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) light_color = LIGHT_COLOR_BLUE -/obj/machinery/computer/card/examine(mob/user) - ..() - if(inserted_scan_id || inserted_modify_id) - 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() . = ..() @@ -56,20 +63,17 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) /obj/machinery/computer/card/examine(mob/user) . = ..() if(inserted_scan_id || inserted_modify_id) - to_chat(user, "Alt-click to eject the ID card.") + . += "Alt-click to eject the ID card." /obj/machinery/computer/card/attackby(obj/I, mob/user, params) - if(istype(I, /obj/item/card/id)) - if(!inserted_scan_id) + if(isidcard(I)) + if(check_access(I) && !inserted_scan_id) if(id_insert(user, I, inserted_scan_id)) inserted_scan_id = I - return - if(!inserted_modify_id) - if(id_insert(user, I, inserted_modify_id)) - inserted_modify_id = I - return - else - to_chat(user, "There's already an ID card in the console!") + updateUsrDialog() + else if(id_insert(user, I, inserted_modify_id)) + inserted_modify_id = I + updateUsrDialog() else return ..() @@ -103,7 +107,6 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) /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) @@ -111,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) @@ -123,125 +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/card/id/I, target) - if(istype(I)) - if(target) - to_chat(user, "There's already an ID card in the console!") - return FALSE - if(!user.transferItemToLoc(I, src)) - return FALSE - 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() - return TRUE + +/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, "There's no ID card in the console!") + 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 an ID card from the console.", \ - "You get the ID card from the console.") + 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 - authenticated = FALSE - return + updateUsrDialog() + return TRUE if(inserted_scan_id) if(id_eject(user, inserted_scan_id)) inserted_scan_id = null - authenticated = FALSE - return + updateUsrDialog() + return TRUE /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(inserted_scan_id) - S = html_encode(inserted_scan_id.name) - else - S = "--------" - dat += "[S]" - dat += "" - dat += "" - var/ID - if(inserted_scan_id && (ACCESS_CHANGE_IDS in inserted_scan_id.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 @@ -255,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(inserted_modify_id) - target_name = html_encode(inserted_modify_id.name) - else - target_name = "--------" - if(inserted_modify_id && inserted_modify_id.registered_name) - target_owner = html_encode(inserted_modify_id.registered_name) - else - target_owner = "--------" - if(inserted_modify_id && inserted_modify_id.assignment) - target_rank = html_encode(inserted_modify_id.assignment) - else - target_rank = "Unassigned" - - var/scan_name - if(inserted_scan_id) - scan_name = html_encode(inserted_scan_id.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 && inserted_modify_id) - - var/carddesc = text("") - var/jobs = text("") - if( authenticated == 2) + 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 @@ -338,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 inserted_modify_id.access) - accesses += "[replacetext(get_centcom_access_desc(A), " ", " ")] " + 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 @@ -361,23 +336,23 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) accesses += "" accesses += "
    " for(var/A in get_region_accesses(i)) if(A in inserted_modify_id.access) - accesses += "[replacetext(get_access_desc(A), " ", " ")] " + 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() @@ -393,25 +368,31 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) usr.set_machine(src) switch(href_list["choice"]) if ("inserted_modify_id") - if (inserted_modify_id) + if(inserted_modify_id && !usr.get_active_held_item()) if(id_eject(usr, inserted_modify_id)) inserted_modify_id = null - else - var/mob/M = usr - var/obj/item/card/id/I = M.get_idcard(TRUE) - if(id_insert(usr, I, inserted_modify_id)) - inserted_modify_id = I + 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) + if(inserted_scan_id && !usr.get_active_held_item()) if(id_eject(usr, inserted_scan_id)) inserted_scan_id = null - else - var/mob/M = usr - var/obj/item/card/id/I = M.get_idcard(TRUE) - if(id_insert(usr, I, inserted_scan_id)) - inserted_scan_id = I + 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 ) && (inserted_scan_id || issilicon(usr)) && (inserted_modify_id || mode))) + if ((!( authenticated ) && (inserted_scan_id || issilicon(usr)) || mode)) if (check_access(inserted_scan_id)) region_access = list() head_subordinates = list() @@ -483,7 +464,7 @@ 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 @@ -496,7 +477,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) 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 = inserted_modify_id @@ -506,7 +487,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 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") @@ -519,7 +500,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) if("make_job_available") // MAKE ANOTHER JOB POSITION AVAILABLE FOR LATE JOINERS - if(inserted_scan_id && (ACCESS_CHANGE_IDS in inserted_scan_id.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) @@ -536,7 +517,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) if("make_job_unavailable") // MAKE JOB POSITION UNAVAILABLE FOR LATE JOINERS - if(inserted_scan_id && (ACCESS_CHANGE_IDS in inserted_scan_id.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) @@ -554,7 +535,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) if ("prioritize_job") // TOGGLE WHETHER JOB APPEARS AS PRIORITIZED IN THE LOBBY - if(inserted_scan_id && (ACCESS_CHANGE_IDS in inserted_scan_id.access) && !target_dept) + if(authenticated && !target_dept) var/priority_target = href_list["job"] var/datum/job/j = SSjob.GetJob(priority_target) if(!j) @@ -570,7 +551,7 @@ 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.") + 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") @@ -641,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..a8b4608b36 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -42,12 +42,6 @@ . = ..() GLOB.shuttle_caller_list += src -/obj/machinery/computer/communications/process() - if(..()) - var/ai_autoupdate = aistate != STATE_STATUSDISPLAY && aistate != STATE_CALLSHUTTLE && aistate != STATE_PURCHASE && aistate != STATE_VIEWMESSAGE - var/machine_user_autoupdate = state != STATE_STATUSDISPLAY && state != STATE_CALLSHUTTLE && state != STATE_PURCHASE && state != STATE_VIEWMESSAGE - updateDialog(machine_user_autoupdate,ai_autoupdate) - /obj/machinery/computer/communications/Topic(href, href_list) if(..()) return @@ -70,9 +64,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)) @@ -588,8 +580,6 @@ popup.set_content(dat) popup.open() - popup.set_content(dat) - popup.open() /obj/machinery/computer/communications/proc/get_javascript_header(form_id) var/dat = {"

    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 51fd2c50d8..16262d61c3 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -320,11 +320,12 @@ M.update_inv_hands() /obj/item/melee/transforming/energy/sword/cx/AltClick(mob/living/user) + . = ..() if(!in_range(src, user)) //Basic checks to prevent abuse return if(user.incapacitated() || !istype(user)) to_chat(user, "You can't do that right now!") - return + return TRUE if(alert("Are you sure you want to recolor your blade?", "Confirm Repaint", "Yes", "No") == "Yes") var/energy_color_input = input(usr,"","Choose Energy Color",light_color) as color|null @@ -332,10 +333,11 @@ light_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1) update_icon() update_light() + return TRUE /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 7eb35ed06b..5bccf91868 100644 --- a/code/game/objects/items/melee/transforming.dm +++ b/code/game/objects/items/melee/transforming.dm @@ -23,8 +23,8 @@ else if(attack_verb_off.len) attack_verb = attack_verb_off - if(get_sharpness()) - AddComponent(/datum/component/butchering, 50, 100, 0, hitsound, !active) + if(sharpness) + AddComponent(/datum/component/butchering, 50, 100, 0, hitsound) /obj/item/melee/transforming/attack_self(mob/living/carbon/user) if(transform_weapon(user)) @@ -65,13 +65,6 @@ icon_state = initial(icon_state) w_class = initial(w_class) total_mass = initial(total_mass) - if(get_sharpness()) - var/datum/component/butchering/BT = LoadComponent(/datum/component/butchering) - BT.butchering_enabled = TRUE - else - var/datum/component/butchering/BT = GetComponent(/datum/component/butchering) - if(BT) - BT.butchering_enabled = FALSE transform_messages(user, supress_message_text) add_fingerprint(user) return TRUE 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..5af9c70d9b 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) @@ -70,6 +70,7 @@ update_icon() /obj/item/pet_carrier/AltClick(mob/living/user) + . = ..() if(open || !user.canUseTopic(src, BE_CLOSE)) return locked = !locked @@ -79,6 +80,7 @@ else playsound(user, 'sound/machines/boltsup.ogg', 30, TRUE) update_icon() + return TRUE /obj/item/pet_carrier/attack(mob/living/target, mob/living/user) if(user.a_intent == INTENT_HARM) @@ -151,12 +153,13 @@ add_overlay("[locked ? "" : "un"]locked") /obj/item/pet_carrier/MouseDrop(atom/over_atom) - . = ..() if(isopenturf(over_atom) && usr.canUseTopic(src, BE_CLOSE, ismonkey(usr)) && usr.Adjacent(over_atom) && open && occupants.len) usr.visible_message("[usr] unloads [src].", \ "You unload [src] onto [over_atom].") for(var/V in occupants) remove_occupant(V, over_atom) + else + return ..() /obj/item/pet_carrier/proc/load_occupant(mob/living/user, mob/living/target) if(pet_carrier_full(src)) diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index cece0068b8..705dcad6c6 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -113,8 +113,10 @@ return log_game("[key_name(user)] activated a hidden grenade in [src].") grenade.preprime(user, msg = FALSE, volume = 10) + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plushpet", /datum/mood_event/plushpet) else to_chat(user, "You try to pet [src], but it has no stuffing. Aww...") + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plush_nostuffing", /datum/mood_event/plush_nostuffing) /obj/item/toy/plush/attackby(obj/item/I, mob/living/user, params) if(I.get_sharpness()) @@ -125,6 +127,7 @@ user.visible_message("[user] tears out the stuffing from [src]!", "You rip a bunch of the stuffing from [src]. Murderer.") I.play_tool_sound(src) stuffed = FALSE + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plushjack", /datum/mood_event/plushjack) else to_chat(user, "You remove the grenade from [src].") user.put_in_hands(grenade) @@ -147,6 +150,7 @@ return if(istype(I, /obj/item/toy/plush)) love(I, user) + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plushplay", /datum/mood_event/plushplay) return return ..() @@ -158,7 +162,7 @@ //we are not catholic if(young == TRUE || Kisser.young == TRUE) - user.show_message("[src] plays tag with [Kisser].", 1, + user.show_message("[src] plays tag with [Kisser].", MSG_VISUAL, "They're happy.", 0) Kisser.cheer_up() cheer_up() @@ -166,10 +170,10 @@ //never again else if(Kisser in scorned) //message, visible, alternate message, neither visible nor audible - user.show_message("[src] rejects the advances of [Kisser]!", 1, + user.show_message("[src] rejects the advances of [Kisser]!", MSG_VISUAL, "That didn't feel like it worked.", 0) else if(src in Kisser.scorned) - user.show_message("[Kisser] realises who [src] is and turns away.", 1, + user.show_message("[Kisser] realises who [src] is and turns away.", MSG_VISUAL, "That didn't feel like it worked.", 0) //first comes love @@ -190,7 +194,7 @@ new_lover(Kisser) Kisser.new_lover(src) else - user.show_message("[src] rejects the advances of [Kisser], maybe next time?", 1, + user.show_message("[src] rejects the advances of [Kisser], maybe next time?", MSG_VISUAL, "That didn't feel like it worked, this time.", 0) //then comes marriage @@ -996,12 +1000,12 @@ 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." @@ -1014,3 +1018,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/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index c9fc59a3fe..53209fac2f 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -39,6 +39,9 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ /obj/item/stack/sheet/glass/fifty amount = 50 +/obj/item/stack/sheet/glass/five + amount = 5 + /obj/item/stack/sheet/glass/Initialize(mapload, new_amount, merge = TRUE) recipes = GLOB.glass_recipes return ..() diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 96546d6eb6..63ebd24b16 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -55,6 +55,9 @@ GLOBAL_LIST_INIT(sandstone_recipes, list ( \ /obj/item/stack/sheet/mineral/sandstone/thirty amount = 30 +/obj/item/stack/sheet/mineral/sandstone/twelve + amount = 12 + /* * Sandbags */ diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index c085306892..33a895cad7 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), @@ -588,6 +620,7 @@ GLOBAL_LIST_INIT(plastic_recipes, list( new /datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 5, one_per_turf = TRUE, on_floor = TRUE, time = 40), \ new /datum/stack_recipe("water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/empty), \ new /datum/stack_recipe("large water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/large/empty,3), \ + new /datum/stack_recipe("large trash cart", /obj/structure/closet/crate/bin,50),\ new /datum/stack_recipe("wet floor sign", /obj/item/caution, 2))) /obj/item/stack/sheet/plastic @@ -649,6 +682,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..e8bd50f19b 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) @@ -350,6 +350,7 @@ . = ..() /obj/item/stack/AltClick(mob/living/user) + . = ..() if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return if(is_cyborg) @@ -363,10 +364,11 @@ max = get_amount() stackmaterial = min(max, stackmaterial) if(stackmaterial == null || stackmaterial <= 0 || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) - return + return TRUE else change_stack(user, stackmaterial) to_chat(user, "You take [stackmaterial] sheets out of the stack") + return TRUE /obj/item/stack/proc/change_stack(mob/user, amount) if(!use(amount, TRUE, FALSE)) diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 847e1b521e..18acb5e14d 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -73,6 +73,64 @@ 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 + color = "#33CCFF" + +/obj/item/stack/tile/fairygrass/white + name = "white fairygrass tile" + singular_name = "white fairygrass floor tile" + desc = "A patch of odd, glowing white grass." + turf_type = /turf/open/floor/grass/fairy/white + color = "#FFFFFF" + +/obj/item/stack/tile/fairygrass/red + name = "red fairygrass tile" + singular_name = "red fairygrass floor tile" + desc = "A patch of odd, glowing red grass." + turf_type = /turf/open/floor/grass/fairy/red + color = "#FF3333" + +/obj/item/stack/tile/fairygrass/yellow + name = "yellow fairygrass tile" + singular_name = "yellow fairygrass floor tile" + desc = "A patch of odd, glowing yellow grass." + turf_type = /turf/open/floor/grass/fairy/yellow + color = "#FFFF66" + +/obj/item/stack/tile/fairygrass/green + name = "green fairygrass tile" + singular_name = "green fairygrass floor tile" + desc = "A patch of odd, glowing green grass." + turf_type = /turf/open/floor/grass/fairy/green + color = "#99FF99" + +/obj/item/stack/tile/fairygrass/blue + name = "blue fairygrass tile" + singular_name = "blue fairygrass floor tile" + desc = "A patch of odd, glowing blue grass." + turf_type = /turf/open/floor/grass/fairy/blue + +/obj/item/stack/tile/fairygrass/purple + name = "purple fairygrass tile" + singular_name = "purple fairygrass floor tile" + desc = "A patch of odd, glowing purple grass." + turf_type = /turf/open/floor/grass/fairy/purple + color = "#D966FF" + +/obj/item/stack/tile/fairygrass/pink + name = "pink fairygrass tile" + singular_name = "pink fairygrass floor tile" + desc = "A patch of odd, glowing pink grass." + turf_type = /turf/open/floor/grass/fairy/pink + color = "#FFB3DA" //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..15db8e2ebd 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) @@ -253,7 +253,7 @@ /obj/item/storage/backpack/satchel/bone name = "bone satchel" - desc = "A bone satchel fashend with watcher wings and large bones from goliath. Can be worn on the belt." + desc = "A grotesque satchel made of sinews and bones." icon = 'icons/obj/mining.dmi' icon_state = "goliath_saddle" slot_flags = ITEM_SLOT_BACK diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 713dbe4133..3a4579d3f8 100755 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -575,7 +575,9 @@ /obj/item/clothing/gloves, /obj/item/melee/flyswatter, /obj/item/paint/paint_remover, - /obj/item/assembly/mousetrap + /obj/item/assembly/mousetrap, + /obj/item/screwdriver, + /obj/item/stack/cable_coil )) /obj/item/storage/belt/bandolier @@ -755,22 +757,12 @@ STR.rustle_sound = FALSE STR.max_w_class = WEIGHT_CLASS_BULKY STR.can_hold = typecacheof(fitting_swords) + STR.quickdraw = TRUE /obj/item/storage/belt/sabre/examine(mob/user) - ..() + . = ..() if(length(contents)) - to_chat(user, "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))) - return - if(length(contents)) - var/obj/item/I = contents[1] - user.visible_message("[user] takes [I] out of [src].", "You take [I] out of [src].") - user.put_in_hands(I) - update_icon() - else - to_chat(user, "[src] is empty.") + . += "Alt-click it to quickly draw the blade." /obj/item/storage/belt/sabre/update_icon() . = ..() diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index e053ff2a5c..e214db3c71 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -105,25 +105,37 @@ // Ordinary survival box /obj/item/storage/box/survival/PopulateContents() new /obj/item/clothing/mask/breath(src) - new /obj/item/tank/internals/emergency_oxygen(src) new /obj/item/reagent_containers/hypospray/medipen(src) + if(!isplasmaman(loc)) + new /obj/item/tank/internals/emergency_oxygen(src) + else + new /obj/item/tank/internals/plasmaman/belt(src) + /obj/item/storage/box/survival/radio/PopulateContents() ..() // we want the survival stuff too. new /obj/item/radio/off(src) /obj/item/storage/box/survival_mining/PopulateContents() new /obj/item/clothing/mask/gas/explorer(src) - new /obj/item/tank/internals/emergency_oxygen/engi(src) new /obj/item/crowbar/red(src) new /obj/item/reagent_containers/hypospray/medipen(src) + if(!isplasmaman(loc)) + new /obj/item/tank/internals/emergency_oxygen(src) + else + new /obj/item/tank/internals/plasmaman/belt(src) + // Engineer survival box /obj/item/storage/box/engineer/PopulateContents() new /obj/item/clothing/mask/breath(src) - new /obj/item/tank/internals/emergency_oxygen/engi(src) new /obj/item/reagent_containers/hypospray/medipen(src) + if(!isplasmaman(loc)) + new /obj/item/tank/internals/emergency_oxygen/engi(src) + else + new /obj/item/tank/internals/plasmaman/belt(src) + /obj/item/storage/box/engineer/radio/PopulateContents() ..() // we want the regular items too. new /obj/item/radio/off(src) @@ -131,14 +143,22 @@ // Syndie survival box /obj/item/storage/box/syndie/PopulateContents() new /obj/item/clothing/mask/gas/syndicate(src) - new /obj/item/tank/internals/emergency_oxygen/engi(src) + + if(!isplasmaman(loc)) + new /obj/item/tank/internals/emergency_oxygen/engi(src) + else + new /obj/item/tank/internals/plasmaman/belt(src) // Security survival box /obj/item/storage/box/security/PopulateContents() new /obj/item/clothing/mask/gas/sechailer(src) - new /obj/item/tank/internals/emergency_oxygen(src) new /obj/item/reagent_containers/hypospray/medipen(src) + if(!isplasmaman(loc)) + new /obj/item/tank/internals/emergency_oxygen(src) + else + new /obj/item/tank/internals/plasmaman/belt(src) + /obj/item/storage/box/security/radio/PopulateContents() ..() // we want the regular stuff too new /obj/item/radio/off(src) @@ -679,6 +699,7 @@ user.changeNext_move(CLICK_CD_MELEE) playsound(loc, "rustle", 50, 1, -5) user.visible_message("[user] hugs \the [src].","You hug \the [src].") + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"hugbox", /datum/mood_event/hugbox) /////clown box & honkbot assembly /obj/item/storage/box/clown @@ -707,11 +728,16 @@ new /obj/item/stack/medical/ointment(src) new /obj/item/reagent_containers/hypospray/medipen(src) +// Clown survival box /obj/item/storage/box/hug/survival/PopulateContents() new /obj/item/clothing/mask/breath(src) - new /obj/item/tank/internals/emergency_oxygen(src) new /obj/item/reagent_containers/hypospray/medipen(src) + if(!isplasmaman(loc)) + new /obj/item/tank/internals/emergency_oxygen(src) + else + new /obj/item/tank/internals/plasmaman/belt(src) + /obj/item/storage/box/rubbershot name = "box of rubber shots" desc = "A box full of rubber shots, designed for riot shotguns." @@ -858,12 +884,12 @@ else if(W.get_sharpness()) if(!contents.len) if(item_state == "paperbag_None") - user.show_message("You cut eyeholes into [src].", 1) + user.show_message("You cut eyeholes into [src].", MSG_VISUAL) new /obj/item/clothing/head/papersack(user.loc) qdel(src) return 0 else if(item_state == "paperbag_SmileyFace") - user.show_message("You cut eyeholes into [src] and modify the design.", 1) + user.show_message("You cut eyeholes into [src] and modify the design.", MSG_VISUAL) new /obj/item/clothing/head/papersack/smiley(user.loc) qdel(src) return 0 @@ -875,7 +901,7 @@ #undef HEART #undef SMILEY -/obj/item/storage/box/ingredients //This box is for the randomely chosen version the chef spawns with, it shouldn't actually exist. +/obj/item/storage/box/ingredients //This box is for the randomly chosen version the chef spawns with, it shouldn't actually exist. name = "ingredients box" illustration = "fruit" var/theme_name 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 44e122e4b9..f05078de81 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))) @@ -157,6 +157,7 @@ to_chat(user, "You take \a [W] out of the pack.") else to_chat(user, "There are no [icon_type]s left in the pack.") + return TRUE /obj/item/storage/fancy/cigarettes/update_icon() if(fancy_open || !contents.len) diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index 822a1d5011..0d9b86fd68 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -18,6 +18,12 @@ throw_speed = 3 throw_range = 7 var/empty = FALSE + var/list/possible_icons = list("firstaid","firstaid2","firstaid3","firstaid4") + +/obj/item/storage/firstaid/Initialize(mapload) + . = ..() + if(LAZYLEN(possible_icons)) + icon_state = pick(possible_icons) /obj/item/storage/firstaid/regular icon_state = "firstaid" @@ -56,17 +62,14 @@ /obj/item/storage/firstaid/fire name = "burn treatment kit" desc = "A specialized medical kit for when the toxins lab -spontaneously- burns down." - icon_state = "ointment" + icon_state = "burn" item_state = "firstaid-ointment" + possible_icons = list("burn","burn2","burn3","burn4") /obj/item/storage/firstaid/fire/suicide_act(mob/living/carbon/user) user.visible_message("[user] begins rubbing \the [src] against [user.p_them()]self! It looks like [user.p_theyre()] trying to start a fire!") return FIRELOSS -/obj/item/storage/firstaid/fire/Initialize(mapload) - . = ..() - icon_state = pick("ointment","firefirstaid") - /obj/item/storage/firstaid/fire/PopulateContents() if(empty) return @@ -80,17 +83,14 @@ /obj/item/storage/firstaid/toxin name = "toxin treatment kit" desc = "Used to treat toxic blood content and radiation poisoning." - icon_state = "antitoxin" + icon_state = "toxin" item_state = "firstaid-toxin" + possible_icons = list("toxin","toxin2","toxin3","toxin4") /obj/item/storage/firstaid/toxin/suicide_act(mob/living/carbon/user) user.visible_message("[user] begins licking the lead paint off \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") return TOXLOSS -/obj/item/storage/firstaid/toxin/Initialize(mapload) - . = ..() - icon_state = pick("antitoxin","antitoxfirstaid","antitoxfirstaid2","antitoxfirstaid3") - /obj/item/storage/firstaid/toxin/PopulateContents() if(empty) return @@ -103,8 +103,9 @@ /obj/item/storage/firstaid/radbgone name = "radiation treatment kit" desc = "Used to treat minor toxic blood content and major radiation poisoning." - icon_state = "antitoxin" + icon_state = "rad" item_state = "firstaid-toxin" + possible_icons = list("rad","rad2","rad3") /obj/item/storage/firstaid/radbgone/suicide_act(mob/living/carbon/user) user.visible_message("[user] begins licking the lead paint off \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") @@ -128,8 +129,9 @@ /obj/item/storage/firstaid/o2 name = "oxygen deprivation treatment kit" desc = "A box full of oxygen goodies." - icon_state = "o2" + icon_state = "oxy" item_state = "firstaid-o2" + possible_icons = list("oxy", "oxy2", "oxy3", "oxy4") /obj/item/storage/firstaid/o2/suicide_act(mob/living/carbon/user) user.visible_message("[user] begins hitting [user.p_their()] neck with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") @@ -149,6 +151,7 @@ desc = "A first aid kit for when you get toolboxed." icon_state = "brute" item_state = "firstaid-brute" + possible_icons = list("brute", "brute2", "brute3", "brute4") /obj/item/storage/firstaid/brute/suicide_act(mob/living/carbon/user) user.visible_message("[user] begins beating [user.p_them()]self over the head with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") @@ -166,7 +169,8 @@ /obj/item/storage/firstaid/tactical name = "combat medical kit" desc = "I hope you've got insurance." - icon_state = "bezerk" + icon_state = "tactical" + possible_icons = null /obj/item/storage/firstaid/tactical/ComponentInitialize() . = ..() @@ -389,3 +393,141 @@ /obj/item/organ_storage )) +//hijacking the minature first aids for hypospray boxes. <3 +/obj/item/storage/hypospraykit + name = "hypospray kit" + desc = "It's a kit containing a hypospray and specific treatment chemical-filled vials." + icon_state = "firstaid-mini" + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' + throw_speed = 3 + throw_range = 7 + var/empty = FALSE + item_state = "firstaid" + +/obj/item/storage/hypospraykit/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_items = 12 + STR.can_hold = typecacheof(list( + /obj/item/hypospray/mkii, + /obj/item/reagent_containers/glass/bottle/vial)) + +/obj/item/storage/hypospraykit/regular + icon_state = "firstaid-mini" + desc = "A hypospray kit with general use vials." + +/obj/item/storage/hypospraykit/regular/PopulateContents() + if(empty) + return + new /obj/item/hypospray/mkii/tricord(src) + new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/tricord(src) + new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/tricord(src) + +/obj/item/storage/hypospraykit/fire + name = "burn treatment hypospray kit" + desc = "A specialized hypospray kit for burn treatments. Apply with sass." + icon_state = "burn-mini" + item_state = "firstaid-ointment" + +/obj/item/storage/hypospraykit/fire/PopulateContents() + if(empty) + return + new /obj/item/hypospray/mkii/burn(src) + new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/kelotane(src) + new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/kelotane(src) + +/obj/item/storage/hypospraykit/toxin + name = "toxin treatment hypospray kit" + icon_state = "toxin-mini" + item_state = "firstaid-toxin" + +/obj/item/storage/hypospraykit/toxin/PopulateContents() + if(empty) + return + new /obj/item/hypospray/mkii/toxin(src) + new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/antitoxin(src) + new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/antitoxin(src) + +/obj/item/storage/hypospraykit/o2 + name = "oxygen deprivation hypospray kit" + icon_state = "oxy-mini" + item_state = "firstaid-o2" + +/obj/item/storage/hypospraykit/o2/PopulateContents() + if(empty) + return + new /obj/item/hypospray/mkii/oxygen(src) + new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/dexalin(src) + new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/dexalin(src) + +/obj/item/storage/hypospraykit/enlarge + name = "organomegaly trauma hypospray kit" + icon_state = "enlarge-mini" + item_state = "firstaid-brute" + +/obj/item/storage/hypospraykit/enlarge/PopulateContents() + if(empty) + return + new /obj/item/hypospray/mkii/enlarge(src) + new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/breastreduction(src) + new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/breastreduction(src) + new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/breastreduction(src) + new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/penisreduction(src) + new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/penisreduction(src) + new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/penisreduction(src) + +/obj/item/storage/hypospraykit/brute + name = "brute trauma hypospray kit" + icon_state = "brute-mini" + item_state = "firstaid-brute" + +/obj/item/storage/hypospraykit/brute/PopulateContents() + if(empty) + return + new /obj/item/hypospray/mkii/brute(src) + new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/bicaridine(src) + new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/bicaridine(src) + +/obj/item/storage/hypospraykit/tactical + name = "combat hypospray kit" + desc = "A hypospray kit best suited for combat situations." + icon_state = "tactical-mini" + +/obj/item/storage/hypospraykit/tactical/PopulateContents() + if(empty) + return + new /obj/item/defibrillator/compact/combat/loaded(src) + new /obj/item/hypospray/mkii/CMO/combat(src) + new /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/combat(src) + new /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/combat(src) + +/obj/item/storage/hypospraykit/cmo + name = "deluxe hypospray kit" + desc = "A kit containing a Deluxe hypospray and Vials." + icon_state = "tactical-mini" + +/obj/item/storage/hypospraykit/cmo/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_items = 6 + STR.can_hold = typecacheof(list( + /obj/item/hypospray/mkii, + /obj/item/reagent_containers/glass/bottle/vial)) + +/obj/item/storage/hypospraykit/cmo/PopulateContents() + if(empty) + return + new /obj/item/hypospray/mkii/CMO(src) + new /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/tricord(src) + new /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/charcoal(src) + new /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/salglu(src) + new /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/dexalin(src) + new /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/synthflesh(src) + +/obj/item/storage/box/vials + name = "box of hypovials" + +/obj/item/storage/box/vials/PopulateContents() + for(var/i in 1 to 7) + new /obj/item/reagent_containers/glass/bottle/vial/small( src ) diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm index 1607b19c2f..3d27370334 100644 --- a/code/game/objects/items/storage/lockbox.dm +++ b/code/game/objects/items/storage/lockbox.dm @@ -108,17 +108,18 @@ 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)) if(!SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED)) open = (open ? FALSE : TRUE) update_icon() - ..() + return TRUE /obj/item/storage/lockbox/medal/PopulateContents() new /obj/item/clothing/accessory/medal/gold/captain(src) 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..2dbe42c159 100644 --- a/code/game/objects/items/storage/wallets.dm +++ b/code/game/objects/items/storage/wallets.dm @@ -37,7 +37,15 @@ /obj/item/screwdriver, /obj/item/valentine, /obj/item/stamp, - /obj/item/key)) + /obj/item/key, + /obj/item/cartridge, + /obj/item/camera_film, + /obj/item/stack/ore/bluespace_crystal, + /obj/item/reagent_containers/food/snacks/grown/poppy, + /obj/item/instrument/harmonica, + /obj/item/mining_voucher, + /obj/item/suit_voucher, + /obj/item/reagent_containers/pill)) /obj/item/storage/wallet/Exited(atom/movable/AM) . = ..() @@ -68,6 +76,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..92b0036ee0 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) @@ -201,7 +201,7 @@ if(!current_location || current_area.noteleport || is_away_level(current_location.z) || !isturf(user.loc))//If turf was not found or they're on z level 2 or >7 which does not currently exist. or if user is not located on a turf to_chat(user, "\The [src] is malfunctioning.") return - user.show_message("Locked In.", 2) + user.show_message("Locked In.", MSG_AUDIBLE) var/list/obj/effect/portal/created = create_portal_pair(current_location, get_teleport_turf(get_turf(T)), src, 300, 1, null, atmos_link_override) if(!(LAZYLEN(created) == 2)) return 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 b04d96dc80..65b240c528 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -220,8 +220,8 @@ /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/get_temperature() return welding * heat @@ -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..e4b95a5073 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" @@ -119,12 +122,21 @@ user.put_in_active_hand(pryjaws) /obj/item/wirecutters/power/attack(mob/living/carbon/C, mob/user) - if(istype(C) && C.handcuffed) - user.visible_message("[user] cuts [C]'s restraints with [src]!") - qdel(C.handcuffed) - return - else - ..() + if(istype(C)) + if(C.handcuffed) + user.visible_message("[user] cuts [C]'s restraints with [src]!") + qdel(C.handcuffed) + return + else if(C.has_status_effect(STATUS_EFFECT_CHOKINGSTRAND)) + var/man = C == user ? "your" : "[C]'\s" + user.visible_message("[user] attempts to remove the durathread strand from around [man] neck.", \ + "You attempt to remove the durathread strand from around [man] neck.") + if(do_after(user, 15, null, C)) + user.visible_message("[user] succesfuly removes the durathread strand.", + "You succesfuly remove the durathread strand.") + C.remove_status_effect(STATUS_EFFECT_CHOKINGSTRAND) + return + ..() /obj/item/wirecutters/advanced name = "advanced wirecutters" 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 de5a53fd9c..08c43f0437 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -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) @@ -182,7 +182,7 @@ return src.add_fingerprint(user) if (src.bullets < 1) - user.show_message("*click*", 2) + user.show_message("*click*", MSG_AUDIBLE) playsound(src, "gun_dry_fire", 30, 1) return playsound(user, 'sound/weapons/gunshot.ogg', 100, 1) @@ -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 @@ -338,11 +338,12 @@ M.update_inv_hands() /obj/item/toy/sword/cx/AltClick(mob/living/user) + . = ..() if(!in_range(src, user)) //Basic checks to prevent abuse return if(user.incapacitated() || !istype(user)) to_chat(user, "You can't do that right now!") - return + return TRUE if(alert("Are you sure you want to recolor your blade?", "Confirm Repaint", "Yes", "No") == "Yes") var/energy_color_input = input(usr,"","Choose Energy Color",light_color) as color|null @@ -350,6 +351,7 @@ light_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1) update_icon() update_light() + return TRUE /obj/item/toy/sword/cx/worn_overlays(isinhands, icon_file) . = ..() @@ -373,8 +375,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 @@ -401,6 +403,7 @@ righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi' var/active = FALSE icon = 'icons/obj/items_and_weapons.dmi' + hitsound = 'sound/weapons/smash.ogg' attack_verb = list("robusted") /obj/item/toy/windupToolbox/attack_self(mob/user) @@ -408,13 +411,33 @@ icon_state = "his_grace_awakened" to_chat(user, "You wind up [src], it begins to rumble.") active = TRUE + playsound(src, 'sound/effects/pope_entry.ogg', 100) + Rumble() addtimer(CALLBACK(src, .proc/stopRumble), 600) else to_chat(user, "[src] is already active.") +/obj/item/toy/windupToolbox/proc/Rumble() + var/static/list/transforms + if(!transforms) + var/matrix/M1 = matrix() + var/matrix/M2 = matrix() + var/matrix/M3 = matrix() + var/matrix/M4 = matrix() + M1.Translate(-1, 0) + M2.Translate(0, 1) + M3.Translate(1, 0) + M4.Translate(0, -1) + transforms = list(M1, M2, M3, M4) + animate(src, transform=transforms[1], time=0.2, loop=-1) + animate(transform=transforms[2], time=0.1) + animate(transform=transforms[3], time=0.2) + animate(transform=transforms[4], time=0.3) + /obj/item/toy/windupToolbox/proc/stopRumble() icon_state = initial(icon_state) active = FALSE + animate(src, transform=matrix()) /* * Subtype of Double-Bladed Energy Swords @@ -994,8 +1017,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 +1243,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 +1315,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 +1539,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..dd7d46d0d7 100644 --- a/code/game/objects/items/twohanded.dm +++ b/code/game/objects/items/twohanded.dm @@ -541,6 +541,7 @@ clean_blood() /obj/item/twohanded/dualsaber/hypereutactic/AltClick(mob/living/user) + . = ..() if(!user.canUseTopic(src, BE_CLOSE, FALSE) || hacked) return if(user.incapacitated() || !istype(user)) @@ -553,6 +554,7 @@ light_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1) update_icon() update_light() + return TRUE /obj/item/twohanded/dualsaber/hypereutactic/worn_overlays(isinhands, icon_file) . = ..() @@ -566,9 +568,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 +636,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) @@ -659,6 +661,7 @@ qdel(src) /obj/item/twohanded/spear/AltClick(mob/user) + . = ..() if(user.canUseTopic(src, BE_CLOSE)) ..() if(!explosive) @@ -667,6 +670,7 @@ var/input = stripped_input(user,"What do you want your war cry to be? You will shout it when you hit someone in melee.", ,"", 50) if(input) src.war_cry = input + return TRUE /obj/item/twohanded/spear/CheckParts(list/parts_list) var/obj/item/shard/tip = locate() in parts_list 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..51386c791c 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -224,16 +224,17 @@ .["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) . = ..() if(unique_reskin && (!current_skin || always_reskinnable) && user.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) reskin_obj(user) + return TRUE /obj/proc/reskin_obj(mob/M) if(!LAZYLEN(unique_reskin)) 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..e61a17b4ec 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() . = ..() @@ -449,6 +449,9 @@ item_chair = null var/turns = 0 +/obj/structure/chair/brass/ComponentInitialize() + return //it spins with the power of ratvar, not components. + /obj/structure/chair/brass/Destroy() STOP_PROCESSING(SSfastprocess, src) . = ..() @@ -464,6 +467,7 @@ return /obj/structure/chair/brass/AltClick(mob/living/user) + . = ..() turns = 0 if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return @@ -475,6 +479,7 @@ user.visible_message("[user] stops [src]'s uncontrollable spinning.", \ "You grab [src] and stop its wild spinning.") STOP_PROCESSING(SSfastprocess, src) + return TRUE /obj/structure/chair/bronze name = "brass chair" @@ -498,7 +503,7 @@ var/mutable_appearance/armrest /obj/structure/chair/sofa/Initialize() - armrest = mutable_appearance(icon, "[icon_state]_armrest") + armrest = mutable_appearance(icon, "[icon_state]_armrest", ABOVE_MOB_LAYER) return ..() /obj/structure/chair/sofa/post_buckle_mob(mob/living/M) 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 1e1fee0bfe..82a0c4d32f 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -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 b9b08802d0..38944c0384 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -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) @@ -342,25 +342,21 @@ . = TRUE if(opened) if(istype(W, cutting_tool)) + var/welder = FALSE if(istype(W, /obj/item/weldingtool)) if(!W.tool_start_check(user, amount=0)) return - - to_chat(user, "You begin cutting \the [src] apart...") - if(W.use_tool(src, user, 40, volume=50)) - if(eigen_teleport) - to_chat(user, "The unstable nature of \the [src] makes it impossible to cut!") - return - if(!opened) - return - user.visible_message("[user] slices apart \the [src].", - "You cut \the [src] apart with \the [W].", - "You hear welding.") - deconstruct(TRUE) - return - else // for example cardboard box is cut with wirecutters - user.visible_message("[user] cut apart \the [src].", \ - "You cut \the [src] apart with \the [W].") + to_chat(user, "You begin [welder ? "slicing" : "deconstructing"] \the [src] apart...") + welder = TRUE + if(W.use_tool(src, user, 40, volume=50)) + if(eigen_teleport) + to_chat(user, "The unstable nature of \the [src] makes it impossible to [welder ? "slice" : "deconstruct"]!") + return + if(!opened) + return + user.visible_message("[user] [welder ? "slice" : "deconstruct"]s apart \the [src].", + "You [welder ? "slice" : "deconstruct"] \the [src] apart with \the [W].", + "You hear [welder ? "welding" : "rustling of screws and metal"].") deconstruct(TRUE) return if(user.transferItemToLoc(W, drop_location())) // so we put in unlit welder too @@ -526,11 +522,12 @@ to_chat(user, "You fail to break out of [src]!") /obj/structure/closet/AltClick(mob/user) - ..() + . = ..() if(!user.canUseTopic(src, be_close=TRUE) || !isturf(loc)) to_chat(user, "You can't do that right now!") - return + return TRUE togglelock(user) + return TRUE /obj/structure/closet/CtrlShiftClick(mob/living/user) if(!HAS_TRAIT(user, TRAIT_SKITTISH)) 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/gimmick.dm b/code/game/objects/structures/crates_lockers/closets/gimmick.dm index c9a2ad54ff..6548ec737c 100644 --- a/code/game/objects/structures/crates_lockers/closets/gimmick.dm +++ b/code/game/objects/structures/crates_lockers/closets/gimmick.dm @@ -4,6 +4,8 @@ icon_state = "cabinet" resistance_flags = FLAMMABLE max_integrity = 70 + material_drop = /obj/item/stack/sheet/mineral/wood + cutting_tool = /obj/item/screwdriver /obj/structure/closet/acloset name = "strange closet" 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/bar.dm b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm index f0c1495281..bfcb00f285 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm @@ -4,6 +4,8 @@ icon_state = "cabinet" resistance_flags = FLAMMABLE max_integrity = 70 + material_drop = /obj/item/stack/sheet/mineral/wood + cutting_tool = /obj/item/screwdriver /obj/structure/closet/secure_closet/bar/PopulateContents() ..() 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 f173ac0662..8da50d488f 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -34,6 +34,8 @@ 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) + new /obj/item/clothing/head/beret/ce/white(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..ead133e22b 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,8 @@ 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) + new /obj/item/clothing/head/beret/cmo/blue(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..8cf0852aaa 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm @@ -5,16 +5,23 @@ 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) +/obj/structure/closet/secure_closet/personal/check_access(obj/item/I) . = ..() if(!I || !istype(I)) return - if(registered_name == I.registered_name) + if(istype(I,/obj/item/modular_computer/tablet)) + var/obj/item/modular_computer/tablet/ourTablet = I + var/obj/item/computer_hardware/card_slot/card_slot = ourTablet.all_components[MC_CARD] + if(card_slot) + return registered_name == card_slot.stored_card.registered_name || registered_name == card_slot.stored_card2.registered_name + var/obj/item/card/id/ID = I.GetID() + if(ID && registered_name == ID.registered_name) return TRUE + return FALSE /obj/structure/closet/secure_closet/personal/PopulateContents() ..() @@ -37,11 +44,14 @@ icon_state = "cabinet" resistance_flags = FLAMMABLE max_integrity = 70 + material_drop = /obj/item/stack/sheet/mineral/wood + cutting_tool = /obj/item/screwdriver /obj/structure/closet/secure_closet/personal/cabinet/PopulateContents() new /obj/item/storage/backpack/satchel/leather/withwallet( src ) new /obj/item/instrument/piano_synth(src) new /obj/item/radio/headset( src ) + new /obj/item/clothing/head/colour(src) /obj/structure/closet/secure_closet/personal/attackby(obj/item/W, mob/user, params) var/obj/item/card/id/I = W.GetID() 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..4e1ca9a77d 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,5 @@ 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..835be8d2fc 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -34,6 +34,8 @@ new /obj/item/gun/energy/e_gun(src) new /obj/item/door_remote/captain(src) new /obj/item/storage/photo_album/Captain(src) + new /obj/item/clothing/head/caphat/beret/white(src) + /obj/structure/closet/secure_closet/hop name = "\proper head of personnel's locker" req_access = list(ACCESS_HOP) @@ -61,6 +63,9 @@ 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) + new /obj/item/clothing/head/hopcap/beret/white(src) + /obj/structure/closet/secure_closet/hos name = "\proper head of security's locker" req_access = list(ACCESS_HOS) @@ -94,6 +99,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) @@ -118,6 +124,7 @@ new /obj/item/clothing/gloves/krav_maga/sec(src) new /obj/item/door_remote/head_of_security(src) new /obj/item/gun/ballistic/shotgun/automatic/combat/compact(src) + new /obj/item/clothing/head/beret/sec/corporatewarden(src) /obj/structure/closet/secure_closet/security name = "security officer's locker" req_access = list(ACCESS_SECURITY) @@ -154,12 +161,16 @@ ..() new /obj/item/clothing/accessory/armband/medblue(src) new /obj/item/encryptionkey/headset_med(src) + /obj/structure/closet/secure_closet/detective name = "\improper detective's cabinet" req_access = list(ACCESS_FORENSICS_LOCKERS) icon_state = "cabinet" resistance_flags = FLAMMABLE max_integrity = 70 + material_drop = /obj/item/stack/sheet/mineral/wood + cutting_tool = /obj/item/screwdriver + /obj/structure/closet/secure_closet/detective/PopulateContents() ..() new /obj/item/clothing/under/rank/det(src) 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/crates_lockers/crates/bins.dm b/code/game/objects/structures/crates_lockers/crates/bins.dm index c0ca1277d3..1580c0104e 100644 --- a/code/game/objects/structures/crates_lockers/crates/bins.dm +++ b/code/game/objects/structures/crates_lockers/crates/bins.dm @@ -4,6 +4,8 @@ icon_state = "largebins" open_sound = 'sound/effects/bin_open.ogg' close_sound = 'sound/effects/bin_close.ogg' + material_drop = /obj/item/stack/sheet/plastic + material_drop_amount = 40 anchored = TRUE horizontal = FALSE delivery_icon = null 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..d6beaa2628 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) @@ -102,9 +102,11 @@ return attack_hand(user) /obj/structure/extinguisher_cabinet/AltClick(mob/living/user) + . = ..() if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return toggle_cabinet(user) + return TRUE /obj/structure/extinguisher_cabinet/proc/toggle_cabinet(mob/user) if(opened && broken) 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..688006a6e3 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." @@ -151,6 +151,9 @@ log_admin("[key_name(new_spawn)] possessed a golem shell enslaved to [key_name(owner)].") if(ishuman(new_spawn)) var/mob/living/carbon/human/H = new_spawn + if(has_owner) + var/datum/species/golem/G = H.dna.species + G.owner = owner H.set_cloned_appearance() if(!name) if(has_owner) @@ -321,8 +324,9 @@ /datum/outfit/hotelstaff name = "Hotel Staff" - uniform = /obj/item/clothing/under/assistantformal + uniform = /obj/item/clothing/under/telegram shoes = /obj/item/clothing/shoes/laceup + head = /obj/item/clothing/head/hotel r_pocket = /obj/item/radio/off back = /obj/item/storage/backpack implants = list(/obj/item/implant/mindshield) @@ -372,7 +376,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 +426,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..1f007b6993 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 - ..() + SSvis_overlays.add_vis_overlay(src, icon, icon_state, ABOVE_MOB_LAYER, plane, dir, alpha, RESET_ALPHA) //you see mobs under it, but you hit them like they are above it + alpha = 0 /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/loom.dm b/code/game/objects/structures/loom.dm index c4e1968e59..28427469ba 100644 --- a/code/game/objects/structures/loom.dm +++ b/code/game/objects/structures/loom.dm @@ -1,5 +1,7 @@ -//Loom, turns raw cotton and durathread into their respective fabrics. +#define FABRIC_PER_SHEET 4 + +///This is a loom. It's usually made out of wood and used to weave fabric like durathread or cotton into their respective cloth types. /obj/structure/loom name = "loom" desc = "A simple device used to weave cloth and other thread-based fabrics together into usable material." @@ -8,14 +10,35 @@ density = TRUE anchored = TRUE -/obj/structure/loom/attackby(obj/item/stack/sheet/W, mob/user) - if(W.is_fabric && W.amount > 1) - user.show_message("You start weaving the [W.name] through the loom..", 1) - if(W.use_tool(src, user, W.pull_effort)) - new W.loom_result(drop_location()) - user.show_message("You weave the [W.name] into a workable fabric.", 1) - W.amount = (W.amount - 2) - if(W.amount < 1) - qdel(W) - else - user.show_message("You need a valid fabric and at least 2 of said fabric before using this.", 1) \ No newline at end of file +/obj/structure/loom/attackby(obj/item/I, mob/user) + if(weave(I, user)) + return + return ..() + +/obj/structure/loom/wrench_act(mob/living/user, obj/item/I) + ..() + default_unfasten_wrench(user, I, 5) + return TRUE + +///Handles the weaving. +/obj/structure/loom/proc/weave(obj/item/stack/sheet/S, mob/user) + if(!istype(S) || !S.is_fabric) + return FALSE + if(!anchored) + user.show_message("The loom needs to be wrenched down.", MSG_VISUAL) + return FALSE + if(S.amount < FABRIC_PER_SHEET) + user.show_message("You need at least [FABRIC_PER_SHEET] units of fabric before using this.", 1) + return FALSE + user.show_message("You start weaving \the [S.name] through the loom..", MSG_VISUAL) + if(S.use_tool(src, user, S.pull_effort)) + if(S.amount >= FABRIC_PER_SHEET) + new S.loom_result(drop_location()) + S.use(FABRIC_PER_SHEET) + user.show_message("You weave \the [S.name] into a workable fabric.", MSG_VISUAL) + return TRUE + +/obj/structure/loom/unanchored + anchored = FALSE + +#undef FABRIC_PER_SHEET \ No newline at end of file diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index b15d686b7b..a7f751e63c 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -226,9 +226,13 @@ if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) return if(new_eye_color) - H.eye_color = sanitize_hexcolor(new_eye_color) + var/n_color = sanitize_hexcolor(new_eye_color) + var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) + if(eyes) + eyes.eye_color = n_color + H.eye_color = n_color H.dna.update_ui_block(DNA_EYE_COLOR_BLOCK) - H.update_body() + H.dna.species.handle_body() if(choice) curse(user) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index e7be30520e..cdd4cb5a31 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -163,15 +163,16 @@ 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) - ..() + . = ..() if(!user.canUseTopic(src, !issilicon(user))) return beeper = !beeper to_chat(user, "You turn the speaker function [beeper ? "on" : "off"].") + return TRUE /obj/structure/bodycontainer/morgue/update_icon() if (!connected || connected.loc != src) // Open or tray is gone. @@ -192,7 +193,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an icon_state = "morgue4" // Cloneable if(mob_occupant.stat == DEAD && beeper) if(world.time > next_beep) - playsound(src, 'sound/weapons/smg_empty_alarm.ogg', 50, 0) //Clone them you blind fucks + playsound(src, 'sound/machines/beeping_alarm.ogg', 50, 0) //Clone them you blind fucks next_beep = world.time + beep_cooldown break 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..cde60e15c1 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) @@ -167,10 +167,12 @@ return TRUE /obj/structure/reflector/AltClick(mob/user) + . = ..() if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return else if(finished) rotate(user) + return TRUE //TYPES OF REFLECTORS, SINGLE, DOUBLE, BOX 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/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/transit_tubes/transit_tube_construction.dm b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm index fb5988f72a..08f16554bc 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm @@ -15,6 +15,15 @@ var/flipped_build_type var/base_icon +/obj/structure/c_transit_tube/proc/can_wrench_in_loc(mob/user) + var/turf/source_turf = get_turf(loc) + var/existing_tubes = 0 + for(var/obj/structure/transit_tube/tube in source_turf) + existing_tubes++ + if(existing_tubes >= 2) + to_chat(user, "You cannot wrench any more transit tubes!") + return FALSE + return TRUE /obj/structure/c_transit_tube/ComponentInitialize() . = ..() @@ -32,9 +41,11 @@ icon_state = "[base_icon][flipped]" /obj/structure/c_transit_tube/wrench_act(mob/living/user, obj/item/I) + if(!can_wrench_in_loc(user)) + return to_chat(user, "You start attaching the [name]...") add_fingerprint(user) - if(I.use_tool(src, user, time_to_unwrench, volume=50)) + if(I.use_tool(src, user, time_to_unwrench, volume=50, extra_checks=CALLBACK(src, .proc/can_wrench_in_loc, user))) to_chat(user, "You attach the [name].") var/obj/structure/transit_tube/R = new build_type(loc, dir) transfer_fingerprints_to(R) 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 794776cfa5..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) . = ..() diff --git a/code/game/say.dm b/code/game/say.dm index 4ce1d3c710..3bfd11bac0 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -28,19 +28,21 @@ GLOBAL_LIST_INIT(freqtospan, list( language = get_default_language() 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) +/atom/movable/proc/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source) + SEND_SIGNAL(src, COMSIG_MOVABLE_HEAR, args) /atom/movable/proc/can_speak() return 1 -/atom/movable/proc/send_speech(message, range = 7, obj/source = src, bubble_type, list/spans, datum/language/message_language = null, message_mode) - var/rendered = compose_message(src, message_language, message, , spans, message_mode) +/atom/movable/proc/send_speech(message, range = 7, atom/movable/source = src, bubble_type, list/spans, datum/language/message_language = null, message_mode) + var/rendered = compose_message(src, message_language, message, , spans, message_mode, source) for(var/_AM in get_hearers_in_view(range, source)) var/atom/movable/AM = _AM - AM.Hear(rendered, src, message_language, message, , spans, message_mode) + AM.Hear(rendered, src, message_language, message, , spans, message_mode, source) -/atom/movable/proc/compose_message(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode, face_name = FALSE) +/atom/movable/proc/compose_message(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode, face_name = FALSE, atom/movable/source) + if(!source) + source = speaker //This proc uses text() because it is faster than appending strings. Thanks BYOND. //Basic span var/spanpart1 = "" 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..82f1a88253 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,56 @@ 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" + color = "#33CCFF" + +/turf/open/floor/grass/fairy/white + name = "white fairygrass patch" + light_color = "#FFFFFF" + color = "#FFFFFF" + floor_tile = /obj/item/stack/tile/fairygrass/white + +/turf/open/floor/grass/fairy/red + name = "red fairygrass patch" + light_color = "#FF3333" + color = "#FF3333" + floor_tile = /obj/item/stack/tile/fairygrass/red + +/turf/open/floor/grass/fairy/yellow + name = "yellow fairygrass patch" + light_color = "#FFFF66" + color = "#FFFF66" + floor_tile = /obj/item/stack/tile/fairygrass/yellow + +/turf/open/floor/grass/fairy/green + name = "green fairygrass patch" + light_color = "#99FF99" + color = "#99FF99" + floor_tile = /obj/item/stack/tile/fairygrass/green + +/turf/open/floor/grass/fairy/blue + name = "blue fairygrass patch" + floor_tile = /obj/item/stack/tile/fairygrass/blue + +/turf/open/floor/grass/fairy/purple + name = "purple fairygrass patch" + light_color = "#D966FF" + color = "#D966FF" + floor_tile = /obj/item/stack/tile/fairygrass/purple + +/turf/open/floor/grass/fairy/pink + name = "pink fairygrass patch" + light_color = "#FFB3DA" + color = "#FFB3DA" + floor_tile = /obj/item/stack/tile/fairygrass/pink + /turf/open/floor/grass/snow gender = PLURAL name = "snow" @@ -105,7 +155,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 +224,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 b71fb51123..f0ac0053ce 100644 --- a/code/game/turfs/simulated/floor/mineral_floor.dm +++ b/code/game/turfs/simulated/floor/mineral_floor.dm @@ -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..aeadceb2e5 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 @@ -176,6 +176,12 @@ /turf/closed/mineral/uranium/volcanic = 35, /turf/closed/mineral/diamond/volcanic = 30, /turf/closed/mineral/gold/volcanic = 45, /turf/closed/mineral/titanium/volcanic = 45, /turf/closed/mineral/silver/volcanic = 50, /turf/closed/mineral/plasma/volcanic = 50, /turf/closed/mineral/bscrystal/volcanic = 20) +/turf/closed/mineral/random/high_chance/earth_like + icon_state = "rock_highchance_oxy" + turf_type = /turf/open/floor/plating/asteroid + baseturfs = /turf/open/floor/plating/asteroid + initial_gas_mix = OPENTURF_DEFAULT_ATMOS + defer_change = TRUE /turf/closed/mineral/random/low_chance @@ -186,6 +192,12 @@ /turf/closed/mineral/silver = 6, /turf/closed/mineral/plasma = 15, /turf/closed/mineral/iron = 40, /turf/closed/mineral/gibtonite = 2, /turf/closed/mineral/bscrystal = 1) +/turf/closed/mineral/random/low_chance/earth_like + icon_state = "rock_lowchance_oxy" + turf_type = /turf/open/floor/plating/asteroid + baseturfs = /turf/open/floor/plating/asteroid + initial_gas_mix = OPENTURF_DEFAULT_ATMOS + defer_change = TRUE /turf/closed/mineral/random/volcanic environment_type = "basalt" @@ -220,6 +232,12 @@ /turf/closed/mineral/silver/volcanic = 20, /turf/closed/mineral/plasma/volcanic = 30, /turf/closed/mineral/bscrystal/volcanic = 1, /turf/closed/mineral/gibtonite/volcanic = 2, /turf/closed/mineral/iron/volcanic = 95) +/turf/closed/mineral/random/earth_like + icon_state = "rock_oxy" + turf_type = /turf/open/floor/plating/asteroid + baseturfs = /turf/open/floor/plating/asteroid + initial_gas_mix = OPENTURF_DEFAULT_ATMOS + defer_change = TRUE /turf/closed/mineral/iron @@ -235,13 +253,20 @@ initial_gas_mix = LAVALAND_DEFAULT_ATMOS defer_change = 1 +/turf/closed/mineral/iron/earth_like + icon_state = "rock_oxy" + turf_type = /turf/open/floor/plating/asteroid + baseturfs = /turf/open/floor/plating/asteroid + initial_gas_mix = OPENTURF_DEFAULT_ATMOS + defer_change = TRUE + /turf/closed/mineral/iron/ice environment_type = "snow_cavern" icon_state = "icerock_iron" 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 @@ -258,6 +283,13 @@ initial_gas_mix = LAVALAND_DEFAULT_ATMOS defer_change = 1 +/turf/closed/mineral/uranium/earth_like + icon_state = "rock_oxy" + turf_type = /turf/open/floor/plating/asteroid + baseturfs = /turf/open/floor/plating/asteroid + initial_gas_mix = OPENTURF_DEFAULT_ATMOS + defer_change = TRUE + /turf/closed/mineral/diamond mineralType = /obj/item/stack/ore/diamond @@ -272,13 +304,20 @@ initial_gas_mix = LAVALAND_DEFAULT_ATMOS defer_change = 1 +/turf/closed/mineral/diamond/earth_like + icon_state = "rock_oxy" + turf_type = /turf/open/floor/plating/asteroid + baseturfs = /turf/open/floor/plating/asteroid + initial_gas_mix = OPENTURF_DEFAULT_ATMOS + defer_change = TRUE + /turf/closed/mineral/diamond/ice environment_type = "snow_cavern" icon_state = "icerock_diamond" 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 @@ -295,6 +334,13 @@ initial_gas_mix = LAVALAND_DEFAULT_ATMOS defer_change = 1 +/turf/closed/mineral/gold/earth_like + icon_state = "rock_oxy" + turf_type = /turf/open/floor/plating/asteroid + baseturfs = /turf/open/floor/plating/asteroid + initial_gas_mix = OPENTURF_DEFAULT_ATMOS + defer_change = TRUE + /turf/closed/mineral/silver mineralType = /obj/item/stack/ore/silver @@ -309,6 +355,13 @@ initial_gas_mix = LAVALAND_DEFAULT_ATMOS defer_change = 1 +/turf/closed/mineral/silver/earth_like + icon_state = "rock_oxy" + turf_type = /turf/open/floor/plating/asteroid + baseturfs = /turf/open/floor/plating/asteroid + initial_gas_mix = OPENTURF_DEFAULT_ATMOS + defer_change = TRUE + /turf/closed/mineral/titanium mineralType = /obj/item/stack/ore/titanium @@ -323,6 +376,13 @@ initial_gas_mix = LAVALAND_DEFAULT_ATMOS defer_change = 1 +/turf/closed/mineral/titanium/earth_like + icon_state = "rock_oxy" + turf_type = /turf/open/floor/plating/asteroid + baseturfs = /turf/open/floor/plating/asteroid + initial_gas_mix = OPENTURF_DEFAULT_ATMOS + defer_change = TRUE + /turf/closed/mineral/plasma mineralType = /obj/item/stack/ore/plasma @@ -337,13 +397,20 @@ initial_gas_mix = LAVALAND_DEFAULT_ATMOS defer_change = 1 +/turf/closed/mineral/plasma/earth_like + icon_state = "rock_oxy" + turf_type = /turf/open/floor/plating/asteroid + baseturfs = /turf/open/floor/plating/asteroid + initial_gas_mix = OPENTURF_DEFAULT_ATMOS + defer_change = TRUE + /turf/closed/mineral/plasma/ice environment_type = "snow_cavern" icon_state = "icerock_plasma" 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 @@ -355,6 +422,12 @@ spread = 0 scan_state = "rock_Bananium" +/turf/closed/mineral/bananium/earth_like + icon_state = "rock_oxy" + turf_type = /turf/open/floor/plating/asteroid + baseturfs = /turf/open/floor/plating/asteroid + initial_gas_mix = OPENTURF_DEFAULT_ATMOS + defer_change = TRUE /turf/closed/mineral/bscrystal mineralType = /obj/item/stack/ore/bluespace_crystal @@ -370,6 +443,13 @@ initial_gas_mix = LAVALAND_DEFAULT_ATMOS defer_change = 1 +/turf/closed/mineral/bscrystal/earth_like + icon_state = "rock_oxy" + turf_type = /turf/open/floor/plating/asteroid + baseturfs = /turf/open/floor/plating/asteroid + initial_gas_mix = OPENTURF_DEFAULT_ATMOS + defer_change = TRUE + /turf/closed/mineral/volcanic environment_type = "basalt" @@ -383,6 +463,13 @@ baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface defer_change = 1 +/turf/closed/mineral/earth_like + icon_state = "rock_oxy" + turf_type = /turf/open/floor/plating/asteroid + baseturfs = /turf/open/floor/plating/asteroid + initial_gas_mix = OPENTURF_DEFAULT_ATMOS + defer_change = TRUE + /turf/closed/mineral/ash_rock //wall piece name = "rock" icon = 'icons/turf/mining.dmi' @@ -404,7 +491,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/reinf_walls.dm b/code/game/turfs/simulated/wall/reinf_walls.dm index 0d9bff1bdf..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) 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..f38f13e657 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 @@ -27,6 +27,8 @@ /turf/open/space/Initialize() icon_state = SPACE_ICON_STATE air = space_gas + vis_contents.Cut() //removes inherited overlays + visibilityChanged() if(flags_1 & INITIALIZED_1) stack_trace("Warning: [src]([type]) initialized multiple times!") 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..895f8c9f88 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" @@ -706,20 +720,44 @@ if(!check_rights(R_SPAWN)) return + var/turf/T = get_turf(usr) var/chosen = pick_closest_path(object) if(!chosen) return if(ispath(chosen, /turf)) - var/turf/T = get_turf(usr.loc) T.ChangeTurf(chosen) else - var/atom/A = new chosen(usr.loc) + var/atom/A = new chosen(T) A.flags_1 |= ADMIN_SPAWNED_1 log_admin("[key_name(usr)] spawned [chosen] at [AREACOORD(usr)]") SSblackbox.record_feedback("tally", "admin_verb", 1, "Spawn Atom") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/datum/admins/proc/podspawn_atom(object as text) + set category = "Debug" + set desc = "(atom path) Spawn an atom via supply drop" + set name = "Podspawn" + + if(!check_rights(R_SPAWN)) + return + + var/chosen = pick_closest_path(object) + if(!chosen) + return + var/turf/T = get_turf(usr) + + if(ispath(chosen, /turf)) + T.ChangeTurf(chosen) + else + var/obj/structure/closet/supplypod/centcompod/pod = new() + var/atom/A = new chosen(pod) + A.flags_1 |= ADMIN_SPAWNED_1 + new /obj/effect/abstract/DPtarget(T, pod) + + log_admin("[key_name(usr)] pod-spawned [chosen] at [AREACOORD(usr)]") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Podspawn Atom") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + /datum/admins/proc/spawn_cargo(object as text) set category = "Debug" set desc = "(atom path) Spawn a cargo crate" @@ -861,7 +899,7 @@ /datum/admins/proc/dynamic_mode_options(mob/user) var/dat = {"

    Dynamic Mode Options


    -
    +

    Common options

    All these options can be changed midround.

    diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 626fa7f66f..c3ffd10174 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_fun) +GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom, /datum/admins/proc/podspawn_atom, /datum/admins/proc/spawn_cargo, /datum/admins/proc/spawn_objasmob, /client/proc/respawn_character)) GLOBAL_PROTECT(admin_verbs_spawn) -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_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..702e2071bd 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) @@ -52,9 +52,11 @@ edit_emitter(user) /obj/effect/sound_emitter/AltClick(mob/user) + . = ..() if(check_rights_for(user.client, R_SOUNDS)) activate(user) to_chat(user, "Sound emitter activated.") + return TRUE /obj/effect/sound_emitter/proc/edit_emitter(mob/user) var/dat = "" 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 8b105da43b..5b751ffe30 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -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) @@ -2357,7 +2355,7 @@ var/atom/target //Where the object will be spawned var/where = href_list["object_where"] - if (!( where in list("onfloor","inhand","inmarked") )) + if (!( where in list("onfloor","frompod","inhand","inmarked") )) where = "onfloor" @@ -2368,7 +2366,7 @@ where = "onfloor" target = usr - if("onfloor") + if("onfloor", "frompod") switch(href_list["offset_type"]) if ("absolute") target = locate(0 + X,0 + Y,0 + Z) @@ -2384,7 +2382,10 @@ else target = marked_datum + var/obj/structure/closet/supplypod/centcompod/pod if(target) + if(where == "frompod") + pod = new() for (var/path in paths) for (var/i = 0; i < number; i++) if(path in typesof(/turf)) @@ -2393,7 +2394,11 @@ if(N && obj_name) N.name = obj_name else - var/atom/O = new path(target) + var/atom/O + if(where == "frompod") + O = new path(pod) + else + O = new path(target) if(!QDELETED(O)) O.flags_1 |= ADMIN_SPAWNED_1 if(obj_dir) @@ -2413,6 +2418,8 @@ R.module.add_module(I, TRUE, TRUE) R.activate_module(I) + if(pod) + new /obj/effect/abstract/DPtarget(target, pod) if (number == 1) log_admin("[key_name(usr)] created a [english_list(paths)]") 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/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index d7dd8db08d..f97822a043 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] @@ -1249,7 +1249,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits if(!check_rights(R_ADMIN) || !check_rights(R_FUN)) return - var/list/punishment_list = list(ADMIN_PUNISHMENT_PIE, ADMIN_PUNISHMENT_FIREBALL, ADMIN_PUNISHMENT_LIGHTNING, ADMIN_PUNISHMENT_BRAINDAMAGE, ADMIN_PUNISHMENT_BSA, ADMIN_PUNISHMENT_GIB, ADMIN_PUNISHMENT_SUPPLYPOD, ADMIN_PUNISHMENT_MAZING, ADMIN_PUNISHMENT_ROD) + var/list/punishment_list = list(ADMIN_PUNISHMENT_PIE, ADMIN_PUNISHMENT_FIREBALL, ADMIN_PUNISHMENT_LIGHTNING, ADMIN_PUNISHMENT_BRAINDAMAGE, ADMIN_PUNISHMENT_BSA, ADMIN_PUNISHMENT_GIB, ADMIN_PUNISHMENT_SUPPLYPOD_QUICK, ADMIN_PUNISHMENT_SUPPLYPOD, ADMIN_PUNISHMENT_MAZING, ADMIN_PUNISHMENT_ROD) var/punishment = input("Choose a punishment", "DIVINE SMITING") as null|anything in punishment_list @@ -1277,6 +1277,22 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits var/turf/startT = spaceDebrisStartLoc(startside, T.z) var/turf/endT = spaceDebrisFinishLoc(startside, T.z) new /obj/effect/immovablerod(startT, endT,target) + if(ADMIN_PUNISHMENT_SUPPLYPOD_QUICK) + var/target_path = input(usr,"Enter typepath of an atom you'd like to send with the pod (type \"empty\" to send an empty pod):" ,"Typepath","/obj/item/reagent_containers/food/snacks/grown/harebell") as null|text + var/obj/structure/closet/supplypod/centcompod/pod = new() + pod.damage = 40 + pod.explosionSize = list(0,0,0,2) + pod.effectStun = TRUE + if (isnull(target_path)) //The user pressed "Cancel" + return + if (target_path != "empty")//if you didn't type empty, we want to load the pod with a delivery + var/delivery = text2path(target_path) + if(!ispath(delivery)) + delivery = pick_closest_path(target_path) + if(!delivery) + alert("ERROR: Incorrect / improper path given.") + new delivery(pod) + new /obj/effect/abstract/DPtarget(get_turf(target), pod) if(ADMIN_PUNISHMENT_SUPPLYPOD) var/datum/centcom_podlauncher/plaunch = new(usr) if(!holder) @@ -1289,6 +1305,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits plaunch.temp_pod.explosionSize = list(0,0,0,2) plaunch.temp_pod.effectStun = TRUE plaunch.ui_interact(usr) + return //We return here because punish_log() is handled by the centcom_podlauncher datum if(ADMIN_PUNISHMENT_MAZING) if(!puzzle_imprison(target)) @@ -1298,11 +1315,13 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits var/obj/item/reagent_containers/food/snacks/pie/cream/nostun/creamy = new(get_turf(target)) creamy.splat(target) - var/msg = "[key_name_admin(usr)] punished [key_name_admin(target)] with [punishment]." - message_admins(msg) - admin_ticket_log(target, msg) - log_admin("[key_name(usr)] punished [key_name(target)] with [punishment].") + punish_log(target, punishment) +/client/proc/punish_log(var/whom, var/punishment) + var/msg = "[key_name_admin(usr)] punished [key_name_admin(whom)] with [punishment]." + message_admins(msg) + admin_ticket_log(whom, msg) + log_admin("[key_name(usr)] punished [key_name(whom)] with [punishment].") /client/proc/trigger_centcom_recall() if(!check_rights(R_ADMIN)) 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_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/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..953b876b35 100644 --- a/code/modules/antagonists/blob/blob/theblob.dm +++ b/code/modules/antagonists/blob/blob/theblob.dm @@ -243,18 +243,21 @@ else return ..() -/obj/structure/blob/proc/chemeffectreport(mob/user) +/obj/structure/blob/proc/chemeffectreport() + RETURN_TYPE(/list) + . = 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() + RETURN_TYPE(/list) + . = 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 +313,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/changeling/powers/headcrab.dm b/code/modules/antagonists/changeling/powers/headcrab.dm index 72d8a127ab..1e06fb39de 100644 --- a/code/modules/antagonists/changeling/powers/headcrab.dm +++ b/code/modules/antagonists/changeling/powers/headcrab.dm @@ -25,7 +25,8 @@ to_chat(H, "You are blinded by a shower of blood!") H.Stun(20) H.blur_eyes(20) - H.adjust_eye_damage(5) + var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) + eyes?.applyOrganDamage(5) H.confused += 3 for(var/mob/living/silicon/S in range(2,user)) to_chat(S, "Your sensors are disabled by a shower of blood!") 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 b5a218131b..0125dc7cf5 100644 --- a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm +++ b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm @@ -196,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)) @@ -279,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..d4d5349c70 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) @@ -162,9 +162,11 @@ access_display(user) /obj/item/clockwork/slab/AltClick(mob/living/user) + . = ..() if(is_servant_of_ratvar(user) && linking && user.canUseTopic(src, BE_CLOSE, ismonkey(user))) linking = null to_chat(user, "Object link canceled.") + return TRUE /obj/item/clockwork/slab/proc/access_display(mob/living/user) if(!is_servant_of_ratvar(user)) 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_items/wraith_spectacles.dm b/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm index 9d241148b4..2a916c7a2f 100644 --- a/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm +++ b/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm @@ -48,10 +48,11 @@ /obj/item/clothing/glasses/wraith_spectacles/proc/blind_cultist(mob/living/victim) if(iscultist(victim)) + var/obj/item/organ/eyes/eyes = victim.getorganslot(ORGAN_SLOT_EYES) to_chat(victim, "\"It looks like Nar'Sie's dogs really don't value their eyes.\"") to_chat(victim, "Your eyes explode with horrific pain!") victim.emote("scream") - victim.become_blind(EYE_DAMAGE) + eyes?.applyOrganDamage(eyes.maxHealth) victim.adjust_blurriness(30) victim.adjust_blindness(30) return TRUE @@ -141,21 +142,23 @@ if(glasses_right && !WS.up && !GLOB.ratvar_awakens && !GLOB.ratvar_approaches) apply_eye_damage(H) else + var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) if(GLOB.ratvar_awakens) H.cure_nearsighted(list(EYE_DAMAGE)) H.cure_blind(list(EYE_DAMAGE)) - H.adjust_eye_damage(-eye_damage_done) + eyes?.applyOrganDamage(-eye_damage_done) eye_damage_done = 0 else if(prob(50) && eye_damage_done) - H.adjust_eye_damage(-1) + eyes?.applyOrganDamage(-1) eye_damage_done = max(0, eye_damage_done - 1) if(!eye_damage_done) qdel(src) /datum/status_effect/wraith_spectacles/proc/apply_eye_damage(mob/living/carbon/human/H) - if(HAS_TRAIT(H, TRAIT_BLIND)) + var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) + if(HAS_TRAIT(H, TRAIT_BLIND) || !eyes) return - H.adjust_eye_damage(0.5) + eyes.applyOrganDamage(0.5) eye_damage_done += 0.5 if(eye_damage_done >= 20) H.adjust_blurriness(2) @@ -166,7 +169,7 @@ if(eye_damage_done >= blind_breakpoint) if(!HAS_TRAIT(H, TRAIT_BLIND)) to_chat(H, "A piercing white light floods your vision. Suddenly, all goes dark!") - H.become_blind(EYE_DAMAGE) + eyes.applyOrganDamage(eyes.maxHealth) if(prob(min(20, 5 + eye_damage_done))) to_chat(H, "Your eyes continue to burn.") 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_mobs/_eminence.dm b/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm index 47faea6dc8..86099d8c79 100644 --- a/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm +++ b/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm @@ -98,7 +98,7 @@ else to_chat(M, message) -/mob/camera/eminence/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) +/mob/camera/eminence/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source) . = ..() if(is_reebe(z) || is_servant_of_ratvar(speaker) || GLOB.ratvar_approaches || GLOB.ratvar_awakens) //Away from Reebe, the Eminence can't hear anything to_chat(src, message) 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 491f1d24b3..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)) 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 35c1ea7bdd..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 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/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 9989058d43..df2383f892 100644 --- a/code/modules/antagonists/cult/cult.dm +++ b/code/modules/antagonists/cult/cult.dm @@ -128,7 +128,8 @@ current.clear_alert("bloodsense") if(ishuman(current)) var/mob/living/carbon/human/H = current - H.eye_color = initial(H.eye_color) + var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) + H.eye_color = eyes?.eye_color || initial(H.eye_color) H.dna.update_ui_block(DNA_EYE_COLOR_BLOCK) REMOVE_TRAIT(H, TRAIT_CULT_EYES, "valid_cultist") H.update_body() 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/true_devil/_true_devil.dm b/code/modules/antagonists/devil/true_devil/_true_devil.dm index df761ac183..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. 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..516f30d896 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 @@ -117,7 +117,7 @@ the new instance inside the host to be updated to the template's stats. follow_next(Dir & NORTHWEST) last_move_tick = world.time -/mob/camera/disease/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) +/mob/camera/disease/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source) . = ..() var/atom/movable/to_follow = speaker if(radio_freq) @@ -129,7 +129,7 @@ the new instance inside the host to be updated to the template's stats. else link = "" // Recompose the message, because it's scrambled by default - message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode) + message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode, FALSE, source) to_chat(src, "[link] [message]") 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/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 d0e6dafbc1..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" @@ -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/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_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm index 17d200a685..d6582a294f 100644 --- a/code/modules/antagonists/revenant/revenant_abilities.dm +++ b/code/modules/antagonists/revenant/revenant_abilities.dm @@ -5,7 +5,7 @@ ShiftClickOn(A) return if(modifiers["alt"]) - AltClickNoInteract(src, A) + altclick_listed_turf(A) return if(ishuman(A)) 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 fef7061488..c4190d8cd9 100644 --- a/code/modules/antagonists/revolution/revolution.dm +++ b/code/modules/antagonists/revolution/revolution.dm @@ -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() @@ -296,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() @@ -318,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/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/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/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 b05750305a..caf2f644df 100644 --- a/code/modules/antagonists/traitor/IAA/internal_affairs.dm +++ b/code/modules/antagonists/traitor/IAA/internal_affairs.dm @@ -223,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 5dfc08b6cf..ac19df3631 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -48,12 +48,17 @@ A.verbs -= /mob/living/silicon/ai/proc/choose_modules A.malf_picker.remove_malf_verbs(A) qdel(A.malf_picker) - 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/handle_hearing(datum/source, list/hearing_args) + var/message = hearing_args[HEARING_RAW_MESSAGE] + message = GLOB.syndicate_code_phrase_regex.Replace(message, "$1") + message = GLOB.syndicate_code_response_regex.Replace(message, "$1") + hearing_args[HEARING_RAW_MESSAGE] = message /datum/antagonist/traitor/proc/add_objective(datum/objective/O) objectives += O @@ -70,7 +75,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 @@ -91,6 +106,10 @@ 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 @@ -104,6 +123,10 @@ 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 @@ -139,7 +162,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 @@ -226,16 +260,20 @@ /datum/antagonist/traitor/apply_innate_effects(mob/living/mob_override) . = ..() update_traitor_icons_added() - var/mob/living/silicon/ai/A = mob_override || owner.current - if(istype(A) && traitor_kind == TRAITOR_AI) + var/mob/M = mob_override || owner.current + if(isAI(M) && traitor_kind == TRAITOR_AI) + var/mob/living/silicon/ai/A = M A.hack_software = TRUE + RegisterSignal(M, COMSIG_MOVABLE_HEAR, .proc/handle_hearing) /datum/antagonist/traitor/remove_innate_effects(mob/living/mob_override) . = ..() update_traitor_icons_removed() - var/mob/living/silicon/ai/A = mob_override || owner.current - if(istype(A) && traitor_kind == TRAITOR_AI) + var/mob/M = mob_override || owner.current + if(isAI(M) && traitor_kind == TRAITOR_AI) + var/mob/living/silicon/ai/A = M A.hack_software = FALSE + UnregisterSignal(M, COMSIG_MOVABLE_HEAR) /datum/antagonist/traitor/proc/give_codewords() if(!owner.current) 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/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index 38aa0ad7f5..a0dbc4d9b1 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -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..dcec31e5c2 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,14 @@ 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/plasmafist + name = "Plasma Fist" + desc = "A forbidden martial art designed on the surging power of plasma. Use it to harness the ancient power." + item_path = /obj/item/book/granter/martial/plasma_fist + cost = 3 /datum/spellbook_entry/item/guardian name = "Guardian Deck" @@ -388,6 +416,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 +435,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 +503,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 +516,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 +530,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 +554,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 +608,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 +685,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 89324f0691..9b2532c71b 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -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) 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..f72f726988 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -22,10 +22,10 @@ "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) +/obj/item/assembly/voice/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source) . = ..() if(speaker == src) return 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..196bf70fdc 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) @@ -73,11 +72,13 @@ air.copy_from(copy) /turf/return_air() + RETURN_TYPE(/datum/gas_mixture) var/datum/gas_mixture/GM = new GM.copy_from_turf(src) return GM /turf/open/return_air() + RETURN_TYPE(/datum/gas_mixture) return air /turf/temperature_expose() diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 6ca25c0d80..cbbfc05f39 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) @@ -823,11 +823,11 @@ return ..() /obj/machinery/airalarm/AltClick(mob/user) - ..() + . = ..() if(!user.canUseTopic(src, !issilicon(user)) || !isturf(loc)) return - else - togglelock(user) + togglelock(user) + return TRUE /obj/machinery/airalarm/proc/togglelock(mob/living/user) if(stat & (NOPOWER|BROKEN)) diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index 7d095869cb..ee4d1bda11 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)) @@ -338,10 +338,9 @@ Pipelines + Other Objects -> Pipe network /obj/machinery/atmospherics/AltClick(mob/living/L) - if(is_type_in_list(src, GLOB.ventcrawl_machinery)) - L.handle_ventcrawl(src) - return - ..() + if(is_type_in_typecache(src, GLOB.ventcrawl_machinery)) + return L.handle_ventcrawl(src) + return ..() /obj/machinery/atmospherics/proc/can_crawl_through() diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index 1de5b93332..c05c3bb3c9 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) @@ -44,6 +44,7 @@ Thus, the two variables affect pump operation are set in New(): return ..() /obj/machinery/atmospherics/components/binary/pump/AltClick(mob/user) + . = ..() var/area/A = get_area(src) var/turf/T = get_turf(src) if(user.canUseTopic(src, BE_CLOSE, FALSE,)) @@ -51,6 +52,7 @@ Thus, the two variables affect pump operation are set in New(): to_chat(user,"You maximize the pressure on the [src].") investigate_log("Pump, [src.name], was maximized by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS) message_admins("Pump, [src.name], was maximized by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]") + return TRUE /obj/machinery/atmospherics/components/binary/pump/layer1 piping_layer = PIPING_LAYER_MIN 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..adca444b10 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -4,7 +4,7 @@ desc = "Very useful for filtering gasses." density = FALSE can_unwrench = TRUE - var/target_pressure = ONE_ATMOSPHERE + var/transfer_rate = MAX_TRANSFER_RATE var/filter_type = null var/frequency = 0 var/datum/radio_frequency/radio_connection @@ -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 flow rate." /obj/machinery/atmospherics/components/trinary/filter/CtrlClick(mob/user) var/area/A = get_area(src) @@ -28,13 +28,15 @@ return ..() /obj/machinery/atmospherics/components/trinary/filter/AltClick(mob/user) + . = ..() var/area/A = get_area(src) var/turf/T = get_turf(src) if(user.canUseTopic(src, BE_CLOSE, FALSE,)) - target_pressure = MAX_OUTPUT_PRESSURE - to_chat(user,"You maximize the pressure on the [src].") + transfer_rate = MAX_TRANSFER_RATE + to_chat(user,"You maximize the flow rate on the [src].") investigate_log("Filter, [src.name], was maximized by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS) message_admins("Filter, [src.name], was maximized by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]") + return TRUE /obj/machinery/atmospherics/components/trinary/filter/layer1 piping_layer = PIPING_LAYER_MIN @@ -150,24 +152,19 @@ var/datum/gas_mixture/air2 = airs[2] var/datum/gas_mixture/air3 = airs[3] - var/output_starting_pressure = air3.return_pressure() + var/input_starting_pressure = air1.return_pressure() - if(output_starting_pressure >= target_pressure) - //No need to transfer if target is already full! + if((input_starting_pressure < 0.01)) return //Calculate necessary moles to transfer using PV=nRT - var/pressure_delta = target_pressure - output_starting_pressure - var/transfer_moles - - if(air1.temperature > 0) - transfer_moles = pressure_delta*air3.volume/(air1.temperature * R_IDEAL_GAS_EQUATION) + var/transfer_ratio = transfer_rate/air1.volume //Actually transfer the gas - if(transfer_moles > 0) - var/datum/gas_mixture/removed = air1.remove(transfer_moles) + if(transfer_ratio > 0) + var/datum/gas_mixture/removed = air1.remove_ratio(transfer_ratio) if(!removed) return @@ -188,10 +185,13 @@ removed.gases[filter_type] = 0 GAS_GARBAGE_COLLECT(removed.gases) - var/datum/gas_mixture/target = (air2.return_pressure() < target_pressure ? air2 : air1) //if there's no room for the filtered gas; just leave it in air1 + var/datum/gas_mixture/target = (air2.return_pressure() < 9000 ? air2 : air1) target.merge(filtered_out) - air3.merge(removed) + if(air3.return_pressure() <= 9000) + air3.merge(removed) + else + air1.merge(removed) // essentially just leaving it in update_parents() @@ -209,8 +209,8 @@ /obj/machinery/atmospherics/components/trinary/filter/ui_data() var/data = list() data["on"] = on - data["pressure"] = round(target_pressure) - data["max_pressure"] = round(MAX_OUTPUT_PRESSURE) + data["rate"] = round(transfer_rate) + data["max_rate"] = round(MAX_TRANSFER_RATE) data["filter_types"] = list() data["filter_types"] += list(list("name" = "Nothing", "path" = "", "selected" = !filter_type)) @@ -227,21 +227,21 @@ on = !on investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", INVESTIGATE_ATMOS) . = TRUE - if("pressure") - var/pressure = params["pressure"] - if(pressure == "max") - pressure = MAX_OUTPUT_PRESSURE + if("rate") + var/rate = params["rate"] + if(rate == "max") + rate = MAX_TRANSFER_RATE . = TRUE - else if(pressure == "input") - pressure = input("New output pressure (0-[MAX_OUTPUT_PRESSURE] kPa):", name, target_pressure) as num|null - if(!isnull(pressure) && !..()) + else if(rate == "input") + rate = input("New transfer rate (0-[MAX_TRANSFER_RATE] L/s):", name, transfer_rate) as num|null + if(!isnull(rate) && !..()) . = TRUE - else if(text2num(pressure) != null) - pressure = text2num(pressure) + else if(text2num(rate) != null) + rate = text2num(rate) . = TRUE if(.) - target_pressure = CLAMP(pressure, 0, MAX_OUTPUT_PRESSURE) - investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS) + transfer_rate = CLAMP(rate, 0, MAX_TRANSFER_RATE) + investigate_log("was set to [transfer_rate] L/s by [key_name(usr)]", INVESTIGATE_ATMOS) if("filter") filter_type = null var/filter_name = "nothing" diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm index fc866c3d6a..9646b78321 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) @@ -30,6 +30,7 @@ return ..() /obj/machinery/atmospherics/components/trinary/mixer/AltClick(mob/user) + . = ..() var/area/A = get_area(src) var/turf/T = get_turf(src) if(user.canUseTopic(src, BE_CLOSE, FALSE,)) @@ -37,6 +38,7 @@ to_chat(user,"You maximize the pressure on the [src].") investigate_log("Mixer, [src.name], was maximized by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS) message_admins("Mixer, [src.name], was maximized by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]") + return TRUE //node 3 is the outlet, nodes 1 & 2 are intakes /obj/machinery/atmospherics/components/trinary/mixer/layer1 diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index ccd13d8d4a..0a54503be5 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()) @@ -401,13 +399,14 @@ return ..() /obj/machinery/atmospherics/components/unary/cryo_cell/AltClick(mob/user) + . = ..() if(user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) if(state_open) close_machine() else open_machine() update_icon() - return ..() + return TRUE /obj/machinery/atmospherics/components/unary/cryo_cell/update_remote_sight(mob/living/user) return // we don't see the pipe network while inside cryo. diff --git a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm index 4f16406456..4dd2216b19 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm @@ -36,6 +36,10 @@ icon_state = "red" gas_type = /datum/gas/nitrogen +/obj/machinery/atmospherics/components/unary/tank/nitrous_oxide + icon_state = "red_white" + gas_type = /datum/gas/nitrous_oxide + /obj/machinery/atmospherics/components/unary/tank/air icon_state = "grey" name = "pressure tank (Air)" diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm index b52dc158e4..2e06e68709 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm @@ -210,13 +210,15 @@ min_temperature = max(T0C - (initial(min_temperature) + L * 15), TCMB) //73.15K with T1 stock parts /obj/machinery/atmospherics/components/unary/thermomachine/freezer/AltClick(mob/living/user) + . = ..() var/area/A = get_area(src) var/turf/T = get_turf(src) if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) return - target_temperature = min_temperature + target_temperature = min_temperature investigate_log("was set to [target_temperature] K by [key_name(usr)]", INVESTIGATE_ATMOS) message_admins("[src.name] was minimized by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]") + return TRUE /obj/machinery/atmospherics/components/unary/thermomachine/heater name = "heater" @@ -240,6 +242,7 @@ max_temperature = T20C + (initial(max_temperature) * L) //573.15K with T1 stock parts /obj/machinery/atmospherics/components/unary/thermomachine/heater/AltClick(mob/living/user) + . = ..() var/area/A = get_area(src) var/turf/T = get_turf(src) if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) @@ -247,3 +250,4 @@ target_temperature = max_temperature investigate_log("was set to [target_temperature] K by [key_name(usr)]", INVESTIGATE_ATMOS) message_admins("[src.name] was maximized by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]") + return TRUE 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..b47b6b42c1 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -81,17 +81,19 @@ return air_contents /obj/machinery/portable_atmospherics/AltClick(mob/living/user) + . = ..() if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, !ismonkey(user))) return if(holding) to_chat(user, "You remove [holding] from [src].") replace_tank(user, TRUE) + return 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 a0927a2578..0d5fa6bc8a 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -44,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 @@ -257,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 @@ -277,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 @@ -441,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/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..9e26cd25fc 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" //I didnt realise how much work it was to make these, you need 2 Cloth, 3 Leather, Tools, 10 Metal, and a Cable Coil Stack for each one. + 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 = 3000 + required_count = 2 + 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..c45461317d 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 @@ -19,7 +19,7 @@ //Variables declared to change how items in the launch bay are picked and launched. (Almost) all of these are changed in the ui_act proc //Some effect groups are choices, while other are booleans. This is because some effects can stack, while others dont (ex: you can stack explosion and quiet, but you cant stack ordered launch and random launch) /datum/centcom_podlauncher - var/static/list/ignored_atoms = typecacheof(list(null, /mob/dead, /obj/effect/landmark, /obj/docking_port, /atom/movable/lighting_object, /obj/effect/particle_effect/sparks, /obj/effect/DPtarget, /obj/effect/supplypod_selector )) + var/static/list/ignored_atoms = typecacheof(list(null, /mob/dead, /obj/effect/landmark, /obj/docking_port, /atom/movable/lighting_object, /obj/effect/particle_effect/sparks, /obj/effect/abstract/DPtarget, /obj/effect/supplypod_selector )) var/turf/oldTurf //Keeps track of where the user was at if they use the "teleport to centcom" button, so they can go back var/client/holder //client of whoever is using this datum var/area/bay //What bay we're using to launch shit from. @@ -29,11 +29,12 @@ var/damageChoice = 0 //Determines if we do no damage (0), custom amnt of damage (1), or gib + 5000dmg (2) var/launcherActivated = FALSE //check if we've entered "launch mode" (when we click a pod is launched). Used for updating mouse cursor var/effectBurst = FALSE //Effect that launches 5 at once in a 3x3 area centered on the target + var/effectAnnounce = TRUE var/numTurfs = 0 //Counts the number of turfs with things we can launch in the chosen bay (in the centcom map) 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/atom/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 @@ -66,12 +67,14 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm data["launchChoice"] = launchChoice //Launch turfs all at once (0), ordered (1), or randomly(1) data["explosionChoice"] = explosionChoice //An explosion that occurs when landing. Can be no explosion (0), custom explosion (1), or maxcap (2) data["damageChoice"] = damageChoice //Damage that occurs to any mob under the pod when it lands. Can be no damage (0), custom damage (1), or gib+5000dmg (2) + data["fallDuration"] = temp_pod.fallDuration //How long the pod's falling animation lasts 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["effectOrgans"] = temp_pod.effectOrgans //If true, yeets the organs out of any bodies caught under the pod when it lands data["effectBluespace"] = temp_pod.bluespace //If true, the pod deletes (in a shower of sparks) after landing data["effectStealth"] = temp_pod.effectStealth //If true, a target icon isnt displayed on the turf where the pod will land data["effectQuiet"] = temp_pod.effectQuiet //The female sniper. If true, the pod makes no noise (including related explosions, opening sounds, etc) @@ -81,12 +84,14 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm data["effectReverse"] = temp_pod.reversing //If true, the pod will not send any items. Instead, after opening, it will close again (picking up items/mobs) and fly back to centcom data["effectTarget"] = specificTarget //Launches the pod at the turf of a specific mob target, rather than wherever the user clicked. Useful for smites data["effectName"] = temp_pod.adminNamed //Determines whether or not the pod has been named by an admin. If true, the pod's name will not get overridden when the style of the pod changes (changing the style of the pod normally also changes the name+desc) + data["effectAnnounce"] = effectAnnounce data["giveLauncher"] = launcherActivated //If true, the user is in launch mode, and whenever they click a pod will be launched (either at their mouse position or at a specific target) data["numObjects"] = numTurfs //Counts the number of turfs that contain a launchable object in the centcom supplypod bay + data["fallingSound"] = temp_pod.fallingSound != initial(temp_pod.fallingSound)//Admin sound to play as the pod falls data["landingSound"] = temp_pod.landingSound //Admin sound to play when the pod lands data["openingSound"] = temp_pod.openingSound //Admin sound to play when the pod opens data["leavingSound"] = temp_pod.leavingSound //Admin sound to play when the pod leaves - data["soundVolume"] = temp_pod.soundVolume != 50 //Admin sound to play when the pod leaves + data["soundVolume"] = temp_pod.soundVolume != initial(temp_pod.soundVolume) //Admin sound to play when the pod leaves return data /datum/centcom_podlauncher/ui_act(action, params) @@ -150,7 +155,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() @@ -227,6 +232,9 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm if("effectLimb") //Toggle: Anyone carbon mob under the pod loses a limb when it lands temp_pod.effectLimb = !temp_pod.effectLimb . = TRUE + if("effectOrgans") //Toggle: Any carbon mob under the pod loses every limb and organ + temp_pod.effectOrgans = !temp_pod.effectOrgans + . = TRUE if("effectBluespace") //Toggle: Deletes the pod after landing temp_pod.bluespace = !temp_pod.bluespace . = TRUE @@ -245,6 +253,9 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm if("effectBurst") //Toggle: Launch 5 pods (with a very slight delay between) in a 3x3 area centered around the target effectBurst = !effectBurst . = TRUE + if("effectAnnounce") //Toggle: Sends a ghost announcement. + effectAnnounce = !effectAnnounce + . = TRUE if("effectReverse") //Toggle: Don't send any items. Instead, after landing, close (taking any objects inside) and go back to the centcom bay it came from temp_pod.reversing = !temp_pod.reversing . = TRUE @@ -261,11 +272,23 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm . = TRUE ////////////////////////////TIMER DELAYS////////////////// + if("fallDuration") //Change the falling animation duration + if (temp_pod.fallDuration != initial(temp_pod.fallDuration)) //If the fall duration has already been changed when we push the "change value" button, then set it to default + temp_pod.fallDuration = initial(temp_pod.fallDuration) + return + var/timeInput = input("Enter the duration of the pod's falling animation, in seconds", "Delay Time", initial(temp_pod.fallDuration) * 0.1) as null|num + if (isnull(timeInput)) + return + if (!isnum(timeInput)) //Sanitize input, if it doesnt check out, error and set to default + alert(usr, "That wasnt a number! Value set to default ([initial(temp_pod.fallDuration)*0.1]) instead.") + timeInput = initial(temp_pod.fallDuration) + temp_pod.fallDuration = 10 * timeInput + . = TRUE if("landingDelay") //Change the time it takes the pod to land, after firing if (temp_pod.landingDelay != initial(temp_pod.landingDelay)) //If the landing delay has already been changed when we push the "change value" button, then set it to default temp_pod.landingDelay = initial(temp_pod.landingDelay) return - var/timeInput = input("Delay Time", "Enter the time it takes for the pod to land, in seconds", 0.5) as null|num + var/timeInput = input("Enter the time it takes for the pod to land, in seconds", "Delay Time", initial(temp_pod.landingDelay) * 0.1) as null|num if (isnull(timeInput)) return if (!isnum(timeInput)) //Sanitize input, if it doesnt check out, error and set to default @@ -277,7 +300,7 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm if (temp_pod.openingDelay != initial(temp_pod.openingDelay)) //If the opening delay has already been changed when we push the "change value" button, then set it to default temp_pod.openingDelay = initial(temp_pod.openingDelay) return - var/timeInput = input("Delay Time", "Enter the time it takes for the pod to open after landing, in seconds", 3) as null|num + var/timeInput = input("Enter the time it takes for the pod to open after landing, in seconds", "Delay Time", initial(temp_pod.openingDelay) * 0.1) as null|num if (isnull(timeInput)) return if (!isnum(timeInput)) //Sanitize input @@ -289,7 +312,7 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm if (temp_pod.departureDelay != initial(temp_pod.departureDelay)) //If the departure delay has already been changed when we push the "change value" button, then set it to default temp_pod.departureDelay = initial(temp_pod.departureDelay) return - var/timeInput = input("Delay Time", "Enter the time it takes for the pod to leave after opening, in seconds", 3) as null|num + var/timeInput = input("Enter the time it takes for the pod to leave after opening, in seconds", "Delay Time", initial(temp_pod.departureDelay) * 0.1) as null|num if (isnull(timeInput)) return if (!isnum(timeInput)) @@ -299,34 +322,60 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm . = TRUE ////////////////////////////ADMIN SOUNDS////////////////// + if("fallingSound") //Admin sound from a local file that plays when the pod falls + if ((temp_pod.fallingSound) != initial(temp_pod.fallingSound)) + temp_pod.fallingSound = initial(temp_pod.fallingSound) + temp_pod.fallingSoundLength = initial(temp_pod.fallingSoundLength) + return + var/soundInput = input(holder, "Please pick a sound file to play when the pod lands! NOTICE: Take a note of exactly how long the sound is.", "Pick a Sound File") as null|sound + if (isnull(soundInput)) + return + var/timeInput = input(holder, "What is the exact length of the sound file, in seconds. This number will be used to line the sound up so that it finishes right as the pod lands!", "Pick a Sound File", 0.3) as null|num + if (isnull(timeInput)) + return + if (!isnum(timeInput)) + alert(usr, "That wasnt a number! Value set to default ([initial(temp_pod.fallingSoundLength)*0.1]) instead.") + temp_pod.fallingSound = soundInput + temp_pod.fallingSoundLength = 10 * timeInput + . = TRUE if("landingSound") //Admin sound from a local file that plays when the pod lands if (!isnull(temp_pod.landingSound)) temp_pod.landingSound = null return - temp_pod.landingSound = input(holder, "Please pick a sound file to play when the pod lands! I reccomend a nice \"oh shit, i'm sorry\", incase you hit someone with the pod.", "Pick a Sound File") as null|sound + var/soundInput = input(holder, "Please pick a sound file to play when the pod lands! I reccomend a nice \"oh shit, i'm sorry\", incase you hit someone with the pod.", "Pick a Sound File") as null|sound + if (isnull(soundInput)) + return + temp_pod.landingSound = soundInput . = TRUE if("openingSound") //Admin sound from a local file that plays when the pod opens if (!isnull(temp_pod.openingSound)) temp_pod.openingSound = null return - temp_pod.openingSound = input(holder, "Please pick a sound file to play when the pod opens! I reccomend a stock sound effect of kids cheering at a party, incase your pod is full of fun exciting stuff!", "Pick a Sound File") as null|sound + var/soundInput = input(holder, "Please pick a sound file to play when the pod opens! I reccomend a stock sound effect of kids cheering at a party, incase your pod is full of fun exciting stuff!", "Pick a Sound File") as null|sound + if (isnull(soundInput)) + return + temp_pod.openingSound = soundInput . = TRUE if("leavingSound") //Admin sound from a local file that plays when the pod leaves if (!isnull(temp_pod.leavingSound)) temp_pod.leavingSound = null return - temp_pod.leavingSound = input(holder, "Please pick a sound file to play when the pod leaves! I reccomend a nice slide whistle sound, especially if you're using the reverse pod effect.", "Pick a Sound File") as null|sound + var/soundInput = input(holder, "Please pick a sound file to play when the pod leaves! I reccomend a nice slide whistle sound, especially if you're using the reverse pod effect.", "Pick a Sound File") as null|sound + if (isnull(soundInput)) + return + temp_pod.leavingSound = soundInput . = TRUE if("soundVolume") //Admin sound from a local file that plays when the pod leaves - if (temp_pod.soundVolume != 50) - temp_pod.soundVolume = 50 + if (temp_pod.soundVolume != initial(temp_pod.soundVolume)) + temp_pod.soundVolume = initial(temp_pod.soundVolume) return - temp_pod.soundVolume = input(holder, "Please pick a volume. Default is between 1 and 100 with 50 being average, but pick whatever. I'm a notification, not a cop. If you still cant hear your sound, consider turning on the Quiet effect. It will silence all pod sounds except for the custom admin ones set by the previous three buttons.", "Pick Admin Sound Volume") as null|num - if (isnull(temp_pod.soundVolume)) - temp_pod.soundVolume = 50 + var/soundInput = input(holder, "Please pick a volume. Default is between 1 and 100 with 80 being average, but pick whatever. I'm a notification, not a cop. If you still cant hear your sound, consider turning on the Quiet effect. It will silence all pod sounds except for the custom admin ones set by the previous three buttons.", "Pick Admin Sound Volume") as null|num + if (isnull(soundInput)) + return + temp_pod.soundVolume = soundInput . = 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) @@ -364,10 +413,13 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm if("styleGondola") temp_pod.setStyle(STYLE_GONDOLA) . = TRUE + if("styleSeeThrough") + temp_pod.setStyle(STYLE_SEETHROUGH) + . = TRUE 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 @@ -403,12 +455,17 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm if(left_click) //When we left click: preLaunch() //Fill the acceptableTurfs list from the orderedArea list. Then, fill up the launchList list with items from the acceptableTurfs list based on the manner of launch (ordered, random, etc) if (!isnull(specificTarget)) - target = get_turf(specificTarget) //if we have a specific mob target, then always launch the pod at the turf of the mob + target = get_turf(specificTarget) //if we have a specific target, then always launch the pod at the turf of the target else if (target) target = get_turf(target) //Make sure we're aiming at a turf rather than an item or effect or something else return //if target is null and we don't have a specific target, cancel - + if (effectAnnounce) + deadchat_broadcast("A special package is being launched at the station!", turf_target = target) + var/list/bouttaDie = list() + for (var/mob/living/M in target) + bouttaDie.Add(M) + supplypod_punish_log(bouttaDie) if (!effectBurst) //If we're not using burst mode, just launch normally. launch(target) else @@ -422,7 +479,6 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm else launch(target) //If we couldn't locate an adjacent turf, just launch at the normal target sleep(rand()*2) //looks cooler than them all appearing at once. Gives the impression of burst fire. - log_admin("Centcom Supplypod Launch: [key_name(user)] launched a supplypod in [AREACOORD(target)]") /datum/centcom_podlauncher/proc/refreshBay() //Called whenever the bay is switched, as well as wheneber a pod is launched orderedArea = createOrderedArea(bay) //Create an ordered list full of turfs form the bay @@ -436,7 +492,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 +509,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 +534,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 @@ -486,11 +542,11 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm if (launchClone) //We arent launching the actual items from the bay, rather we are creating clones and launching those 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 + new /obj/effect/abstract/DPtarget(A, toLaunch) //Create the DPTarget, which will eventually forceMove the temp_pod to it's location + 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 + new /obj/effect/abstract/DPtarget(A, toLaunch) //Then, create the DPTarget effect, which will eventually forceMove the temp_pod to it's location if (launchClone) launchCounter++ //We only need to increment launchCounter if we are cloning objects. //If we aren't cloning objects, taking and removing the first item each time from the acceptableTurfs list will inherently iterate through the list in order @@ -508,4 +564,26 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm updateCursor(FALSE) //Make sure our moues cursor resets to default. False means we are not in launch mode qdel(temp_pod) //Delete the temp_pod qdel(selector) //Delete the selector effect - . = ..() \ No newline at end of file + . = ..() + +/datum/centcom_podlauncher/proc/supplypod_punish_log(var/list/whoDyin) + var/podString = effectBurst ? "5 pods" : "a pod" + var/whomString = "" + if (LAZYLEN(whoDyin)) + for (var/mob/living/M in whoDyin) + whomString += "[key_name(M)], " + + var/delayString = temp_pod.landingDelay == initial(temp_pod.landingDelay) ? "" : " Delay=[temp_pod.landingDelay*0.1]s" + var/damageString = temp_pod.damage == 0 ? "" : " Dmg=[temp_pod.damage]" + var/explosionString = "" + var/explosion_sum = temp_pod.explosionSize[1] + temp_pod.explosionSize[2] + temp_pod.explosionSize[3] + temp_pod.explosionSize[4] + if (explosion_sum != 0) + explosionString = " Boom=|" + for (var/X in temp_pod.explosionSize) + explosionString += "[X]|" + + var/msg = "launched [podString][whomString].[delayString][damageString][explosionString]]" + message_admins("[key_name_admin(usr)] [msg] in [AREACOORD(specificTarget)].") + if (!isemptylist(whoDyin)) + for (var/mob/living/M in whoDyin) + admin_ticket_log(M, "[key_name_admin(usr)] [msg]") 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..e38e5b55b9 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" @@ -183,7 +183,7 @@ LZ = pick(empty_turfs) if (SO.pack.cost <= SSshuttle.points && LZ)//we need to call the cost check again because of the CHECK_TICK call SSshuttle.points -= SO.pack.cost - new /obj/effect/DPtarget(LZ, podType, SO) + new /obj/effect/abstract/DPtarget(LZ, podType, SO) . = TRUE update_icon() else @@ -200,7 +200,7 @@ for(var/i in 1 to MAX_EMAG_ROCKETS) var/LZ = pick(empty_turfs) LAZYREMOVE(empty_turfs, LZ) - new /obj/effect/DPtarget(LZ, podType, SO) + new /obj/effect/abstract/DPtarget(LZ, podType, SO) . = TRUE update_icon() CHECK_TICK diff --git a/code/modules/cargo/gondolapod.dm b/code/modules/cargo/gondolapod.dm index f36ff0ce33..7b78facf00 100644 --- a/code/modules/cargo/gondolapod.dm +++ b/code/modules/cargo/gondolapod.dm @@ -39,15 +39,22 @@ 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, forced = TRUE) + +/mob/living/simple_animal/pet/gondola/gondolapod/examine(mob/user) + ..() + if (contents.len) + to_chat(user, "It looks like it hasn't made its delivery yet.
    ") + else + to_chat(user, "It looks like it has already made its delivery.
    ") /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) - to_chat(src, "You detect [total] object[total > 1 ? "s" : ""] within your incredibly vast belly.") + if (total) + to_chat(src, "You detect [total] object\s within your incredibly vast belly.") else to_chat(src, "A closer look inside yourself reveals... nothing.") diff --git a/code/modules/cargo/packs/armory.dm b/code/modules/cargo/packs/armory.dm index ee983784fe..58677814a6 100644 --- a/code/modules/cargo/packs/armory.dm +++ b/code/modules/cargo/packs/armory.dm @@ -61,7 +61,7 @@ /datum/supply_pack/security/armory/dragnetgun name = "DRAGnet gun Crate" - desc = "Contains two DRAGnet gun. A Dynamic Rapid-Apprehension of the Guilty net the revolution in law enforcement technology that YOU Want! Requires Armory access to open." + desc = "Contains two DRAGnet guns. A Dynamic Rapid-Apprehension of the Guilty net the revolution in law enforcement technology that YOU Want! Requires Armory access to open." cost = 3250 contains = list(/obj/item/gun/energy/e_gun/dragnet, /obj/item/gun/energy/e_gun/dragnet) diff --git a/code/modules/cargo/packs/emergency.dm b/code/modules/cargo/packs/emergency.dm index 1987369d20..30153ef077 100644 --- a/code/modules/cargo/packs/emergency.dm +++ b/code/modules/cargo/packs/emergency.dm @@ -44,8 +44,51 @@ crate_name = "emergency crate" crate_type = /obj/structure/closet/crate/internals +/datum/supply_pack/emergency/medicalemergency + name = "Emergency Medical Supplies" //Almost all of this can be ordered seperatly for a much cheaper price, but the HUD increases it. + desc = "Emergency supplies for a front-line medic. Contains two boxes of body bags, a medical HUD, a defib unit, medical belt, toxin bottles, epipens, and several types of medical kits." + cost = 10000 + contains = list(/obj/item/storage/box/bodybags, + /obj/item/storage/box/bodybags, + /obj/item/clothing/glasses/hud/health, + /obj/item/defibrillator/loaded, + /obj/item/storage/belt/medical, + /obj/item/storage/firstaid/toxin, + /obj/item/storage/firstaid/o2, + /obj/item/storage/firstaid/brute, + /obj/item/storage/firstaid/fire, + /obj/item/reagent_containers/glass/bottle/toxin, + /obj/item/reagent_containers/glass/bottle/toxin, + /obj/item/storage/box/medipens) + crate_name = "medical emergency crate" + crate_type = /obj/structure/closet/crate/medical + +/datum/supply_pack/emergency/medemergencylite + name = "Emergency Medical Supplies (Lite)" + desc = "A less than optimal, but still effective, set of tools for emergency care. Contains a box of bodybags, some normal (and advanced) health analyzers, healing sprays, a single first aid kit, charcoal, some gauze, a bottle of toxins, and some spare medipens." + cost = 2800 + contains = list(/obj/item/storage/box/bodybags, + /obj/item/stack/medical/gauze, + /obj/item/stack/medical/gauze, + /obj/item/healthanalyzer, + /obj/item/healthanalyzer, + /obj/item/healthanalyzer/advanced, + /obj/item/storage/firstaid/regular, + /obj/item/reagent_containers/medspray/styptic, + /obj/item/reagent_containers/medspray/silver_sulf, + /obj/item/reagent_containers/medspray/synthflesh, + /obj/item/reagent_containers/glass/bottle/charcoal, + /obj/item/reagent_containers/glass/bottle/charcoal, + /obj/item/reagent_containers/glass/bottle/toxin, + /obj/item/reagent_containers/hypospray/medipen, + /obj/item/reagent_containers/hypospray/medipen, + /obj/item/reagent_containers/hypospray/medipen, + /obj/item/reagent_containers/hypospray/medipen) + crate_name = "medical emergency crate (lite)" + crate_type = /obj/structure/closet/crate/medical + /datum/supply_pack/emergency/radiatione_emergency - name = "Emergenc Radiation Protection Crate" + name = "Emergency Radiation Protection Crate" desc = "Survive the Nuclear Apocalypse and Supermatter Engine alike with two sets of Radiation suits. Each set contains a helmet, suit, and Geiger counter. We'll even throw in a few pill bottles that are able to handles radiation and the affects of the poisoning." cost = 2500 contains = list(/obj/item/clothing/head/radiation, @@ -61,7 +104,7 @@ /datum/supply_pack/emergency/rcds name = "Emergency RCDs" - desc = "Bombs going off on station? SME blown and now you need to fix the hole it left behind? Well this crate has a pare of Rcds to be able to easily fix up any problem you may have!" + desc = "Bombs going off on station? SME blown and now you need to fix the hole it left behind? Well this crate has a pare of RCDs to be able to easily fix up any problem you may have!" cost = 1500 contains = list(/obj/item/construction/rcd, /obj/item/construction/rcd) @@ -70,7 +113,7 @@ /datum/supply_pack/emergency/soft_suit name = "Emergency Space Suit " - desc = "Is there bombs going off left and right? Is there meteors shooting around the station? Well we have two fragile space suit for emergencys as well as air and masks." + desc = "Are there bombs going off left and right? Are there meteors shooting around the station? Well then! Here's two fragile space suit for emergencies. Comes with air and masks." cost = 1200 contains = list(/obj/item/tank/internals/air, /obj/item/tank/internals/air, @@ -137,6 +180,18 @@ /obj/item/storage/box/metalfoam) crate_name = "metal foam grenade crate" +/datum/supply_pack/emergency/mre + name = "MRE supply kit (emergency rations)" + desc = "The lights are out. Oxygen's running low. You've run out of food except space weevils. Don't let this be you! Order our NT branded MRE kits today! This pack contains 5 MRE packs with a randomized menu and an oxygen tank." + cost = 2000 + contains = list(/obj/item/storage/box/mre/menu1/safe, + /obj/item/storage/box/mre/menu1/safe, + /obj/item/storage/box/mre/menu2/safe, + /obj/item/storage/box/mre/menu2/safe, + /obj/item/storage/box/mre/menu3, + /obj/item/storage/box/mre/menu4/safe) + crate_name = "MRE crate (emergency rations)" + /datum/supply_pack/emergency/syndicate name = "NULL_ENTRY" desc = "(#@&^$THIS PACKAGE CONTAINS 30TC WORTH OF SOME RANDOM SYNDICATE GEAR WE HAD LYING AROUND THE WAREHOUSE. GIVE EM HELL, OPERATIVE@&!*() " @@ -205,7 +260,6 @@ name = "Space Suit Crate" desc = "Contains two aging suits from Space-Goodwill. Requires EVA access to open." cost = 3000 - access = ACCESS_EVA contains = list(/obj/item/clothing/suit/space, /obj/item/clothing/suit/space, /obj/item/clothing/head/helmet/space, @@ -254,22 +308,3 @@ crate_name = "weed control crate" crate_type = /obj/structure/closet/crate/secure/hydroponics -/datum/supply_pack/medical/anitvirus - name = "Virus Containment Crate" - desc = "Viro let out a death plague Mk II again? Someone didnt wash there hands? Old plagues born anew? Well this crate is for you! Hope you cure it before it brakes out of the station... This crate needs medical access to open and has two bio suits, a box of needles and beakers, five spaceacillin needles, and a medibot." - cost = 3000 - access = ACCESS_MEDICAL - contains = list(/mob/living/simple_animal/bot/medbot, - /obj/item/clothing/head/bio_hood, - /obj/item/clothing/head/bio_hood, - /obj/item/clothing/suit/bio_suit, - /obj/item/clothing/suit/bio_suit, - /obj/item/reagent_containers/syringe/antiviral, - /obj/item/reagent_containers/syringe/antiviral, - /obj/item/reagent_containers/syringe/antiviral, - /obj/item/reagent_containers/syringe/antiviral, - /obj/item/reagent_containers/syringe/antiviral, - /obj/item/storage/box/syringes, - /obj/item/storage/box/beakers) - crate_name = "virus containment unit crate" - crate_type = /obj/structure/closet/crate/secure/plasma diff --git a/code/modules/cargo/packs/engineering.dm b/code/modules/cargo/packs/engineering.dm index 19cb53489e..f09c9e429d 100644 --- a/code/modules/cargo/packs/engineering.dm +++ b/code/modules/cargo/packs/engineering.dm @@ -56,6 +56,7 @@ name = "Engineering Hardsuit" desc = "Poly 'Who stole all the hardsuits!' Well now you can get more hardsuits if needed! NOTE ONE HARDSUIT IS IN THIS CRATE, as well as one air tank and mask!" cost = 2250 + access = ACCESS_ENGINE contains = list(/obj/item/tank/internals/air, /obj/item/clothing/mask/gas, /obj/item/clothing/suit/space/hardsuit/engine) @@ -65,7 +66,7 @@ name = "Atmospherics Hardsuit" desc = "Too many techs and not enough hardsuits? Time to buy some more! Comes with gas mask and air tank. Ask the CE to open." cost = 5000 - access = ACCESS_CE + access = ACCESS_CE //100% Fire and Bio resistance contains = list(/obj/item/tank/internals/air, /obj/item/clothing/mask/gas, /obj/item/clothing/suit/space/hardsuit/engine/atmos) @@ -74,7 +75,7 @@ /datum/supply_pack/engineering/industrialrcd name = "Industrial RCD" - desc = "A industrial RCD in case the station has gone through more then one meteor storm and the CE needs to bring out the somthing a bit more reliable. Dose not contain spare ammo for the industrial RCD or any other RCD modles." + desc = "An industrial RCD in case the station has gone through more then one meteor storm and the CE needs to bring out the somthing a bit more reliable. Does not contain spare ammo for the industrial RCD or any other RCD models." cost = 4500 access = ACCESS_CE contains = list(/obj/item/construction/rcd/industrial) @@ -91,15 +92,11 @@ crate_name = "insulated gloves crate" crate_type = /obj/structure/closet/crate/engineering/electrical -/obj/item/stock_parts/cell/inducer_supply - maxcharge = 5000 - charge = 5000 - /datum/supply_pack/engineering/inducers name = "NT-75 Electromagnetic Power Inducers Crate" desc = "No rechargers? No problem, with the NT-75 EPI, you can recharge any standard cell-based equipment anytime, anywhere. Contains two Inducers." cost = 2300 - contains = list(/obj/item/inducer/sci {cell_type = /obj/item/stock_parts/cell/inducer_supply; opened = 0}, /obj/item/inducer/sci {cell_type = /obj/item/stock_parts/cell/inducer_supply; opened = 0}) //FALSE doesn't work in modified type paths apparently. + contains = list(/obj/item/inducer/sci/supply, /obj/item/inducer/sci/supply) crate_name = "inducer crate" crate_type = /obj/structure/closet/crate/engineering/electrical @@ -121,18 +118,6 @@ crate_name = "power cell crate" crate_type = /obj/structure/closet/crate/engineering/electrical - -/datum/supply_pack/engineering/siezedpower - name = "Siezed Power Cell Crate" - desc = "We took the means of power! Contains three high-voltage plus power cells." - cost = 1300 - contraband = TRUE - contains = list(/obj/item/stock_parts/cell/high/plus, - /obj/item/stock_parts/cell/high/plus, - /obj/item/stock_parts/cell/high/plus) - crate_name = "siezed crate" - crate_type = /obj/structure/closet/crate/engineering/electrical - /datum/supply_pack/engineering/shuttle_engine name = "Shuttle Engine Crate" desc = "Through advanced bluespace-shenanigans, our engineers have managed to fit an entire shuttle engine into one tiny little crate. Requires CE access to open." @@ -142,22 +127,6 @@ crate_name = "shuttle engine crate" crate_type = /obj/structure/closet/crate/secure/engineering -/datum/supply_pack/engineering/siezedproduction - name = "The Means of Production" - desc = "We will win for we have took over the production! S five metal sheets, five wire, three matter bins, one manipulater and one sheet of glass." - cost = 1500 - contraband = TRUE - contains = list(/obj/item/stock_parts/cell/high/plus, - /obj/item/circuitboard/machine/autolathe, - /obj/item/stack/cable_coil/random/five, - /obj/item/stack/sheet/metal/five, - /obj/item/stock_parts/matter_bin, - /obj/item/stock_parts/matter_bin, - /obj/item/stock_parts/matter_bin, - /obj/item/stock_parts/manipulator, - /obj/item/stack/sheet/glass,) - crate_name = "siezed crate" - /datum/supply_pack/engineering/tools name = "Toolbox Crate" desc = "Any robust spaceman is never far from their trusty toolbox. Contains three electrical toolboxes and three mechanical toolboxes." @@ -184,7 +153,7 @@ /datum/supply_pack/engineering/dna_vault name = "DNA Vault Parts" - desc = "Secure the longevity of the current state of humanity within this massive library of scientific knowledge, capable of granting superhuman powers and abilities. Highly advanced research is required for proper construction. Also contains five DNA probes." + desc = "Secure the longevity of the current state of civilization within this massive library of scientific knowledge, capable of granting superhuman powers and abilities. Highly advanced research is required for proper construction. Also contains five DNA probes." //C'mon now, it's nae just humans on the station these days cost = 12000 special = TRUE contains = list( diff --git a/code/modules/cargo/packs/livestock.dm b/code/modules/cargo/packs/livestock.dm index 8708562a06..1b55c0540a 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() @@ -43,7 +58,7 @@ name = "Chicken Crate" desc = "The chicken goes bwaak!" cost = 2000 - contains = list( /mob/living/simple_animal/chick) + contains = list(/mob/living/simple_animal/chick) crate_name = "chicken crate" /datum/supply_pack/critter/crab @@ -120,7 +135,7 @@ /obj/item/clothing/neck/petcollar) crate_name = "pug crate" -/datum/supply_pack/organic/critter/kiwi +/datum/supply_pack/critter/kiwi name = "Space kiwi Crate" cost = 2000 contains = list( /mob/living/simple_animal/kiwi) @@ -135,6 +150,18 @@ /mob/living/simple_animal/hostile/retaliate/poison/snake) crate_name = "snake crate" +/datum/supply_pack/critter/mouse + name = "Mouse Crate" + desc = "Good for snakes and lizards of all ages. Contains ~12 feeder mice." + cost = 2000 + contains = list(/mob/living/simple_animal/mouse,) + crate_name = "mouse crate" + +/datum/supply_pack/critter/mouse/generate() + . = ..() + for(var/i in 1 to 11) + new /mob/living/simple_animal/mouse(.) + /datum/supply_pack/critter/secbat name = "Security Bat Crate" desc = "Contains five security bats, perfect to Bat-up any security officer." diff --git a/code/modules/cargo/packs/materials.dm b/code/modules/cargo/packs/materials.dm index 0f8ad2462a..c9862282dc 100644 --- a/code/modules/cargo/packs/materials.dm +++ b/code/modules/cargo/packs/materials.dm @@ -9,6 +9,10 @@ /datum/supply_pack/materials group = "Canisters & Materials" +////////////////////////////////////////////////////////////////////////////// +///////////////////////////// Materials ////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + /datum/supply_pack/materials/cardboard50 name = "50 Cardboard Sheets" desc = "Create a bunch of boxes." @@ -58,6 +62,13 @@ contains = list(/obj/item/stack/sheet/mineral/sandstone/thirty) crate_name = "sandstone blocks crate" +/datum/supply_pack/materials/rawlumber + name = "50 Towercap Logs" + desc = "Raw logs from towercaps. Contains fifty logs." + cost = 1000 + contains = list(/obj/item/grown/log) + crate_name = "lumber crate" + /datum/supply_pack/materials/wood50 name = "50 Wood Planks" desc = "Turn cargo's boring metal groundwork into beautiful panelled flooring and much more with fifty wooden planks!" @@ -65,9 +76,40 @@ contains = list(/obj/item/stack/sheet/mineral/wood/fifty) crate_name = "wood planks crate" +/datum/supply_pack/materials/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 profit 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/materials/rawcottonbulk + name = "Raw Cotton Crate (Bulk)" + desc = "We have so much of this stuff we need to get rid of it in -bulk- now. This crate contains 240 raw cotton sheets." + cost = 1300 // 100 net cost (per 40 cotton) , 20 x 20 = 400. 300 profit 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/thirty, + /obj/item/stack/sheet/cotton/thirty, + /obj/item/stack/sheet/cotton/thirty, + /obj/item/stack/sheet/cotton/thirty, + /obj/item/stack/sheet/cotton/thirty, + /obj/item/stack/sheet/cotton/thirty, + /obj/item/stack/sheet/cotton/thirty, + ) + crate_name = "bulk cotton crate" + crate_type = /obj/structure/closet/crate/hydroponics + +/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." + desc = "This crate contains sixteen RCD compressed matter packs, to help with any holes or projects people might be working on." cost = 3750 contains = list(/obj/item/rcd_ammo, /obj/item/rcd_ammo, @@ -87,6 +129,18 @@ /obj/item/rcd_ammo) crate_name = "rcd ammo" +/datum/supply_pack/materials/loom + name = "Loom" + desc = "A large pre-made loom." + cost = 1000 + contains = list(/obj/structure/loom/unanchored) + crate_name = "loom crate" + crate_type = /obj/structure/closet/crate/large + +////////////////////////////////////////////////////////////////////////////// +///////////////////////////// Canisters ////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + /datum/supply_pack/materials/bz name = "BZ Canister Crate" desc = "Contains a canister of BZ. Requires Toxins access to open." @@ -137,6 +191,10 @@ crate_name = "water vapor canister crate" crate_type = /obj/structure/closet/crate/large +////////////////////////////////////////////////////////////////////////////// +/////////////////////////////// Tanks //////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + /datum/supply_pack/materials/fueltank name = "Fuel Tank Crate" desc = "Contains a welding fuel tank. Caution, highly flammable." @@ -168,3 +226,5 @@ contains = list(/obj/structure/reagent_dispensers/watertank/high) crate_name = "high-capacity water tank crate" crate_type = /obj/structure/closet/crate/large + + diff --git a/code/modules/cargo/packs/medical.dm b/code/modules/cargo/packs/medical.dm index 656474cc1d..1e5097fd11 100644 --- a/code/modules/cargo/packs/medical.dm +++ b/code/modules/cargo/packs/medical.dm @@ -10,6 +10,16 @@ group = "Medical" crate_type = /obj/structure/closet/crate/medical +/datum/supply_pack/medical/bodybags + name = "Bodybags" + desc = "For when the bodies hit the floor. Contains 4 boxes of bodybags." + cost = 1200 + contains = list(/obj/item/storage/box/bodybags, + /obj/item/storage/box/bodybags, + /obj/item/storage/box/bodybags, + /obj/item/storage/box/bodybags,) + crate_name = "bodybag crate" + /datum/supply_pack/medical/firstaidbruises name = "Bruise Treatment Kit Crate" desc = "Contains three first aid kits focused on healing bruises and broken bones." @@ -30,9 +40,10 @@ /datum/supply_pack/medical/bloodpacks name = "Blood Pack Variety Crate" - desc = "Contains ten different blood packs for reintroducing blood to patients." + desc = "Contains nine different blood packs for reintroducing blood to patients, plus two universal synthetic blood packs." cost = 3000 - contains = list(/obj/item/reagent_containers/blood/random, + contains = list(/obj/item/reagent_containers/blood/synthetics, + /obj/item/reagent_containers/blood/synthetics, /obj/item/reagent_containers/blood/random, /obj/item/reagent_containers/blood/APlus, /obj/item/reagent_containers/blood/AMinus, @@ -46,18 +57,6 @@ crate_name = "blood freezer" crate_type = /obj/structure/closet/crate/freezer -/datum/supply_pack/medical/bloodpackssynth - name = "Synthetics Blood Pack Crate" - desc = "Contains five synthetics blood packs for reintroducing blood to patients." - cost = 3000 - contains = list(/obj/item/reagent_containers/blood/synthetics, - /obj/item/reagent_containers/blood/synthetics, - /obj/item/reagent_containers/blood/synthetics, - /obj/item/reagent_containers/blood/synthetics, - /obj/item/reagent_containers/blood/synthetics) - crate_name = "blood freezer" - crate_type = /obj/structure/closet/crate/freezer - /datum/supply_pack/medical/defibs name = "Defibrillator Crate" desc = "Contains two defibrillators for bringing the recently deceased back to life." @@ -85,7 +84,7 @@ /datum/supply_pack/science/adv_surgery_tools name = "Med-Co Advanced surgery tools" - desc = "A full set of Med-Co advanced surgery tools, this crate also comes with a spay of synth flesh as well as a can of . Requires Surgery access to open." + desc = "A full set of Med-Co advanced surgery tools! In addition to that it contains both a can of synthflesh and a can of sterilizine. Requires Surgery access to open." cost = 5500 access = ACCESS_SURGERY contains = list(/obj/item/storage/belt/medical/surgery_belt_adv, @@ -96,8 +95,9 @@ /datum/supply_pack/medical/medicalhardsuit name = "Medical Hardsuit" - desc = "Got people being spaced left and right? Hole in the same room as the dead body of Hos or cap? Fear not, now you can buy one medical hardsuit with a mask and air tank to save your fellow crewmembers." + desc = "Got people being spaced left and right? Hole in the same room as the dead body of Hos or cap? Fear not, now you can buy one medical hardsuit with a mask and air tank to save your fellow crewmembers. Requires medical access to open." cost = 2750 + access = ACCESS_MEDICAL contains = list(/obj/item/tank/internals/air, /obj/item/clothing/mask/gas, /obj/item/clothing/suit/space/hardsuit/medical) @@ -174,7 +174,7 @@ /datum/supply_pack/medical/advrad name = "Radiation Treatment Crate Deluxe" - desc = "A crate for when radiation is out of hand... Contains two rad-b-gone kits, one bottle of anti radiation deluxe pill bottle, as well as a radiation treatment deluxe pill bottle!" + desc = "A crate for when radiation is out of hand... Contains two rad-b-gone kits, one bottle of anti radiation deluxe pills, as well as a radiation treatment deluxe pill bottle!" cost = 3500 contains = list(/obj/item/storage/pill_bottle/antirad_plus, /obj/item/storage/pill_bottle/mutarad, @@ -226,3 +226,23 @@ crate_name = "virus crate" crate_type = /obj/structure/closet/crate/secure/plasma dangerous = TRUE + +/datum/supply_pack/medical/anitvirus + name = "Virus Containment Crate" + desc = "Viro let out a death plague Mk II again? Someone didnt wash their hands? Old plagues born anew? Well this crate is for you! Hope you cure it before it breaks out of the station... This crate needs medical access to open and has two bio suits, a box of needles and beakers, five spaceacillin needles, and a medibot." + cost = 3000 + access = ACCESS_MEDICAL + contains = list(/mob/living/simple_animal/bot/medbot, + /obj/item/clothing/head/bio_hood, + /obj/item/clothing/head/bio_hood, + /obj/item/clothing/suit/bio_suit, + /obj/item/clothing/suit/bio_suit, + /obj/item/reagent_containers/syringe/antiviral, + /obj/item/reagent_containers/syringe/antiviral, + /obj/item/reagent_containers/syringe/antiviral, + /obj/item/reagent_containers/syringe/antiviral, + /obj/item/reagent_containers/syringe/antiviral, + /obj/item/storage/box/syringes, + /obj/item/storage/box/beakers) + crate_name = "virus containment unit crate" + crate_type = /obj/structure/closet/crate/secure/plasma \ No newline at end of file diff --git a/code/modules/cargo/packs/misc.dm b/code/modules/cargo/packs/misc.dm index c380d5411e..aa680e1b1e 100644 --- a/code/modules/cargo/packs/misc.dm +++ b/code/modules/cargo/packs/misc.dm @@ -9,6 +9,21 @@ /datum/supply_pack/misc group = "Miscellaneous Supplies" +////////////////////////////////////////////////////////////////////////////// +//////////////////// Paperwork and Writing Supplies ////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +/* I did it Kevin +/datum/supply_pack/misc/abandonedcrate + name = "Abandoned Crate" + desc = "Someone keeps finding these locked crates out in the boonies. How about you take a crack at it, we've had our fill. WARNING: EXPLOSIVE" + contraband = TRUE + cost = 12800 + contains = list(/obj/structure/closet/crate/secure/loot) + crate_name = "abandoned crate" + crate_type = /obj/structure/closet/crate/large + dangerous = TRUE +*/ /datum/supply_pack/misc/artsupply name = "Art Supplies" desc = "Make some happy little accidents with six canvasses, two easels, two boxes of crayons, and a rainbow crayon!" @@ -29,39 +44,6 @@ crate_name = "art supply crate" crate_type = /obj/structure/closet/crate/wooden -/datum/supply_pack/misc/captain_pen - name = "Captain Pen" - desc = "A spare Captain fountain pen." - access = ACCESS_CAPTAIN - cost = 10000 - contains = list(/obj/item/pen/fountain/captain) - crate_name = "captain pen" - crate_type = /obj/structure/closet/crate/secure/weapon //It is a combat pen - -/datum/supply_pack/misc/bicycle - name = "Bicycle" - desc = "Nanotrasen reminds all employees to never toy with powers outside their control." - cost = 1000000 - contains = list(/obj/vehicle/ridden/bicycle) - crate_name = "Bicycle Crate" - crate_type = /obj/structure/closet/crate/large - -/datum/supply_pack/misc/bigband - name = "Big Band Instrument Collection" - desc = "Get your sad station movin' and groovin' with this fine collection! Contains nine different instruments!" - cost = 5000 - crate_name = "Big band musical instruments collection" - contains = list(/obj/item/instrument/violin, - /obj/item/instrument/guitar, - /obj/item/instrument/glockenspiel, - /obj/item/instrument/accordion, - /obj/item/instrument/saxophone, - /obj/item/instrument/trombone, - /obj/item/instrument/recorder, - /obj/item/instrument/harmonica, - /obj/structure/piano/unanchored) - crate_type = /obj/structure/closet/crate/wooden - /datum/supply_pack/misc/book_crate name = "Book Crate" desc = "Surplus from the Nanotrasen Archives, these five books are sure to be good reads." @@ -98,6 +80,15 @@ /obj/item/storage/briefcase) crate_name = "bureaucracy crate" +/datum/supply_pack/misc/captain_pen + name = "Captain Pen" + desc = "A spare Captain fountain pen." + access = ACCESS_CAPTAIN + cost = 10000 + contains = list(/obj/item/pen/fountain/captain) + crate_name = "captain pen" + crate_type = /obj/structure/closet/crate/secure/weapon //It is a combat pen + /datum/supply_pack/misc/fountainpens name = "Calligraphy Crate" desc = "Sign death warrants in style with these seven executive fountain pens." @@ -107,14 +98,6 @@ crate_type = /obj/structure/closet/crate/wooden crate_name = "calligraphy crate" -/datum/supply_pack/misc/wrapping_paper - name = "Festive Wrapping Paper Crate" - desc = "Want to mail your loved ones gift-wrapped chocolates, stuffed animals, the Clown's severed head? You can do all that, with this crate full of wrapping paper." - cost = 1000 - contains = list(/obj/item/stack/wrapping_paper) - crate_type = /obj/structure/closet/crate/wooden - crate_name = "festive wrapping paper crate" - /datum/supply_pack/misc/paper_work name = "Freelance Paper work" desc = "The Nanotrasen Primary Bureaucratic Database Intelligence (PDBI) reports that the station has not completed its funding and grant paperwork this solar cycle. In order to gain further funding, your station is required to fill out (20) ten of these forms or no additional capital will be disbursed. We have sent you ten copies of the following form and we expect every one to be up to Nanotrasen Standards." // Disbursement. It's not a typo, look it up. @@ -143,16 +126,134 @@ ) crate_name = "Paperwork" -/datum/supply_pack/misc/funeral - name = "Funeral Supply crate" - desc = "At the end of the day, someone's gonna want someone dead. Give them a proper send-off with these funeral supplies! Contains a coffin with burial garmets and flowers." - cost = 800 - contains = list(/obj/item/clothing/under/burial, - /obj/item/reagent_containers/food/snacks/grown/harebell, - /obj/item/reagent_containers/food/snacks/grown/poppy/geranium - ) - crate_name = "coffin" - crate_type = /obj/structure/closet/crate/coffin +////////////////////////////////////////////////////////////////////////////// +//////////////////////////////// Entertainment /////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +/datum/supply_pack/misc/randombedsheets + name = "Bedsheet Crate (R)" + desc = "Snuggle up in some sweet sheets with this assorted bedsheet crate. Each set comes with eight random bedsheets for your slumbering pleasure!" + cost = 2000 + contains = list(/obj/item/bedsheet/random, + /obj/item/bedsheet/random, + /obj/item/bedsheet/random, + /obj/item/bedsheet/random, + /obj/item/bedsheet/random, + /obj/item/bedsheet/random, + /obj/item/bedsheet/random, + /obj/item/bedsheet/random) //I'm lazy, and I copy paste stuff. + crate_name = "random bedsheet crate" + +/datum/supply_pack/misc/coloredsheets + name = "Bedsheet Crate (C)" + desc = "Give your night life a splash of color with this crate filled with bedsheets! Contains a total of nine different-colored sheets." + cost = 1250 + contains = list(/obj/item/bedsheet/blue, + /obj/item/bedsheet/green, + /obj/item/bedsheet/orange, + /obj/item/bedsheet/purple, + /obj/item/bedsheet/red, + /obj/item/bedsheet/yellow, + /obj/item/bedsheet/brown, + /obj/item/bedsheet/black, + /obj/item/bedsheet/rainbow) + crate_name = "colored bedsheet crate" + +/datum/supply_pack/misc/bicycle + name = "Bicycle" + desc = "Nanotrasen reminds all employees to never toy with powers outside their control." + cost = 1000000 + contains = list(/obj/vehicle/ridden/bicycle) + crate_name = "Bicycle Crate" + crate_type = /obj/structure/closet/crate/large + +/datum/supply_pack/misc/bigband + name = "Big Band Instrument Collection" + desc = "Get your sad station movin' and groovin' with this fine collection! Contains nine different instruments!" + cost = 5000 + crate_name = "Big band musical instruments collection" + contains = list(/obj/item/instrument/violin, + /obj/item/instrument/guitar, + /obj/item/instrument/glockenspiel, + /obj/item/instrument/accordion, + /obj/item/instrument/saxophone, + /obj/item/instrument/trombone, + /obj/item/instrument/recorder, + /obj/item/instrument/harmonica, + /obj/structure/piano/unanchored) + crate_type = /obj/structure/closet/crate/wooden + +/datum/supply_pack/misc/cbtpack + name = "CBT Equipment" + desc = "(*!&@#CBT is a special term coined by high ranking syndicate operatives for a special form of information extraction. While the training required to use this shipment is highly classified, the distribution of it's contents are not. In addition to this crates unusual contents, we have added a bar of soap.#@*$" + hidden = TRUE + cost = 2400 + contains = list(/mob/living/simple_animal/chicken, + /obj/item/toy/beach_ball/holoball, + /obj/item/melee/baton/cattleprod, + /obj/item/soap/syndie) + crate_name = "cbt crate" + crate_type = /obj/structure/closet/crate/large + +/datum/supply_pack/misc/casinocrate + name = "Casino Crate" + desc = "Start up your own grand casino with this crate filled with slot machine and arcade boards!" + cost = 3000 + contains = list(/obj/item/circuitboard/computer/arcade/battle, + /obj/item/circuitboard/computer/arcade/battle, + /obj/item/circuitboard/computer/arcade/orion_trail, + /obj/item/circuitboard/computer/arcade/orion_trail, + /obj/item/circuitboard/computer/arcade/minesweeper, + /obj/item/circuitboard/computer/arcade/minesweeper, + /obj/item/circuitboard/computer/slot_machine, + /obj/item/circuitboard/computer/slot_machine, + /obj/item/circuitboard/computer/slot_machine, + /obj/item/circuitboard/computer/slot_machine, + /obj/item/circuitboard/computer/slot_machine, + /obj/item/circuitboard/computer/slot_machine) + crate_name = "casino crate" + +/datum/supply_pack/misc/coincrate + name = "Coin Crate" + desc = "Psssst, hey, you. Yes, you. I've heard that coins can do some special things on your station, give you access to some pretty cool stuff. Here's the deal, you give me some credits, and I give so some coins. Sound like a deal? I'll give you 10 for 10000 creds." + contraband = TRUE + cost = 10000 + contains = list(/obj/item/coin/silver) + crate_name = "coin crate" + crate_type = /obj/structure/closet/crate/large + +/datum/supply_pack/misc/coincrate/generate() + . = ..() + for(var/i in 1 to 9) + new /obj/item/coin/silver(.) + +////////////////////////////////////////////////////////////////////////////// +//////////////////////////////// Misc Supplies /////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +/datum/supply_pack/misc/exoticfootwear + name = "Exotic Footwear Crate" + desc = "Popularised by lizards and exotic dancers, the footwear included in this shipment is sure to give your feet the breathing room they deserve. Sweet Kicks Inc. is not responsible for any damage, distress, or @r0u$a1 caused by this shipment." + cost = 4337 + contains = list(/obj/item/clothing/shoes/wraps, + /obj/item/clothing/shoes/wraps, + /obj/item/clothing/shoes/wraps/silver, + /obj/item/clothing/shoes/wraps/silver, + /obj/item/clothing/shoes/wraps/red, + /obj/item/clothing/shoes/wraps/red, + /obj/item/clothing/shoes/wraps/blue, + /obj/item/clothing/shoes/wraps/blue, + /obj/item/clothing/shoes/clown_shoes, + /obj/item/clothing/shoes/kindleKicks) + crate_name = "footie crate" + +/datum/supply_pack/misc/wrapping_paper + name = "Festive Wrapping Paper Crate" + desc = "Want to mail your loved ones gift-wrapped chocolates, stuffed animals, or the Clown's severed head? You can do all that, with this crate full of wrapping paper." + cost = 1000 + contains = list(/obj/item/stack/wrapping_paper) + crate_type = /obj/structure/closet/crate/wooden + crate_name = "festive wrapping paper crate" /datum/supply_pack/misc/jukebox name = "Jukebox" @@ -160,9 +261,147 @@ contains = list(/obj/machinery/jukebox) crate_name = "Jukebox" +/datum/supply_pack/misc/potted_plants + name = "Potted Plants Crate" + desc = "Spruce up the station with these lovely plants! Contains a random assortment of five potted plants from Nanotrasen's potted plant research division. Warranty void if thrown." + cost = 730 + contains = list(/obj/item/twohanded/required/kirbyplants/random, + /obj/item/twohanded/required/kirbyplants/random, + /obj/item/twohanded/required/kirbyplants/random, + /obj/item/twohanded/required/kirbyplants/random, + /obj/item/twohanded/required/kirbyplants/random) + crate_name = "potted plants crate" + crate_type = /obj/structure/closet/crate/hydroponics + +/datum/supply_pack/misc/religious_supplies + name = "Religious Supplies Crate" + desc = "Keep your local chaplain happy and well-supplied, lest they call down judgement upon your cargo bay. Contains two bottles of holywater, bibles, chaplain robes, and burial garmets." + cost = 4000 // it costs so much because the Space Church is ran by Space Jews + contains = list(/obj/item/reagent_containers/food/drinks/bottle/holywater, + /obj/item/reagent_containers/food/drinks/bottle/holywater, + /obj/item/storage/book/bible/booze, + /obj/item/storage/book/bible/booze, + /obj/item/clothing/suit/hooded/chaplain_hoodie, + /obj/item/clothing/suit/hooded/chaplain_hoodie + ) + crate_name = "religious supplies crate" + +/datum/supply_pack/misc/funeral + name = "Funeral Supplies" + desc = "Mourn your dead properly buy sending them off with love filled notes, clean clothes, and a proper ceremony. Contains two candle packs, funeral garb, flowers, a paperbin , and crayons to help aid in religious rituals. Coffin included." + cost = 1200 + contains = list(/obj/item/clothing/under/burial, + /obj/item/storage/fancy/candle_box, + /obj/item/storage/fancy/candle_box, + /obj/item/reagent_containers/food/snacks/grown/harebell, + /obj/item/reagent_containers/food/snacks/grown/harebell, + /obj/item/reagent_containers/food/snacks/grown/poppy/geranium, + /obj/item/reagent_containers/food/snacks/grown/poppy/geranium, + /obj/item/reagent_containers/food/snacks/grown/poppy/lily, + /obj/item/reagent_containers/food/snacks/grown/poppy/lily, + /obj/item/storage/crayons, + /obj/item/paper_bin + ) + crate_name = "coffin" + crate_type = /obj/structure/closet/crate/coffin + +/datum/supply_pack/misc/shower + name = "Shower Supplies" + desc = "Everyone needs a bit of R&R. Make sure you get can get yours by ordering this crate filled with towels, rubber duckies, and some soap!" + cost = 1000 + contains = list(/obj/item/reagent_containers/rag/towel, + /obj/item/reagent_containers/rag/towel, + /obj/item/reagent_containers/rag/towel, + /obj/item/reagent_containers/rag/towel, + /obj/item/reagent_containers/rag/towel, + /obj/item/reagent_containers/rag/towel, + /obj/item/bikehorn/rubberducky, + /obj/item/bikehorn/rubberducky, + /obj/item/soap/nanotrasen) + crate_name = "shower crate" + +////////////////////////////////////////////////////////////////////////////// +//////////////////////////// Misc + Decor //////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +/datum/supply_pack/misc/carpet_exotic + name = "Exotic Carpet Crate" + desc = "Exotic carpets straight from Space Russia, for all your decorating needs. Contains 100 tiles each of 10 different flooring patterns." + cost = 7000 + contains = list(/obj/item/stack/tile/carpet/blue/fifty, + /obj/item/stack/tile/carpet/blue/fifty, + /obj/item/stack/tile/carpet/cyan/fifty, + /obj/item/stack/tile/carpet/cyan/fifty, + /obj/item/stack/tile/carpet/green/fifty, + /obj/item/stack/tile/carpet/green/fifty, + /obj/item/stack/tile/carpet/orange/fifty, + /obj/item/stack/tile/carpet/orange/fifty, + /obj/item/stack/tile/carpet/purple/fifty, + /obj/item/stack/tile/carpet/purple/fifty, + /obj/item/stack/tile/carpet/red/fifty, + /obj/item/stack/tile/carpet/red/fifty, + /obj/item/stack/tile/carpet/royalblue/fifty, + /obj/item/stack/tile/carpet/royalblue/fifty, + /obj/item/stack/tile/carpet/royalblack/fifty, + /obj/item/stack/tile/carpet/royalblack/fifty, + /obj/item/stack/tile/carpet/blackred/fifty, + /obj/item/stack/tile/carpet/blackred/fifty, + /obj/item/stack/tile/carpet/monochrome/fifty, + /obj/item/stack/tile/carpet/monochrome/fifty) + crate_name = "exotic carpet crate" + +/datum/supply_pack/misc/carpet + name = "Premium Carpet Crate" + desc = "Plasteel floor tiles getting on your nerves? These stacks of extra soft carpet will tie any room together. Contains some classic carpet, along with black, red, and monochrome varients." + cost = 1350 + contains = list(/obj/item/stack/tile/carpet/fifty, + /obj/item/stack/tile/carpet/fifty, + /obj/item/stack/tile/carpet/black/fifty, + /obj/item/stack/tile/carpet/black/fifty, + /obj/item/stack/tile/carpet/blackred/fifty, + /obj/item/stack/tile/carpet/blackred/fifty, + /obj/item/stack/tile/carpet/monochrome/fifty, + /obj/item/stack/tile/carpet/monochrome/fifty) + crate_name = "premium carpet crate" + +/datum/supply_pack/misc/party + name = "Party Equipment" + desc = "Celebrate both life and death on the station with Nanotrasen's Party Essentials(tm)! Contains seven colored glowsticks, four beers, two ales, a drinking shaker, and a bottle of patron & goldschlager!" + cost = 2000 + contains = list(/obj/item/storage/box/drinkingglasses, + /obj/item/reagent_containers/food/drinks/shaker, + /obj/item/reagent_containers/food/drinks/bottle/patron, + /obj/item/reagent_containers/food/drinks/bottle/goldschlager, + /obj/item/reagent_containers/food/drinks/ale, + /obj/item/reagent_containers/food/drinks/ale, + /obj/item/reagent_containers/food/drinks/beer, + /obj/item/reagent_containers/food/drinks/beer, + /obj/item/reagent_containers/food/drinks/beer, + /obj/item/reagent_containers/food/drinks/beer, + /obj/item/flashlight/glowstick, + /obj/item/flashlight/glowstick/red, + /obj/item/flashlight/glowstick/blue, + /obj/item/flashlight/glowstick/cyan, + /obj/item/flashlight/glowstick/orange, + /obj/item/flashlight/glowstick/yellow, + /obj/item/flashlight/glowstick/pink) + crate_name = "party equipment crate" + +/datum/supply_pack/misc/noslipfloor + name = "High-traction Floor Tiles" + desc = "Make slipping a thing of the past with sixty industrial-grade anti-slip floortiles!" + cost = 2000 + contains = list(/obj/item/stack/tile/noslip/thirty, + /obj/item/stack/tile/noslip/thirty) + crate_name = "high-traction floor tiles crate" + +////////////////////////////////////////////////////////////////////////////// +//////////////////////////////// Lewd Supplies /////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + /datum/supply_pack/misc/lewd name = "Lewd Crate" // OwO - desc = "Psss want to have a good time with your sluts? Well I got what you want maid clothing, dildos, collars and more!" + desc = "Pssst, want to have a good time with your sluts? Well I got what you want! Maid clothing, dildos, collars and more!" cost = 5250 contraband = TRUE contains = list(/obj/item/dildo/custom, @@ -191,40 +430,4 @@ crate_name = "deluxe keg" crate_type = /obj/structure/closet/crate -/datum/supply_pack/misc/religious_supplies - name = "Religious Supplies Crate" - desc = "Keep your local chaplain happy and well-supplied, lest they call down judgement upon your cargo bay. Contains two bottles of holywater, bibles, chaplain robes, and burial garmets." - cost = 4000 // it costs so much because the Space Church is ran by Space Jews - contains = list(/obj/item/reagent_containers/food/drinks/bottle/holywater, - /obj/item/reagent_containers/food/drinks/bottle/holywater, - /obj/item/storage/book/bible/booze, - /obj/item/storage/book/bible/booze, - /obj/item/clothing/suit/hooded/chaplain_hoodie, - /obj/item/clothing/suit/hooded/chaplain_hoodie - ) - crate_name = "religious supplies crate" -/datum/supply_pack/misc/randomised/promiscuous - name = "Promiscuous Organs" - desc = "Do YOU want to have more genital? Well we have just the thing for you~. This crate has two autosurgeon, that will let you have a new sex, organ to impress that hot stud and or chick." - cost = 4000 //Only get 2! - contraband = TRUE - var/num_contained = 2 - contains = list(/obj/item/autosurgeon/penis, - /obj/item/autosurgeon/testicles, - /obj/item/autosurgeon/vagina, - /obj/item/autosurgeon/breasts, - /obj/item/autosurgeon/womb) - crate_name = "promiscuous organs" - -/datum/supply_pack/misc/toner - name = "Toner Crate" - desc = "Spent too much ink printing butt pictures? Fret not, with these six toner refills, you'll be printing butts 'till the cows come home!'" - cost = 1000 - contains = list(/obj/item/toner, - /obj/item/toner, - /obj/item/toner, - /obj/item/toner, - /obj/item/toner, - /obj/item/toner) - crate_name = "toner crate" diff --git a/code/modules/cargo/packs/organic.dm b/code/modules/cargo/packs/organic.dm index 2b5df207c3..3ffe24ac1c 100644 --- a/code/modules/cargo/packs/organic.dm +++ b/code/modules/cargo/packs/organic.dm @@ -10,35 +10,13 @@ group = "Food & Hydroponics" crate_type = /obj/structure/closet/crate/freezer -/datum/supply_pack/organic/hydroponics/beekeeping_suits - name = "Beekeeper Suit Crate" - desc = "Bee business booming? Better be benevolent and boost botany by bestowing bi-Beekeeper-suits! Contains two beekeeper suits and matching headwear." - cost = 1300 - contains = list(/obj/item/clothing/head/beekeeper_head, - /obj/item/clothing/suit/beekeeper_suit, - /obj/item/clothing/head/beekeeper_head, - /obj/item/clothing/suit/beekeeper_suit) - crate_name = "beekeeper suits" - crate_type = /obj/structure/closet/crate/hydroponics - -/datum/supply_pack/organic/hydroponics/beekeeping_fullkit - name = "Beekeeping Starter Crate" - desc = "BEES BEES BEES. Contains three honey frames, a beekeeper suit and helmet, flyswatter, bee house, and, of course, a pure-bred Nanotrasen-Standardized Queen Bee!" - cost = 1800 - contains = list(/obj/structure/beebox/unwrenched, - /obj/item/honey_frame, - /obj/item/honey_frame, - /obj/item/honey_frame, - /obj/item/queen_bee/bought, - /obj/item/clothing/head/beekeeper_head, - /obj/item/clothing/suit/beekeeper_suit, - /obj/item/melee/flyswatter) - crate_name = "beekeeping starter crate" - crate_type = /obj/structure/closet/crate/hydroponics +////////////////////////////////////////////////////////////////////////////// +/////////////////////////////// Food ///////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// /datum/supply_pack/organic/candy/randomised name = "Candy Crate" - desc = "For people that have a insatiable sweet tooth! Has ten candies to be eaten up.." + desc = "For people that have an insatiable sweet tooth! Has ten candies to be eaten up.." cost = 2500 var/num_contained = 10 //number of items picked to be contained in a randomised crate contains = list(/obj/item/reagent_containers/food/snacks/candy, @@ -69,35 +47,9 @@ /obj/item/storage/fancy/donut_box) crate_name = "candy crate" -/datum/supply_pack/organic/cutlery - name = "Kitchen Cutlery Deluxe Set" - desc = "Need to slice and dice away those ''Tomatos'' well we got what you need! From a nice set of knifes, forks, plates, glasses, and a whetstone for when you got some grizzle that is a bit harder to slice then normal." - cost = 10000 - contraband = TRUE - contains = list(/obj/item/sharpener, - /obj/item/kitchen/fork, - /obj/item/kitchen/fork, - /obj/item/kitchen/knife, - /obj/item/kitchen/knife, - /obj/item/kitchen/knife, - /obj/item/kitchen/knife, - /obj/item/kitchen/knife/butcher, - /obj/item/kitchen/knife/butcher, - /obj/item/kitchen/rollingpin, //Deluxe for a reason - /obj/item/trash/plate, - /obj/item/trash/plate, - /obj/item/trash/plate, - /obj/item/trash/plate, - /obj/item/reagent_containers/food/drinks/drinkingglass, - /obj/item/reagent_containers/food/drinks/drinkingglass, - /obj/item/reagent_containers/food/drinks/drinkingglass, - /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, - /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass) - crate_name = "kitchen cutlery deluxe set" - /datum/supply_pack/organic/food name = "Food Crate" - desc = "Get things cooking with this crate full of useful ingredients! Contains a two dozen eggs, three bananas, and two bags of flour and rice, two cartons of milk, soymilk, as well as salt and pepper shakers, a enzyme and sugar bottle, and three slabs of monkeymeat." + desc = "Get things cooking with this crate full of useful ingredients! Contains a two dozen eggs, three bananas, and two bags of flour and rice, two cartons of milk, soymilk, as well as salt and pepper shakers, an enzyme and sugar bottle, and three slabs of monkeymeat." cost = 1000 contains = list(/obj/item/reagent_containers/food/condiment/flour, /obj/item/reagent_containers/food/condiment/flour, @@ -120,6 +72,90 @@ /obj/item/reagent_containers/food/snacks/grown/banana) crate_name = "food crate" +/datum/supply_pack/organic/fiestatortilla + name = "Fiesta Crate" + desc = "Spice up the kitchen with this fiesta themed food order! Contains 8 tortilla based food items, as well as a sombrero, moustache, and cloak!" + cost = 2750 + contains = list(/obj/item/clothing/head/sombrero, + /obj/item/clothing/suit/hooded/cloak/david, + /obj/item/clothing/mask/fakemoustache, + /obj/item/reagent_containers/food/snacks/taco, + /obj/item/reagent_containers/food/snacks/taco, + /obj/item/reagent_containers/food/snacks/taco/plain, + /obj/item/reagent_containers/food/snacks/taco/plain, + /obj/item/reagent_containers/food/snacks/enchiladas, + /obj/item/reagent_containers/food/snacks/enchiladas, + /obj/item/reagent_containers/food/snacks/carneburrito, + /obj/item/reagent_containers/food/snacks/cheesyburrito, + /obj/item/reagent_containers/glass/bottle/capsaicin, + /obj/item/reagent_containers/glass/bottle/capsaicin) + crate_name = "fiesta 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, peaches, and lastly seven strawberry. Includes one serving tray." + 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/peach, + /obj/item/reagent_containers/food/snacks/grown/peach, + /obj/item/reagent_containers/food/snacks/grown/peach, + /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/storage/bag/tray) + 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." @@ -130,58 +166,51 @@ access = ACCESS_THEATRE crate_type = /obj/structure/closet/crate/secure -/datum/supply_pack/organic/hunting - name = "Huntting gear" - desc = "Even in space, we can fine prey to hunt, this crate contains everthing a fine hunter needs to have a sporting time. This crate needs armory access to open. A true huntter only needs a fine bottle of cognac, a nice coat, some good o' cigars, and of cource a huntting shotgun. " - cost = 3500 +/datum/supply_pack/organic/fakemeat + name = "Meat Crate" + desc = "Run outta meat already? Keep the lizards content with this freezer filled with cruelty-free chemically compounded meat! Contains 12 slabs of meat product, and 4 slabs of *carp*." + cost = 1200 // Buying 3 food crates nets you 9 meat for 900 points, plus like, 6 bags of rice, flour, and egg boxes. This is 12 for 500, but you -only- get meat and carp. + contains = list(/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct, + /obj/item/reagent_containers/food/snacks/meat/slab/meatproduct, + /obj/item/reagent_containers/food/snacks/meat/slab/meatproduct, + /obj/item/reagent_containers/food/snacks/meat/slab/meatproduct, + /obj/item/reagent_containers/food/snacks/meat/slab/meatproduct, + /obj/item/reagent_containers/food/snacks/meat/slab/meatproduct, + /obj/item/reagent_containers/food/snacks/meat/slab/meatproduct, + /obj/item/reagent_containers/food/snacks/meat/slab/meatproduct, + /obj/item/reagent_containers/food/snacks/meat/slab/meatproduct, + /obj/item/reagent_containers/food/snacks/meat/slab/meatproduct, + /obj/item/reagent_containers/food/snacks/meat/slab/meatproduct, + /obj/item/reagent_containers/food/snacks/meat/slab/meatproduct, + /obj/item/reagent_containers/food/snacks/carpmeat/imitation, + /obj/item/reagent_containers/food/snacks/carpmeat/imitation, + /obj/item/reagent_containers/food/snacks/carpmeat/imitation, + /obj/item/reagent_containers/food/snacks/carpmeat/imitation) + crate_name = "meaty crate" + crate_type = /obj/structure/closet/crate/freezer + +/datum/supply_pack/organic/monkeydripmeat + name = "*Meat* Crate" + desc = "Need some meat? With this do-it-yourself kit you'll be swimming in it! Contains a monkey cube, an IV drip, and some cryoxadone!" + cost = 2150 contraband = TRUE - contains = list(/obj/item/clothing/head/flatcap, - /obj/item/clothing/suit/hooded/wintercoat/captain, - /obj/item/reagent_containers/food/drinks/bottle/cognac, - /obj/item/storage/fancy/cigarettes/cigars/havana, - /obj/item/clothing/gloves/color/white, - /obj/item/clothing/under/rank/curator, - /obj/item/gun/ballistic/shotgun/lethal) - access = ACCESS_ARMORY - crate_name = "sporting crate" - crate_type = /obj/structure/closet/crate/secure // Would have liked a wooden crate but access >:( + contains = list(/obj/item/reagent_containers/food/snacks/monkeycube, + /obj/item/restraints/handcuffs/cable, + /obj/machinery/iv_drip, + /obj/item/reagent_containers/glass/beaker/cryoxadone, + /obj/item/reagent_containers/glass/beaker/cryoxadone) + crate_name = "monkey meat crate" -/datum/supply_pack/organic/hydroponics - name = "Hydroponics Crate" - desc = "Supplies for growing a great garden! Contains two bottles of ammonia, two Plant-B-Gone spray bottles, a hatchet, cultivator, plant analyzer, as well as a pair of leather gloves and a botanist's apron." - cost = 1750 - contains = list(/obj/item/reagent_containers/spray/plantbgone, - /obj/item/reagent_containers/spray/plantbgone, - /obj/item/reagent_containers/glass/bottle/ammonia, - /obj/item/reagent_containers/glass/bottle/ammonia, - /obj/item/hatchet, - /obj/item/cultivator, - /obj/item/plant_analyzer, - /obj/item/clothing/gloves/botanic_leather, - /obj/item/clothing/suit/apron) - crate_name = "hydroponics crate" - crate_type = /obj/structure/closet/crate/hydroponics - -/datum/supply_pack/organic/hydroponics/hydrotank - name = "Hydroponics Backpack Crate" - desc = "Bring on the flood with this high-capacity backpack crate. Contains 500 units of life-giving H2O. Requires hydroponics access to open." - cost = 1200 - access = ACCESS_HYDROPONICS - contains = list(/obj/item/watertank) - crate_name = "hydroponics backpack crate" - crate_type = /obj/structure/closet/crate/secure - -/datum/supply_pack/organic/mre - name = "MRE supply kit (emergency rations)" - desc = "The lights are out. Oxygen's running low. You've run out of food except space weevils. Don't let this be you! Order our NT branded MRE kits today! This pack contains 5 MRE packs with a randomized menu and an oxygen tank." - cost = 2000 - contains = list(/obj/item/storage/box/mre/menu1/safe, - /obj/item/storage/box/mre/menu1/safe, - /obj/item/storage/box/mre/menu2/safe, - /obj/item/storage/box/mre/menu2/safe, - /obj/item/storage/box/mre/menu3, - /obj/item/storage/box/mre/menu4/safe) - crate_name = "MRE crate (emergency rations)" +/datum/supply_pack/organic/mixedboxes + name = "Mixed Ingredient Boxes" + desc = "Get overwhelmed with inspiration by ordering these boxes of surprise ingredients! Get four boxes filled with an assortment of products!" + cost = 2300 + contains = list(/obj/item/storage/box/ingredients/wildcard, + /obj/item/storage/box/ingredients/wildcard, + /obj/item/storage/box/ingredients/wildcard, + /obj/item/storage/box/ingredients/wildcard) + crate_name = "wildcard food crate" + crate_type = /obj/structure/closet/crate/freezer /datum/supply_pack/organic/pizza name = "Pizza Crate" @@ -217,16 +246,105 @@ considered \[REDACTED\] and returned at your leisure. Note that objects the anomaly produces are specifically attuned exactly to the individual opening the anomaly; regardless \ of species, the individual will find the object edible and it will taste great according to their personal definitions, which vary significantly based on person and species.") -/datum/supply_pack/organic/potted_plants - name = "Potted Plants Crate" - desc = "Spruce up the station with these lovely plants! Contains a random assortment of five potted plants from Nanotrasen's potted plant research division. Warranty void if thrown." - cost = 730 - contains = list(/obj/item/twohanded/required/kirbyplants/random, - /obj/item/twohanded/required/kirbyplants/random, - /obj/item/twohanded/required/kirbyplants/random, - /obj/item/twohanded/required/kirbyplants/random, - /obj/item/twohanded/required/kirbyplants/random) - crate_name = "potted plants crate" + +////////////////////////////////////////////////////////////////////////////// +//////////////////////////// Hydroponics ///////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +/datum/supply_pack/organic/hydroponics/beekeeping_suits + name = "Beekeeper Suit Crate" + desc = "Bee business booming? Better be benevolent and boost botany by bestowing bi-Beekeeper-suits! Contains two beekeeper suits and matching headwear." + cost = 1300 + contains = list(/obj/item/clothing/head/beekeeper_head, + /obj/item/clothing/suit/beekeeper_suit, + /obj/item/clothing/head/beekeeper_head, + /obj/item/clothing/suit/beekeeper_suit) + crate_name = "beekeeper suits" + crate_type = /obj/structure/closet/crate/hydroponics + +/datum/supply_pack/organic/hydroponics/beekeeping_fullkit + name = "Beekeeping Starter Crate" + desc = "BEES BEES BEES. Contains three honey frames, a beekeeper suit & helmet, flyswatter, bee house, and, of course, a pure-bred Nanotrasen-Standardized Queen Bee!" + cost = 1800 + contains = list(/obj/structure/beebox/unwrenched, + /obj/item/honey_frame, + /obj/item/honey_frame, + /obj/item/honey_frame, + /obj/item/queen_bee/bought, + /obj/item/clothing/head/beekeeper_head, + /obj/item/clothing/suit/beekeeper_suit, + /obj/item/melee/flyswatter) + crate_name = "beekeeping starter crate" + crate_type = /obj/structure/closet/crate/hydroponics + +/datum/supply_pack/organic/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 + +/* Maintenance Garden Crate basically does this and more. +/datum/supply_pack/organic/hydroponics + name = "Hydroponics Crate" + desc = "Supplies for growing a great garden! Contains two bottles of ammonia, two Plant-B-Gone spray bottles, a hatchet, cultivator, plant analyzer, as well as a pair of leather gloves and a botanist's apron." + cost = 1750 + contains = list(/obj/item/reagent_containers/spray/plantbgone, + /obj/item/reagent_containers/spray/plantbgone, + /obj/item/reagent_containers/glass/bottle/ammonia, + /obj/item/reagent_containers/glass/bottle/ammonia, + /obj/item/hatchet, + /obj/item/cultivator, + /obj/item/plant_analyzer, + /obj/item/clothing/gloves/botanic_leather, + /obj/item/clothing/suit/apron) + crate_name = "hydroponics crate" + crate_type = /obj/structure/closet/crate/hydroponics +*/ +/datum/supply_pack/organic/hydroponics/hydrotank + name = "Hydroponics Backpack Crate" + desc = "Bring on the flood with this high-capacity backpack crate. Contains 500 units of life-giving H2O. Requires hydroponics access to open." + cost = 1200 + access = ACCESS_HYDROPONICS + contains = list(/obj/item/watertank) + crate_name = "hydroponics backpack crate" + crate_type = /obj/structure/closet/crate/secure + +/datum/supply_pack/organic/hydroponics/maintgarden + name = "Maintenance Garden Crate" + desc = "Set up your own tiny paradise with do-it-yourself botany kit. Contains sandstone for dirt plots, pest spray, ammonia, a portable seed generator, basic botanical tools, and some seeds to start off with." + cost = 2700 + contains = list(/obj/item/storage/bag/plants/portaseeder, + /obj/item/reagent_containers/spray/pestspray, + /obj/item/stack/sheet/mineral/sandstone/twelve, + /obj/item/reagent_containers/glass/bucket, + /obj/item/reagent_containers/glass/bottle/ammonia, + /obj/item/reagent_containers/glass/bottle/ammonia, + /obj/item/hatchet, + /obj/item/cultivator, + /obj/item/plant_analyzer, + /obj/item/flashlight, + /obj/item/seeds/carrot, + /obj/item/seeds/carrot, + /obj/item/seeds/tower, + /obj/item/seeds/tower, + /obj/item/seeds/watermelon, + /obj/item/seeds/watermelon, + /obj/item/seeds/grass, + /obj/item/seeds/grass) + crate_name = "maint garden crate" crate_type = /obj/structure/closet/crate/hydroponics /datum/supply_pack/organic/seeds @@ -249,9 +367,29 @@ crate_name = "seeds crate" crate_type = /obj/structure/closet/crate/hydroponics +////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////// Misc ///////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +/datum/supply_pack/organic/hunting + name = "Hunting Gear" + desc = "Even in space, we can find prey to hunt, this crate contains everthing a fine hunter needs to have a sporting time. This crate needs armory access to open. A true huntter only needs a fine bottle of cognac, a nice coat, some good o' cigars, and of cource a hunting shotgun. " + cost = 3500 + contraband = TRUE + contains = list(/obj/item/clothing/head/flatcap, + /obj/item/clothing/suit/hooded/wintercoat/captain, + /obj/item/reagent_containers/food/drinks/bottle/cognac, + /obj/item/storage/fancy/cigarettes/cigars/havana, + /obj/item/clothing/gloves/color/white, + /obj/item/clothing/under/rank/curator, + /obj/item/gun/ballistic/shotgun/lethal) + access = ACCESS_ARMORY + crate_name = "sporting crate" + crate_type = /obj/structure/closet/crate/secure // Would have liked a wooden crate but access >:( + /datum/supply_pack/organic/vday name = "Surplus Valentine Crate" - desc = "Turns out we got warehouses of this love-y dove-y crap. Were sending out small barged buddle of Valentine gear. This crate has two boxes of chocolate, three poppy flowers, five candy hearts, and three cards." + desc = "Turns out we got warehouses of this love-y dove-y crap. We're sending out small bargain buddle of Valentine gear. This crate has two boxes of chocolate, three poppy flowers, five candy hearts, and three cards." cost = 3000 contraband = TRUE contains = list(/obj/item/storage/fancy/heart_box, @@ -269,22 +407,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 ace64b21fb..981e343045 100644 --- a/code/modules/cargo/packs/science.dm +++ b/code/modules/cargo/packs/science.dm @@ -85,7 +85,7 @@ /datum/supply_pack/science/monkey name = "Monkey Cube Crate" desc = "Stop monkeying around! Contains seven monkey cubes. Just add water!" - cost = 2000 + cost = 1500 contains = list (/obj/item/storage/box/monkeycubes) crate_name = "monkey cube crate" @@ -131,7 +131,7 @@ /datum/supply_pack/science/relic name = "Relic Crate" - desc = "Ever want to play with old discounted toys? Look no more. Contains two relics." + desc = "Ever wanted to play with old discounted toys? Look no further. Contains two relics." cost = 1000 contraband = TRUE contains = list(/obj/item/relic, 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/packs/service.dm b/code/modules/cargo/packs/service.dm index 14bde519e1..8fd5b6eb58 100644 --- a/code/modules/cargo/packs/service.dm +++ b/code/modules/cargo/packs/service.dm @@ -9,143 +9,25 @@ /datum/supply_pack/service group = "Service" -/datum/supply_pack/service/advlighting - name = "Advanced Lighting crate" - desc = "Thanks to advanced lighting tech we here at the Lamp Factory have be able to produce more lamps and lamp items! This crate has three lamps, a box of lights and a state of the art rapid-light-device!" - cost = 2750 - contains = list(/obj/item/construction/rld, - /obj/item/flashlight/lamp, - /obj/item/flashlight/lamp, - /obj/item/flashlight/lamp/green, - /obj/item/storage/box/lights/mixed) - crate_name = "advanced lighting crate" - crate_type = /obj/structure/closet/crate/secure +////////////////////////////////////////////////////////////////////////////// +/////////////////////////////// Cargo //////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// /datum/supply_pack/service/cargo_supples name = "Cargo Supplies Crate" - desc = "Sold everything that wasn't bolted down? You can get right back to work with this crate containing stamps, an export scanner, destination tagger, hand labeler and some package wrapping." + desc = "Sold everything that wasn't bolted down? You can get right back to work with this crate containing stamps, an export scanner, destination tagger, hand labeler and some package wrapping. Now with extra toner cartidges!" cost = 1000 contains = list(/obj/item/stamp, /obj/item/stamp/denied, /obj/item/export_scanner, /obj/item/destTagger, /obj/item/hand_labeler, + /obj/item/toner, + /obj/item/toner, + /obj/item/stack/packageWrap, /obj/item/stack/packageWrap) crate_name = "cargo supplies crate" -/datum/supply_pack/service/carpet_exotic - name = "Exotic Carpet Crate" - desc = "Exotic carpets straight from Space Russia, for all your decorating needs. Contains 100 tiles each of 10 different flooring patterns." - cost = 7000 - contains = list(/obj/item/stack/tile/carpet/blue/fifty, - /obj/item/stack/tile/carpet/blue/fifty, - /obj/item/stack/tile/carpet/cyan/fifty, - /obj/item/stack/tile/carpet/cyan/fifty, - /obj/item/stack/tile/carpet/green/fifty, - /obj/item/stack/tile/carpet/green/fifty, - /obj/item/stack/tile/carpet/orange/fifty, - /obj/item/stack/tile/carpet/orange/fifty, - /obj/item/stack/tile/carpet/purple/fifty, - /obj/item/stack/tile/carpet/purple/fifty, - /obj/item/stack/tile/carpet/red/fifty, - /obj/item/stack/tile/carpet/red/fifty, - /obj/item/stack/tile/carpet/royalblue/fifty, - /obj/item/stack/tile/carpet/royalblue/fifty, - /obj/item/stack/tile/carpet/royalblack/fifty, - /obj/item/stack/tile/carpet/royalblack/fifty, - /obj/item/stack/tile/carpet/blackred/fifty, - /obj/item/stack/tile/carpet/blackred/fifty, - /obj/item/stack/tile/carpet/monochrome/fifty, - /obj/item/stack/tile/carpet/monochrome/fifty) - crate_name = "exotic carpet crate" - -/datum/supply_pack/service/food_cart - name = "Food Cart Crate" - desc = "Want to sell food on the go? Cook lost their cart? Well we just so happen to have a few carts to spare!" - cost = 1000 - contains = list(/obj/machinery/food_cart) - crate_name = "food cart crate" - crate_type = /obj/structure/closet/crate - -/datum/supply_pack/service/noslipfloor - name = "High-traction Floor Tiles" - desc = "Make slipping a thing of the past with sixty industrial-grade anti-slip floortiles!" - cost = 2000 - contains = list(/obj/item/stack/tile/noslip/thirty, - /obj/item/stack/tile/noslip/thirty) - crate_name = "high-traction floor tiles crate" - -/datum/supply_pack/service/icecream_cart - name = "Ice Cream Cart Crate" - desc = "Plasma fire a to hot for you, want a nice treat after a hard days work? Well now we have the cart for you! This Ice Cream Vat has everthing you need to make you and your friends so ice cream treats! This cart comes stocked with some ingredients for each type of scoopable icecream." - cost = 2750 //Comes prestocked with basic ingredients - contains = list(/obj/machinery/icecream_vat) - crate_name = "ice cream vat crate" - crate_type = /obj/structure/closet/crate - -/datum/supply_pack/service/janitor - name = "Janitorial Supplies Crate" - desc = "Fight back against dirt and grime with Nanotrasen's Janitorial Essentials(tm)! Contains three buckets, caution signs, and cleaner grenades. Also has a single mop, spray cleaner, rag, NT soap and a trash bag." - cost = 1300 - contains = list(/obj/item/reagent_containers/glass/bucket, - /obj/item/reagent_containers/glass/bucket, - /obj/item/reagent_containers/glass/bucket, - /obj/item/mop, - /obj/item/caution, - /obj/item/caution, - /obj/item/caution, - /obj/item/storage/bag/trash, - /obj/item/reagent_containers/spray/cleaner, - /obj/item/reagent_containers/rag, - /obj/item/grenade/chem_grenade/cleaner, - /obj/item/grenade/chem_grenade/cleaner, - /obj/item/grenade/chem_grenade/cleaner, - /obj/item/soap/nanotrasen) - crate_name = "janitorial supplies crate" - -/datum/supply_pack/service/janitor/janicart - name = "Janitorial Cart and Galoshes Crate" - desc = "The keystone to any successful janitor. As long as you have feet, this pair of galoshes will keep them firmly planted on the ground. Also contains a janitorial cart." - cost = 2000 - contains = list(/obj/structure/janitorialcart, - /obj/item/clothing/shoes/galoshes) - crate_name = "janitorial cart crate" - crate_type = /obj/structure/closet/crate/large - -/datum/supply_pack/service/janitor/janitank - name = "Janitor Backpack Crate" - desc = "Call forth divine judgement upon dirt and grime with this high capacity janitor backpack. Contains 500 units of station-cleansing cleaner. Requires janitor access to open." - cost = 1000 - access = ACCESS_JANITOR - contains = list(/obj/item/watertank/janitor) - crate_name = "janitor backpack crate" - crate_type = /obj/structure/closet/crate/secure - -/datum/supply_pack/service/janitor/janpremium - name = "Janitor Premium Supplies" - desc = "Do to the union for better supplies, we have desided to make a deal for you, In this crate you can get a brand new chem, Drying Angent this stuff is the work of slimes or magic! This crate also contains a rag to test out the Drying Angent magic, three wet floor signs, and some spare bottles of ammonia." - cost = 1750 - access = ACCESS_JANITOR - contains = list(/obj/item/caution, - /obj/item/caution, - /obj/item/caution, - /obj/item/reagent_containers/rag, - /obj/item/reagent_containers/glass/bottle/ammonia, - /obj/item/reagent_containers/glass/bottle/ammonia, - /obj/item/reagent_containers/glass/bottle/ammonia, - /obj/item/reagent_containers/spray/drying_agent) - crate_name = "janitor backpack crate" - -/datum/supply_pack/service/janitor/janpimp - name = "Custodial Cruiser" - desc = "Clown steal your ride? Assistant lock it in the dorms? Order a new one and get back to cleaning in style!" - cost = 3000 - access = ACCESS_JANITOR - contains = list(/obj/vehicle/ridden/janicart, - /obj/item/key/janitor) - crate_name = "janitor ride crate" - crate_type = /obj/structure/closet/crate/large - /datum/supply_pack/service/mule name = "MULEbot Crate" desc = "Pink-haired Quartermaster not doing her job? Replace her with this tireless worker, today!" @@ -154,59 +36,6 @@ crate_name = "\improper MULEbot Crate" crate_type = /obj/structure/closet/crate/large -/datum/supply_pack/service/party - name = "Party Equipment" - desc = "Celebrate both life and death on the station with Nanotrasen's Party Essentials(tm)! Contains seven colored glowsticks, four beers, two ales, and a bottle of patron, goldschlager, and shaker!" - cost = 2000 - contains = list(/obj/item/storage/box/drinkingglasses, - /obj/item/reagent_containers/food/drinks/shaker, - /obj/item/reagent_containers/food/drinks/bottle/patron, - /obj/item/reagent_containers/food/drinks/bottle/goldschlager, - /obj/item/reagent_containers/food/drinks/ale, - /obj/item/reagent_containers/food/drinks/ale, - /obj/item/reagent_containers/food/drinks/beer, - /obj/item/reagent_containers/food/drinks/beer, - /obj/item/reagent_containers/food/drinks/beer, - /obj/item/reagent_containers/food/drinks/beer, - /obj/item/flashlight/glowstick, - /obj/item/flashlight/glowstick/red, - /obj/item/flashlight/glowstick/blue, - /obj/item/flashlight/glowstick/cyan, - /obj/item/flashlight/glowstick/orange, - /obj/item/flashlight/glowstick/yellow, - /obj/item/flashlight/glowstick/pink) - crate_name = "party equipment crate" - -/datum/supply_pack/service/carpet - name = "Premium Carpet Crate" - desc = "Plasteel floor tiles getting on your nerves? These stacks of extra soft carpet will tie any room together. Contains the classics." - cost = 1000 - contains = list(/obj/item/stack/tile/carpet/fifty, - /obj/item/stack/tile/carpet/fifty, - /obj/item/stack/tile/carpet/black/fifty, - /obj/item/stack/tile/carpet/black/fifty) - crate_name = "premium carpet crate" - -/datum/supply_pack/service/carpet2 - name = "Premium Carpet Crate #2" - desc = "Plasteel floor tiles getting on your nerves? These stacks of extra soft carpet will tie any room together. Contains red, and monochrome" - cost = 1000 - contains = list(/obj/item/stack/tile/carpet/blackred/fifty, - /obj/item/stack/tile/carpet/blackred/fifty, - /obj/item/stack/tile/carpet/monochrome/fifty, - /obj/item/stack/tile/carpet/monochrome/fifty) - crate_name = "premium carpet crate #2" - -/datum/supply_pack/service/lightbulbs - name = "Replacement Lights" - desc = "May the light of Aether shine upon this station! Or at least, the light of forty two light tubes and twenty one light bulbs as well as a light replacer." - cost = 1200 - contains = list(/obj/item/storage/box/lights/mixed, - /obj/item/storage/box/lights/mixed, - /obj/item/storage/box/lights/mixed, - /obj/item/lightreplacer) - crate_name = "replacement lights" - /datum/supply_pack/service/minerkit name = "Shaft Miner Starter Kit" desc = "All the miners died too fast? Assistant wants to get a taste of life off-station? Either way, this kit is the best way to turn a regular crewman into an ore-producing, monster-slaying machine. Contains meson goggles, a pickaxe, advanced mining scanner, cargo headset, ore bag, gasmask, and explorer suit. Requires QM access to open." @@ -223,9 +52,188 @@ crate_type = /obj/structure/closet/crate/secure ////////////////////////////////////////////////////////////////////////////// -/////////////////////////// Vending Restocks ///////////////////////////////// +/////////////////////// Chef, Botanist, Bartender //////////////////////////// ////////////////////////////////////////////////////////////////////////////// +/datum/supply_pack/service/buildabar + name = "Build a Bar Crate" + desc = "Looking to set up your own little safe haven? Maintenance bar too much of a bummer to work on? Maybe you just want to set up shop right in front of the bartender. Whatever your reasons, get a jump-start on this with this handy kit. Contains circuitboards for bar equipment, some parts, and some basic bartending supplies. (Batteries not Included)" + cost = 3750 + contains = list(/obj/item/storage/box/drinkingglasses, + /obj/item/storage/box/drinkingglasses, + /obj/item/stock_parts/matter_bin, + /obj/item/stock_parts/matter_bin, + /obj/item/stock_parts/matter_bin, + /obj/item/stock_parts/matter_bin, + /obj/item/stock_parts/matter_bin, + /obj/item/stock_parts/matter_bin, + /obj/item/stock_parts/manipulator, + /obj/item/stock_parts/manipulator, + /obj/item/stock_parts/manipulator, + /obj/item/stock_parts/capacitor, + /obj/item/stock_parts/capacitor, + /obj/item/stack/sheet/metal/ten, + /obj/item/stack/sheet/metal/five, + /obj/item/stack/sheet/glass/five, + /obj/item/stack/cable_coil/random, + /obj/item/reagent_containers/rag, + /obj/item/book/manual/wiki/barman_recipes, + /obj/item/book/granter/action/drink_fling, + /obj/item/reagent_containers/food/drinks/shaker, + /obj/item/circuitboard/machine/chem_dispenser/drinks/beer, + /obj/item/circuitboard/machine/chem_dispenser/drinks, + /obj/item/circuitboard/machine/dish_drive) + crate_name = "build a bar crate" + +/datum/supply_pack/service/food_cart + name = "Food Cart Crate" + desc = "Want to sell food on the go? Cook lost their cart? Well we just so happen to have a few carts to spare!" + cost = 1000 + contains = list(/obj/machinery/food_cart) + crate_name = "food cart crate" + crate_type = /obj/structure/closet/crate + +/datum/supply_pack/service/icecream_cart + name = "Ice Cream Cart Crate" + desc = "Plasma fire too hot for you? Want a nice treat after a hard days work? Well now we have the cart for you! This Ice Cream Vat has everthing you need to make you and your friends so ice cream treats! This cart comes stocked with some ingredients for each type of scoopable icecream." + cost = 2750 //Comes prestocked with basic ingredients + contains = list(/obj/machinery/icecream_vat) + crate_name = "ice cream vat crate" + crate_type = /obj/structure/closet/crate + +/datum/supply_pack/service/cutlery + name = "Kitchen Cutlery Deluxe Set" + desc = "Need to slice and dice away those ''Tomatoes''? 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, //Deluxe for a reason + /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, + /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" + +////////////////////////////////////////////////////////////////////////////// +/////////////////////////////// Janitor ////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +/datum/supply_pack/service/advlighting + name = "Advanced Lighting crate" + desc = "Thanks to advanced lighting tech we here at the Lamp Factory have be able to produce more lamps and lamp items! This crate has three lamps, a box of lights and a state of the art rapid-light-device!" + cost = 2750 + contains = list(/obj/item/construction/rld, + /obj/item/flashlight/lamp, + /obj/item/flashlight/lamp, + /obj/item/flashlight/lamp/green, + /obj/item/storage/box/lights/mixed) + crate_name = "advanced lighting crate" + crate_type = /obj/structure/closet/crate/secure + +/datum/supply_pack/service/lightbulbs + name = "Replacement Lights" //Subgrouping this with Advanced Lighting Crate, they're both lighting related. + desc = "May the light of Aether shine upon this station! Or at least, the light of forty two light tubes and twenty one light bulbs as well as a light replacer." + cost = 1200 + contains = list(/obj/item/storage/box/lights/mixed, + /obj/item/storage/box/lights/mixed, + /obj/item/storage/box/lights/mixed, + /obj/item/lightreplacer) + crate_name = "replacement lights" + +/datum/supply_pack/service/janitor/advanced + name = "Advanced Sanitation Crate" + desc = "Contains all the essentials for an advanced spacefaring cleanup crew. This kit includes a trashbag, an advanced mop, a bottle of space cleaner, a floor buffer, and a holosign projector. Requires Janitorial Access to Open" + cost = 5700 + access = ACCESS_JANITOR + contains = list(/obj/item/storage/bag/trash/bluespace, + /obj/item/reagent_containers/spray/cleaner, + /obj/item/mop/advanced, + /obj/item/lightreplacer, + /obj/item/janiupgrade, + /obj/item/holosign_creator) + crate_name = "advanced santation crate" + crate_type = /obj/structure/closet/crate/secure + +/datum/supply_pack/service/janitor/janpimp + name = "Custodial Cruiser" + desc = "Clown steal your ride? Assistant lock it in the dorms? Order a new one and get back to cleaning in style!" + cost = 3000 + access = ACCESS_JANITOR + contains = list(/obj/vehicle/ridden/janicart, + /obj/item/key/janitor) + crate_name = "janitor ride crate" + crate_type = /obj/structure/closet/crate/large + +/datum/supply_pack/service/janitor/janitank + name = "Janitor Backpack Crate" + desc = "Call forth divine judgement upon dirt and grime with this high capacity janitor backpack. Contains 500 units of station-cleansing cleaner. Requires janitor access to open." + cost = 1000 + access = ACCESS_JANITOR + contains = list(/obj/item/watertank/janitor) + crate_name = "janitor backpack crate" + crate_type = /obj/structure/closet/crate/secure + +/datum/supply_pack/service/janitor/janpremium + name = "Janitor Supplies (Premium)" + desc = "The custodial union is in a tizzy, so we've gathered up some better supplies for you. In this crate you can get a brand new chem, Drying Agent. This stuff is the work of slimes or magic! This crate also contains a rag to test out the Drying Angent magic, several cleaning grenades, some spare bottles of ammonia, and an MCE (or Massive Cleaning Explosive)." + cost = 2700 + contains = list(/obj/item/grenade/clusterbuster/cleaner, + /obj/item/grenade/chem_grenade/cleaner, + /obj/item/grenade/chem_grenade/cleaner, + /obj/item/grenade/chem_grenade/cleaner, + /obj/item/reagent_containers/rag, + /obj/item/reagent_containers/glass/bottle/ammonia, + /obj/item/reagent_containers/glass/bottle/ammonia, + /obj/item/reagent_containers/glass/bottle/ammonia, + /obj/item/reagent_containers/spray/drying_agent) + crate_name = "premium janitorial crate" + +/datum/supply_pack/service/janitor/starter + name = "Janitorial Supplies (Standard)" + desc = "Fight back against dirt and grime with Nanotrasen's Janitorial Essentials(tm)! Contains three buckets, caution signs, and cleaner grenades. Also has a single mop, spray cleaner, rag, NT soap and a trash bag." + cost = 1300 + contains = list(/obj/item/reagent_containers/glass/bucket, + /obj/item/reagent_containers/glass/bucket, + /obj/item/reagent_containers/glass/bucket, + /obj/item/mop, + /obj/item/caution, + /obj/item/caution, + /obj/item/caution, + /obj/item/storage/bag/trash, + /obj/item/reagent_containers/spray/cleaner, + /obj/item/reagent_containers/rag, + /obj/item/grenade/chem_grenade/cleaner, + /obj/item/grenade/chem_grenade/cleaner, + /obj/item/grenade/chem_grenade/cleaner, + /obj/item/soap/nanotrasen) + crate_name = "standard janitorial crate" + +/datum/supply_pack/service/janitor/janicart + name = "Janicart and Galoshes Crate" + desc = "The keystone to any successful janitor. As long as you have feet, this pair of galoshes will keep them firmly planted on the ground. Also contains a janitorial cart." + cost = 2000 + contains = list(/obj/structure/janitorialcart, + /obj/item/clothing/shoes/galoshes) + crate_name = "janitorial cart crate" + crate_type = /obj/structure/closet/crate/large + +////////////////////////////////////////////////////////////////////////////// +//////////////////////////// Vendor Refills ////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + /datum/supply_pack/service/vending/bartending name = "Bartending Supply Crate" desc = "Bring on the booze with vending machine refills, as well as a free book containing the well-kept secrets to the bartending trade!" diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm index 89e221c339..5f3d6dab0a 100644 --- a/code/modules/cargo/supplypod.dm +++ b/code/modules/cargo/supplypod.dm @@ -15,15 +15,17 @@ armor = list("melee" = 30, "bullet" = 50, "laser" = 50, "energy" = 100, "bomb" = 100, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 80) anchored = TRUE //So it cant slide around after landing anchorable = FALSE + flags_1 = PREVENT_CONTENTS_EXPLOSION_1 //*****NOTE*****: Many of these comments are similarly described in centcom_podlauncher.dm. If you change them here, please consider doing so in the centcom podlauncher code as well! var/adminNamed = FALSE //Determines whether or not the pod has been named by an admin. If true, the pod's name will not get overridden when the style of the pod changes (changing the style of the pod normally also changes the name+desc) var/bluespace = FALSE //If true, the pod deletes (in a shower of sparks) after landing var/landingDelay = 30 //How long the pod takes to land after launching var/openingDelay = 30 //How long the pod takes to open after landing - var/departureDelay = 30 //How long the pod takes to leave after opening (if bluespace=true, it deletes. if reversing=true, it flies back to centcom) + var/departureDelay = 30 //How long the pod takes to leave after opening. If bluespace = TRUE, it deletes. If reversing = TRUE, it flies back to centcom. var/damage = 0 //Damage that occurs to any mob under the pod when it lands. var/effectStun = FALSE //If true, stuns anyone under the pod when it launches until it lands, forcing them to get hit by the pod. Devilish! var/effectLimb = FALSE //If true, pops off a limb (if applicable) from anyone caught under the pod when it lands + var/effectOrgans = FALSE //If true, yeets out every limb and organ from anyone caught under the pod when it lands var/effectGib = FALSE //If true, anyone under the pod will be gibbed when it lands var/effectStealth = FALSE //If true, a target icon isnt displayed on the turf where the pod will land var/effectQuiet = FALSE //The female sniper. If true, the pod makes no noise (including related explosions, opening sounds, etc) @@ -31,10 +33,13 @@ var/effectCircle = FALSE //If true, allows the pod to come in at any angle. Bit of a weird feature but whatever its here var/style = STYLE_STANDARD //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. var/reversing = FALSE //If true, the pod will not send any items. Instead, after opening, it will close again (picking up items/mobs) and fly back to centcom + var/fallDuration = 4 + var/fallingSoundLength = 11 + var/fallingSound = 'sound/weapons/mortar_long_whistle.ogg'//Admin sound to play before the pod lands var/landingSound //Admin sound to play when the pod lands var/openingSound //Admin sound to play when the pod opens var/leavingSound //Admin sound to play when the pod leaves - var/soundVolume = 50 //Volume to play sounds at. Ignores the cap + var/soundVolume = 80 //Volume to play sounds at. Ignores the cap var/bay //Used specifically for the centcom_podlauncher datum. Holds the current bay the user is launching objects from. Bays are specific rooms on the centcom map. var/list/explosionSize = list(0,0,2,3) @@ -48,16 +53,18 @@ style = STYLE_CENTCOM bluespace = TRUE explosionSize = list(0,0,0,0) - landingDelay = 5 //Very speedy! + landingDelay = 20 //Very speedy! resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF /obj/structure/closet/supplypod/Initialize() - ..() + . = ..() setStyle(style, TRUE) //Upon initialization, give the supplypod an iconstate, name, and description based on the "style" variable. This system is important for the centcom_podlauncher to function correctly /obj/structure/closet/supplypod/update_icon() cut_overlays() - if (style != STYLE_INVISIBLE) //If we're invisible, we dont bother adding any overlays + if (style == STYLE_SEETHROUGH || style == STYLE_INVISIBLE) //If we're invisible, we dont bother adding any overlays + return + else if (opened) add_overlay("[icon_state]_open") else @@ -75,7 +82,7 @@ update_icon() /obj/structure/closet/supplypod/tool_interact(obj/item/W, mob/user) - if (bluespace) //We dont want to worry about interacting with bluespace pods, as they are due to delete themselves soon anyways. + if(bluespace) //We dont want to worry about interacting with bluespace pods, as they are due to delete themselves soon anyways. return FALSE else ..() @@ -86,9 +93,6 @@ /obj/structure/closet/supplypod/contents_explosion() //Supplypods also protect their contents from the harmful effects of fucking exploding. return -/obj/structure/closet/supplypod/prevent_content_explosion() //Useful for preventing epicenter explosions from damaging contents - return TRUE - /obj/structure/closet/supplypod/toggle(mob/living/user) //Supplypods shouldn't be able to be manually opened under any circumstances, as the open() proc generates supply order datums return @@ -101,17 +105,33 @@ if (effectLimb && iscarbon(M)) //If effectLimb is true (which means we pop limbs off when we hit people): var/mob/living/carbon/CM = M for (var/obj/item/bodypart/bodypart in CM.bodyparts) //Look at the bodyparts in our poor mob beneath our pod as it lands - if(bodypart.body_part != HEAD && bodypart.body_zone != CHEST)//we dont want to kill him, just teach em a lesson! + if(bodypart.body_part != HEAD && bodypart.body_part != CHEST)//we dont want to kill him, just teach em a lesson! if (bodypart.dismemberable) bodypart.dismember() //Using the power of flextape i've sawed this man's limb in half! break + if (effectOrgans && iscarbon(M)) //effectOrgans means remove every organ in our mob + var/mob/living/carbon/CM = M + for(var/X in CM.internal_organs) + var/destination = get_edge_target_turf(T, pick(GLOB.alldirs)) //Pick a random direction to toss them in + var/obj/item/organ/O = X + O.Remove(CM) //Note that this isn't the same proc as for lists + O.forceMove(T) //Move the organ outta the body + O.throw_at(destination, 2, 3) //Thow the organ at a random tile 3 spots away + sleep(1) + for (var/obj/item/bodypart/bodypart in CM.bodyparts) //Look at the bodyparts in our poor mob beneath our pod as it lands + var/destination = get_edge_target_turf(T, pick(GLOB.alldirs)) + if (bodypart.dismemberable) + bodypart.dismember() //Using the power of flextape i've sawed this man's bodypart in half! + bodypart.throw_at(destination, 2, 3) + sleep(1) + if (effectGib) //effectGib is on, that means whatever's underneath us better be fucking oof'd on M.adjustBruteLoss(5000) //THATS A LOT OF DAMAGE (called just in case gib() doesnt work on em) M.gib() //After adjusting the fuck outta that brute loss we finish the job with some satisfying gibs - M.adjustBruteLoss(damage) - - - if (B[1] || B[2] || B[3] || B[4]) //If the explosion list isn't all zeroes, call an explosion + else + M.adjustBruteLoss(damage) + var/explosion_sum = B[1] + B[2] + B[3] + B[4] + if (explosion_sum != 0) //If the explosion list isn't all zeroes, call an explosion explosion(get_turf(src), B[1], B[2], B[3], flame_range = B[4], silent = effectQuiet, ignorecap = istype(src, /obj/structure/closet/supplypod/centcompod)) //less advanced equipment than bluespace pod, so larger explosion when landing else if (!effectQuiet) //If our explosion list IS all zeroes, we still make a nice explosion sound (unless the effectQuiet var is true) playsound(src, "explosion", landingSound ? 15 : 80, 1) @@ -128,22 +148,31 @@ /obj/structure/closet/supplypod/open(atom/movable/holder, var/broken = FALSE, var/forced = FALSE) //The holder var represents an atom whose contents we will be working with var/turf/T = get_turf(holder) //Get the turf of whoever's contents we're talking about + if (!holder) + return + if(opened) + return + opened = TRUE //This is to ensure we don't open something that has already been opened var/mob/M if (istype(holder, /mob)) //Allows mobs to assume the role of the holder, meaning we look at the mob's contents rather than the supplypod's contents. Typically by this point the supplypod's contents have already been moved over to the mob's contents M = holder if (M.key && !forced && !broken) //If we are player controlled, then we shouldnt open unless the opening is manual, or if it is due to being destroyed (represented by the "broken" parameter) return - opened = TRUE //This is to ensure we don't open something that has already been opened if (openingSound) - playsound(get_turf(holder), openingSound, soundVolume, 0, 0) + playsound(get_turf(holder), openingSound, soundVolume, 0, 0) //Special admin sound to play INVOKE_ASYNC(holder, .proc/setOpened) //Use the INVOKE_ASYNC proc to call setOpened() on whatever the holder may be, without giving the atom/movable base class a setOpened() proc definition + if (style == STYLE_SEETHROUGH) + update_icon() for (var/atom/movable/O in holder.contents) //Go through the contents of the holder O.forceMove(T) //move everything from the contents of the holder to the turf of the holder - if (!effectQuiet) //If we aren't being quiet, play an open sound + if (!effectQuiet && !openingSound && style != STYLE_SEETHROUGH) //If we aren't being quiet, play the default pod open sound playsound(get_turf(holder), open_sound, 15, 1, -3) if (broken) //If the pod is opening because it's been destroyed, we end here return - addtimer(CALLBACK(src, .proc/depart, holder), departureDelay) //Finish up the pod's duties after a certain amount of time + if (style == STYLE_SEETHROUGH) + depart(src) + else + addtimer(CALLBACK(src, .proc/depart, holder), departureDelay) //Finish up the pod's duties after a certain amount of time /obj/structure/closet/supplypod/proc/depart(atom/movable/holder) if (leavingSound) @@ -151,7 +180,7 @@ if (reversing) //If we're reversing, we call the close proc. This sends the pod back up to centcom close(holder) else if (bluespace) //If we're a bluespace pod, then delete ourselves (along with our holder, if a seperate holder exists) - if (style != STYLE_INVISIBLE) + if (!effectQuiet && style != STYLE_INVISIBLE && style != STYLE_SEETHROUGH) do_sparks(5, TRUE, holder) //Create some sparks right before closing qdel(src) //Delete ourselves and the holder if (holder != src) @@ -164,13 +193,14 @@ if (ismob(O) && !isliving(O)) //We dont want to take ghosts with us continue O.forceMove(holder) //Put objects inside before we close - var/obj/effect/temp_visual/risingPod = new /obj/effect/temp_visual/DPfall(get_turf(holder), src) //Make a nice animation of flying back up + var/obj/effect/temp_visual/risingPod = new /obj/effect/abstract/DPfall(get_turf(holder), src) //Make a nice animation of flying back up risingPod.pixel_z = 0 //The initial value of risingPod's pixel_z is 200 because it normally comes down from a high spot holder.forceMove(bay) //Move the pod back to centcom, where it belongs animate(risingPod, pixel_z = 200, time = 10, easing = LINEAR_EASING) //Animate our rising pod + QDEL_IN(risingPod, 10) reversing = FALSE //Now that we're done reversing, we set this to false (otherwise we would get stuck in an infinite loop of calling the close proc at the bottom of open() ) + bluespace = TRUE //Make it so that the pod doesn't stay in centcom forever open(holder, forced = TRUE) - return /obj/structure/closet/supplypod/proc/setOpened() //Proc exists here, as well as in any atom that can assume the role of a "holder" of a supplypod. Check the open() proc for more details update_icon() @@ -179,12 +209,11 @@ update_icon() /obj/structure/closet/supplypod/Destroy() - if (!opened) //If we havent opened yet, we're opening because we've been destroyed. Lets dump our contents by opening up - open(src, broken = TRUE) - return ..() + open(src, broken = TRUE) //Lets dump our contents by opening up + . = ..() //------------------------------------FALLING SUPPLY POD-------------------------------------// -/obj/effect/temp_visual/DPfall //Falling pod +/obj/effect/abstract/DPfall //Falling pod name = "" icon = 'icons/obj/supplypods.dmi' pixel_x = -16 @@ -192,17 +221,22 @@ pixel_z = 200 desc = "Get out of the way!" layer = FLY_LAYER//that wasnt flying, that was falling with style! - randomdir = FALSE icon_state = "" -/obj/effect/temp_visual/DPfall/Initialize(dropLocation, obj/structure/closet/supplypod/pod) - if (pod.style != STYLE_INVISIBLE) //Check to ensure the pod isn't invisible +/obj/effect/abstract/DPfall/Initialize(dropLocation, obj/structure/closet/supplypod/pod) + if (pod.style == STYLE_SEETHROUGH) + pixel_x = -16 + pixel_y = 0 + for (var/atom/movable/O in pod.contents) + var/icon/I = getFlatIcon(O) //im so sorry + add_overlay(I) + else if (pod.style != STYLE_INVISIBLE) //Check to ensure the pod isn't invisible icon_state = "[pod.icon_state]_falling" name = pod.name . = ..() //------------------------------------TEMPORARY_VISUAL-------------------------------------// -/obj/effect/DPtarget //This is the object that forceMoves the supplypod to it's location +/obj/effect/abstract/DPtarget //This is the object that forceMoves the supplypod to it's location name = "Landing Zone Indicator" desc = "A holographic projection designating the landing zone of something. It's probably best to stand back." icon = 'icons/mob/actions/actions_items.dmi' @@ -212,45 +246,60 @@ var/obj/effect/temp_visual/fallingPod //Temporary "falling pod" that we animate var/obj/structure/closet/supplypod/pod //The supplyPod that will be landing ontop of this target -/obj/effect/ex_act() - return - -/obj/effect/DPtarget/Initialize(mapload, podParam, var/datum/supply_order/SO = null) +/obj/effect/abstract/DPtarget/Initialize(mapload, podParam, single_order = null) + . = ..() if (ispath(podParam)) //We can pass either a path for a pod (as expressconsoles do), or a reference to an instantiated pod (as the centcom_podlauncher does) podParam = new podParam() //If its just a path, instantiate it pod = podParam - if (SO) - SO.generate(pod) - for (var/mob/living/M in podParam) //If there are any mobs in the supplypod, we want to forceMove them into the target. This is so that they can see where they are about to land, AND so that they don't get sent to the nullspace error room (as the pod is currently in nullspace) + if (single_order) + if (istype(single_order, /datum/supply_order)) + var/datum/supply_order/SO = single_order + SO.generate(pod) + else if (istype(single_order, /atom/movable)) + var/atom/movable/O = single_order + O.forceMove(pod) + for (var/mob/living/M in pod) //If there are any mobs in the supplypod, we want to forceMove them into the target. This is so that they can see where they are about to land, AND so that they don't get sent to the nullspace error room (as the pod is currently in nullspace) M.forceMove(src) if(pod.effectStun) //If effectStun is true, stun any mobs caught on this target until the pod gets a chance to hit them for (var/mob/living/M in get_turf(src)) M.Stun(pod.landingDelay+10, ignore_canstun = TRUE)//you aint goin nowhere, kid. if (pod.effectStealth) //If effectStealth is true we want to be invisible - alpha = 255 + icon_state = "" + if (pod.fallDuration == initial(pod.fallDuration) && pod.landingDelay + pod.fallDuration < pod.fallingSoundLength) + pod.fallingSoundLength = 3 //The default falling sound is a little long, so if the landing time is shorter than the default falling sound, use a special, shorter default falling sound + pod.fallingSound = 'sound/weapons/mortar_whistle.ogg' + var/soundStartTime = pod.landingDelay - pod.fallingSoundLength + pod.fallDuration + if (soundStartTime < 0) + soundStartTime = 1 + if (!pod.effectQuiet) + addtimer(CALLBACK(src, .proc/playFallingSound), soundStartTime) addtimer(CALLBACK(src, .proc/beginLaunch, pod.effectCircle), pod.landingDelay) -/obj/effect/DPtarget/proc/beginLaunch(effectCircle) //Begin the animation for the pod falling. The effectCircle param determines whether the pod gets to come in from any descent angle - fallingPod = new /obj/effect/temp_visual/DPfall(drop_location(), pod) +/obj/effect/abstract/DPtarget/proc/playFallingSound() + playsound(src, pod.fallingSound, pod.soundVolume, 1, 6) + +/obj/effect/abstract/DPtarget/proc/beginLaunch(effectCircle) //Begin the animation for the pod falling. The effectCircle param determines whether the pod gets to come in from any descent angle + fallingPod = new /obj/effect/abstract/DPfall(drop_location(), pod) var/matrix/M = matrix(fallingPod.transform) //Create a new matrix that we can rotate var/angle = effectCircle ? rand(0,360) : rand(70,110) //The angle that we can come in from - fallingPod.pixel_x = cos(angle)*200 //Use some ADVANCED MATHEMATICS to set the animated pod's position to somewhere on the edge of a circle with the center being the target - fallingPod.pixel_z = sin(angle)*200 + fallingPod.pixel_x = cos(angle)*400 //Use some ADVANCED MATHEMATICS to set the animated pod's position to somewhere on the edge of a circle with the center being the target + fallingPod.pixel_z = sin(angle)*400 var/rotation = Get_Pixel_Angle(fallingPod.pixel_z, fallingPod.pixel_x) //CUSTOM HOMEBREWED proc that is just arctan with extra steps M.Turn(rotation) //Turn our matrix accordingly fallingPod.transform = M //Transform the animated pod according to the matrix M = matrix(pod.transform) //Make another matrix based on the pod M.Turn(rotation) //Turn the matrix pod.transform = M //Turn the actual pod (Won't be visible until endLaunch() proc tho) - animate(fallingPod, pixel_z = 0, pixel_x = -16, time = 3, , easing = LINEAR_EASING) //Make the pod fall! At an angle! - addtimer(CALLBACK(src, .proc/endLaunch), 3, TIMER_CLIENT_TIME) //Go onto the last step after a very short falling animation + animate(fallingPod, pixel_z = 0, pixel_x = -16, time = pod.fallDuration, , easing = LINEAR_EASING) //Make the pod fall! At an angle! + addtimer(CALLBACK(src, .proc/endLaunch), pod.fallDuration, TIMER_CLIENT_TIME) //Go onto the last step after a very short falling animation -/obj/effect/DPtarget/proc/endLaunch() +/obj/effect/abstract/DPtarget/proc/endLaunch() + pod.update_icon() pod.forceMove(drop_location()) //The fallingPod animation is over, now's a good time to forceMove the actual pod into position + QDEL_NULL(fallingPod) //Delete the falling pod effect, because at this point its animation is over. We dont use temp_visual because we want to manually delete it as soon as the pod appears for (var/mob/living/M in src) //Remember earlier (initialization) when we moved mobs into the DPTarget so they wouldnt get lost in nullspace? Time to get them out M.forceMove(pod) pod.preOpen() //Begin supplypod open procedures. Here effects like explosions, damage, and other dangerous (and potentially admin-caused, if the centcom_podlauncher datum was used) memes will take place - QDEL_NULL(fallingPod) //The fallingPod's (the animated effect, not the actual pod) purpose is complete. It can rest easy now qdel(src) //ditto //------------------------------------UPGRADES-------------------------------------// diff --git a/code/modules/cargo/supplypod_beacon.dm b/code/modules/cargo/supplypod_beacon.dm index 3c82722f69..006f1a8084 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... @@ -76,12 +76,14 @@ to_chat(user, "[src] linked to [C].") /obj/item/supplypod_beacon/AltClick(mob/user) + . = ..() if (!user.canUseTopic(src, !issilicon(user))) return if (express_console) unlink_console() else to_chat(user, "There is no linked console!") + return TRUE /obj/item/supplypod_beacon/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/pen)) //give a tag that is visible from the linked express console @@ -91,5 +93,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 b3b6f0b576..c476e5a310 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 @@ -240,7 +241,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) /datum/preferences/proc/ShowChoices(mob/user) if(!user || !user.client) return - update_preview_icon() + update_preview_icon(current_tab != 2) var/list/dat = list("
    ") dat += "Character Settings" @@ -332,7 +333,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "[name] " dat += "
    " - update_preview_icon() dat += "" dat += "
    " dat += "

    Flavor Text

    " dat += "Set Examine Text
    " @@ -834,6 +834,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 += "
    " @@ -1558,10 +1564,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/temp_hsv = RGBtoHSV(new_mutantcolor) if(new_mutantcolor == "#000000") features["mcolor"] = pref_species.default_color - update_preview_icon() else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) // mutantcolors must be bright, but only if they affect the skin features["mcolor"] = sanitize_hexcolor(new_mutantcolor) - update_preview_icon() else to_chat(user, "Invalid color. Your color is not bright enough.") @@ -1571,10 +1575,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/temp_hsv = RGBtoHSV(new_mutantcolor) if(new_mutantcolor == "#000000") features["mcolor2"] = pref_species.default_color - update_preview_icon() else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) // mutantcolors must be bright, but only if they affect the skin features["mcolor2"] = sanitize_hexcolor(new_mutantcolor) - update_preview_icon() else to_chat(user, "Invalid color. Your color is not bright enough.") @@ -1584,10 +1586,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/temp_hsv = RGBtoHSV(new_mutantcolor) if(new_mutantcolor == "#000000") features["mcolor3"] = pref_species.default_color - update_preview_icon() else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) // mutantcolors must be bright, but only if they affect the skin features["mcolor3"] = sanitize_hexcolor(new_mutantcolor) - update_preview_icon() else to_chat(user, "Invalid color. Your color is not bright enough.") @@ -1729,14 +1729,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["body_markings"] = new_body_markings if(new_body_markings != "None") features["mam_body_markings"] = "None" - update_preview_icon() if("legs") var/new_legs new_legs = input(user, "Choose your character's legs:", "Character Preference") as null|anything in GLOB.legs_list if(new_legs) features["legs"] = new_legs - update_preview_icon() if("insect_wings") var/new_insect_wings @@ -1822,7 +1820,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) else if(new_mam_body_markings == "None") features["mam_body_markings"] = "Plain" features["body_markings"] = "None" - update_preview_icon() //Xeno Bodyparts if("xenohead")//Head or caste type @@ -1996,6 +1993,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 +2289,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 @@ -2301,8 +2297,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) pref_species = new /datum/species/human save_character() - character.set_species(chosen_species, icon_update = FALSE, pref_load = TRUE) character.dna.features = features.Copy() + character.set_species(chosen_species, icon_update = FALSE, pref_load = TRUE) character.dna.real_name = character.real_name character.dna.nameless = character.nameless character.dna.custom_species = character.custom_species @@ -2328,9 +2324,9 @@ 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() /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/client/verbs/aooc.dm b/code/modules/client/verbs/aooc.dm index 311c22955d..3f86a617e6 100644 --- a/code/modules/client/verbs/aooc.dm +++ b/code/modules/client/verbs/aooc.dm @@ -116,7 +116,7 @@ GLOBAL_VAR_INIT(normal_aooc_colour, "#ce254f") antaglisting |= M.current.client for(var/mob/M in GLOB.player_list) - if(M.client && (M.stat == DEAD || M.client.holder)) + if(M.client && (M.stat == DEAD || M.client.holder || is_special_character(M))) antaglisting |= M.client for(var/client/C in antaglisting) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 1793bd8f4b..dc9e46c4b4 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -62,7 +62,7 @@ if(ismecha(M.loc)) // stops inventory actions in a mech return - if(!M.incapacitated() && loc == M && istype(over_object, /obj/screen/inventory/hand)) + if(!. && !M.incapacitated() && loc == M && istype(over_object, /obj/screen/inventory/hand)) var/obj/screen/inventory/hand/H = over_object if(M.putItemFromInventoryInHandIfPossible(src, H.held_index)) add_fingerprint(usr) @@ -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) . = ..() @@ -254,16 +253,14 @@ BLIND // can't see anything H.update_suit_sensors() /obj/item/clothing/under/AltClick(mob/user) - if(..()) - return 1 - + . = ..() if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return + if(attached_accessory) + remove_accessory(user) else - if(attached_accessory) - remove_accessory(user) - else - rolldown() + rolldown() + return TRUE /obj/item/clothing/under/verb/jumpsuit_adjust() set name = "Adjust Jumpsuit Style" diff --git a/code/modules/clothing/ears/_ears.dm b/code/modules/clothing/ears/_ears.dm index 1dcaeb35fa..6775279ef6 100644 --- a/code/modules/clothing/ears/_ears.dm +++ b/code/modules/clothing/ears/_ears.dm @@ -18,7 +18,7 @@ /obj/item/clothing/ears/earmuffs/ComponentInitialize() . = ..() - AddComponent(/datum/component/earhealing) + AddElement(/datum/element/earhealing) AddComponent(/datum/component/wearertargeting/earprotection, list(SLOT_EARS)) /obj/item/clothing/ears/headphones diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index f140fb3074..206165a495 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() ..() @@ -43,15 +43,16 @@ //called when thermal glasses are emped. /obj/item/clothing/glasses/proc/thermal_overload() - if(ishuman(src.loc)) - var/mob/living/carbon/human/H = src.loc - if(!(HAS_TRAIT(H, TRAIT_BLIND))) - if(H.glasses == src) - to_chat(H, "[src] overloads and blinds you!") - H.flash_act(visual = 1) - H.blind_eyes(3) - H.blur_eyes(5) - H.adjust_eye_damage(5) + if(!ishuman(loc)) + return + var/mob/living/carbon/human/H = loc + var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) + if((!HAS_TRAIT(H, TRAIT_BLIND) || !eyes) && H.glasses == src) + to_chat(H, "[src] overloads and blinds you!") + H.flash_act(visual = 1) + H.blind_eyes(3) + H.blur_eyes(5) + eyes.applyOrganDamage(5) /obj/item/clothing/glasses/meson name = "optical meson scanner" @@ -362,7 +363,7 @@ desc = replacetext(desc, "person", "man") else if(user.gender == FEMALE) desc = replacetext(desc, "person", "woman") - ..() + . = ..() desc = desk /obj/item/clothing/glasses/thermal/eyepatch @@ -427,19 +428,17 @@ ..() /obj/item/clothing/glasses/AltClick(mob/user) + . = ..() if(glass_colour_type && ishuman(user)) var/mob/living/carbon/human/H = user - if(H.client) - if(H.client.prefs) - if(src == H.glasses) - H.client.prefs.uses_glasses_colour = !H.client.prefs.uses_glasses_colour - if(H.client.prefs.uses_glasses_colour) - to_chat(H, "You will now see glasses colors.") - else - to_chat(H, "You will no longer see glasses colors.") - H.update_glasses_color(src, 1) - else - return ..() + if(H.client?.prefs && src == H.glasses) + H.client.prefs.uses_glasses_colour = !H.client.prefs.uses_glasses_colour + if(H.client.prefs.uses_glasses_colour) + to_chat(H, "You will now see glasses colors.") + else + to_chat(H, "You will no longer see glasses colors.") + H.update_glasses_color(src, 1) + return TRUE /obj/item/clothing/glasses/proc/change_glass_color(mob/living/carbon/human/H, datum/client_colour/glass_colour/new_color_type) var/old_colour_type = glass_colour_type diff --git a/modular_citadel/code/modules/clothing/glasses/phantomthief.dm b/code/modules/clothing/glasses/phantomthief.dm similarity index 86% rename from modular_citadel/code/modules/clothing/glasses/phantomthief.dm rename to code/modules/clothing/glasses/phantomthief.dm index 353b0afb14..f5a15f7900 100644 --- a/modular_citadel/code/modules/clothing/glasses/phantomthief.dm +++ b/code/modules/clothing/glasses/phantomthief.dm @@ -19,9 +19,9 @@ . = ..() if(user.get_item_by_slot(SLOT_GLASSES) == src) if(world.time >= nextadrenalinepop) - to_chat(user, "The built-in adrenaline injector is ready for use.") + . += "The built-in adrenaline injector is ready for use." else - to_chat(user, "[DisplayTimeText(nextadrenalinepop - world.time)] left before the adrenaline injector can be used again.") + . += "[DisplayTimeText(nextadrenalinepop - world.time)] left before the adrenaline injector can be used again." /obj/item/clothing/glasses/phantomthief/syndicate/proc/injectadrenaline(mob/user, combatmodestate) if(istype(user) && combatmodestate && world.time >= nextadrenalinepop) 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/_head.dm b/code/modules/clothing/head/_head.dm index 358942627d..ec6db20cc4 100644 --- a/code/modules/clothing/head/_head.dm +++ b/code/modules/clothing/head/_head.dm @@ -41,14 +41,14 @@ H.update_inv_head() -///Special throw_impact for hats to frisbee hats at people to place them on their heads/attempt to de-hat them. +///Special throw_impact for hats to frisbee hats at people to place them on their heads. /obj/item/clothing/head/throw_impact(atom/hit_atom, datum/thrownthing/thrownthing) . = ..() ///if the thrown object's target zone isn't the head if(thrownthing.target_zone != BODY_ZONE_HEAD) return - ///ignore any hats with the tinfoil counter-measure enabled - if(clothing_flags & ANTI_TINFOIL_MANEUVER) + ///ignore any hats with downsides when worn + if(clothing_flags & IGNORE_HAT_TOSS) return ///if the hat happens to be capable of holding contents and has something in it. mostly to prevent super cheesy stuff like stuffing a mini-bomb in a hat and throwing it if(LAZYLEN(contents)) @@ -57,20 +57,8 @@ var/mob/living/carbon/H = hit_atom if(istype(H.head, /obj/item)) var/obj/item/WH = H.head - ///check if the item has NODROP - if(HAS_TRAIT(WH, TRAIT_NODROP)) - H.visible_message("[src] bounces off [H]'s [WH.name]!", "[src] bounces off your [WH.name], falling to the floor.") - return - ///check if the item is an actual clothing head item, since some non-clothing items can be worn - if(istype(WH, /obj/item/clothing/head)) - var/obj/item/clothing/head/WHH = WH - ///SNUG_FIT hats are immune to being knocked off - if(WHH.clothing_flags & SNUG_FIT) - H.visible_message("[src] bounces off [H]'s [WHH.name]!", "[src] bounces off your [WHH.name], falling to the floor.") - return - ///if the hat manages to knock something off - if(H.dropItemToGround(WH)) - H.visible_message("[src] knocks [WH] off [H]'s head!", "[WH] is suddenly knocked off your head by [src]!") + H.visible_message("[src] bounces off [H]'s [WH.name]!", "[src] bounces off your [WH.name], falling to the floor.") + return if(H.equip_to_slot_if_possible(src, SLOT_HEAD, FALSE, TRUE)) H.visible_message("[src] lands neatly on [H]'s head!", "[src] lands perfectly onto your head!") return @@ -84,6 +72,8 @@ R.visible_message("[src] lands neatly on top of [R].", "[src] lands perfectly on top of you.") R.place_on_head(src) //hats aren't designed to snugly fit borg heads or w/e so they'll always manage to knock eachother off + + /obj/item/clothing/head/worn_overlays(isinhands = FALSE) . = list() if(!isinhands) diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm index 5457d32e8a..dc7e1df15f 100644 --- a/code/modules/clothing/head/collectable.dm +++ b/code/modules/clothing/head/collectable.dm @@ -13,14 +13,12 @@ /obj/item/clothing/head/collectable/slime name = "collectable slime cap!" desc = "It just latches right in place!" - clothing_flags = SNUG_FIT icon_state = "slime" dynamic_hair_suffix = "" /obj/item/clothing/head/collectable/xenom name = "collectable xenomorph helmet!" desc = "Hiss hiss hiss!" - clothing_flags = SNUG_FIT icon_state = "xenom" /obj/item/clothing/head/collectable/chef @@ -29,7 +27,6 @@ icon_state = "chef" item_state = "chef" dynamic_hair_suffix = "" - dog_fashion = /datum/dog_fashion/head/chef /obj/item/clothing/head/collectable/paper @@ -73,14 +70,13 @@ desc = "A collectable welding helmet. Now with 80% less lead! Not for actual welding. Any welding done while wearing this helmet is done so at the owner's own risk!" icon_state = "welding" item_state = "welding" - clothing_flags = SNUG_FIT + resistance_flags = NONE /obj/item/clothing/head/collectable/slime name = "collectable slime hat" desc = "Just like a real brain slug!" icon_state = "headslime" item_state = "headslime" - clothing_flags = SNUG_FIT /obj/item/clothing/head/collectable/flatcap name = "collectable flat cap" @@ -124,7 +120,6 @@ /obj/item/clothing/head/collectable/hardhat name = "collectable hard hat" desc = "WARNING! Offers no real protection, or luminosity, but damn, is it fancy!" - clothing_flags = SNUG_FIT icon_state = "hardhat0_yellow" item_state = "hardhat0_yellow" @@ -147,7 +142,7 @@ desc = "Go Red! I mean Green! I mean Red! No Green!" icon_state = "thunderdome" item_state = "thunderdome" - clothing_flags = SNUG_FIT + resistance_flags = NONE flags_inv = HIDEHAIR /obj/item/clothing/head/collectable/swat @@ -155,5 +150,5 @@ desc = "That's not real blood. That's red paint." //Reference to the actual description icon_state = "swat" item_state = "swat" - clothing_flags = SNUG_FIT + resistance_flags = NONE flags_inv = HIDEHAIR diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index d72e4ba1d7..19f03dfd0a 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -11,7 +11,6 @@ armor = list("melee" = 15, "bullet" = 5, "laser" = 20,"energy" = 10, "bomb" = 20, "bio" = 10, "rad" = 20, "fire" = 100, "acid" = 50) flags_inv = 0 actions_types = list(/datum/action/item_action/toggle_helmet_light) - clothing_flags = SNUG_FIT resistance_flags = FIRE_PROOF dynamic_hair_suffix = "+generic" @@ -116,8 +115,10 @@ toggle_helmet_light(user) /obj/item/clothing/head/hardhat/weldhat/AltClick(mob/user) + . = ..() if(user.canUseTopic(src, BE_CLOSE)) toggle_welding_screen(user) + return TRUE /obj/item/clothing/head/hardhat/weldhat/proc/toggle_welding_screen(mob/living/user) if(weldingvisortoggle(user)) diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 8a1cc01bd5..be6e270e45 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -10,7 +10,7 @@ heat_protection = HEAD max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT strip_delay = 60 - clothing_flags = SNUG_FIT + resistance_flags = NONE flags_cover = HEADCOVERSEYES flags_inv = HIDEHAIR diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 298510564c..05116c8b97 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -51,6 +51,11 @@ dog_fashion = null +/obj/item/clothing/head/caphat/beret/white + name = "captain's white beret" + desc = "A white beret fit for a leader." + icon_state = "beret_captain_white" + //Head of Personnel /obj/item/clothing/head/hopcap name = "head of personnel's cap" @@ -67,6 +72,11 @@ dog_fashion = null +/obj/item/clothing/head/hopcap/beret/white + name = "head of personnel's white beret" + desc = "The symbol of true bureaucratic micromanagement, although in a fancy form." + icon_state = "beret_white_hop" + //Chaplain /obj/item/clothing/head/nun_hood name = "nun hood" @@ -90,20 +100,20 @@ 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))) - ..() - if(loc == user) - if(candy_cooldown < world.time) - var/obj/item/reagent_containers/food/snacks/candy_corn/CC = new /obj/item/reagent_containers/food/snacks/candy_corn(src) - user.put_in_hands(CC) - to_chat(user, "You slip a candy corn from your hat.") - candy_cooldown = world.time+1200 - else - to_chat(user, "You just took a candy corn! You should wait a couple minutes, lest you burn through your stash.") + . = ..() + if(loc == user && user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + if(candy_cooldown < world.time) + var/obj/item/reagent_containers/food/snacks/candy_corn/CC = new /obj/item/reagent_containers/food/snacks/candy_corn(src) + user.put_in_hands(CC) + to_chat(user, "You slip a candy corn from your hat.") + candy_cooldown = world.time+1200 + else + to_chat(user, "You just took a candy corn! You should wait a couple minutes, lest you burn through your stash.") + return TRUE //Mime @@ -119,6 +129,16 @@ desc = "A black beret, perfect for war veterans and dark, brooding, anti-hero mimes." icon_state = "beretblack" +/obj/item/clothing/head/beret/purple + name = "purple beret" + desc = "A purple beret." + icon_state = "beret_purple" + +/obj/item/clothing/head/beret/blue + name = "blue beret" + desc = "A blue beret" + icon_state = "beret_blue" + /obj/item/clothing/head/beret/highlander desc = "That was white fabric. Was." dog_fashion = null //THIS IS FOR SLAUGHTER, NOT PUPPIES @@ -146,6 +166,11 @@ desc = "A robust beret for the Head of Security, for looking stylish while not sacrificing protection." icon_state = "hosberetblack" +/obj/item/clothing/head/HoS/beret/officer + name = "head of security officer beret" + desc = "A robust beret for the Head of Security, for looking stylish while not sacrificing protection." + icon_state = "beret_centcom_officer" + /obj/item/clothing/head/HoS/beret/syndicate name = "syndicate beret" desc = "A black beret with thick armor padding inside. Stylish and robust." @@ -242,8 +267,11 @@ name = "warden's beret" desc = "A special beret with the Warden's insignia emblazoned on it. For wardens with class." icon_state = "wardenberet" - armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) - strip_delay = 60 + +/obj/item/clothing/head/beret/sec/corporatewarden + name = "warden's corporate beret" + desc = "A special beret with the Warden's insignia emblazoned on it. For wardens with class." + icon_state = "beret_corporate_warden" /obj/item/clothing/head/beret/sec/navyofficer desc = "A special beret with the security insignia emblazoned on it. For officers with class." @@ -261,18 +289,71 @@ desc = "A fancy beret with a green cross, signifying your status in the station's medbay." icon_state = "cmoberet" +/obj/item/clothing/head/beret/cmo/blue + name = "chief medical officer's blue beret" + desc = "A fancy beret with a blue and white cross, try not to be chief malpractice officer in it." + icon_state = "beret_blue_cmo" + +//Medical +/obj/item/clothing/head/beret/med + name = "medical officer's beret" + desc = "A fancy beret with a blue cross, smells sterile" + icon_state = "beret_med" + +/obj/item/clothing/head/beret/chem + name = "chemist's beret" + desc = "A fancy beret with a orange beaker, you're not sure if you should smell it" + icon_state = "beret_chem" + +/obj/item/clothing/head/beret/viro + name = "virologist's beret" + desc = "A fancy beret with a green gross, hopefully it's virus free!" + icon_state = "beret_viro" + //Research Director /obj/item/clothing/head/beret/rd name = "research director's beret" desc = "A beret worn only by highly intelligent people." icon_state = "rdberet" + + +//Scientist +/obj/item/clothing/head/beret/sci + name = "scientist's beret" + desc = "A Scientist's beret, looks like it's covered in slime." + icon_state = "beret_sci" + +//Roboticist +/obj/item/clothing/head/beret/robo + name = "roboticist's beret" + desc = "A Roboticist's beret, almost more oil than hat." + icon_state = "beret_robot" + + //Chief Engineer /obj/item/clothing/head/beret/ce name = "chief engineer's beret" desc = "A beret that will surely make you look way cooler than a hard hat, although lack of protection is the price." icon_state = "ceberet" +/obj/item/clothing/head/beret/ce/white + name = "chief engineer's white beret" + desc = "A beret that will surely make you look way cooler than a hard hat, although lack of protection is the price." + icon_state = "beret_ce_white" + +//Atmos +/obj/item/clothing/head/beret/atmos + name = "atmospheric technician's beret" + desc = "An Atmospheric Technician's beret. Smells like plasma fire." + icon_state = "beret_atmos" + +//Engineer +/obj/item/clothing/head/beret/eng + name = "engineer's beret" + desc = "An Engineer's beret, try not to lose it to space wind." + icon_state = "beret_engineering" + //Quartermaster /obj/item/clothing/head/beret/qm name = "quartermaster's beret" diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index cac98e74fc..dabfaf06cd 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -67,14 +67,12 @@ desc = "A plastic replica of a Syndicate agent's space helmet. You'll look just like a real murderous Syndicate agent in this! This is a toy, it is not made for use in space!" flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT mutantrace_variation = MUTANTRACE_VARIATION - clothing_flags = SNUG_FIT /obj/item/clothing/head/cueball name = "cueball helmet" desc = "A large, featureless white orb meant to be worn on your head. How do you even see out of this thing?" icon_state = "cueball" item_state="cueball" - clothing_flags = SNUG_FIT flags_cover = HEADCOVERSEYES|HEADCOVERSMOUTH flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT @@ -83,7 +81,6 @@ desc = "A ball of white styrofoam. So festive." icon_state = "snowman_h" item_state = "snowman_h" - clothing_flags = SNUG_FIT flags_cover = HEADCOVERSEYES flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT @@ -93,7 +90,6 @@ icon_state = "justicered" item_state = "justicered" flags_inv = HIDEHAIR|HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDESNOUT - clothing_flags = SNUG_FIT flags_cover = HEADCOVERSEYES /obj/item/clothing/head/justice/blue @@ -117,10 +113,8 @@ desc = "Wearing these makes you look useless, and only good for your sex appeal." icon_state = "bunny" dynamic_hair_suffix = "" - dog_fashion = /datum/dog_fashion/head/rabbit - /obj/item/clothing/head/flatcap name = "flat cap" desc = "A working man's cap." @@ -165,7 +159,6 @@ icon_state = "chickenhead" item_state = "chickensuit" flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT - clothing_flags = SNUG_FIT /obj/item/clothing/head/griffin name = "griffon head" @@ -173,7 +166,6 @@ icon_state = "griffinhat" item_state = "griffinhat" flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT - clothing_flags = SNUG_FIT /obj/item/clothing/head/bearpelt name = "bear pelt hat" @@ -187,7 +179,6 @@ item_state = "xenos_helm" desc = "A helmet made out of chitinous alien hide." flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT - clothing_flags = SNUG_FIT /obj/item/clothing/head/fedora name = "fedora" @@ -212,7 +203,6 @@ item_state = "sombrero" desc = "You can practically taste the fiesta." flags_inv = HIDEHAIR - dog_fashion = /datum/dog_fashion/head/sombrero /obj/item/clothing/head/sombrero/green @@ -309,7 +299,6 @@ desc = "When everything's going to crab, protecting your head is the best choice." icon_state = "lobster_hat" flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT - clothing_flags = SNUG_FIT /obj/item/clothing/head/drfreezehat name = "doctor freeze's wig" @@ -370,3 +359,24 @@ 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 + +/obj/item/clothing/head/hotel + name = "Telegram cap" + desc = "A bright red cap warn by hotel staff. Or people who want to be a singing telegram" + icon_state = "telegramhat" + item_color = "telegramhat" + dog_fashion = null + +/obj/item/clothing/head/colour + name = "Singer cap" + desc = "A light white hat that has bands of color. Just makes you want to sing and dance!" + icon_state = "colour" + item_color = "colour" + dog_fashion = /datum/dog_fashion/head/colour \ No newline at end of file diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index a3a4f1d859..fc82d038ce 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -29,7 +29,6 @@ visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH resistance_flags = FIRE_PROOF mutantrace_variation = MUTANTRACE_VARIATION - clothing_flags = SNUG_FIT /obj/item/clothing/head/welding/attack_self(mob/user) weldingvisortoggle(user) @@ -116,7 +115,6 @@ item_state = "hardhat0_pumpkin" item_color = "pumpkin" flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT - clothing_flags = SNUG_FIT armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) brightness_on = 2 //luminosity when on flags_cover = HEADCOVERSEYES @@ -165,7 +163,6 @@ desc = "A helmet made out of a box." icon_state = "cardborg_h" item_state = "cardborg_h" - clothing_flags = SNUG_FIT flags_cover = HEADCOVERSEYES flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT @@ -230,7 +227,6 @@ desc = "A crude helmet made out of bronze plates. It offers very little in the way of protection." icon = 'icons/obj/clothing/clockwork_garb.dmi' icon_state = "clockwork_helmet_old" - clothing_flags = SNUG_FIT flags_inv = HIDEEARS|HIDEHAIR armor = list("melee" = 5, "bullet" = 0, "laser" = -5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 20) @@ -243,7 +239,7 @@ equip_delay_other = 140 var/datum/brain_trauma/mild/phobia/paranoia var/warped = FALSE - clothing_flags = ANTI_TINFOIL_MANEUVER + clothing_flags = IGNORE_HAT_TOSS /obj/item/clothing/head/foilhat/Initialize(mapload) . = ..() @@ -258,8 +254,8 @@ return if(paranoia) QDEL_NULL(paranoia) - paranoia = new() - user.gain_trauma(paranoia, TRAUMA_RESILIENCE_MAGIC, "conspiracies") + paranoia = new("conspiracies") + user.gain_trauma(paranoia, TRAUMA_RESILIENCE_MAGIC) to_chat(user, "As you don the foiled hat, an entire world of conspiracy theories and seemingly insane ideas suddenly rush into your mind. What you once thought unbelievable suddenly seems.. undeniable. Everything is connected and nothing happens just by accident. You know too much and now they're out to get you. ") /obj/item/clothing/head/foilhat/MouseDrop(atom/over_object) @@ -301,3 +297,16 @@ . = ..() if(!warped) warp_up() + +/obj/item/clothing/head/flakhelm //Actually the M1 Helmet + name = "flak helmet" + icon_state = "m1helm" + item_state = "helmet" + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0.1, "bio" = 0, "rad" = 0, "fire" = -10, "acid" = -15) + desc = "A dilapidated helmet used in ancient wars. This one is brittle and essentially useless. An ace of spades is tucked into the band around the outer shell." + pocket_storage_component_path = /datum/component/storage/concrete/pockets/tiny/spacenam //So you can stuff other things in the elastic band instead of it simply being a fluff thing. + +//The "pocket" for the M1 helmet so you can tuck things into the elastic band + +/datum/component/storage/concrete/pockets/tiny/spacenam + attack_hand_interact = TRUE //So you can actually see what you stuff in there \ No newline at end of file diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index b14b0575f9..69ec1ccedd 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -22,11 +22,11 @@ /obj/item/clothing/head/soft/AltClick(mob/user) - ..() + . = ..() if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return - else - flip(user) + flip(user) + return TRUE /obj/item/clothing/head/soft/proc/flip(mob/user) @@ -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" @@ -139,4 +139,4 @@ flags_inv = HIDEEYES|HIDEFACE armor = list("melee" = 35, "bullet" = 35, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 90) strip_delay = 90 //You dont take a Major Leage cap - dog_fashion = null \ No newline at end of file + dog_fashion = null diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index 947aa048c4..f4335d17e8 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -23,15 +23,15 @@ adjustmask(user) /obj/item/clothing/mask/breath/AltClick(mob/user) - ..() + . = ..() if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return - else - adjustmask(user) + adjustmask(user) + return TRUE /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/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm index 117fbc49e0..57866b5131 100644 --- a/code/modules/clothing/spacesuits/_spacesuits.dm +++ b/code/modules/clothing/spacesuits/_spacesuits.dm @@ -4,7 +4,7 @@ name = "space helmet" icon_state = "spaceold" desc = "A special helmet with solar UV shielding to protect your eyes from harmful rays." - clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS | SNUG_FIT + clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS item_state = "spaceold" permeability_coefficient = 0.01 armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 50, "fire" = 80, "acid" = 70) 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..c6eac4ac56 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -65,7 +65,7 @@ /obj/item/clothing/head/helmet/space/hardsuit/proc/display_visor_message(var/msg) var/mob/wearer = loc if(msg && ishuman(wearer)) - wearer.show_message("[icon2html(src, wearer)][msg]", 1) + wearer.show_message("[icon2html(src, wearer)][msg]", MSG_VISUAL) /obj/item/clothing/head/helmet/space/hardsuit/rad_act(severity) . = ..() @@ -958,26 +958,18 @@ /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 /obj/item/clothing/suit/space/hardsuit/lavaknight/AltClick(mob/living/user) - if(user.incapacitated() || !istype(user)) + . = ..() + if(!in_range(src, user) || !istype(user)) + return + if(user.incapacitated()) to_chat(user, "You can't do that right now!") - return - if(!in_range(src, user)) - return - if(user.incapacitated() || !istype(user) || !in_range(src, user)) - return + return TRUE if(alert("Are you sure you want to recolor your armor stripes?", "Confirm Repaint", "Yes", "No") == "Yes") var/energy_color_input = input(usr,"","Choose Energy Color",energy_color) as color|null @@ -993,7 +985,8 @@ user.update_inv_wear_suit() light_color = energy_color update_light() + return TRUE /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/bio.dm b/code/modules/clothing/suits/bio.dm index 369ddba7b9..5d0a9b9914 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -4,7 +4,7 @@ icon_state = "bio" desc = "A hood that protects the head and face from biological contaminants." permeability_coefficient = 0.01 - clothing_flags = THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | SNUG_FIT + clothing_flags = THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 60, "fire" = 30, "acid" = 100) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDEFACE|HIDESNOUT resistance_flags = ACID_PROOF diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm index be81374868..b8287c7f4c 100644 --- a/code/modules/clothing/suits/cloaks.dm +++ b/code/modules/clothing/suits/cloaks.dm @@ -69,7 +69,6 @@ icon_state = "golhood" desc = "A protective & concealing hood." armor = list("melee" = 35, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) - clothing_flags = SNUG_FIT flags_inv = HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR /obj/item/clothing/suit/hooded/cloak/drake @@ -89,7 +88,6 @@ icon_state = "dragon" desc = "The skull of a dragon." armor = list("melee" = 70, "bullet" = 30, "laser" = 50, "energy" = 40, "bomb" = 70, "bio" = 60, "rad" = 50, "fire" = 100, "acid" = 100) - clothing_flags = SNUG_FIT heat_protection = HEAD max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index bc885868c5..b67fda421e 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -505,6 +505,21 @@ min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT flags_inv = HIDEHAIR|HIDEEARS +/obj/item/clothing/suit/hooded/wintercoat/centcom + name = "centcom winter coat" + icon_state = "coatcentcom" + item_state = "coatcentcom" + armor = list("melee" = 40, "bullet" = 45, "laser" = 45, "energy" = 35, "bomb" = 40, "bio" = 25, "rad" = 25, "fire" = 35, "acid" = 50) + hoodtype = /obj/item/clothing/head/hooded/winterhood/centcom + +/obj/item/clothing/suit/hooded/wintercoat/centcom/Initialize() + . = ..() + allowed = GLOB.security_wintercoat_allowed + +/obj/item/clothing/head/hooded/winterhood/centcom + icon_state = "winterhood_centcom" + armor = list("melee" = 40, "bullet" = 45, "laser" = 45, "energy" = 35, "bomb" = 40, "bio" = 25, "rad" = 25, "fire" = 35, "acid" = 50) + /obj/item/clothing/suit/hooded/wintercoat/captain name = "captain's winter coat" icon_state = "coatcaptain" @@ -519,6 +534,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 +558,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 +583,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 +627,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 +700,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 +729,24 @@ /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/aformal + name = "assistant's formal winter coat" + icon_state = "coataformal" + item_state = "coataformal" + hoodtype = /obj/item/clothing/head/hooded/winterhood/aformal + +/obj/item/clothing/head/hooded/winterhood/aformal + icon_state = "winterhood_aformal" + /obj/item/clothing/suit/hooded/wintercoat/miner name = "mining winter coat" icon_state = "coatminer" @@ -605,6 +758,27 @@ /obj/item/clothing/head/hooded/winterhood/miner icon_state = "winterhood_miner" +/obj/item/clothing/suit/hooded/wintercoat/ratvar + name = "ratvarian winter coat" + icon_state = "coatratvar" + item_state = "coatratvar" + hoodtype = /obj/item/clothing/head/hooded/winterhood/ratvar + +/obj/item/clothing/head/hooded/winterhood/ratvar + icon_state = "winterhood_ratvar" + light_range = 3 + light_power = 1 + light_color = "#B18B25" //clockwork slab background top color + +/obj/item/clothing/suit/hooded/wintercoat/narsie + name = "narsian winter coat" + icon_state = "coatnarsie" + item_state = "coatnarsie" + hoodtype = /obj/item/clothing/head/hooded/winterhood/narsie + +/obj/item/clothing/head/hooded/winterhood/narsie + icon_state = "winterhood_narsie" + /obj/item/clothing/suit/spookyghost name = "spooky ghost" desc = "This is obviously just a bedsheet, but maybe try it on?" @@ -633,3 +807,24 @@ 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/flakjack + name = "flak jacket" + desc = "A dilapidated jacket made of a supposedly bullet-proof material (Hint: It isn't.). Smells faintly of napalm." + icon_state = "flakjack" + item_state = "redtag" + blood_overlay_type = "armor" + body_parts_covered = CHEST + resistance_flags = NONE + mutantrace_variation = NO_MUTANTRACE_VARIATION + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 5, "bio" = 0, "rad" = 0, "fire" = -5, "acid" = -15) //nylon sucks against acid + +/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..559d3006a1 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -92,11 +92,11 @@ //Toggle exosuits for different aesthetic styles (hoodies, suit jacket buttons, etc) /obj/item/clothing/suit/toggle/AltClick(mob/user) - ..() + . = ..() if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return - else - suit_toggle(user) + suit_toggle(user) + return TRUE /obj/item/clothing/suit/toggle/ui_action_click() suit_toggle() @@ -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/suits/utility.dm b/code/modules/clothing/suits/utility.dm index b98d8207d9..fbdca6ddbc 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -58,7 +58,7 @@ name = "bomb hood" desc = "Use in case of bomb." icon_state = "bombsuit" - clothing_flags = THICKMATERIAL | SNUG_FIT + clothing_flags = THICKMATERIAL armor = list("melee" = 20, "bullet" = 0, "laser" = 20,"energy" = 10, "bomb" = 100, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50) flags_inv = HIDEFACE|HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT dynamic_hair_suffix = "" @@ -123,7 +123,7 @@ name = "radiation hood" icon_state = "rad" desc = "A hood with radiation protective properties. The label reads, 'Made with lead. Please do not consume insulation.'" - clothing_flags = THICKMATERIAL|SNUG_FIT + clothing_flags = THICKMATERIAL flags_inv = HIDEMASK|HIDEEARS|HIDEFACE|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 60, "rad" = 100, "fire" = 30, "acid" = 30) strip_delay = 60 diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index 93eb8181c7..9d1a47f231 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -7,7 +7,6 @@ armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 20, "bio" = 20, "rad" = 20, "fire" = 100, "acid" = 100) strip_delay = 50 equip_delay_other = 50 - clothing_flags = SNUG_FIT resistance_flags = FIRE_PROOF | ACID_PROOF dog_fashion = /datum/dog_fashion/head/blue_wizard diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 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..e165297a3f 100644 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -67,16 +67,18 @@ return /obj/item/clothing/accessory/AltClick(mob/user) + . = ..() if(istype(user) && user.canUseTopic(src, BE_CLOSE, ismonkey(user))) if(initial(above_suit)) above_suit = !above_suit to_chat(user, "[src] will be worn [above_suit ? "above" : "below"] your suit.") + return TRUE /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..51e34c7b3e 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -5,6 +5,7 @@ item_color = "red_pyjamas" item_state = "w_suit" can_adjust = FALSE + /obj/item/clothing/under/pj/blue name = "blue pj's" desc = "Sleepwear." @@ -12,6 +13,7 @@ item_color = "blue_pyjamas" item_state = "w_suit" can_adjust = FALSE + /obj/item/clothing/under/patriotsuit name = "Patriotic Suit" desc = "Motorcycle not included." @@ -19,6 +21,7 @@ item_state = "ek" item_color = "ek" can_adjust = FALSE + /obj/item/clothing/under/scratch name = "white suit" desc = "A white suit, suitable for an excellent host." @@ -43,6 +46,7 @@ icon_state = "sl_suit" item_color = "sl_suit" can_adjust = FALSE + /obj/item/clothing/under/roman name = "\improper Roman armor" desc = "Ancient Roman armor. Made of metallic and leather straps." @@ -52,6 +56,7 @@ can_adjust = FALSE strip_delay = 100 resistance_flags = NONE + /obj/item/clothing/under/waiter name = "waiter's outfit" desc = "It's a very smart uniform with a special pocket for tip." @@ -59,6 +64,7 @@ item_state = "waiter" item_color = "waiter" can_adjust = FALSE + /obj/item/clothing/under/rank/prisoner name = "prison jumpsuit" desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position." @@ -85,12 +91,14 @@ icon_state = "mailman" item_state = "b_suit" item_color = "mailman" + /obj/item/clothing/under/rank/psyche name = "psychedelic jumpsuit" desc = "Groovy!" icon_state = "psyche" item_state = "p_suit" item_color = "psyche" + /obj/item/clothing/under/rank/clown/sexy name = "sexy-clown suit" desc = "It makes you look HONKable!" @@ -98,6 +106,7 @@ item_state = "sexyclown" item_color = "sexyclown" can_adjust = FALSE + /obj/item/clothing/under/jabroni name = "Jabroni Outfit" desc = "The leather club is two sectors down." @@ -105,6 +114,7 @@ item_state = "darkholme" item_color = "darkholme" can_adjust = FALSE + /obj/item/clothing/under/rank/vice name = "vice officer's jumpsuit" desc = "It's the standard issue pretty-boy outfit, as seen on Holo-Vision." @@ -112,6 +122,7 @@ item_state = "gy_suit" item_color = "vice" can_adjust = FALSE + /obj/item/clothing/under/rank/centcom_officer desc = "It's a jumpsuit worn by CentCom Officers." name = "\improper CentCom officer's jumpsuit" @@ -119,12 +130,14 @@ item_state = "g_suit" item_color = "officer" alt_covers_chest = TRUE + /obj/item/clothing/under/rank/centcom_commander desc = "It's a jumpsuit worn by CentCom's highest-tier Commanders." name = "\improper CentCom officer's jumpsuit" icon_state = "centcom" item_state = "dg_suit" item_color = "centcom" + /obj/item/clothing/under/space name = "\improper NASA jumpsuit" desc = "It has a NASA logo on it and is made of space-proofed materials." @@ -141,6 +154,7 @@ max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT can_adjust = FALSE resistance_flags = NONE + /obj/item/clothing/under/acj name = "administrative cybernetic jumpsuit" icon_state = "syndicate" @@ -157,24 +171,28 @@ max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT can_adjust = FALSE resistance_flags = FIRE_PROOF | ACID_PROOF + /obj/item/clothing/under/owl name = "owl uniform" desc = "A soft brown jumpsuit made of synthetic feathers and strong conviction." icon_state = "owl" item_color = "owl" can_adjust = FALSE + /obj/item/clothing/under/griffin name = "griffon uniform" desc = "A soft brown jumpsuit with a white feather collar made of synthetic feathers and a lust for mayhem." icon_state = "griffin" item_color = "griffin" can_adjust = FALSE + /obj/item/clothing/under/cloud name = "cloud" desc = "cloud" icon_state = "cloud" item_color = "cloud" can_adjust = FALSE + /obj/item/clothing/under/gimmick/rank/captain/suit name = "captain's suit" desc = "A green suit and yellow necktie. Exemplifies authority." @@ -218,18 +236,21 @@ item_state = "bl_suit" item_color = "black_suit" can_adjust = FALSE + /obj/item/clothing/under/suit_jacket/really_black name = "executive suit" desc = "A formal black suit and red tie, intended for the station's finest." icon_state = "really_black_suit" item_state = "bl_suit" item_color = "really_black_suit" + /obj/item/clothing/under/suit_jacket/female name = "executive suit" desc = "A formal trouser suit for women, intended for the station's finest." icon_state = "black_suit_fem" item_state = "black_suit_fem" item_color = "black_suit_fem" + /obj/item/clothing/under/suit_jacket/green name = "green suit" desc = "A green suit and yellow necktie. Baller." @@ -237,48 +258,56 @@ item_state = "dg_suit" item_color = "green_suit" can_adjust = FALSE + /obj/item/clothing/under/suit_jacket/red name = "red suit" desc = "A red suit and blue tie. Somewhat formal." icon_state = "red_suit" item_state = "r_suit" item_color = "red_suit" + /obj/item/clothing/under/suit_jacket/charcoal name = "charcoal suit" desc = "A charcoal suit and red tie. Very professional." icon_state = "charcoal_suit" item_state = "charcoal_suit" item_color = "charcoal_suit" + /obj/item/clothing/under/suit_jacket/navy name = "navy suit" desc = "A navy suit and red tie, intended for the station's finest." icon_state = "navy_suit" item_state = "navy_suit" item_color = "navy_suit" + /obj/item/clothing/under/suit_jacket/burgundy name = "burgundy suit" desc = "A burgundy suit and black tie. Somewhat formal." icon_state = "burgundy_suit" item_state = "burgundy_suit" item_color = "burgundy_suit" + /obj/item/clothing/under/suit_jacket/checkered name = "checkered suit" desc = "That's a very nice suit you have there. Shame if something were to happen to it, eh?" icon_state = "checkered_suit" item_state = "checkered_suit" item_color = "checkered_suit" + /obj/item/clothing/under/suit_jacket/tan name = "tan suit" desc = "A tan suit with a yellow tie. Smart, but casual." icon_state = "tan_suit" item_state = "tan_suit" item_color = "tan_suit" + /obj/item/clothing/under/suit_jacket/white name = "white suit" desc = "A white suit and jacket with a blue shirt. You wanna play rough? OKAY!" icon_state = "white_suit" item_state = "white_suit" item_color = "white_suit" + /obj/item/clothing/under/burial name = "burial garments" desc = "Traditional burial garments from the early 22nd century." @@ -286,6 +315,7 @@ item_state = "burial" item_color = "burial" has_sensor = NO_SENSORS + /obj/item/clothing/under/skirt/black name = "black skirt" desc = "A black skirt, very fancy!" @@ -294,6 +324,7 @@ body_parts_covered = CHEST|GROIN|ARMS fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE + /obj/item/clothing/under/skirt/blue name = "blue skirt" desc = "A blue, casual skirt." @@ -303,6 +334,7 @@ body_parts_covered = CHEST|GROIN|ARMS fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE + /obj/item/clothing/under/skirt/red name = "red skirt" desc = "A red, casual skirt." @@ -312,6 +344,7 @@ body_parts_covered = CHEST|GROIN|ARMS fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE + /obj/item/clothing/under/skirt/purple name = "purple skirt" desc = "A purple, casual skirt." @@ -321,6 +354,7 @@ body_parts_covered = CHEST|GROIN|ARMS fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE + /obj/item/clothing/under/schoolgirl name = "blue schoolgirl uniform" desc = "It's just like one of my Japanese animes!" @@ -330,21 +364,25 @@ body_parts_covered = CHEST|GROIN|ARMS fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE + /obj/item/clothing/under/schoolgirl/red name = "red schoolgirl uniform" icon_state = "schoolgirlred" item_state = "schoolgirlred" item_color = "schoolgirlred" + /obj/item/clothing/under/schoolgirl/green name = "green schoolgirl uniform" icon_state = "schoolgirlgreen" item_state = "schoolgirlgreen" item_color = "schoolgirlgreen" + /obj/item/clothing/under/schoolgirl/orange name = "orange schoolgirl uniform" icon_state = "schoolgirlorange" item_state = "schoolgirlorange" item_color = "schoolgirlorange" + /obj/item/clothing/under/overalls name = "laborer's overalls" desc = "A set of durable overalls for getting the job done." @@ -352,6 +390,7 @@ item_state = "lb_suit" item_color = "overalls" can_adjust = FALSE + /obj/item/clothing/under/pirate name = "pirate outfit" desc = "Yarr." @@ -359,6 +398,7 @@ item_state = "pirate" item_color = "pirate" can_adjust = FALSE + /obj/item/clothing/under/soviet name = "soviet uniform" desc = "For the Motherland!" @@ -366,6 +406,7 @@ item_state = "soviet" item_color = "soviet" can_adjust = FALSE + /obj/item/clothing/under/redcoat name = "redcoat uniform" desc = "Looks old." @@ -373,6 +414,7 @@ item_state = "redcoat" item_color = "redcoat" can_adjust = FALSE + /obj/item/clothing/under/kilt name = "kilt" desc = "Includes shoes and plaid." @@ -382,6 +424,7 @@ body_parts_covered = CHEST|GROIN|LEGS|FEET fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE + /obj/item/clothing/under/kilt/highlander desc = "You're the only one worthy of this kilt." @@ -398,6 +441,7 @@ body_parts_covered = CHEST|GROIN|LEGS fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE + /obj/item/clothing/under/gladiator name = "gladiator uniform" desc = "Are you not entertained? Is that not why you are here?" @@ -408,9 +452,11 @@ fitted = NO_FEMALE_UNIFORM can_adjust = FALSE resistance_flags = NONE + /obj/item/clothing/under/gladiator/ash_walker desc = "This gladiator uniform appears to be covered in ash and fairly dated." has_sensor = NO_SENSORS + /obj/item/clothing/under/sundress name = "sundress" desc = "Makes you want to frolic in a field of daisies." @@ -420,6 +466,7 @@ body_parts_covered = CHEST|GROIN fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE + /obj/item/clothing/under/captainparade name = "captain's parade uniform" desc = "A captain's luxury-wear, for special occasions." @@ -427,6 +474,7 @@ item_state = "by_suit" item_color = "captain_parade" can_adjust = FALSE + /obj/item/clothing/under/hosparademale name = "head of security's parade uniform" desc = "A male head of security's luxury-wear, for special occasions." @@ -434,6 +482,7 @@ item_state = "r_suit" item_color = "hos_parade_male" can_adjust = FALSE + /obj/item/clothing/under/hosparadefem name = "head of security's parade uniform" desc = "A female head of security's luxury-wear, for special occasions." @@ -442,6 +491,7 @@ item_color = "hos_parade_fem" fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE + /obj/item/clothing/under/assistantformal name = "assistant's formal uniform" desc = "An assistant's formal-wear. Why an assistant needs formal-wear is still unknown." @@ -449,6 +499,7 @@ item_state = "gy_suit" item_color = "assistant_formal" can_adjust = FALSE + /obj/item/clothing/under/blacktango name = "black tango dress" desc = "Filled with Latin fire." @@ -457,6 +508,7 @@ item_color = "black_tango" fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE + /obj/item/clothing/under/stripeddress name = "striped dress" desc = "Fashion in space." @@ -466,6 +518,7 @@ body_parts_covered = CHEST|GROIN|ARMS fitted = FEMALE_UNIFORM_FULL can_adjust = FALSE + /obj/item/clothing/under/sailordress name = "sailor dress" desc = "Formal wear for a leading lady." @@ -475,6 +528,7 @@ body_parts_covered = CHEST|GROIN|ARMS fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE + /obj/item/clothing/under/redeveninggown name = "red evening gown" desc = "Fancy dress for space bar singers." @@ -483,6 +537,7 @@ item_color = "red_evening_gown" fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE + /obj/item/clothing/under/maid name = "maid costume" desc = "Maid in China." @@ -492,10 +547,12 @@ body_parts_covered = CHEST|GROIN fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE + /obj/item/clothing/under/maid/Initialize() . = ..() var/obj/item/clothing/accessory/maidapron/A = new (src) attach_accessory(A) + /obj/item/clothing/under/janimaid name = "maid uniform" desc = "A simple maid uniform for housekeeping." @@ -505,6 +562,7 @@ body_parts_covered = CHEST|GROIN fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE + /obj/item/clothing/under/plaid_skirt name = "red plaid skirt" desc = "A preppy red skirt with a white blouse." @@ -514,6 +572,7 @@ fitted = FEMALE_UNIFORM_TOP can_adjust = TRUE alt_covers_chest = TRUE + /obj/item/clothing/under/plaid_skirt/blue name = "blue plaid skirt" desc = "A preppy blue skirt with a white blouse." @@ -523,6 +582,7 @@ fitted = FEMALE_UNIFORM_TOP can_adjust = TRUE alt_covers_chest = TRUE + /obj/item/clothing/under/plaid_skirt/purple name = "purple plaid skirt" desc = "A preppy purple skirt with a white blouse." @@ -532,6 +592,7 @@ fitted = FEMALE_UNIFORM_TOP can_adjust = TRUE alt_covers_chest = TRUE + /obj/item/clothing/under/singery name = "yellow performer's outfit" desc = "Just looking at this makes you want to sing." @@ -542,6 +603,7 @@ fitted = NO_FEMALE_UNIFORM alternate_worn_layer = ABOVE_SHOES_LAYER can_adjust = FALSE + /obj/item/clothing/under/singerb name = "blue performer's outfit" desc = "Just looking at this makes you want to sing." @@ -552,6 +614,7 @@ alternate_worn_layer = ABOVE_SHOES_LAYER fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE + /obj/item/clothing/under/plaid_skirt/green name = "green plaid skirt" desc = "A preppy green skirt with a white blouse." @@ -561,14 +624,17 @@ fitted = FEMALE_UNIFORM_TOP can_adjust = TRUE alt_covers_chest = TRUE + /obj/item/clothing/under/jester name = "jester suit" desc = "A jolly dress, well suited to entertain your master, nuncle." icon_state = "jester" item_color = "jester" can_adjust = FALSE + /obj/item/clothing/under/jester/alt icon_state = "jester2" + /obj/item/clothing/under/geisha name = "geisha suit" desc = "Cute space ninja senpai not included." @@ -576,12 +642,14 @@ item_color = "geisha" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE + /obj/item/clothing/under/villain name = "villain suit" desc = "A change of wardrobe is necessary if you ever want to catch a real superhero." icon_state = "villain" item_color = "villain" can_adjust = FALSE + /obj/item/clothing/under/sailor name = "sailor suit" desc = "Skipper's in the wardroom drinkin gin'." @@ -607,8 +675,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 @@ -649,6 +718,7 @@ icon_state = "hostanclothes" item_state = "hostanclothes" item_color = "hostanclothes" + /obj/item/clothing/under/mummy name = "mummy wrapping" desc = "Return the slab or suffer my stale references." @@ -659,6 +729,7 @@ fitted = NO_FEMALE_UNIFORM can_adjust = FALSE resistance_flags = NONE + /obj/item/clothing/under/scarecrow name = "scarecrow clothes" desc = "Perfect camouflage for hiding in botany." @@ -669,6 +740,7 @@ fitted = NO_FEMALE_UNIFORM can_adjust = FALSE resistance_flags = NONE + /obj/item/clothing/under/draculass name = "draculass coat" desc = "A dress inspired by the ancient \"Victorian\" era." @@ -678,6 +750,7 @@ body_parts_covered = CHEST|GROIN|ARMS fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE + /obj/item/clothing/under/drfreeze name = "doctor freeze's jumpsuit" desc = "A modified scientist jumpsuit to look extra cool." @@ -685,6 +758,7 @@ item_state = "drfreeze" item_color = "drfreeze" can_adjust = FALSE + /obj/item/clothing/under/lobster name = "foam lobster suit" desc = "Who beheaded the college mascot?" @@ -693,6 +767,7 @@ item_color = "lobster" fitted = NO_FEMALE_UNIFORM can_adjust = FALSE + /obj/item/clothing/under/gondola name = "gondola hide suit" desc = "Now you're cooking." @@ -700,6 +775,7 @@ item_state = "lb_suit" item_color = "gondola" can_adjust = FALSE + /obj/item/clothing/under/skeleton name = "skeleton jumpsuit" desc = "A black jumpsuit with a white bone pattern printed on it. Spooky!" @@ -719,6 +795,14 @@ body_parts_covered = CHEST|GROIN can_adjust = FALSE +/obj/item/clothing/under/telegram + name = "telegram suit" + desc = "Bright and red, hard to miss. Mostly warn by hotel staff or singing telegram." + icon_state = "telegram" + item_state = "telegram" + body_parts_covered = CHEST|GROIN + can_adjust = FALSE + /obj/item/clothing/under/durathread name = "durathread jumpsuit" desc = "A jumpsuit made from durathread, its resilient fibres provide some protection to the wearer." 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 fdfb959fe6..00878d1c59 100644 --- a/code/modules/crafting/recipes/recipes_misc.dm +++ b/code/modules/crafting/recipes/recipes_misc.dm @@ -47,16 +47,17 @@ /datum/crafting_recipe/goldenbox name = "Gold Plated Toolbox" result = /obj/item/storage/toolbox/gold_fake + tools = list(/obj/item/stock_parts/cell/upgraded/plus) reqs = list(/obj/item/stack/sheet/cardboard = 1, //so we dont null items in crafting /obj/item/stack/cable_coil = 10, /obj/item/stack/sheet/mineral/gold = 1, - /obj/item/stock_parts/cell = 1, /datum/reagent/water = 15) time = 40 category = CAT_MISC /datum/crafting_recipe/bronze_driver name = "Bronze Plated Screwdriver" + tools = list(/obj/item/stock_parts/cell/upgraded/plus) result = /obj/item/screwdriver/bronze reqs = list(/obj/item/screwdriver = 1, /obj/item/stack/cable_coil = 10, @@ -67,6 +68,7 @@ /datum/crafting_recipe/bronze_welder name = "Bronze Plated Welding Tool" + tools = list(/obj/item/stock_parts/cell/upgraded/plus) result = /obj/item/weldingtool/bronze reqs = list(/obj/item/weldingtool = 1, /obj/item/stack/cable_coil = 10, @@ -77,6 +79,7 @@ /datum/crafting_recipe/bronze_wirecutters name = "Bronze Plated Wirecutters" + tools = list(/obj/item/stock_parts/cell/upgraded/plus) result = /obj/item/wirecutters/bronze reqs = list(/obj/item/wirecutters = 1, /obj/item/stack/cable_coil = 10, @@ -87,6 +90,7 @@ /datum/crafting_recipe/bronze_crowbar name = "Bronze Plated Crowbar" + tools = list(/obj/item/stock_parts/cell/upgraded/plus) result = /obj/item/crowbar/bronze reqs = list(/obj/item/crowbar = 1, /obj/item/stack/cable_coil = 10, @@ -97,6 +101,7 @@ /datum/crafting_recipe/bronze_wrench name = "Bronze Plated Wrench" + tools = list(/obj/item/stock_parts/cell/upgraded/plus) result = /obj/item/wrench/bronze reqs = list(/obj/item/wrench = 1, /obj/item/stack/cable_coil = 10, 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..944fbb8df8 100644 --- a/code/modules/detectivework/scanner.dm +++ b/code/modules/detectivework/scanner.dm @@ -187,9 +187,11 @@ return time2text(world.time + 432000, ":ss") /obj/item/detective_scanner/AltClick(mob/living/user) + . = ..() // Best way for checking if a player can use while not incapacitated, etc if(!user.canUseTopic(src, be_close=TRUE)) return + . = TRUE if(!LAZYLEN(log)) to_chat(user, "Cannot clear logs, the scanner has no logs.") return @@ -200,9 +202,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/immovable_rod.dm b/code/modules/events/immovable_rod.dm index e041d566e9..41b2bfee5a 100644 --- a/code/modules/events/immovable_rod.dm +++ b/code/modules/events/immovable_rod.dm @@ -45,6 +45,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 throwforce = 100 density = TRUE anchored = TRUE + flags_1 = PREVENT_CONTENTS_EXPLOSION_1 var/mob/living/wizard var/z_original = 0 var/destination @@ -100,9 +101,6 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 /obj/effect/immovablerod/ex_act(severity, target) return 0 -/obj/structure/closet/supplypod/prevent_content_explosion() - return TRUE - /obj/effect/immovablerod/singularity_act() return 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..236eed5c09 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(60, 90) //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..f006f2b358 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.") @@ -199,7 +133,7 @@ shuttle_spawns.Add(/mob/living/simple_animal/hostile/syndicate/ranged/infiltrator) if(RUSKY_PARTY) - var/datum/supply_pack/pack = SSshuttle.supply_packs[/datum/supply_pack/service/party] + var/datum/supply_pack/pack = SSshuttle.supply_packs[/datum/supply_pack/misc/party] pack.generate(pick_n_take(empty_shuttle_turfs)) shuttle_spawns.Add(/mob/living/simple_animal/hostile/russian) diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index cb25446e4a..77600cdefe 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -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) 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/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 48704d7623..f5262742e2 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -21,7 +21,8 @@ GLOBAL_LIST_INIT(hallucination_list, list( /datum/hallucination/delusion = 2, /datum/hallucination/shock = 1, /datum/hallucination/death = 1, - /datum/hallucination/oh_yeah = 1 + /datum/hallucination/oh_yeah = 1, + /datum/hallucination/sleeping_carp = 1 )) @@ -672,7 +673,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 +895,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. Estimated time until impact: [round(rand(300,600)/60)] minutes.

    ") + 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') @@ -1294,3 +1295,26 @@ GLOBAL_LIST_INIT(hallucination_list, list( H.preparePixelProjectile(target, start) H.fire() qdel(src) + +/datum/hallucination/sleeping_carp + +/datum/hallucination/sleeping_carp/New(mob/living/carbon/C, forced = TRUE) + set waitfor = FALSE + ..() + var/list/mobsyup + for (var/mob/living/carbon/A in orange(C,1)) + if (get_dist(C,A) < 2) + LAZYADD(mobsyup,A) + if (!LAZYLEN(mobsyup)) + qdel(src) + return + var/mob/living/carbon/G = pick(mobsyup) + if (prob(50)) + C.visible_message("[C] falls to the ground screaming and clutching [C.p_their()] wrist!", \ + "[G] grabs your wrist and violently wrenches it to the side!") + C.emote("scream") + C.dropItemToGround(C.get_active_held_item()) + C.Knockdown(60) + else + to_chat(C,"[G] violently grabs you!") + qdel(src) 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/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index c5a962230a..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 @@ -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..8724841643 100644 --- a/code/modules/food_and_drinks/food/customizables.dm +++ b/code/modules/food_and_drinks/food/customizables.dm @@ -16,13 +16,13 @@ w_class = WEIGHT_CLASS_SMALL volume = 80 - var/ingMax = 12 + var/ingMax = 32 var/list/ingredients = list() var/ingredients_placement = INGREDIENTS_FILL 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], " @@ -32,8 +32,10 @@ if(ingredients.len>5) size = "big" if(ingredients.len>8) + size = "huge" + if(ingredients.len>16) 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 637e0b929c..b8a63afb7f 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) @@ -319,13 +319,13 @@ All foods are distributed among various categories. Use common sense. if(iscorgi(M)) var/mob/living/L = M if(bitecount == 0 || prob(50)) - M.emote("me", 1, "nibbles away at \the [src]") + M.emote("me", EMOTE_VISIBLE, "nibbles away at \the [src]") bitecount++ L.taste(reagents) // why should carbons get all the fun? if(bitecount >= 5) var/sattisfaction_text = pick("burps from enjoyment", "yaps for more", "woofs twice", "looks at the area where \the [src] was") if(sattisfaction_text) - M.emote("me", 1, "[sattisfaction_text]") + M.emote("me", EMOTE_VISIBLE, "[sattisfaction_text]") qdel(src) // //////////////////////////////////////////////Store//////////////////////////////////////// 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..baf8e150c5 100644 --- a/code/modules/food_and_drinks/food/snacks_pastry.dm +++ b/code/modules/food_and_drinks/food/snacks_pastry.dm @@ -386,7 +386,7 @@ tastes = list("pastry" = 1, "sweetness" = 1) foodtype = GRAIN -#define PANCAKE_MAX_STACK 10 +#define PANCAKE_MAX_STACK 30 /obj/item/reagent_containers/food/snacks/pancakes name = "pancake" @@ -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/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm index 0f901f2412..a58435959c 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm @@ -4,8 +4,9 @@ #define ICECREAM_PEACH 4 #define ICECREAM_GRAPE 5 #define ICECREAM_BLUE 6 -#define CONE_WAFFLE 7 -#define CONE_CHOC 8 +#define ICECREAM_CUSTOM 7 +#define CONE_WAFFLE 8 +#define CONE_CHOC 9 @@ -22,17 +23,18 @@ var/list/product_types = list() var/dispense_flavour = ICECREAM_VANILLA var/flavour_name = "vanilla" + var/obj/item/reagent_containers/beaker = null var/static/list/icecream_vat_reagents = list( - "milk" = 5, - "flour" = 5, - "sugar" = 5, - "ice" = 5, - "cocoa" = 5, - "vanilla" = 5, - "berryjuice" = 5, - "singulo" = 5, - "peachjuice" = 5, - "grapejuice" = 5) + "milk" = 6, + "flour" = 6, + "sugar" = 6, + "ice" = 6, + "cocoa" = 6, + "vanilla" = 6, + "berryjuice" = 6, + "singulo" = 6, + "peachjuice" = 6, + "grapejuice" = 6) /obj/machinery/icecream_vat/proc/get_ingredient_list(type) switch(type) @@ -40,6 +42,8 @@ return list("milk", "ice", "cocoa") if(ICECREAM_STRAWBERRY) return list("milk", "ice", "berryjuice") + if(ICECREAM_CUSTOM) + return list("milk", "ice") if(ICECREAM_PEACH) return list("milk", "ice", "peachjuice") if(ICECREAM_GRAPE) @@ -66,6 +70,8 @@ return "grape" if(ICECREAM_BLUE) return "blue" + if(ICECREAM_CUSTOM) + return "custom" if(CONE_WAFFLE) return "waffle" if(CONE_CHOC) @@ -76,7 +82,7 @@ /obj/machinery/icecream_vat/Initialize() . = ..() - while(product_types.len < 8) + while(product_types.len < 9) product_types.Add(5) create_reagents(100, OPENCONTAINER | NO_REACT) for(var/reagent in icecream_vat_reagents) @@ -87,16 +93,23 @@ var/dat dat += "ICE CREAM
    " dat += "Dispensing: [flavour_name] icecream

    " - dat += "Vanilla ice cream: Select Make x5 [product_types[ICECREAM_VANILLA]] scoops left. (Ingredients: milk, ice)
    " + dat += "Vanilla ice cream: Select Make x5 [product_types[ICECREAM_VANILLA]] scoops left. (Ingredients: milk, ice, vanilla)
    " dat += "Strawberry ice cream: Select Make x5 [product_types[ICECREAM_STRAWBERRY]] dollops left. (Ingredients: milk, ice, berry juice)
    " dat += "Chocolate ice cream: Select Make x5 [product_types[ICECREAM_CHOCOLATE]] dollops left. (Ingredients: milk, ice, coco powder)
    " dat += "Peach ice cream: Select Make x5 [product_types[ICECREAM_PEACH]] dollops left. (Ingredients: milk, ice, peach juice)
    " dat += "Grape ice cream: Select Make x5 [product_types[ICECREAM_GRAPE]] dollops left. (Ingredients: milk, ice, grape juice)
    " - dat += "Blue ice cream: Select Make x5 [product_types[ICECREAM_BLUE]] dollops left. (Ingredients: milk, ice, singulo)
    " + dat += "Blue ice cream: Select Make x5 [product_types[ICECREAM_BLUE]] dollops left. (Ingredients: milk, ice, singulo)
    " + dat += "Custom ice cream: Select Make x5 [product_types[ICECREAM_CUSTOM]] dollops left. (Ingredients: milk, ice, optional flavoring)
    " dat += "
    CONES
    " dat += "Waffle cones: Dispense Make x5 [product_types[CONE_WAFFLE]] cones left. (Ingredients: flour, sugar)
    " dat += "Chocolate cones: Dispense Make x5 [product_types[CONE_CHOC]] cones left. (Ingredients: flour, sugar, coco powder)
    " dat += "
    " + if(beaker) + dat += "BEAKER CONTENT
    " + for(var/datum/reagent/R in beaker.reagents.reagent_list) + dat += "[R.name]: [R.volume]u
    " + dat += "Refill from beaker
    " + dat += "
    " dat += "VAT CONTENT
    " for(var/datum/reagent/R in reagents.reagent_list) dat += "[R.name]: [R.volume]" @@ -114,36 +127,60 @@ if(product_types[dispense_flavour] > 0) visible_message("[icon2html(src, viewers(src))] [user] scoops delicious [flavour_name] ice cream into [I].") product_types[dispense_flavour] -= 1 + if(beaker && beaker.reagents.total_volume) + I.add_ice_cream(flavour_name, beaker.reagents) + else + I.add_ice_cream(flavour_name) I.add_ice_cream(flavour_name) - // if(beaker) - // beaker.reagents.trans_to(I, 10) if(I.reagents.total_volume < 10) I.reagents.add_reagent("sugar", 10 - I.reagents.total_volume) + updateDialog() else to_chat(user, "There is not enough ice cream left!") else to_chat(user, "[O] already has ice cream in it.") return 1 + if(istype(O, /obj/item/reagent_containers) && !(O.item_flags & ABSTRACT) && O.is_open_container()) + . = TRUE //no afterattack + var/obj/item/reagent_containers/B = O + if(!user.transferItemToLoc(B, src)) + return + replace_beaker(user, B) + to_chat(user, "You add [B] to [src].") + updateUsrDialog() + update_icon() + return else if(O.is_drainable()) return else return ..() +/obj/machinery/icecream_vat/proc/RefillFromBeaker() + if(!beaker || !beaker.reagents) + return + for(var/datum/reagent/R in beaker.reagents.reagent_list) + if(R.type in icecream_vat_reagents) + beaker.reagents.trans_id_to(src, R.type, R.volume) + say("Internalizing reagent.") + playsound(src, 'sound/items/drink.ogg', 25, 1) + return + /obj/machinery/icecream_vat/proc/make(mob/user, make_type, amount) + var/recipe_amount = amount * 3 //prevents reagent duping by requring roughly the amount of reagenst you gain back by grinding. for(var/R in get_ingredient_list(make_type)) - if(reagents.has_reagent(R, amount)) + if(reagents.has_reagent(R, recipe_amount)) continue amount = 0 break if(amount) for(var/R in get_ingredient_list(make_type)) - reagents.remove_reagent(R, amount) + reagents.remove_reagent(R, recipe_amount) product_types[make_type] += amount var/flavour = get_flavour_name(make_type) - if(make_type > 4) - src.visible_message("[user] cooks up some [flavour] cones.") + if(make_type > 7) + visible_message("[user] cooks up some [flavour] cones.") else - src.visible_message("[user] whips up some [flavour] icecream.") + visible_message("[user] whips up some [flavour] icecream.") else to_chat(user, "You don't have the ingredients to make this!") @@ -172,7 +209,10 @@ make(usr, C, amount) if(href_list["disposeI"]) - reagents.del_reagent(href_list["disposeI"]) + reagents.del_reagent(text2path(href_list["disposeI"])) + + if(href_list["refill"]) + RefillFromBeaker() updateDialog() @@ -189,15 +229,16 @@ desc = "Delicious waffle cone, but no ice cream." icon = 'icons/obj/kitchen.dmi' icon_state = "icecream_cone_waffle" //default for admin-spawned cones, href_list["cone"] should overwrite this all the time + list_reagents = list("nutriment" = 4) + tastes = list("cream" = 2, "waffle" = 1) var/ice_creamed = 0 var/cone_type - bitesize = 3 - foodtype = DAIRY + bitesize = 4 + foodtype = DAIRY | SUGAR /obj/item/reagent_containers/food/snacks/icecream/Initialize() . = ..() - create_reagents(20) - reagents.add_reagent("nutriment", 4) + reagents.maximum_volume = 20 /obj/item/reagent_containers/food/snacks/icecream/proc/set_cone_type(var/cone_name) cone_type = cone_name @@ -211,30 +252,53 @@ desc = "Delicious [cone_name] cone, but no ice cream." -/obj/item/reagent_containers/food/snacks/icecream/proc/add_ice_cream(var/flavour_name) +/obj/item/reagent_containers/food/snacks/icecream/proc/add_ice_cream(flavour_name, datum/reagents/R = null) name = "[flavour_name] icecream" - src.add_overlay("icecream_[flavour_name]") switch (flavour_name) // adding the actual reagents advertised in the ingredient list if ("vanilla") desc = "A delicious [cone_type] cone filled with vanilla ice cream. All the other ice creams take content from it." + reagents.add_reagent("vanilla", 3) + filling_color = "#ECE1C1" if ("chocolate") desc = "A delicious [cone_type] cone filled with chocolate ice cream. Surprisingly, made with real cocoa." - reagents.add_reagent("cocoa", 2) + reagents.add_reagent("cocoa", 3) + filling_color = "#93673B" if ("strawberry") desc = "A delicious [cone_type] cone filled with strawberry ice cream. Definitely not made with real strawberries." - reagents.add_reagent("berryjuice", 2) + reagents.add_reagent("berryjuice", 3) + filling_color = "#EFB4B4" if ("peach") desc = "A delicious [cone_type] cone filled with peach ice cream. Definitely made with real peaches!" - reagents.add_reagent("peachjuice", 2) + reagents.add_reagent("peachjuice", 3) + filling_color = "#E78108" if ("grape") desc = "A delicious [cone_type] cone filled with grape ice cream. Surprisingly, made with real pink grape, likely not real sugarcanes used." - reagents.add_reagent("grapejuice", 2) + reagents.add_reagent("grapejuice", 3) + filling_color = "#FF1493" if ("blue") desc = "A delicious [cone_type] cone filled with blue ice cream. Made with real... blue?" - reagents.add_reagent("singulo", 2) + reagents.add_reagent("singulo", 3) + filling_color = "#ACBCED" if ("mob") desc = "A suspicious [cone_type] cone filled with bright red ice cream. That's probably not strawberry..." - reagents.add_reagent("liquidgibs", 2) + reagents.add_reagent("liquidgibs", 3) + filling_color = "#EFB4B4" + if ("custom") + if(R && R.total_volume >= 4) //consumable reagents have stronger taste so higher volume will allow non-food flavourings to break through better. + var/mutable_appearance/flavoring = mutable_appearance(icon,"icecream_custom") + var/datum/reagent/master = R.get_master_reagent() + flavoring.color = master.color + filling_color = master.color + name = "[master.name] icecream" + desc = "A delicious [cone_type] cone filled with artisanal icecream. Made with real [master.name]. Ain't that something." + R.trans_to(src, 4) + add_overlay(flavoring) + else + name = "bland icecream" + desc = "A delicious [cone_type] cone filled with anemic, flavorless icecream.You wonder why this was ever scooped.." + add_overlay("icecream_custom") + if(flavour_name != "custom") + src.add_overlay("icecream_[flavour_name]") ice_creamed = 1 /obj/item/reagent_containers/food/snacks/icecream/proc/add_mob_flavor(var/mob/M) @@ -246,6 +310,22 @@ new /obj/item/stack/sheet/metal(loc, 4) qdel(src) +/obj/machinery/icecream_vat/AltClick(mob/living/user) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + return + replace_beaker(user) + +/obj/machinery/icecream_vat/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker) + if(beaker) + beaker.forceMove(drop_location()) + if(user && Adjacent(user) && !issiliconoradminghost(user)) + user.put_in_hands(beaker) + if(new_beaker) + beaker = new_beaker + else + beaker = null + updateDialog() + return TRUE #undef ICECREAM_VANILLA #undef ICECREAM_CHOCOLATE @@ -253,5 +333,6 @@ #undef ICECREAM_PEACH #undef ICECREAM_GRAPE #undef ICECREAM_BLUE +#undef ICECREAM_CUSTOM #undef CONE_WAFFLE #undef CONE_CHOC diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm index 6fcc5c9cec..4efac6f508 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) @@ -186,8 +186,10 @@ ..() /obj/machinery/microwave/AltClick(mob/user) + . = ..() if(user.canUseTopic(src, !issilicon(usr))) cook() + return TRUE /obj/machinery/microwave/ui_interact(mob/user) . = ..() diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index ceb7a01ede..893a53ede7 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -144,7 +144,7 @@ else O.forceMove(src) return TRUE - + ///Really simple proc, just moves the object "O" into the hands of mob "M" if able, done so I could modify the proc a little for the organ fridge /obj/machinery/smartfridge/proc/dispense(obj/item/O, var/mob/M) if(!M.put_in_hands(O)) @@ -388,20 +388,27 @@ /obj/machinery/smartfridge/organ name = "smart organ storage" desc = "A refrigerated storage unit for organ storage." - max_n_of_items = 20 //vastly lower to prevent processing too long + max_n_of_items = 25 //vastly lower to prevent processing too long var/repair_rate = 0 /obj/machinery/smartfridge/organ/accept_check(obj/item/O) if(istype(O, /obj/item/organ)) return TRUE + if(istype(O, /obj/item/reagent_containers/syringe)) + return TRUE + if(istype(O, /obj/item/reagent_containers/glass/bottle)) + return TRUE + if(istype(O, /obj/item/reagent_containers/medspray)) + return TRUE return FALSE /obj/machinery/smartfridge/organ/load(obj/item/O) . = ..() if(!.) //if the item loads, clear can_decompose return - var/obj/item/organ/organ = O - organ.organ_flags |= ORGAN_FROZEN + if(istype(O, /obj/item/organ)) + var/obj/item/organ/organ = O + organ.organ_flags |= ORGAN_FROZEN /obj/machinery/smartfridge/organ/RefreshParts() for(var/obj/item/stock_parts/matter_bin/B in component_parts) @@ -420,6 +427,17 @@ if(istype(AM)) AM.organ_flags &= ~ORGAN_FROZEN +/obj/machinery/smartfridge/organ/preloaded + initial_contents = list( + /obj/item/reagent_containers/medspray/synthtissue = 1, + /obj/item/reagent_containers/medspray/sterilizine = 1) + +/obj/machinery/smartfridge/organ/preloaded/Initialize() + ..() + var/list = list(/obj/item/organ/tongue, /obj/item/organ/brain, /obj/item/organ/heart, /obj/item/organ/liver, /obj/item/organ/ears, /obj/item/organ/eyes, /obj/item/organ/tail, /obj/item/organ/stomach) + var/newtype = pick(list) + load(new newtype(src.loc)) + // ----------------------------- // Chemistry Medical Smartfridge // ----------------------------- 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/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm index c83048e4b1..9dbddfb519 100644 --- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm +++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm @@ -382,7 +382,7 @@ results = list("neurotoxin" = 2) required_reagents = list("gargleblaster" = 1, "morphine" = 1) //FermiChem vars: Easy to make, but hard to make potent - OptimalTempMin = 200 // Lower area of bell curve for determining heat based rate reactions + OptimalTempMin = 100 // Lower area of bell curve for determining heat based rate reactions OptimalTempMax = 950 // Upper end for above ExplodeTemp = 999 //Temperature at which reaction explodes OptimalpHMin = 4.6 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) 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..4fbb931b32 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" @@ -130,9 +130,11 @@ update_icon() /obj/item/toy/cards/singlecard/cas/AltClick(mob/living/user) + . = ..() if(!ishuman(user) || !user.canUseTopic(src, BE_CLOSE)) return Flip() + return TRUE /obj/item/toy/cards/singlecard/cas/update_icon() if(flipped) 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..24225c1a20 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) @@ -259,12 +252,11 @@ // Spooky Uplink Items // ///////////////////////// -/datum/uplink_item/dangerous/crossbow/candy +/datum/uplink_item/stealthy_weapons/crossbow/candy name = "Candy Corn Crossbow" desc = "A standard miniature energy crossbow that uses a hard-light projector to transform bolts into candy corn. Happy Halloween!" category = "Holiday" item = /obj/item/gun/energy/kinetic_accelerator/crossbow/halloween - cost = 12 surplus = 0 /datum/uplink_item/device_tools/emag/hack_o_lantern diff --git a/code/modules/holiday/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/beekeeping/beekeeper_suit.dm b/code/modules/hydroponics/beekeeping/beekeeper_suit.dm index fd9f879f5e..7fa1a0dd2c 100644 --- a/code/modules/hydroponics/beekeeping/beekeeper_suit.dm +++ b/code/modules/hydroponics/beekeeping/beekeeper_suit.dm @@ -4,7 +4,7 @@ desc = "Keeps the lil buzzing buggers out of your eyes." icon_state = "beekeeper" item_state = "beekeeper" - clothing_flags = THICKMATERIAL | SNUG_FIT + clothing_flags = THICKMATERIAL /obj/item/clothing/suit/beekeeper_suit 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..94dbc74499 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("nutriment" = 0.07, "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("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..66d03c777c 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_3d + 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, "haloperidol" = 0.15) + +/obj/item/reagent_containers/food/snacks/grown/citrus/orange_3d + seed = /obj/item/seeds/orange_3d + 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..44373515c6 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("enzyme" = 0.1, "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("bungotoxin", seed.potency * 0.10) //More than this will kill at too low potency + reagents.add_reagent("nutriment", seed.potency * 0.04) + + diff --git a/code/modules/hydroponics/grown/cotton.dm b/code/modules/hydroponics/grown/cotton.dm index 045839d0de..a898b76ee8 100644 --- a/code/modules/hydroponics/grown/cotton.dm +++ b/code/modules/hydroponics/grown/cotton.dm @@ -1,79 +1,79 @@ -/obj/item/seeds/cotton - name = "pack of cotton seeds" - desc = "A pack of seeds that'll grow into a cotton plant. Assistants make good free labor if neccesary." - icon_state = "seed-cotton" - species = "cotton" - plantname = "Cotton" - icon_harvest = "cotton-harvest" - product = /obj/item/grown/cotton - lifespan = 35 - endurance = 25 - maturation = 15 - production = 1 - yield = 2 - potency = 50 - growthstages = 3 - growing_icon = 'icons/obj/hydroponics/growing.dmi' - icon_dead = "cotton-dead" - mutatelist = list(/obj/item/seeds/cotton/durathread) - -/obj/item/grown/cotton - seed = /obj/item/seeds/cotton - name = "cotton bundle" - desc = "A fluffy bundle of cotton." - icon_state = "cotton" - force = 0 - throwforce = 0 - w_class = WEIGHT_CLASS_TINY - throw_speed = 2 - throw_range = 3 - attack_verb = list("pomfed") - var/cotton_type = /obj/item/stack/sheet/cotton - var/cotton_name = "raw cotton" - -/obj/item/grown/cotton/attack_self(mob/user) - user.show_message("You pull some [cotton_name] out of the [name]!", 1) - var/seed_modifier = 0 - if(seed) - seed_modifier = round(seed.potency / 25) - var/obj/item/stack/cotton = new cotton_type(user.loc, 1 + seed_modifier) - var/old_cotton_amount = cotton.amount - for(var/obj/item/stack/ST in user.loc) - if(ST != cotton && istype(ST, cotton_type) && ST.amount < ST.max_amount) - ST.attackby(cotton, user) - if(cotton.amount > old_cotton_amount) - to_chat(user, "You add the newly-formed [cotton_name] to the stack. It now contains [cotton.amount] [cotton_name].") - qdel(src) - -//reinforced mutated variant -/obj/item/seeds/cotton/durathread - name = "pack of durathread seeds" - desc = "A pack of seeds that'll grow into an extremely durable thread that could easily rival plasteel if woven properly." - icon_state = "seed-durathread" - species = "durathread" - plantname = "Durathread" - icon_harvest = "durathread-harvest" - product = /obj/item/grown/cotton/durathread - lifespan = 80 - endurance = 50 - maturation = 15 - production = 1 - yield = 2 - potency = 50 - growthstages = 3 - growing_icon = 'icons/obj/hydroponics/growing.dmi' - icon_dead = "cotton-dead" - -/obj/item/grown/cotton/durathread - seed = /obj/item/seeds/cotton/durathread - name = "durathread bundle" - desc = "A tough bundle of durathread, good luck unraveling this." - icon_state = "durathread" - force = 5 - throwforce = 5 - w_class = WEIGHT_CLASS_NORMAL - throw_speed = 2 - throw_range = 3 - attack_verb = list("bashed", "battered", "bludgeoned", "whacked") - cotton_type = /obj/item/stack/sheet/cotton/durathread - cotton_name = "raw durathread" \ No newline at end of file +/obj/item/seeds/cotton + name = "pack of cotton seeds" + desc = "A pack of seeds that'll grow into a cotton plant. Assistants make good free labor if neccesary." + icon_state = "seed-cotton" + species = "cotton" + plantname = "Cotton" + icon_harvest = "cotton-harvest" + product = /obj/item/grown/cotton + lifespan = 35 + endurance = 25 + maturation = 15 + production = 1 + yield = 2 + potency = 50 + growthstages = 3 + growing_icon = 'icons/obj/hydroponics/growing.dmi' + icon_dead = "cotton-dead" + mutatelist = list(/obj/item/seeds/cotton/durathread) + +/obj/item/grown/cotton + seed = /obj/item/seeds/cotton + name = "cotton bundle" + desc = "A fluffy bundle of cotton." + icon_state = "cotton" + force = 0 + throwforce = 0 + w_class = WEIGHT_CLASS_TINY + throw_speed = 2 + throw_range = 3 + attack_verb = list("pomfed") + var/cotton_type = /obj/item/stack/sheet/cotton + var/cotton_name = "raw cotton" + +/obj/item/grown/cotton/attack_self(mob/user) + user.show_message("You pull some [cotton_name] out of the [name]!", MSG_VISUAL) + var/seed_modifier = 0 + if(seed) + seed_modifier = round(seed.potency / 25) + var/obj/item/stack/cotton = new cotton_type(user.loc, 1 + seed_modifier) + var/old_cotton_amount = cotton.amount + for(var/obj/item/stack/ST in user.loc) + if(ST != cotton && istype(ST, cotton_type) && ST.amount < ST.max_amount) + ST.attackby(cotton, user) + if(cotton.amount > old_cotton_amount) + to_chat(user, "You add the newly-formed [cotton_name] to the stack. It now contains [cotton.amount] [cotton_name].") + qdel(src) + +//reinforced mutated variant +/obj/item/seeds/cotton/durathread + name = "pack of durathread seeds" + desc = "A pack of seeds that'll grow into an extremely durable thread that could easily rival plasteel if woven properly." + icon_state = "seed-durathread" + species = "durathread" + plantname = "Durathread" + icon_harvest = "durathread-harvest" + product = /obj/item/grown/cotton/durathread + lifespan = 80 + endurance = 50 + maturation = 15 + production = 1 + yield = 2 + potency = 50 + growthstages = 3 + growing_icon = 'icons/obj/hydroponics/growing.dmi' + icon_dead = "cotton-dead" + +/obj/item/grown/cotton/durathread + seed = /obj/item/seeds/cotton/durathread + name = "durathread bundle" + desc = "A tough bundle of durathread, good luck unraveling this." + icon_state = "durathread" + force = 5 + throwforce = 5 + w_class = WEIGHT_CLASS_NORMAL + throw_speed = 2 + throw_range = 3 + attack_verb = list("bashed", "battered", "bludgeoned", "whacked") + cotton_type = /obj/item/stack/sheet/cotton/durathread + cotton_name = "raw durathread" diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm index af5919969c..beecb258a7 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("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..8fc141e152 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,57 @@ 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("nutriment" = 0.02, "hydrogen" = 0.05, "space_drugs" = 0.15) + +/obj/item/reagent_containers/food/snacks/grown/grass/fairy + seed = /obj/item/seeds/grass/fairy + name = "fairygrass" + desc = "Glowing, and smells fainly of mushrooms." + icon_state = "fairygrassclump" + filling_color = "#3399ff" + stacktype = /obj/item/stack/tile/fairygrass + +/obj/item/reagent_containers/food/snacks/grown/grass/fairy/attack_self(mob/user) + var/datum/plant_gene/trait/glow/G = null + for(var/datum/plant_gene/trait/glow/gene in seed.genes) + G = gene + break + + stacktype = initial(stacktype) + + if(G) + switch(G.type) + if(/datum/plant_gene/trait/glow/white) + stacktype = /obj/item/stack/tile/fairygrass/white + if(/datum/plant_gene/trait/glow/red) + stacktype = /obj/item/stack/tile/fairygrass/red + if(/datum/plant_gene/trait/glow/yellow) + stacktype = /obj/item/stack/tile/fairygrass/yellow + if(/datum/plant_gene/trait/glow/green) + stacktype = /obj/item/stack/tile/fairygrass/green + if(/datum/plant_gene/trait/glow/blue) + stacktype = /obj/item/stack/tile/fairygrass/blue + if(/datum/plant_gene/trait/glow/purple) + stacktype = /obj/item/stack/tile/fairygrass/purple + if(/datum/plant_gene/trait/glow/pink) + stacktype = /obj/item/stack/tile/fairygrass/pink + + . = ..() + + + + // 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..16992b3e96 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("nutriment" = 0.05, "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" @@ -156,9 +226,12 @@ /obj/item/reagent_containers/food/snacks/grown/cherry_bomb/proc/prime() icon_state = "cherry_bomb_lit" playsound(src, 'sound/effects/fuse.ogg', seed.potency, 0) + addtimer(CALLBACK(src, /obj/item/reagent_containers/food/snacks/grown/cherry_bomb/proc/detonate), rand(50, 100)) + +/obj/item/reagent_containers/food/snacks/grown/cherry_bomb/proc/detonate() reagents.chem_temp = 1000 //Sets off the black powder reagents.handle_reactions() - + // Lavaland cactus /obj/item/seeds/lavaland/cactus diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm index fe2beb896c..c8e97c78de 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("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/pumpkin.dm b/code/modules/hydroponics/grown/pumpkin.dm index 02bc776b78..46dc49a169 100644 --- a/code/modules/hydroponics/grown/pumpkin.dm +++ b/code/modules/hydroponics/grown/pumpkin.dm @@ -29,7 +29,7 @@ /obj/item/reagent_containers/food/snacks/grown/pumpkin/attackby(obj/item/W as obj, mob/user as mob, params) if(W.get_sharpness()) - user.show_message("You carve a face into [src]!", 1) + user.show_message("You carve a face into [src]!", MSG_VISUAL) new /obj/item/clothing/head/hardhat/pumpkinhead(user.loc) qdel(src) return diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index 9a660ac282..9d7081ad65 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -51,7 +51,7 @@ /obj/item/grown/log/attackby(obj/item/W, mob/user, params) if(W.sharpness) - user.show_message("You make [plank_name] out of \the [src]!", 1) + user.show_message("You make [plank_name] out of \the [src]!", MSG_VISUAL) var/seed_modifier = 0 if(seed) seed_modifier = round(seed.potency / 25) 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..3597ed5be6 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 = "polypyr" + rate = 0.15 + +/datum/plant_gene/reagent/liquidelectricity + name = "Liquid Electricity" + reagent_id = "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..d8bf82a4b4 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) @@ -615,8 +615,13 @@ return ..() +/obj/item/electronic_assembly/can_trigger_gun(mob/living/user) //sanity checks against pocket death weapon circuits + if(!can_fire_equipped || !user.is_holding(src)) + return FALSE + return ..() + /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..40bcbe016b 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 @@ -402,3 +402,8 @@ a creative player the means to solve many problems. Circuits are held inside an return TRUE return FALSE + +/obj/item/integrated_circuit/can_trigger_gun(mob/living/user) + if(!user.is_holding(src)) + return FALSE + 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/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index b7feedd312..46f8017b10 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -859,7 +859,7 @@ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH power_draw_per_use = 5 -/obj/item/integrated_circuit/input/microphone/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode) +/obj/item/integrated_circuit/input/microphone/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode, atom/movable/source) . = ..() var/translated = FALSE if(speaker && message) diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm index fb00897eec..0bdf0547f9 100644 --- a/code/modules/integrated_electronics/subtypes/manipulation.dm +++ b/code/modules/integrated_electronics/subtypes/manipulation.dm @@ -11,7 +11,7 @@ w_class = WEIGHT_CLASS_SMALL complexity = 10 cooldown_per_use = 1 - ext_cooldown = 2 + ext_cooldown = 4 inputs = list("direction" = IC_PINTYPE_DIR) outputs = list("obstacle" = IC_PINTYPE_REF) activators = list("step towards dir" = IC_PINTYPE_PULSE_IN,"on step"=IC_PINTYPE_PULSE_OUT,"blocked"=IC_PINTYPE_PULSE_OUT) 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/integrated_electronics/subtypes/weaponized.dm b/code/modules/integrated_electronics/subtypes/weaponized.dm index 7bccbfafcd..350f05914d 100644 --- a/code/modules/integrated_electronics/subtypes/weaponized.dm +++ b/code/modules/integrated_electronics/subtypes/weaponized.dm @@ -81,9 +81,13 @@ to_chat(user, "There's no weapon to remove from the mechanism.") /obj/item/integrated_circuit/weaponized/weapon_firing/do_work() - if(!installed_gun || !installed_gun.handle_pins()) + if(!assembly || !installed_gun) return - if(!isturf(assembly.loc) && !(assembly.can_fire_equipped && ishuman(assembly.loc))) + if(isliving(assembly.loc)) + var/mob/living/L = assembly.loc + if(!assembly.can_fire_equipped || !L.is_holding(assembly) || !installed_gun.can_trigger_gun(L)) //includes pins, hulk and other chunky fingers checks. + return + else if(!isturf(assembly.loc) || !installed_gun.handle_pins()) return set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun)) push_data() @@ -92,18 +96,17 @@ var/datum/integrated_io/mode1 = inputs[3] mode = mode1.data - if(assembly) - if(isnum(xo.data)) - xo.data = round(xo.data, 1) - if(isnum(yo.data)) - yo.data = round(yo.data, 1) + if(isnum(xo.data)) + xo.data = round(xo.data, 1) + if(isnum(yo.data)) + yo.data = round(yo.data, 1) - var/turf/T = get_turf(assembly) - var/target_x = CLAMP(T.x + xo.data, 0, world.maxx) - var/target_y = CLAMP(T.y + yo.data, 0, world.maxy) + var/turf/T = get_turf(assembly) + var/target_x = CLAMP(T.x + xo.data, 0, world.maxx) + var/target_y = CLAMP(T.y + yo.data, 0, world.maxy) - assembly.visible_message("[assembly] fires [installed_gun]!") - shootAt(locate(target_x, target_y, T.z)) + assembly.visible_message("[assembly] fires [installed_gun]!") + shootAt(locate(target_x, target_y, T.z)) /obj/item/integrated_circuit/weaponized/weapon_firing/proc/shootAt(turf/target) var/turf/T = get_turf(src) @@ -246,26 +249,30 @@ if(!A || A.anchored || A.throwing || A == assembly || istype(A, /obj/item/twohanded) || istype(A, /obj/item/transfer_valve)) return - if(!AT || !AT.air_contents) + var/obj/item/I = get_object() + var/turf/T = get_turf(I) + if(!T) + return + if(isliving(I.loc)) + var/mob/living/L = I.loc + if(!I.can_trigger_gun(L)) //includes hulk and other chunky fingers checks. + return + if(HAS_TRAIT(L, TRAIT_PACIFISM) && A.throwforce) + to_chat(L, " [I] is lethally chambered! You don't want to risk harming anyone...") + return + else if(T != I.loc) return - if (istype(assembly.loc, /obj/item/implant/storage)) //Prevents the more abusive form of chestgun. + if(!AT || !AT.air_contents) return if(max_w_class && (A.w_class > max_w_class)) return - if(!assembly.can_fire_equipped && ishuman(assembly.loc)) - return - // Is the target inside the assembly or close to it? if(!check_target(A, exclude_components = TRUE)) return - var/turf/T = get_turf(get_object()) - if(!T) - return - // If the item is in mob's inventory, try to remove it from there. if(ismob(A.loc)) var/mob/living/M = A.loc 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/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm index f98f0755c8..4cfd2e447f 100644 --- a/code/modules/mining/abandoned_crates.dm +++ b/code/modules/mining/abandoned_crates.dm @@ -181,10 +181,11 @@ else return ..() +//this helps you not blow up so easily by overriding unlocking which results in an immediate boom. /obj/structure/closet/crate/secure/loot/AltClick(mob/living/user) - if(!user.canUseTopic(src, BE_CLOSE)) - return - return attack_hand(user) //this helps you not blow up so easily by overriding unlocking which results in an immediate boom. + if(user.canUseTopic(src, BE_CLOSE)) + attack_hand(user) + return TRUE /obj/structure/closet/crate/secure/loot/attackby(obj/item/W, mob/user) if(locked) 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..9d595664ff 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)]" @@ -59,6 +59,7 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list( /obj/item/stack/marker_beacon/AltClick(mob/living/user) if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) return + . = TRUE var/input_color = input(user, "Choose a color.", "Beacon Color") as null|anything in GLOB.marker_beacon_colors if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) return @@ -93,8 +94,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]) @@ -128,9 +129,10 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list( return ..() /obj/structure/marker_beacon/AltClick(mob/living/user) - ..() + . = ..() if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) return + . = TRUE var/input_color = input(user, "Choose a color.", "Beacon Color") as null|anything in GLOB.marker_beacon_colors if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) return 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 fde856c4fb..ab3b20ac9f 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -398,6 +398,7 @@ fire_sound = 'sound/weapons/batonextend.ogg' max_charges = 1 item_flags = NEEDS_PERMIT | NOBLUDGEON + w_class = WEIGHT_CLASS_BULKY force = 18 /obj/item/ammo_casing/magic/hook @@ -645,10 +646,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!") @@ -1073,8 +1074,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 c13408b24f..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) 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/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm index d54b8256a9..7aae26526e 100644 --- a/code/modules/mob/dead/new_player/preferences_setup.dm +++ b/code/modules/mob/dead/new_player/preferences_setup.dm @@ -25,7 +25,7 @@ features = random_features() age = rand(AGE_MIN,AGE_MAX) -/datum/preferences/proc/update_preview_icon() +/datum/preferences/proc/update_preview_icon(equip_job = TRUE) // Determine what job is marked as 'High' priority, and dress them up as such. var/datum/job/previewJob var/highest_pref = 0 @@ -45,12 +45,11 @@ // Set up the dummy for its photoshoot var/mob/living/carbon/human/dummy/mannequin = generate_or_wait_for_human_dummy(DUMMY_HUMAN_SLOT_PREFERENCES) - mannequin.cut_overlays() // Apply the Dummy's preview background first so we properly layer everything else on top of it. mannequin.add_overlay(mutable_appearance('modular_citadel/icons/ui/backgrounds.dmi', bgstate, layer = SPACE_LAYER)) copy_to(mannequin) - if(previewJob) + if(previewJob && equip_job) mannequin.job = previewJob.title previewJob.equip(mannequin, TRUE, preference_source = parent) 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 a1242fa263..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. @@ -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/obj/machinery/cryopod/C = loc - 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" || QDELETED(C) || QDELETED(src) || loc != C) - return - 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/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm index 7eeab05466..69cbd0830a 100644 --- a/code/modules/mob/dead/observer/say.dm +++ b/code/modules/mob/dead/observer/say.dm @@ -22,7 +22,7 @@ . = say_dead(message) -/mob/dead/observer/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) +/mob/dead/observer/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source) . = ..() var/atom/movable/to_follow = speaker if(radio_freq) @@ -35,6 +35,6 @@ to_follow = V.source var/link = FOLLOW_LINK(src, to_follow) // Recompose the message, because it's scrambled by default - message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode) + message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode, FALSE, source) to_chat(src, "[link] [message]") 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/damage_procs.dm b/code/modules/mob/living/carbon/alien/damage_procs.dm index 2f8ffb4c01..f5d210b94b 100644 --- a/code/modules/mob/living/carbon/alien/damage_procs.dm +++ b/code/modules/mob/living/carbon/alien/damage_procs.dm @@ -7,9 +7,9 @@ /* CIT CHANGE - Pffffffffffffhahahahahhaha-- No. //aliens are immune to stamina damage. -/mob/living/carbon/alien/adjustStaminaLoss(amount, updating_stamina = 1) +/mob/living/carbon/alien/adjustStaminaLoss(amount, updating_health = 1) return -/mob/living/carbon/alien/setStaminaLoss(amount, updating_stamina = 1) +/mob/living/carbon/alien/setStaminaLoss(amount, updating_health = 1) return */ 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 6d52a5c01b..3a9495a5cb 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)) @@ -788,9 +789,13 @@ if(IsUnconscious() || IsSleeping() || getOxyLoss() > 50 || (HAS_TRAIT(src, TRAIT_DEATHCOMA)) || (health <= HEALTH_THRESHOLD_FULLCRIT && !HAS_TRAIT(src, TRAIT_NOHARDCRIT))) stat = UNCONSCIOUS blind_eyes(1) + if(combatmode) + toggle_combat_mode(TRUE, TRUE) else if(health <= crit_threshold && !HAS_TRAIT(src, TRAIT_NOSOFTCRIT)) stat = SOFT_CRIT + if(combatmode) + toggle_combat_mode(TRUE, TRUE) else stat = CONSCIOUS adjust_blindness(-1) @@ -951,3 +956,8 @@ if(mood) if(mood.sanity < SANITY_UNSTABLE) return TRUE + +/mob/living/carbon/transfer_ckey(mob/new_mob, send_signal = TRUE) + if(combatmode) + toggle_combat_mode(TRUE, TRUE) + return ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index b0e9b808df..c5aeb2c1c7 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -355,30 +355,30 @@ if (damage == 1) to_chat(src, "Your eyes sting a little.") if(prob(40)) - adjust_eye_damage(1) + eyes.applyOrganDamage(1) else if (damage == 2) to_chat(src, "Your eyes burn.") - adjust_eye_damage(rand(2, 4)) + eyes.applyOrganDamage(rand(2, 4)) else if( damage >= 3) to_chat(src, "Your eyes itch and burn severely!") - adjust_eye_damage(rand(12, 16)) + eyes.applyOrganDamage(rand(12, 16)) - if(eyes.eye_damage > 10) + if(eyes.damage > 10) blind_eyes(damage) blur_eyes(damage * rand(3, 6)) - if(eyes.eye_damage > 20) - if(prob(eyes.eye_damage - 20)) + if(eyes.damage > 20) + if(prob(eyes.damage - 20)) if(!HAS_TRAIT(src, TRAIT_NEARSIGHT)) to_chat(src, "Your eyes start to burn badly!") become_nearsighted(EYE_DAMAGE) - else if(prob(eyes.eye_damage - 25)) + else if(prob(eyes.damage - 25)) if(!HAS_TRAIT(src, TRAIT_BLIND)) to_chat(src, "You can't see anything!") - become_blind(EYE_DAMAGE) + eyes.applyOrganDamage(eyes.maxHealth) else to_chat(src, "Your eyes are really starting to hurt. This can't be good for you!") diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index 7d1e5320fc..21541e8c28 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 @@ -157,6 +157,11 @@ O.applyOrganDamage(amount, maximum) O.onDamage(amount, maximum) +/mob/living/carbon/proc/getFailingOrgans() + .=list() + for(var/obj/item/organ/O in internal_organs) + if(O.organ_flags & ORGAN_FAILING) + .+=O //////////////////////////////////////////// diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm index ae0e223e08..6a75429c27 100644 --- a/code/modules/mob/living/carbon/death.dm +++ b/code/modules/mob/living/carbon/death.dm @@ -7,13 +7,15 @@ if(!gibbed) emote("deathgasp") + if(combatmode) + toggle_combat_mode(TRUE, TRUE) . = ..() - + for(var/T in get_traumas()) var/datum/brain_trauma/BT = T BT.on_death() - + if(SSticker.mode) SSticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now @@ -63,3 +65,8 @@ var/obj/item/bodypart/BP = X BP.drop_limb() BP.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5) + +/mob/living/carbon/ghostize(can_reenter_corpse = TRUE, special = FALSE, penalize = FALSE) + if(combatmode) + toggle_combat_mode(TRUE, TRUE) + return ..() 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..9e87e7626d 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) @@ -78,37 +78,38 @@ if(pulledby && pulledby.grab_state) msg += "[t_He] [t_is] restrained by [pulledby]'s grip.\n" - msg += "" + if(msg.len) + . += "[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/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm index 6da188dd2d..74593a20a0 100644 --- a/code/modules/mob/living/carbon/human/dummy.dm +++ b/code/modules/mob/living/carbon/human/dummy.dm @@ -17,6 +17,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) /mob/living/carbon/human/dummy/proc/wipe_state() delete_equipment() + icon_render_key = null cut_overlays(TRUE) //Inefficient pooling/caching way. diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 7b0fb74f44..04ec0454f8 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(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 @@ -178,7 +169,7 @@ var/r_limbs_missing = 0 for(var/t in missing) if(t==BODY_ZONE_HEAD) - msg += "[t_His] [parse_zone(t)] is missing!\n" + msg += "[t_His] [parse_zone(t)] is missing!\n" continue if(t == BODY_ZONE_L_ARM || t == BODY_ZONE_L_LEG) l_limbs_missing++ @@ -281,11 +272,10 @@ msg += "[t_He] [t_is] a shitfaced, slobbering wreck.\n" if(reagents.has_reagent("astral")) - msg += "[t_He] have wild, spacey eyes" if(mind) - msg += " and have a strange, abnormal look to them.\n" + msg += "[t_He] has wild, spacey eyes and they have a strange, abnormal look to them.\n" else - msg += " and don't look like they're all there.\n" + msg += "[t_He] has wild, spacey eyes and they don't look like they're all there.\n" if(isliving(user)) var/mob/living/L = user @@ -296,7 +286,7 @@ msg += "[t_He] seem[p_s()] winded.\n" if (getToxLoss() >= 10) msg += "[t_He] seem[p_s()] sickly.\n" - var/datum/component/mood/mood = src.GetComponent(/datum/component/mood) + var/datum/component/mood/mood = GetComponent(/datum/component/mood) if(mood.sanity <= SANITY_DISTURBED) msg += "[t_He] seem[p_s()] distressed.\n" SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "empath", /datum/mood_event/sad_empath, src) @@ -308,8 +298,6 @@ if (HAS_TRAIT(src, TRAIT_DEAF)) msg += "[t_He] appear[p_s()] to not be responding to noises.\n" - msg += "" - var/obj/item/organ/vocal_cords/Vc = user.getorganslot(ORGAN_SLOT_VOICE) if(Vc) if(istype(Vc, /obj/item/organ/vocal_cords/velvet)) @@ -334,7 +322,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 +339,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 +370,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..3ae2e3bdbd 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 @@ -1043,6 +1043,21 @@ /mob/living/carbon/human/species/golem/plastic race = /datum/species/golem/plastic +/mob/living/carbon/human/species/golem/bronze + race = /datum/species/golem/bronze + +/mob/living/carbon/human/species/golem/cardboard + race = /datum/species/golem/cardboard + +/mob/living/carbon/human/species/golem/leather + race = /datum/species/golem/leather + +/mob/living/carbon/human/species/golem/bone + race = /datum/species/golem/bone + +/mob/living/carbon/human/species/golem/durathread + race = /datum/species/golem/durathread + /mob/living/carbon/human/species/golem/clockwork race = /datum/species/golem/clockwork diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 2ab7c6d404..362a4aaa9d 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) @@ -386,43 +388,34 @@ return var/b_loss = 0 var/f_loss = 0 - var/bomb_armor = getarmor(null, "bomb") + var/bomb_armor = max(0,(100-getarmor(null, "bomb"))/100) switch (severity) if (1) - if(prob(bomb_armor)) - b_loss = 500 + if(bomb_armor) + b_loss = 500*bomb_armor var/atom/throw_target = get_edge_target_turf(src, get_dir(src, get_step_away(src, src))) throw_at(throw_target, 200, 4) - damage_clothes(400 - bomb_armor, BRUTE, "bomb") + damage_clothes(400*bomb_armor, BRUTE, "bomb") else - for(var/I in contents) - var/atom/A = I - A.ex_act(severity) + damage_clothes(400,BRUTE,"bomb") gib() return if (2) - b_loss = 60 - f_loss = 60 - if(bomb_armor) - b_loss = 30*(2 - round(bomb_armor*0.01, 0.05)) - f_loss = b_loss - damage_clothes(200 - bomb_armor, BRUTE, "bomb") + b_loss = 60*bomb_armor + f_loss = 60*bomb_armor + damage_clothes(200*bomb_armor, BRUTE, "bomb") if (!istype(ears, /obj/item/clothing/ears/earmuffs)) adjustEarDamage(30, 120) - if (prob(max(70 - (bomb_armor * 0.5), 0))) - Unconscious(200) + Unconscious(200*bomb_armor) if(3) - b_loss = 30 - if(bomb_armor) - b_loss = 15*(2 - round(bomb_armor*0.01, 0.05)) + b_loss = 30*bomb_armor damage_clothes(max(50 - bomb_armor, 0), BRUTE, "bomb") if (!istype(ears, /obj/item/clothing/ears/earmuffs)) adjustEarDamage(15,60) - if (prob(max(50 - (bomb_armor * 0.5), 0))) - Unconscious(160) + Unconscious(100*bomb_armor) take_overall_damage(b_loss,f_loss) @@ -659,6 +652,12 @@ if(health >= 0) if(src == M) + if(has_status_effect(STATUS_EFFECT_CHOKINGSTRAND)) + to_chat(src, "You attempt to remove the durathread strand from around your neck.") + if(do_after(src, 35, null, src)) + to_chat(src, "You succesfuly remove the durathread strand.") + remove_status_effect(STATUS_EFFECT_CHOKINGSTRAND) + return var/to_send = "" visible_message("[src] examines [p_them()]self.", \ "You check yourself for injuries.") 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..69ec619e5d 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -191,7 +191,6 @@ if(G.vision_correction) if(HAS_TRAIT(src, TRAIT_NEARSIGHT)) overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1) - adjust_eye_damage(0) if(G.vision_flags || G.darkness_view || G.invis_override || G.invis_view || !isnull(G.lighting_alpha)) update_sight() if(!QDELETED(src)) @@ -251,7 +250,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 +262,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 8445f340e6..96bd62b1f6 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) @@ -248,7 +252,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) QDEL_NULL(eyes) if(should_have_eyes && !eyes) eyes = new mutanteyes - eyes.Insert(C) + eyes.Insert(C, TRUE) if(ears && (replace_current || !should_have_ears)) ears.Remove(C,1) @@ -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 @@ -1533,6 +1537,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) target.lastattacker = user.real_name target.lastattackerckey = user.ckey + user.dna.species.spec_unarmedattacked(user, target) if(user.limb_destroyer) target.dismembering_strike(user, affecting.body_zone) @@ -1546,6 +1551,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) else if(target.lying) target.forcesay(GLOB.hit_appends) +/datum/species/proc/spec_unarmedattacked(mob/living/carbon/human/user, mob/living/carbon/human/target) + return + /datum/species/proc/disarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) // CITADEL EDIT slap mouthy gits and booty var/aim_for_mouth = user.zone_selected == "mouth" @@ -1677,6 +1685,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]!") @@ -2034,13 +2044,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 +2189,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 edd0be01b0..48ce55a052 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -862,27 +862,27 @@ if(M.stat == DEAD) //F return if(M == H) - H.show_message("You cringe with pain as your body rings around you!", 2) + H.show_message("You cringe with pain as your body rings around you!", MSG_AUDIBLE) H.playsound_local(H, 'sound/effects/gong.ogg', 100, TRUE) H.soundbang_act(2, 0, 100, 1) H.jitteriness += 7 var/distance = max(0,get_dist(get_turf(H),get_turf(M))) switch(distance) if(0 to 1) - M.show_message("GONG!", 2) + M.show_message("GONG!", MSG_AUDIBLE) M.playsound_local(H, 'sound/effects/gong.ogg', 100, TRUE) M.soundbang_act(1, 0, 30, 3) M.confused += 10 M.jitteriness += 4 SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "gonged", /datum/mood_event/loud_gong) if(2 to 3) - M.show_message("GONG!", 2) + M.show_message("GONG!", MSG_AUDIBLE) M.playsound_local(H, 'sound/effects/gong.ogg', 75, TRUE) M.soundbang_act(1, 0, 15, 2) M.jitteriness += 3 SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "gonged", /datum/mood_event/loud_gong) else - M.show_message("GONG!", 2) + M.show_message("GONG!", MSG_AUDIBLE) M.playsound_local(H, 'sound/effects/gong.ogg', 50, TRUE) @@ -944,6 +944,21 @@ grab_sound = 'sound/weapons/whipgrab.ogg' attack_sound = 'sound/weapons/whip.ogg' +/datum/species/golem/durathread + name = "Durathread Golem" + id = "durathread golem" + prefix = "Durathread" + limbs_id = "d_golem" + special_names = list("Boll","Weave") + species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYES) + fixed_mut_color = null + inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) + info_text = "As a Durathread Golem, your strikes will cause those your targets to start choking, but your woven body won't withstand fire as well." + +/datum/species/golem/durathread/spec_unarmedattacked(mob/living/carbon/human/user, mob/living/carbon/human/target) + . = ..() + target.apply_status_effect(STATUS_EFFECT_CHOKINGSTRAND) + /datum/species/golem/bone name = "Bone Golem" id = "bone golem" 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/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index bc2d6132e1..eed3a17c34 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -85,7 +85,7 @@ return not_handled -/mob/living/carbon/doUnEquip(obj/item/I) +/mob/living/carbon/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE) . = ..() //Sets the default return value to what the parent returns. if(!. || !I) //We don't want to set anything to null if the parent returned 0. return diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index ca139cace7..16a9f07ceb 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) || HAS_TRAIT(src, TRAIT_MAGIC_CHOKE) || (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/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index f9c2e2dd3d..025c1a2f75 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -63,8 +63,6 @@ var/amount if(reagents.has_reagent("morphine")) amount = -1 - if(reagents.has_reagent("nuka_cola")) - amount = -1 if(amount) add_movespeed_modifier(MOVESPEED_ID_MONKEY_REAGENT_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = amount) 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/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm index 766bd376b1..6c497bb8d4 100644 --- a/code/modules/mob/living/carbon/status_procs.dm +++ b/code/modules/mob/living/carbon/status_procs.dm @@ -2,44 +2,6 @@ //The effects include: stun, knockdown, unconscious, sleeping, resting, jitteriness, dizziness, ear damage, // eye damage, eye_blind, eye_blurry, druggy, TRAIT_BLIND trait, TRAIT_NEARSIGHT trait, and TRAIT_HUSK trait. -/mob/living/carbon/damage_eyes(amount) - var/obj/item/organ/eyes/eyes = getorganslot(ORGAN_SLOT_EYES) - if (!eyes) - return - if(amount>0) - eyes.eye_damage = amount - if(eyes.eye_damage > 20) - if(eyes.eye_damage > 30) - overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 2) - else - overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 1) - -/mob/living/carbon/set_eye_damage(amount) - var/obj/item/organ/eyes/eyes = getorganslot(ORGAN_SLOT_EYES) - if (!eyes) - return - eyes.eye_damage = max(amount,0) - if(eyes.eye_damage > 20) - if(eyes.eye_damage > 30) - overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 2) - else - overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 1) - else - clear_fullscreen("eye_damage") - -/mob/living/carbon/adjust_eye_damage(amount) - var/obj/item/organ/eyes/eyes = getorganslot(ORGAN_SLOT_EYES) - if (!eyes) - return - eyes.eye_damage = max(eyes.eye_damage+amount, 0) - if(eyes.eye_damage > 20) - if(eyes.eye_damage > 30) - overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 2) - else - overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 1) - else - clear_fullscreen("eye_damage") - /mob/living/carbon/adjust_drugginess(amount) druggy = max(druggy+amount, 0) if(druggy) diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index dc43ab8b07..57b65a53f7 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -225,10 +225,10 @@ /mob/living/proc/getStaminaLoss() return staminaloss -/mob/living/proc/adjustStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE) +/mob/living/proc/adjustStaminaLoss(amount, updating_health = TRUE, forced = FALSE) return -/mob/living/proc/setStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE) +/mob/living/proc/setStaminaLoss(amount, updating_health = TRUE, forced = FALSE) return // heal ONE external organ, organ gets randomly selected from damaged ones. 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..5299618177 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 @@ -492,7 +502,6 @@ bodytemperature = BODYTEMP_NORMAL set_blindness(0) set_blurriness(0) - set_eye_damage(0) cure_nearsighted() cure_blind() cure_husk() @@ -514,6 +523,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) @@ -1210,7 +1220,8 @@ if("eye_blind") set_blindness(var_value) if("eye_damage") - set_eye_damage(var_value) + var/obj/item/organ/eyes/E = getorganslot(ORGAN_SLOT_EYES) + E?.setOrganDamage(var_value) if("eye_blurry") set_blurriness(var_value) if("maxHealth") 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/say.dm b/code/modules/mob/living/say.dm index 174fd5c394..4c670129c1 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -212,11 +212,11 @@ GLOBAL_LIST_INIT(department_radio_keys, list( if(succumbed) succumb() - to_chat(src, compose_message(src, language, message, , spans, message_mode)) + to_chat(src, compose_message(src, language, message, null, spans, message_mode)) return 1 -/mob/living/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) +/mob/living/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source) . = ..() if(!client) return @@ -231,13 +231,9 @@ GLOBAL_LIST_INIT(department_radio_keys, list( deaf_type = 2 // Since you should be able to hear yourself without looking // Recompose message for AI hrefs, language incomprehension. - message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode) - message = hear_intercept(message, speaker, message_language, raw_message, radio_freq, spans, message_mode) + message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode, FALSE, source) - show_message(message, 2, deaf_message, deaf_type) - return message - -/mob/living/proc/hear_intercept(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) + show_message(message, MSG_AUDIBLE, deaf_message, deaf_type) return message /mob/living/send_speech(message, message_range = 6, obj/source = src, bubble_type = bubble_icon, list/spans, datum/language/message_language=null, message_mode) @@ -248,8 +244,8 @@ GLOBAL_LIST_INIT(department_radio_keys, list( var/list/listening = get_hearers_in_view(message_range+eavesdrop_range, source) var/list/the_dead = list() var/list/yellareas //CIT CHANGE - adds the ability for yelling to penetrate walls and echo throughout areas - if(say_test(message) == "2") //CIT CHANGE - ditto - yellareas = get_areas_in_range(message_range*0.5,src) //CIT CHANGE - ditto + if(!eavesdrop_range && say_test(message) == "2") //CIT CHANGE - ditto + yellareas = get_areas_in_range(message_range*0.5, source) //CIT CHANGE - ditto for(var/_M in GLOB.player_list) var/mob/M = _M if(M.stat != DEAD) //not dead, not important @@ -260,7 +256,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( continue if(!M.client || !client) //client is so that ghosts don't have to listen to mice continue - if(get_dist(M, src) > 7 || M.z != z) //they're out of range of normal hearing + if(get_dist(M, source) > 7 || M.z != z) //they're out of range of normal hearing if(eavesdropping_modes[message_mode] && !(M.client.prefs.chat_toggles & CHAT_GHOSTWHISPER)) //they're whispering and we have hearing whispers at any range off continue if(!(M.client.prefs.chat_toggles & CHAT_GHOSTEARS)) //they're talking normally and we have hearing at any range off @@ -272,15 +268,15 @@ GLOBAL_LIST_INIT(department_radio_keys, list( var/eavesrendered if(eavesdrop_range) eavesdropping = stars(message) - eavesrendered = compose_message(src, message_language, eavesdropping, , spans, message_mode) + eavesrendered = compose_message(src, message_language, eavesdropping, null, spans, message_mode, FALSE, source) - var/rendered = compose_message(src, message_language, message, , spans, message_mode) + var/rendered = compose_message(src, message_language, message, null, spans, message_mode, FALSE, source) for(var/_AM in listening) var/atom/movable/AM = _AM if(eavesdrop_range && get_dist(source, AM) > message_range && !(the_dead[AM])) - AM.Hear(eavesrendered, src, message_language, eavesdropping, , spans, message_mode) + AM.Hear(eavesrendered, src, message_language, eavesdropping, null, spans, message_mode, source) else - AM.Hear(rendered, src, message_language, message, , spans, message_mode) + AM.Hear(rendered, src, message_language, message, null, spans, message_mode, source) SEND_GLOBAL_SIGNAL(COMSIG_GLOB_LIVING_SAY_SPECIAL, src, message) //speech bubble diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 1b1eb1a805..0444458841 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -36,7 +36,7 @@ var/can_be_carded = TRUE var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list(), "Burglar"=list()) var/viewalerts = 0 - var/icon/holo_icon//Default is assigned when AI is created. + var/icon/holo_icon//Female is assigned when AI is created. var/obj/mecha/controlled_mech //For controlled_mech a mech, to determine whether to relaymove or use the AI eye. var/radio_enabled = TRUE //Determins if a carded AI can speak with its built in radio or not. radiomod = ";" //AIs will, by default, state their laws on the internal radio. @@ -93,6 +93,7 @@ var/list/all_eyes = list() var/max_multicams = 6 var/display_icon_override + var/emote_display = "Neutral" //text string of the current emote we set for the status displays, to prevent logins resetting it. /mob/living/silicon/ai/Initialize(mapload, datum/ai_laws/L, mob/target_ai) . = ..() @@ -130,7 +131,7 @@ set_core_display_icon() - holo_icon = getHologramIcon(icon('icons/mob/ai.dmi',"default")) + holo_icon = getHologramIcon(icon('icons/mob/ai.dmi',"female")) spark_system = new /datum/effect_system/spark_spread() spark_system.set_up(5, 0, src) @@ -201,6 +202,7 @@ if(!ai_core_icon || incapacitated()) return + display_icon_override = ai_core_icon set_core_display_icon(ai_core_icon) @@ -599,12 +601,15 @@ if(incapacitated()) return var/list/ai_emotions = list("Very Happy", "Happy", "Neutral", "Unsure", "Confused", "Sad", "BSOD", "Blank", "Problems?", "Awesome", "Facepalm", "Thinking", "Friend Computer", "Dorfy", "Blue Glow", "Red Glow") - var/emote = input("Please, select a status!", "AI Status", null, null) in ai_emotions + var/n_emote = input("Please, select a status!", "AI Status", null, null) in ai_emotions + if(!n_emote) + return + emote_display = n_emote for (var/each in GLOB.ai_status_displays) //change status of displays var/obj/machinery/status_display/ai/M = each - M.emotion = emote + M.emotion = emote_display M.update() - if (emote == "Friend Computer") + if (emote_display == "Friend Computer") var/datum/radio_frequency/frequency = SSradio.return_frequency(FREQ_STATUS_DISPLAYS) if(!frequency) @@ -670,10 +675,13 @@ holo_icon = getHologramIcon(icon(icon_list[input], input)) else var/list/icon_list = list( - "default" = 'icons/mob/ai.dmi', + "female" = 'icons/mob/ai.dmi', + "male" = 'icons/mob/ai.dmi', "floating face" = 'icons/mob/ai.dmi', + "green face" = 'icons/mob/ai.dmi', "xeno queen" = 'icons/mob/alien.dmi', - "horror" = 'icons/mob/ai.dmi' + "horror" = 'icons/mob/ai.dmi', + "creature" = 'icons/mob/ai.dmi' ) input = input("Please select a hologram:") as null|anything in icon_list @@ -783,7 +791,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 ..() @@ -823,7 +831,7 @@ var/rendered = "[start][hrefpart][namepart] ([jobpart]) [raw_message]" - show_message(rendered, 2) + show_message(rendered, MSG_AUDIBLE) /mob/living/silicon/ai/fully_replace_character_name(oldname,newname) ..() @@ -882,6 +890,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 f72e03350e..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() diff --git a/code/modules/mob/living/silicon/ai/examine.dm b/code/modules/mob/living/silicon/ai/examine.dm index fb345e10ba..10b88ae14a 100644 --- a/code/modules/mob/living/silicon/ai/examine.dm +++ b/code/modules/mob/living/silicon/ai/examine.dm @@ -1,26 +1,22 @@ /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..7477ba7713 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" @@ -182,7 +191,7 @@ acceleration = !acceleration to_chat(usr, "Camera acceleration has been toggled [acceleration ? "on" : "off"].") -/mob/camera/aiEye/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) +/mob/camera/aiEye/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source) . = ..() if(relay_speech && speaker && ai && !radio_freq && speaker != ai && near_camera(speaker)) ai.relay_speech(message, speaker, message_language, raw_message, radio_freq, spans, message_mode) 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..930c55b627 100644 --- a/code/modules/mob/living/silicon/ai/login.dm +++ b/code/modules/mob/living/silicon/ai/login.dm @@ -4,8 +4,9 @@ for(var/each in GLOB.ai_status_displays) //change status var/obj/machinery/status_display/ai/O = each O.mode = 1 - O.emotion = "Neutral" + O.emotion = emote_display 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/damage_procs.dm b/code/modules/mob/living/silicon/damage_procs.dm index 8fbd7afbdd..91a6709bc9 100644 --- a/code/modules/mob/living/silicon/damage_procs.dm +++ b/code/modules/mob/living/silicon/damage_procs.dm @@ -30,10 +30,10 @@ /mob/living/silicon/setCloneLoss(amount, updating_health = TRUE, forced = FALSE) return FALSE -/mob/living/silicon/adjustStaminaLoss(amount, updating_stamina = 1, forced = FALSE)//immune to stamina damage. +/mob/living/silicon/adjustStaminaLoss(amount, updating_health = 1, forced = FALSE)//immune to stamina damage. return FALSE -/mob/living/silicon/setStaminaLoss(amount, updating_stamina = 1) +/mob/living/silicon/setStaminaLoss(amount, updating_health = 1) return FALSE /mob/living/silicon/adjustOrganLoss(slot, amount, maximum = 500) 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/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..0484e39c1a 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 @@ -1090,9 +1098,9 @@ status_flags &= ~CANPUSH if(module.clean_on_move) - AddComponent(/datum/component/cleaning) + AddElement(/datum/element/cleaning) else - qdel(GetComponent(/datum/component/cleaning)) + RemoveElement(/datum/element/cleaning) hat_offset = module.hat_offset @@ -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_health = 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..b9cee43138 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -13,6 +13,8 @@ mob_biotypes = list(MOB_ROBOTIC) rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE speech_span = SPAN_ROBOT + flags_1 = PREVENT_CONTENTS_EXPLOSION_1 | HEAR_1 + no_vore = TRUE var/datum/ai_laws/laws = null//Now... THEY ALL CAN ALL HAVE LAWS var/last_lawchange_announce = 0 @@ -70,9 +72,6 @@ /mob/living/silicon/contents_explosion(severity, target) return -/mob/living/silicon/prevent_content_explosion() - return TRUE - /mob/living/silicon/proc/cancelAlarm() return diff --git a/code/modules/mob/living/simple_animal/astral.dm b/code/modules/mob/living/simple_animal/astral.dm index 9bac53ef22..2aafedb149 100644 --- a/code/modules/mob/living/simple_animal/astral.dm +++ b/code/modules/mob/living/simple_animal/astral.dm @@ -57,3 +57,9 @@ return to_chat(A, "[src] projects into your mind, \"[message]\"") log_game("FERMICHEM: [src] has astrally transmitted [message] into [A]") + +//Delete the mob if there's no mind! Pay that mob no mind. +/mob/living/simple_animal/astral/Life() + if(!mind) + qdel(src) + . = ..() diff --git a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm index 0378b0b9ee..f2ab3e56ed 100644 --- a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm +++ b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm @@ -135,7 +135,7 @@ var/atom/Tsec = drop_location() var/obj/item/bot_assembly/secbot/Sa = new (Tsec) - Sa.build_step = 1 + Sa.build_step = ASSEMBLY_SECOND_STEP Sa.add_overlay("hs_hole") Sa.created_name = name new /obj/item/assembly/prox_sensor(Tsec) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index a5943aa0e6..e61cfad068 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() ..() @@ -673,11 +674,11 @@ Pass a positive integer as an argument to override a bot's default speed. destination = nearest_beacon //PDA control. Some bots, especially MULEs, may have more parameters. -/mob/living/simple_animal/bot/proc/bot_control(command, mob/user, turf/user_turf, list/user_access = list()) +/mob/living/simple_animal/bot/proc/bot_control(command, mob/user, list/user_access = list()) if(!on || emagged == 2 || remote_disabled) //Emagged bots do not respect anyone's authority! Bots with their remote controls off cannot get commands. return TRUE //ACCESS DENIED if(client) - bot_control_message(command,user,user_turf,user_access) + bot_control_message(command, user) // process control input switch(command) if("patroloff") @@ -689,7 +690,7 @@ Pass a positive integer as an argument to override a bot's default speed. if("summon") bot_reset() - summon_target = user_turf + summon_target = get_turf(user) if(user_access.len != 0) access_card.access = user_access + prev_access //Adds the user's access, if any. mode = BOT_SUMMON @@ -701,15 +702,14 @@ Pass a positive integer as an argument to override a bot's default speed. return // -/mob/living/simple_animal/bot/proc/bot_control_message(command,user,user_turf,user_access) +/mob/living/simple_animal/bot/proc/bot_control_message(command, user) switch(command) if("patroloff") to_chat(src, "STOP PATROL") if("patrolon") to_chat(src, "START PATROL") if("summon") - var/area/a = get_area(user_turf) - to_chat(src, "PRIORITY ALERT:[user] in [a.name]!") + to_chat(src, "PRIORITY ALERT:[user] in [get_area_name(user)]!") if("stop") to_chat(src, "STOP!") diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index 77df764b43..6c4680a477 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) && build_step == 4) + if(W.use_tool(src, user, 0, volume=40) && build_step == ASSEMBLY_FOURTH_STEP) name = "shielded frame assembly" to_chat(user, "You weld the vest to [src].") build_step++ diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index e272878574..cbd985c358 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -379,7 +379,7 @@ Auto Patrol[]"}, var/atom/Tsec = drop_location() var/obj/item/bot_assembly/ed209/Sa = new (Tsec) - Sa.build_step = 1 + Sa.build_step = ASSEMBLY_SECOND_STEP Sa.add_overlay("hs_hole") Sa.created_name = name new /obj/item/assembly/prox_sensor(Tsec) 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..426de81da0 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 = FALSE) 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..c0a9a2082f 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 @@ -411,7 +411,7 @@ Auto Patrol: []"}, var/atom/Tsec = drop_location() var/obj/item/bot_assembly/secbot/Sa = new (Tsec) - Sa.build_step = 1 + Sa.build_step = ASSEMBLY_SECOND_STEP Sa.add_overlay("hs_hole") Sa.created_name = name new /obj/item/assembly/prox_sensor(Tsec) 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/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 3a21a04bf9..73fd2b5569 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -169,40 +169,40 @@ /mob/living/simple_animal/pet/cat/Life() if(!stat && !buckled && !client) if(prob(1)) - emote("me", 1, pick("stretches out for a belly rub.", "wags its tail.", "lies down.")) + emote("me", EMOTE_VISIBLE, pick("stretches out for a belly rub.", "wags its tail.", "lies down.")) icon_state = "[icon_living]_rest" collar_type = "[initial(collar_type)]_rest" resting = 1 update_canmove() else if (prob(1)) - emote("me", 1, pick("sits down.", "crouches on its hind legs.", "looks alert.")) + emote("me", EMOTE_VISIBLE, pick("sits down.", "crouches on its hind legs.", "looks alert.")) icon_state = "[icon_living]_sit" collar_type = "[initial(collar_type)]_sit" resting = 1 update_canmove() else if (prob(1)) if (resting) - emote("me", 1, pick("gets up and meows.", "walks around.", "stops resting.")) + emote("me", EMOTE_VISIBLE, pick("gets up and meows.", "walks around.", "stops resting.")) icon_state = "[icon_living]" collar_type = "[initial(collar_type)]" resting = 0 update_canmove() else - emote("me", 1, pick("grooms its fur.", "twitches its whiskers.", "shakes out its coat.")) + emote("me", EMOTE_VISIBLE, pick("grooms its fur.", "twitches its whiskers.", "shakes out its coat.")) //MICE! if((src.loc) && isturf(src.loc)) if(!stat && !resting && !buckled) for(var/mob/living/simple_animal/mouse/M in view(1,src)) if(!M.stat && Adjacent(M)) - emote("me", 1, "splats \the [M]!") + emote("me", EMOTE_VISIBLE, "splats \the [M]!") M.splat() movement_target = null stop_automated_movement = 0 break for(var/obj/item/toy/cattoy/T in view(1,src)) if (T.cooldown < (world.time - 400)) - emote("me", 1, "bats \the [T] around with its paw!") + emote("me", EMOTE_VISIBLE, "bats \the [T] around with its paw!") T.cooldown = world.time ..() @@ -241,10 +241,10 @@ if(change > 0) if(M && stat != DEAD) new /obj/effect/temp_visual/heart(loc) - emote("me", 1, "purrs!") + emote("me", EMOTE_VISIBLE, "purrs!") else if(M && stat != DEAD) - emote("me", 1, "hisses!") + emote("me", EMOTE_VISIBLE, "hisses!") /mob/living/simple_animal/pet/cat/cak //I told you I'd do it, Remie name = "Keeki" @@ -310,6 +310,7 @@ emote_see = list("looks at you eagerly for pets!", "wiggles enthusiastically.") gold_core_spawnable = NO_SPAWN var/pseudo_death = FALSE + var/mob/living/carbon/human/origin /mob/living/simple_animal/pet/cat/custom_cat/death() if (pseudo_death == TRUE) //secret cat chem diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index c194233c42..eb7129181d 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -459,10 +459,10 @@ movement_target.attack_animal(src) else if(ishuman(movement_target.loc) ) if(prob(20)) - emote("me", 1, "stares at [movement_target.loc]'s [movement_target] with a sad puppy-face") + emote("me", EMOTE_VISIBLE, "stares at [movement_target.loc]'s [movement_target] with a sad puppy-face") if(prob(1)) - emote("me", 1, pick("dances around.","chases its tail!")) + emote("me", EMOTE_VISIBLE, pick("dances around.","chases its tail!")) spawn(0) for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2)) setDir(i) @@ -618,7 +618,7 @@ if(!stat && !resting && !buckled) if(prob(1)) - emote("me", 1, pick("dances around.","chases her tail.")) + emote("me", EMOTE_VISIBLE, pick("dances around.","chases her tail.")) spawn(0) for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2)) setDir(i) @@ -629,7 +629,7 @@ if(!stat && !resting && !buckled) if(prob(1)) - emote("me", 1, pick("chases its tail.")) + emote("me", EMOTE_VISIBLE, pick("chases its tail.")) spawn(0) for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2)) setDir(i) @@ -648,8 +648,8 @@ if(change > 0) if(M && stat != DEAD) // Added check to see if this mob (the dog) is dead to fix issue 2454 new /obj/effect/temp_visual/heart(loc) - emote("me", 1, "yaps happily!") + emote("me", EMOTE_VISIBLE, "yaps happily!") SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "pet_corgi", /datum/mood_event/pet_corgi) else if(M && stat != DEAD) // Same check here, even though emote checks it as well (poor form to check it only in the help case) - emote("me", 1, "growls!") + emote("me", EMOTE_VISIBLE, "growls!") 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/charger.dm b/code/modules/mob/living/simple_animal/guardian/types/charger.dm index 3ece5d4e27..49514d0d12 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/charger.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/charger.dm @@ -3,8 +3,8 @@ ranged = 1 //technically ranged_message = "charges" ranged_cooldown_time = 20 - damage_coeff = list(BRUTE = 0, BURN = 0.5, TOX = 0.5, CLONE = 0.5, STAMINA = 0, OXY = 0.5) - playstyle_string = "As a charger type you do medium damage, take half damage, immunity to brute damage, move very fast, and can charge at a location, damaging any target hit and forcing them to drop any items they are holding." + damage_coeff = list(BRUTE = 0.2, BURN = 0.5, TOX = 0.5, CLONE = 0.5, STAMINA = 0, OXY = 0.5) + playstyle_string = "As a charger type you do medium damage, take half damage, have near immunity to brute damage, move very fast, and can charge at a location, damaging any target hit and forcing them to drop any items they are holding." magic_fluff_string = "..And draw the Hunter, an alien master of rapid assault." tech_fluff_string = "Boot sequence complete. Charge modules loaded. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! Caught one! It's a charger carp, that likes running at people. But it doesn't have any legs..." diff --git a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm index 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..e9f767376a 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm @@ -29,6 +29,7 @@ /mob/living/simple_animal/hostile/guardian/bomb/AltClickOn(atom/movable/A) if(!istype(A)) + altclick_listed_turf(A) return if(loc == summoner) to_chat(src, "You must be manifested to create bombs!") @@ -90,6 +91,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/guardian/types/fire.dm b/code/modules/mob/living/simple_animal/guardian/types/fire.dm index b111caae50..718bfd71af 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/fire.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/fire.dm @@ -6,8 +6,8 @@ attack_sound = 'sound/items/welder.ogg' attacktext = "ignites" melee_damage_type = BURN - damage_coeff = list(BRUTE = 0.7, BURN = 0, TOX = 0.7, CLONE = 0.7, STAMINA = 0, OXY = 0.7) - playstyle_string = "As a chaos type, you take 30% damage reduction to all but burn, which you are immune to. You will ignite any enemy you bump into. in addition, your melee attacks will cause human targets to see everyone as you." + damage_coeff = list(BRUTE = 0.7, BURN = 0.1, TOX = 0.7, CLONE = 0.7, STAMINA = 0, OXY = 0.7) + playstyle_string = "As a chaos type, you take 30% damage reduction to all but burn, which you are almost immune to. You will ignite any enemy you bump into. in addition, your melee attacks will cause human targets to see everyone as you." magic_fluff_string = "..And draw the Wizard, bringer of endless chaos!" tech_fluff_string = "Boot sequence complete. Crowd control modules activated. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! You caught one! OH GOD, EVERYTHING'S ON FIRE. Except you and the fish." diff --git a/code/modules/mob/living/simple_animal/guardian/types/support.dm b/code/modules/mob/living/simple_animal/guardian/types/support.dm index d31809e9aa..b9783ed116 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/support.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm @@ -105,8 +105,9 @@ /mob/living/simple_animal/hostile/guardian/healer/AltClickOn(atom/movable/A) if(!istype(A)) + altclick_listed_turf(A) return - if(src.loc == summoner) + if(loc == summoner) to_chat(src, "You must be manifested to warp a target!") return if(!beacon) diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index 5240b4d06c..bb51358192 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -168,6 +168,7 @@ /mob/living/simple_animal/hostile/alien/maid/Initialize(mapload) . = ..() + AddElement(/datum/element/cleaning) /mob/living/simple_animal/hostile/alien/maid/AttackingTarget() if(ismovableatom(target)) 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/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 9cd0504315..0377efd16e 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -364,7 +364,7 @@ /mob/living/simple_animal/hostile/proc/Aggro() vision_range = aggro_vision_range if(target && emote_taunt.len && prob(taunt_chance)) - emote("me", 1, "[pick(emote_taunt)] at [target].") + emote("me", EMOTE_VISIBLE, "[pick(emote_taunt)] at [target].") taunt_chance = max(taunt_chance-7,2) 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 c21166276a..51a9d8d62b 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -373,10 +373,10 @@ 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) +/obj/machinery/anomalous_crystal/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode, atom/movable/source) ..() if(isliving(speaker)) ActivationReaction(speaker, ACTIVATE_SPEECH) @@ -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, special = FALSE) +/mob/living/simple_animal/hostile/lightgeist/ghostize(can_reenter_corpse = TRUE, special = FALSE, penalize = 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/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index b1694a6172..0e3cde5628 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -80,7 +80,7 @@ Difficulty: Medium return FALSE return ..() -/mob/living/simple_animal/hostile/megafauna/dragon/visible_message() +/mob/living/simple_animal/hostile/megafauna/dragon/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs) if(swooping & SWOOP_INVULNERABLE) //to suppress attack messages without overriding every single proc that could send a message saying we got hit return return ..() @@ -267,6 +267,7 @@ Difficulty: Medium /mob/living/simple_animal/hostile/megafauna/dragon/AltClickOn(atom/movable/A) if(!istype(A)) + altclick_listed_turf(A) return if(swoop_cooldown >= world.time) to_chat(src, "You need to wait 20 seconds between swoop attacks!") diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index cca39cfea6..6279821170 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -441,7 +441,7 @@ Difficulty: Normal /mob/living/simple_animal/hostile/megafauna/hierophant/AltClickOn(atom/A) //player control handler(don't give this to a player holy fuck) if(!istype(A) || get_dist(A, src) <= 2) - return + return altclick_listed_turf(A) blink(A) //Hierophant overlays diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index d62f59cdd7..8c2fbef15e 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -25,6 +25,7 @@ mob_size = MOB_SIZE_LARGE layer = LARGE_MOB_LAYER //Looks weird with them slipping under mineral walls and cameras and shit otherwise mouse_opacity = MOUSE_OPACITY_OPAQUE // Easier to click on in melee, they're giant targets anyway + flags_1 = PREVENT_CONTENTS_EXPLOSION_1 var/list/crusher_loot var/medal_type var/score_type = BOSS_SCORE @@ -41,9 +42,6 @@ QDEL_NULL(internal) . = ..() -/mob/living/simple_animal/hostile/megafauna/prevent_content_explosion() - return TRUE - /mob/living/simple_animal/hostile/megafauna/death(gibbed) if(health > 0) return @@ -118,8 +116,10 @@ recovery_time = world.time + buffer_time /mob/living/simple_animal/hostile/megafauna/proc/grant_achievement(medaltype, scoretype, crusher_kill) - if(!medal_type || (flags_1 & ADMIN_SPAWNED_1) || !SSmedals.hub_enabled) //Don't award medals if the medal type isn't set + if(!medal_type || (flags_1 & ADMIN_SPAWNED_1)) //Don't award medals if the medal type isn't set return FALSE + if(!SSmedals.hub_enabled) // This allows subtypes to carry on other special rewards not tied with medals. (such as bubblegum's arena shuttle) + return TRUE for(var/mob/living/L in view(7,src)) if(L.stat || !L.client) 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..3d23baae48 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) @@ -143,7 +143,7 @@ stat("Held Item", held_item) stat("Mode",a_intent) -/mob/living/simple_animal/parrot/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans, message_mode) +/mob/living/simple_animal/parrot/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans, message_mode, atom/movable/source) . = ..() if(speaker != src && prob(50)) //Dont imitate ourselves if(!radio_freq || prob(10)) @@ -437,7 +437,7 @@ //Search for item to steal parrot_interest = search_for_item() if(parrot_interest) - emote("me", 1, "looks in [parrot_interest]'s direction and takes flight.") + emote("me", EMOTE_VISIBLE, "looks in [parrot_interest]'s direction and takes flight.") parrot_state = PARROT_SWOOP | PARROT_STEAL icon_state = icon_living return @@ -459,7 +459,7 @@ if(AM) if(istype(AM, /obj/item) || isliving(AM)) //If stealable item parrot_interest = AM - emote("me", 1, "turns and flies towards [parrot_interest].") + emote("me", EMOTE_VISIBLE, "turns and flies towards [parrot_interest].") parrot_state = PARROT_SWOOP | PARROT_STEAL return else //Else it's a perch @@ -760,7 +760,7 @@ held_item = null if(health < maxHealth) adjustBruteLoss(-10) - emote("me", 1, "[src] eagerly downs the cracker.") + emote("me", EMOTE_VISIBLE, "[src] eagerly downs the cracker.") return 1 diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index a2ef5b813b..52e58aea4e 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -185,16 +185,16 @@ say(pick(speak), forced = "poly") else if(!(emote_hear && emote_hear.len) && (emote_see && emote_see.len)) - emote("me", 1, pick(emote_see)) + emote("me", EMOTE_VISIBLE, pick(emote_see)) if((emote_hear && emote_hear.len) && !(emote_see && emote_see.len)) - emote("me", 2, pick(emote_hear)) + emote("me", EMOTE_AUDIBLE, pick(emote_hear)) if((emote_hear && emote_hear.len) && (emote_see && emote_see.len)) var/length = emote_hear.len + emote_see.len var/pick = rand(1,length) if(pick <= emote_see.len) - emote("me", 1, pick(emote_see)) + emote("me", EMOTE_VISIBLE, pick(emote_see)) else - emote("me", 2, pick(emote_hear)) + emote("me", EMOTE_AUDIBLE, pick(emote_hear)) /mob/living/simple_animal/proc/environment_is_safe(datum/gas_mixture/environment, check_temp = FALSE) @@ -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/say.dm b/code/modules/mob/living/simple_animal/slime/say.dm index a2618b711e..c48249d80f 100644 --- a/code/modules/mob/living/simple_animal/slime/say.dm +++ b/code/modules/mob/living/simple_animal/slime/say.dm @@ -1,4 +1,4 @@ -/mob/living/simple_animal/slime/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode) +/mob/living/simple_animal/slime/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode, atom/movable/source) . = ..() if(speaker != src && !radio_freq && !stat) if (speaker in Friends) 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/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm index cacd1c7c56..7f8513bfd9 100644 --- a/code/modules/mob/living/ventcrawling.dm +++ b/code/modules/mob/living/ventcrawling.dm @@ -8,6 +8,7 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list( /mob/living/proc/handle_ventcrawl(atom/A) if(!ventcrawler || !Adjacent(A)) return + . = TRUE //return value to stop the client from being shown the turf contents stat tab on alt-click. if(stat) to_chat(src, "You must be conscious to do this!") return diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index f790d15d2d..d4528fb91f 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -85,106 +85,120 @@ msg = copytext(msg, 1, MAX_MESSAGE_LEN) if(type) - if(type & 1 && eye_blind )//Vision related + if(type & MSG_VISUAL && eye_blind )//Vision related if(!alt_msg) return else msg = alt_msg type = alt_type - if(type & 2 && !can_hear())//Hearing related + if(type & MSG_AUDIBLE && !can_hear())//Hearing related if(!alt_msg) return else msg = alt_msg type = alt_type - if(type & 1 && eye_blind) + if(type & MSG_VISUAL && eye_blind) return // voice muffling if(stat == UNCONSCIOUS) - if(type & 2) //audio + if(type & MSG_AUDIBLE) //audio to_chat(src, "... You can almost hear something ...") - else - to_chat(src, msg) + return + to_chat(src, msg) -// Show a message to all player mobs who sees this atom -// Show a message to the src mob (if the src is a mob) -// Use for atoms performing visible actions -// message is output to anyone who can see, e.g. "The [src] does something!" -// self_message (optional) is what the src mob sees e.g. "You do something!" -// blind_message (optional) is what blind people will hear e.g. "You hear something!" -// vision_distance (optional) define how many tiles away the message can be seen. -// ignored_mob (optional) doesn't show any message to a given mob if TRUE. - -/atom/proc/visible_message(message, self_message, blind_message, vision_distance, list/ignored_mobs, no_ghosts = FALSE) +/** + * Generate a visible message from this atom + * + * Show a message to all player mobs who sees this atom + * + * Show a message to the src mob (if the src is a mob) + * + * Use for atoms performing visible actions + * + * message is output to anyone who can see, e.g. "The [src] does something!" + * + * Vars: + * * self_message (optional) is what the src mob sees e.g. "You do something!" + * * blind_message (optional) is what blind people will hear e.g. "You hear something!" + * * vision_distance (optional) define how many tiles away the message can be seen. + * * ignored_mobs (optional) doesn't show any message to any given mob in the list. + */ +/atom/proc/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs) var/turf/T = get_turf(src) if(!T) return + var/list/hearers = get_hearers_in_view(vision_distance, src) //caches the hearers and then removes ignored mobs. + if(!length(hearers)) + return if(!islist(ignored_mobs)) ignored_mobs = list(ignored_mobs) - var/range = 7 - if(vision_distance) - range = vision_distance - for(var/mob/M in get_hearers_in_view(range, src)) + hearers -= ignored_mobs + if(self_message) + hearers -= src + for(var/mob/M in hearers) if(!M.client) continue - if(M in ignored_mobs) - continue + //This entire if/else chain could be in two lines but isn't for readibilties sake. var/msg = message - if(isobserver(M) && no_ghosts) + //CITADEL EDIT, required for vore code to remove (T != loc && T != src)) as a check + if(M.see_invisible[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/say_vr.dm b/code/modules/mob/say_vr.dm index 4bbeef707a..a7ffd29463 100644 --- a/code/modules/mob/say_vr.dm +++ b/code/modules/mob/say_vr.dm @@ -173,9 +173,9 @@ proc/get_top_level_mob(var/mob/S) message = "[user] " + "[message]" if(emote_type == EMOTE_AUDIBLE) - user.audible_message(message=message,hearing_distance=1, no_ghosts = TRUE) + user.audible_message(message=message,hearing_distance=1, ignored_mobs = GLOB.dead_mob_list) else - user.visible_message(message=message,self_message=message,vision_distance=1, no_ghosts = TRUE) + user.visible_message(message=message,self_message=message,vision_distance=1, ignored_mobs = GLOB.dead_mob_list) log_emote("[key_name(user)] : (SUBTLER) [message]") message = null diff --git a/code/modules/mob/status_procs.dm b/code/modules/mob/status_procs.dm index 606d6d4f66..17311daec2 100644 --- a/code/modules/mob/status_procs.dm +++ b/code/modules/mob/status_procs.dm @@ -134,17 +134,6 @@ /mob/proc/Dizzy(amount) dizziness = max(dizziness,amount,0) -/////////////////////////////////// EYE DAMAGE //////////////////////////////////// - -/mob/proc/damage_eyes(amount) - return - -/mob/proc/adjust_eye_damage(amount) - return - -/mob/proc/set_eye_damage(amount) - return - /////////////////////////////////// EYE_BLIND //////////////////////////////////// /mob/proc/blind_eyes(amount) diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index db4cdc2ff5..79c74de2eb 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -126,7 +126,7 @@ portable_drive.verb_pickup() /obj/item/modular_computer/AltClick(mob/user) - ..() + . = ..() if(issilicon(user)) return @@ -142,7 +142,7 @@ return if(ai_slot) ai_slot.try_eject(null, user) - + return TRUE // Gets IDs/access levels from card slot. Would be useful when/if PDAs would become modular PCs. /obj/item/modular_computer/GetAccess() @@ -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..ce8ab9659c 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() . = ..() @@ -86,8 +86,8 @@ /obj/item/modular_computer/laptop/AltClick(mob/user) if(screen_on) // Close it. try_toggle_open(user) - else - return ..() + return TRUE + return ..() /obj/item/modular_computer/laptop/proc/toggle_open(mob/living/user=null) if(screen_on) 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/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm index b3476e7046..a988003b67 100644 --- a/code/modules/modular_computers/computers/machinery/modular_computer.dm +++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm @@ -94,8 +94,9 @@ cpu.eject_card() /obj/machinery/modular_computer/AltClick(mob/user) + . = ..() if(cpu) - cpu.AltClick(user) + return cpu.AltClick(user) //ATTACK HAND IGNORING PARENT RETURN VALUE // On-click handling. Turns on the computer if it's off and opens the GUI. 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/suit.dm b/code/modules/ninja/suit/suit.dm index d89bb9edf2..03fc7a2ed2 100644 --- a/code/modules/ninja/suit/suit.dm +++ b/code/modules/ninja/suit/suit.dm @@ -149,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/paperwork/contract.dm b/code/modules/paperwork/contract.dm index 3009a3ebfd..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() diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 1d6326a3ed..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) diff --git a/code/modules/paperwork/paper_cutter.dm b/code/modules/paperwork/paper_cutter.dm index ccc9427349..0f57d53111 100644 --- a/code/modules/paperwork/paper_cutter.dm +++ b/code/modules/paperwork/paper_cutter.dm @@ -91,7 +91,6 @@ update_icon() /obj/item/papercutter/MouseDrop(atom/over_object) - . = ..() var/mob/M = usr if(M.incapacitated() || !Adjacent(M)) return @@ -102,6 +101,10 @@ else if(istype(over_object, /obj/screen/inventory/hand)) var/obj/screen/inventory/hand/H = over_object M.putItemFromInventoryInHandIfPossible(src, H.held_index) + + else + . = ..() + add_fingerprint(M) /obj/item/paperslip diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 6d9c6373ba..6fc65e1771 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -41,7 +41,6 @@ ..() /obj/item/paper_bin/MouseDrop(atom/over_object) - . = ..() var/mob/living/M = usr if(!istype(M) || M.incapacitated() || !Adjacent(M)) return @@ -52,6 +51,9 @@ else if(istype(over_object, /obj/screen/inventory/hand)) var/obj/screen/inventory/hand/H = over_object M.putItemFromInventoryInHandIfPossible(src, H.held_index) + + else + . = ..() add_fingerprint(M) @@ -116,11 +118,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() diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index b547089aef..2ca6ce2611 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -44,10 +44,12 @@ return ..() /obj/item/paperplane/suicide_act(mob/living/user) + var/obj/item/organ/eyes/eyes = user.getorganslot(ORGAN_SLOT_EYES) user.Stun(200) user.visible_message("[user] jams [src] in [user.p_their()] nose. It looks like [user.p_theyre()] trying to commit suicide!") user.adjust_blurriness(6) - user.adjust_eye_damage(rand(6,8)) + if(eyes) + eyes.applyOrganDamage(rand(6,8)) sleep(10) return (BRUTELOSS) @@ -111,17 +113,20 @@ if(prob(hit_probability)) if(H.is_eyes_covered()) return + var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) visible_message("\The [src] hits [H] in the eye!") H.adjust_blurriness(6) - H.adjust_eye_damage(rand(6,8)) + if(eyes) + eyes.applyOrganDamage(rand(6,8)) H.Knockdown(40) 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)) return to_chat(user, "You fold [src] into the shape of a plane!") @@ -134,3 +139,4 @@ I = new plane_type(user, src) user.put_in_hands(I) + return TRUE diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index fece60f268..7567fc1a52 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -174,11 +174,15 @@ */ /obj/item/pen/edagger attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") //these wont show up if the pen is off + sharpness = IS_SHARP var/on = FALSE /obj/item/pen/edagger/Initialize() . = ..() - AddComponent(/datum/component/butchering, 60, 100, 0, 'sound/weapons/blade1.ogg', TRUE) + AddComponent(/datum/component/butchering, 60, 100, 0, 'sound/weapons/blade1.ogg') + +/obj/item/pen/edagger/get_sharpness() + return on * sharpness /obj/item/pen/edagger/attack_self(mob/living/user) if(on) @@ -201,8 +205,6 @@ throwforce = 35 playsound(user, 'sound/weapons/saberon.ogg', 5, 1) to_chat(user, "[src] is now active.") - var/datum/component/butchering/butchering = src.GetComponent(/datum/component/butchering) - butchering.butchering_enabled = on update_icon() /obj/item/pen/edagger/update_icon() diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm index 8c51fd31ea..96738e5021 100644 --- a/code/modules/photography/camera/camera.dm +++ b/code/modules/photography/camera/camera.dm @@ -43,16 +43,17 @@ /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)) return var/desired_x = input(user, "How high do you want the camera to shoot, between [picture_size_x_min] and [picture_size_x_max]?", "Zoom", picture_size_x) as num var/desired_y = input(user, "How wide do you want the camera to shoot, between [picture_size_y_min] and [picture_size_y_max]?", "Zoom", picture_size_y) as num picture_size_x = min(CLAMP(desired_x, picture_size_x_min, picture_size_x_max), CAMERA_PICTURE_SIZE_HARD_LIMIT) picture_size_y = min(CLAMP(desired_y, picture_size_y_min, picture_size_y_max), CAMERA_PICTURE_SIZE_HARD_LIMIT) - + return TRUE /obj/item/camera/attack(mob/living/carbon/human/M, mob/user) return @@ -81,8 +82,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..5da29bf5ac 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 @@ -702,11 +702,11 @@ return ..() /obj/machinery/power/apc/AltClick(mob/user) - ..() + . = ..() if(!user.canUseTopic(src, !issilicon(user)) || !isturf(loc)) return - else - togglelock(user) + togglelock(user) + return TRUE /obj/machinery/power/apc/proc/togglelock(mob/living/user) if(obj_flags & EMAGGED) diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index bbbf8edae5..ded99d6fa6 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!") @@ -360,3 +360,7 @@ var/area/A = get_area(src) if(!A.lightswitch || !A.light_power) charge = 0 //For naturally depowered areas, we start with no power + +//found inside the inducers ordered from cargo. +/obj/item/stock_parts/cell/inducer_supply + maxcharge = 5000 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..68ffcb909a 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -75,6 +75,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) icon_state = "darkmatter" density = TRUE anchored = TRUE + flags_1 = PREVENT_CONTENTS_EXPLOSION_1 var/uid = 1 var/static/gl_uid = 1 light_range = 4 @@ -187,17 +188,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 +308,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 +645,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 @@ -677,18 +677,15 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) for(var/mob/living/L in range(10)) investigate_log("has irradiated [key_name(L)] after consuming [AM].", INVESTIGATE_SUPERMATTER) if(L in view()) - L.show_message("As \the [src] slowly stops resonating, you find your skin covered in new radiation burns.", 1,\ - "The unearthly ringing subsides and you notice you have new radiation burns.", 2) + L.show_message("As \the [src] slowly stops resonating, you find your skin covered in new radiation burns.", MSG_VISUAL,\ + "The unearthly ringing subsides and you notice you have new radiation burns.", MSG_AUDIBLE) else - L.show_message("You hear an unearthly ringing and notice your skin is covered in fresh radiation burns.", 2) + L.show_message("You hear an unearthly ringing and notice your skin is covered in fresh radiation burns.", MSG_AUDIBLE) //Do not blow up our internal radio /obj/machinery/power/supermatter_crystal/contents_explosion(severity, target) return -/obj/machinery/power/supermatter_crystal/prevent_content_explosion() - return TRUE - /obj/machinery/power/supermatter_crystal/engine is_main_engine = TRUE 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 96b396243b..531c6082b0 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) . = ..() @@ -198,8 +198,13 @@ /obj/item/gun/can_trigger_gun(mob/living/user) . = ..() + if(!.) + return if(!handle_pins(user)) return FALSE + if(HAS_TRAIT(user, TRAIT_PACIFISM) && chambered?.harmful) // If the user has the pacifist trait, then they won't be able to fire [src] if the round chambered inside of [src] is lethal. + to_chat(user, " [src] is lethally chambered! You don't want to risk harming anyone...") + return FALSE /obj/item/gun/proc/handle_pins(mob/living/user) if(pin) @@ -275,10 +280,6 @@ addtimer(CALLBACK(src, .proc/process_burst, user, target, message, params, zone_override, sprd, randomized_gun_spread, randomized_bonus_spread, rand_spr, i), fire_delay * (i - 1)) else if(chambered) - if(HAS_TRAIT(user, TRAIT_PACIFISM)) // If the user has the pacifist trait, then they won't be able to fire [src] if the round chambered inside of [src] is lethal. - if(chambered.harmful) // Is the bullet chambered harmful? - to_chat(user, " [src] is lethally chambered! You don't want to risk harming anyone...") - return sprd = round((rand() - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread)) if(!chambered.fire_casing(target, user, params, , suppressed, zone_override, sprd, src)) shoot_with_empty_chamber(user) 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..571525d8f0 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" @@ -225,14 +225,15 @@ spread = 2 /obj/item/gun/ballistic/shotgun/automatic/combat/compact/AltClick(mob/living/user) + . = ..() if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return toggle_stock(user) - . = ..() + return TRUE /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 +264,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() . = ..() @@ -290,8 +290,10 @@ to_chat(user, "You switch to tube A.") /obj/item/gun/ballistic/shotgun/automatic/dual_tube/AltClick(mob/living/user) + . = ..() if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return pump() + return TRUE // DOUBLE BARRELED SHOTGUN and IMPROVISED SHOTGUN are in revolver.dm diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 2cccc57d9e..8a65a29826 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -144,22 +144,24 @@ ..() if(!automatic_charge_overlays) return - var/ratio = CEILING(CLAMP(cell.charge / cell.maxcharge, 0, 1) * charge_sections, 1) + var/ratio = can_shoot() ? CEILING(CLAMP(cell.charge / cell.maxcharge, 0, 1) * charge_sections, 1) : 0 + // Sets the ratio to 0 if the gun doesn't have enough charge to fire, or if it's power cell is removed. + // TG issues #5361 & #47908 if(ratio == old_ratio && !force_update) return old_ratio = ratio cut_overlays() - var/obj/item/ammo_casing/energy/shot = ammo_type[select] var/iconState = "[icon_state]_charge" var/itemState = null if(!initial(item_state)) itemState = icon_state if (modifystate) + var/obj/item/ammo_casing/energy/shot = ammo_type[select] add_overlay("[icon_state]_[shot.select_name]") iconState += "_[shot.select_name]" if(itemState) itemState += "[shot.select_name]" - if(cell.charge < shot.e_cost) + if(ratio == 0) add_overlay("[icon_state]_empty") else if(!shaded_charge) 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/pins.dm b/code/modules/projectiles/pins.dm index 9103340790..1e2070de1b 100644 --- a/code/modules/projectiles/pins.dm +++ b/code/modules/projectiles/pins.dm @@ -60,10 +60,10 @@ /obj/item/firing_pin/proc/auth_fail(mob/living/user) if(user) - user.show_message(fail_message, 1) + user.show_message(fail_message, MSG_VISUAL) if(selfdestruct) if(user) - user.show_message("SELF-DESTRUCTING...
    ", 1) + user.show_message("SELF-DESTRUCTING...
    ", MSG_VISUAL) to_chat(user, "[gun] explodes!") explosion(get_turf(gun), -1, 0, 2, 3) if(gun) 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/energy.dm b/code/modules/projectiles/projectile/energy.dm deleted file mode 100644 index 047d50beaf..0000000000 --- a/code/modules/projectiles/projectile/energy.dm +++ /dev/null @@ -1,203 +0,0 @@ -/obj/item/projectile/energy - name = "energy" - icon_state = "spark" - damage = 0 - damage_type = BURN - flag = "energy" - is_reflectable = TRUE - -/obj/item/projectile/energy/chameleon - nodamage = TRUE - -/obj/item/projectile/energy/electrode - name = "electrode" - icon_state = "spark" - color = "#FFFF00" - nodamage = 1 - knockdown = 100 - stutter = 5 - jitter = 20 - hitsound = 'sound/weapons/taserhit.ogg' - range = 7 - tracer_type = /obj/effect/projectile/tracer/stun - muzzle_type = /obj/effect/projectile/muzzle/stun - impact_type = /obj/effect/projectile/impact/stun - -/obj/item/projectile/energy/electrode/on_hit(atom/target, blocked = FALSE) - . = ..() - if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - burst into sparks! - do_sparks(1, TRUE, src) - else if(iscarbon(target)) - var/mob/living/carbon/C = target - if(C.dna && C.dna.check_mutation(HULK)) - C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) - else if((C.status_flags & CANKNOCKDOWN) && !HAS_TRAIT(C, TRAIT_STUNIMMUNE)) - addtimer(CALLBACK(C, /mob/living/carbon.proc/do_jitter_animation, jitter), 5) - -/obj/item/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet - do_sparks(1, TRUE, src) - ..() - -/obj/item/projectile/energy/net - name = "energy netting" - icon_state = "e_netting" - damage = 10 - damage_type = STAMINA - hitsound = 'sound/weapons/taserhit.ogg' - range = 10 - -/obj/item/projectile/energy/net/Initialize() - . = ..() - SpinAnimation() - -/obj/item/projectile/energy/net/on_hit(atom/target, blocked = FALSE) - if(isliving(target)) - var/turf/Tloc = get_turf(target) - if(!locate(/obj/effect/nettingportal) in Tloc) - new /obj/effect/nettingportal(Tloc) - ..() - -/obj/item/projectile/energy/net/on_range() - do_sparks(1, TRUE, src) - ..() - -/obj/effect/nettingportal - name = "DRAGnet teleportation field" - desc = "A field of bluespace energy, locking on to teleport a target." - icon = 'icons/effects/effects.dmi' - icon_state = "dragnetfield" - light_range = 3 - anchored = TRUE - -/obj/effect/nettingportal/Initialize() - . = ..() - var/obj/item/radio/beacon/teletarget = null - for(var/obj/machinery/computer/teleporter/com in GLOB.machines) - if(com.target) - if(com.power_station && com.power_station.teleporter_hub && com.power_station.engaged) - teletarget = com.target - - addtimer(CALLBACK(src, .proc/pop, teletarget), 30) - -/obj/effect/nettingportal/proc/pop(teletarget) - if(teletarget) - for(var/mob/living/L in get_turf(src)) - do_teleport(L, teletarget, 2)//teleport what's in the tile to the beacon - else - for(var/mob/living/L in get_turf(src)) - do_teleport(L, L, 15) //Otherwise it just warps you off somewhere. - - qdel(src) - -/obj/effect/nettingportal/singularity_act() - return - -/obj/effect/nettingportal/singularity_pull() - return - - -/obj/item/projectile/energy/trap - name = "energy snare" - icon_state = "e_snare" - nodamage = 1 - knockdown = 20 - hitsound = 'sound/weapons/taserhit.ogg' - range = 4 - -/obj/item/projectile/energy/trap/on_hit(atom/target, blocked = FALSE) - if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - drop a trap - new/obj/item/restraints/legcuffs/beartrap/energy(get_turf(loc)) - else if(iscarbon(target)) - var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy(get_turf(target)) - B.Crossed(target) - ..() - -/obj/item/projectile/energy/trap/on_range() - new /obj/item/restraints/legcuffs/beartrap/energy(loc) - ..() - -/obj/item/projectile/energy/trap/cyborg - name = "Energy Bola" - icon_state = "e_snare" - nodamage = 1 - knockdown = 0 - hitsound = 'sound/weapons/taserhit.ogg' - range = 10 - -/obj/item/projectile/energy/trap/cyborg/on_hit(atom/target, blocked = FALSE) - if(!ismob(target) || blocked >= 100) - do_sparks(1, TRUE, src) - qdel(src) - if(iscarbon(target)) - var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(target)) - B.Crossed(target) - QDEL_IN(src, 10) - ..() - -/obj/item/projectile/energy/trap/cyborg/on_range() - do_sparks(1, TRUE, src) - qdel(src) - -/obj/item/projectile/energy/declone - name = "radiation beam" - icon_state = "declone" - damage = 20 - damage_type = CLONE - irradiate = 10 - impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser - -/obj/item/projectile/energy/dart //ninja throwing dart - name = "dart" - icon_state = "toxin" - damage = 5 - damage_type = TOX - knockdown = 100 - range = 7 - -/obj/item/projectile/energy/bolt //ebow bolts - name = "bolt" - icon_state = "cbbolt" - damage = 8 - damage_type = TOX - nodamage = 0 - knockdown = 100 - stutter = 5 - -/obj/item/projectile/energy/bolt/halloween - name = "candy corn" - icon_state = "candy_corn" - -/obj/item/projectile/energy/bolt/large - damage = 20 - -/obj/item/projectile/energy/tesla - name = "tesla bolt" - icon_state = "tesla_projectile" - impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser - var/chain - -/obj/item/projectile/energy/tesla/fire(setAngle) - if(firer) - chain = firer.Beam(src, icon_state = "lightning[rand(1, 12)]", time = INFINITY, maxdistance = INFINITY) - ..() - -/obj/item/projectile/energy/tesla/Destroy() - qdel(chain) - return ..() - -/obj/item/projectile/energy/tesla/revolver - name = "energy orb" - -/obj/item/projectile/energy/tesla/revolver/on_hit(atom/target) - . = ..() - if(isliving(target)) - tesla_zap(target, 3, 10000) - qdel(src) - -/obj/item/projectile/energy/tesla/cannon - name = "tesla orb" - -/obj/item/projectile/energy/tesla/cannon/on_hit(atom/target) - . = ..() - tesla_zap(target, 3, 10000, explosive = FALSE, stun_mobs = FALSE) - qdel(src) 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/projectiles/projectile/megabuster.dm b/code/modules/projectiles/projectile/megabuster.dm index bfe9f40297..8abb182a1e 100644 --- a/code/modules/projectiles/projectile/megabuster.dm +++ b/code/modules/projectiles/projectile/megabuster.dm @@ -6,7 +6,6 @@ damage_type = BURN hitsound = 'sound/weapons/sear.ogg' hitsound_wall = 'sound/weapons/effects/searwall.ogg' - icon = 'modular_citadel/icons/obj/VGprojectile.dmi' lefthand_file = 'modular_citadel/icons/mob/citadel/guns_lefthand.dmi' righthand_file = 'modular_citadel/icons/mob/citadel/guns_righthand.dmi' @@ -14,6 +13,5 @@ name = "buster pellet" icon_state = "megabuster" nodamage = 1 - icon = 'modular_citadel/icons/obj/VGprojectile.dmi' lefthand_file = 'modular_citadel/icons/mob/citadel/guns_lefthand.dmi' righthand_file = 'modular_citadel/icons/mob/citadel/guns_righthand.dmi' diff --git a/code/modules/projectiles/projectile/plasma.dm b/code/modules/projectiles/projectile/plasma.dm index f9adb9f3d7..038200b9df 100644 --- a/code/modules/projectiles/projectile/plasma.dm +++ b/code/modules/projectiles/projectile/plasma.dm @@ -1,5 +1,4 @@ obj/item/projectile/energy/plasmabolt - icon = 'modular_citadel/icons/obj/VGProjectile.dmi' name = "plasma bolt" icon_state = "plasma" flag = "energy" diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index fb064b6146..f2c6dd2fb5 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -843,7 +843,7 @@ return FALSE if (D.id == "water" && !no_react && !istype(my_atom, /obj/item/reagent_containers/food)) //Do like an otter, add acid to water, but also don't blow up botany. - if (pH <= 2) + if (pH < 2) SSblackbox.record_feedback("tally", "fermi_chem", 1, "water-acid explosions") var/datum/effect_system/smoke_spread/chem/s = new var/turf/T = get_turf(my_atom) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index b5bfa06786..a3dd3c8049 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 @@ -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() @@ -428,10 +428,11 @@ return final_list /obj/machinery/chem_dispenser/AltClick(mob/living/user) + . = ..() if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) return replace_beaker(user) - return + return TRUE /obj/machinery/chem_dispenser/drinks/Initialize() . = ..() diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index eeb452dbb5..b4f14c69a7 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -29,10 +29,11 @@ icon_state = "mixer0b" /obj/machinery/chem_heater/AltClick(mob/living/user) + . = ..() if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) return replace_beaker(user) - return + return TRUE /obj/machinery/chem_heater/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker) if(beaker) diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index f540ae850d..06e33ddf9f 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -112,10 +112,11 @@ return ..() /obj/machinery/chem_master/AltClick(mob/living/user) + . = ..() if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) return replace_beaker(user) - return + return TRUE /obj/machinery/chem_master/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker) if(beaker) diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 05fa4d382a..6ae0a682d8 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -237,10 +237,11 @@ return ..() /obj/machinery/computer/pandemic/AltClick(mob/living/user) + . = ..() if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) return replace_beaker(user) - return + return TRUE /obj/machinery/computer/pandemic/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker) if(beaker) 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..f96acf2d71 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) @@ -195,17 +199,17 @@ All effects don't start immediately, but rather get worse over time; the rate is to_chat(M, "[pick("You have a really bad headache.", "Your eyes hurt.", "You find it hard to stay still.", "You feel your heart practically beating out of your chest.")]") if(prob(5) && iscarbon(M)) + var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES) if(HAS_TRAIT(M, TRAIT_BLIND)) - var/obj/item/organ/eyes/eye = M.getorganslot(ORGAN_SLOT_EYES) - if(istype(eye)) - eye.Remove(M) - eye.forceMove(get_turf(M)) + if(eyes) + eyes.Remove(M) + eyes.forceMove(get_turf(M)) to_chat(M, "You double over in pain as you feel your eyeballs liquify in your head!") M.emote("scream") M.adjustBruteLoss(15) else to_chat(M, "You scream in terror as you go blind!") - M.become_blind(EYE_DAMAGE) + eyes?.applyOrganDamage(eyes.maxHealth) M.emote("scream") if(prob(3) && iscarbon(M)) @@ -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..08594dee5b 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" @@ -216,6 +217,7 @@ glass_icon_state = "glass_white" glass_name = "glass of milk" glass_desc = "White and nutritious goodness!" + pH = 6.5 /datum/reagent/consumable/milk/on_mob_life(mob/living/carbon/M) if(HAS_TRAIT(M, TRAIT_CALCIUM_HEALER)) @@ -405,10 +407,6 @@ glass_name = "glass of Nuka Cola" glass_desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland." -/datum/reagent/consumable/nuka_cola/on_mob_metabolize(mob/living/L) - ..() - L.add_movespeed_modifier(id, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING)) - /datum/reagent/consumable/nuka_cola/on_mob_end_metabolize(mob/living/L) L.remove_movespeed_modifier(id) ..() @@ -785,6 +783,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..2a8ad86646 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 @@ -783,6 +793,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES) if (!eyes) return + eyes.applyOrganDamage(-2) if(HAS_TRAIT_FROM(M, TRAIT_BLIND, EYE_DAMAGE)) if(prob(20)) to_chat(M, "Your vision slowly returns...") @@ -797,8 +808,6 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) else if(M.eye_blind || M.eye_blurry) M.set_blindness(0) M.set_blurriness(0) - else if(eyes.eye_damage > 0) - M.adjust_eye_damage(-1) ..() /datum/reagent/medicine/atropine @@ -871,40 +880,49 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) /datum/reagent/medicine/strange_reagent name = "Strange Reagent" id = "strange_reagent" - description = "A miracle drug capable of bringing the dead back to life. Only functions if the target has less than 100 brute and burn damage (independent of one another), and causes slight damage to the living." + description = "A miracle drug capable of bringing the dead back to life. Only functions when applied by patch or spray, if the target has less than 100 brute and burn damage (independent of one another) and hasn't been husked. Causes slight damage to the living." reagent_state = LIQUID color = "#A0E85E" metabolization_rate = 0.5 * REAGENTS_METABOLISM taste_description = "magnets" pH = 0 -/datum/reagent/medicine/strange_reagent/reaction_mob(mob/living/carbon/human/M, method=TOUCH, reac_volume) +/datum/reagent/medicine/strange_reagent/reaction_mob(mob/living/M, method=TOUCH, reac_volume) if(M.stat == DEAD) - if(M.getBruteLoss() >= 100 || M.getFireLoss() >= 100) - M.visible_message("[M]'s body convulses a bit, and then falls still once more.") + if(M.suiciding || M.hellbound) //they are never coming back + M.visible_message("[M]'s body does not react...") return - M.visible_message("[M]'s body convulses a bit.") - if(!M.suiciding && !(HAS_TRAIT(M, TRAIT_NOCLONE)) && !M.hellbound) - if(!M) - return - if(M.notify_ghost_cloning(source = M)) - spawn (100) //so the ghost has time to re-enter - return + if(M.getBruteLoss() >= 100 || M.getFireLoss() >= 100 || HAS_TRAIT(M, TRAIT_HUSK)) //body is too damaged to be revived + M.visible_message("[M]'s body convulses a bit, and then falls still once more.") + M.do_jitter_animation(10) + return + else + M.visible_message("[M]'s body starts convulsing!") + M.notify_ghost_cloning(source = M) + M.do_jitter_animation(10) + addtimer(CALLBACK(M, /mob/living/carbon.proc/do_jitter_animation, 10), 40) //jitter immediately, then again after 4 and 8 seconds + addtimer(CALLBACK(M, /mob/living/carbon.proc/do_jitter_animation, 10), 80) + + spawn(100) //so the ghost has time to re-enter + if(iscarbon(M)) + var/mob/living/carbon/C = M + if(!(C.dna && C.dna.species && (NOBLOOD in C.dna.species.species_traits))) + C.blood_volume = max(C.blood_volume, BLOOD_VOLUME_NORMAL*C.blood_ratio) //so you don't instantly re-die from a lack of blood + for(var/organ in C.internal_organs) + var/obj/item/organ/O = organ + if(O.damage > O.maxHealth/2) + O.setOrganDamage(O.maxHealth/2) //so you don't instantly die from organ damage when being revived - else M.adjustOxyLoss(-20, 0) M.adjustToxLoss(-20, 0) - var/mob/living/carbon/H = M - for(var/organ in H.internal_organs) - var/obj/item/organ/O = organ - O.setOrganDamage(0) M.updatehealth() - if(M.revive()) + M.grab_ghost() M.emote("gasp") log_combat(M, M, "revived", src) ..() + /datum/reagent/medicine/strange_reagent/on_mob_life(mob/living/carbon/M) M.adjustBruteLoss(0.5*REM, 0) M.adjustFireLoss(0.5*REM, 0) @@ -930,6 +948,21 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) description = "Reacts with neural tissue, helping reform damaged connections. Can cure minor traumas." color = "#EEFF8F" +/datum/reagent/medicine/neurine/reaction_mob(mob/living/M, method=TOUCH, reac_volume) + if(!(method == INJECT)) + return + var/obj/item/organ/brain/B = M.getorganslot(ORGAN_SLOT_BRAIN) + if(!B || (!(B.organ_flags & ORGAN_FAILING))) + return + B.applyOrganDamage(-20) + if(prob(80)) + B.gain_trauma_type(BRAIN_TRAUMA_MILD) + else if(prob(50)) + B.gain_trauma_type(BRAIN_TRAUMA_SEVERE) + else + B.gain_trauma_type(BRAIN_TRAUMA_SPECIAL) + + /datum/reagent/medicine/neurine/on_mob_life(mob/living/carbon/C) if(holder.has_reagent("neurotoxin")) holder.remove_reagent("neurotoxin", 5) @@ -1192,19 +1225,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 +1487,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..bb65392057 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" @@ -1645,7 +1654,7 @@ description = "Cheap and extremely common type of plant nutriment." color = "#376400" // RBG: 50, 100, 0 tox_prob = 10 - pH = 2 + pH = 2.5 /datum/reagent/plantnutriment/left4zednutriment name = "Left 4 Zed" @@ -1653,7 +1662,7 @@ description = "Unstable nutriment that makes plants mutate more often than usual." color = "#1A1E4D" // RBG: 26, 30, 77 tox_prob = 25 - pH = 1.5 + pH = 3.5 /datum/reagent/plantnutriment/robustharvestnutriment name = "Robust Harvest" @@ -1661,7 +1670,7 @@ description = "Very potent nutriment that prevents plants from mutating." color = "#9D9D00" // RBG: 157, 157, 0 tox_prob = 15 - pH = 1 + pH = 2.5 // GOON OTHERS 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..f97204b45e 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -33,7 +33,7 @@ toxpwr = 0 taste_description = "slime" taste_mult = 0.9 - pH = 2 + pH = 2.3 /datum/reagent/toxin/mutagen/reaction_mob(mob/living/carbon/M, method=TOUCH, reac_volume) if(!..()) @@ -220,7 +220,7 @@ color = "#49002E" // rgb: 73, 0, 46 toxpwr = 1 taste_mult = 1 - pH = 2 + pH = 2.7 /datum/reagent/toxin/plantbgone/reaction_obj(obj/O, reac_volume) if(istype(O, /obj/structure/alien/weeds)) @@ -967,3 +967,22 @@ 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/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index 374f7715bb..607e0b5a4e 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -73,7 +73,7 @@ id = "synthtissue" results = list("synthtissue" = 5) required_reagents = list("synthflesh" = 1) - required_catalysts = list("nutriment" = 0.1) + required_catalysts = list("sugar" = 0.1) //FermiChem vars: OptimalTempMin = 305 // Lower area of bell curve for determining heat based rate reactions OptimalTempMax = 315 // Upper end for above @@ -86,13 +86,13 @@ CurveSharppH = 2.5 // How sharp the pH exponential curve is (to the power of value) ThermicConstant = 0.01 // Temperature change per 1u produced HIonRelease = 0.015 // pH change per 1u reaction (inverse for some reason) - RateUpLim = 0.05 // Optimal/max rate possible if all conditions are perfect + RateUpLim = 0.1 // Optimal/max rate possible if all conditions are perfect FermiChem = TRUE // If the chemical uses the Fermichem reaction mechanics PurityMin = 0 /datum/chemical_reaction/synthtissue/FermiCreate(datum/reagents/holder, added_volume, added_purity) var/datum/reagent/synthtissue/St = holder.has_reagent("synthtissue") - var/datum/reagent/N = holder.has_reagent("nutriment") + var/datum/reagent/N = holder.has_reagent("sugar") if(!St) return if(holder.chem_temp > 320) diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index b29a1c6809..ad1efc1da7 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -99,7 +99,6 @@ /datum/chemical_reaction/reagent_explosion/blackpowder_explosion/on_reaction(datum/reagents/holder, created_volume) var/turf/T = get_turf(holder.my_atom) - sleep(rand(50,100)) ..(holder, created_volume, T) /datum/chemical_reaction/thermite 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/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index afe48ab3fb..0ee131bc14 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -77,6 +77,11 @@ desc = "A small bottle of charcoal, which removes toxins and other chemicals from the bloodstream." list_reagents = list("charcoal" = 30) +/obj/item/reagent_containers/glass/bottle/cryoxadone + name = "cryoxadone bottle" + desc = "A small bottle of cryoxadone, heals most types of damage when used in extremely cold enviornments." + list_reagents = list("cryoxadone" = 30) + /obj/item/reagent_containers/glass/bottle/mutagen name = "unstable mutagen bottle" desc = "A small bottle of unstable mutagen. Randomly changes the DNA structure of whoever comes in contact." diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 432b9289dd..f1a4d1554e 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))) @@ -338,8 +338,10 @@ return FALSE /obj/item/hypospray/mkii/AltClick(mob/user) + . = ..() if(vial) vial.attack_self(user) + return TRUE // Gunna allow this for now, still really don't approve - Pooj /obj/item/hypospray/mkii/emag_act(mob/user) diff --git a/code/modules/reagents/reagent_containers/medspray.dm b/code/modules/reagents/reagent_containers/medspray.dm index df7c7af225..b445c38ad9 100644 --- a/code/modules/reagents/reagent_containers/medspray.dm +++ b/code/modules/reagents/reagent_containers/medspray.dm @@ -100,3 +100,8 @@ name = "sterilizer spray" desc = "Spray bottle loaded with non-toxic sterilizer. Useful in preparation for surgery." list_reagents = list("sterilizine" = 60) + +/obj/item/reagent_containers/medspray/synthtissue + name = "Synthtissue young culture spray" + desc = "Spray bottle loaded with synthtissue. Useful in synthtissue grafting surgeries." + list_reagents = list("synthtissue" = 60) diff --git a/code/modules/reagents/reagent_containers/rags.dm b/code/modules/reagents/reagent_containers/rags.dm index 92a4b155d8..d09b18f244 100644 --- a/code/modules/reagents/reagent_containers/rags.dm +++ b/code/modules/reagents/reagent_containers/rags.dm @@ -5,7 +5,7 @@ icon = 'icons/obj/toy.dmi' icon_state = "rag" item_flags = NOBLUDGEON - reagent_flags = OPENCONTAINER + reagent_flags = REFILLABLE | DRAINABLE amount_per_transfer_from_this = 5 possible_transfer_amounts = list() volume = 5 @@ -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.") + . += "It's soaked. Alt-Click to squeeze it dry, and perhaps gather the liquids into another held open container." /obj/item/reagent_containers/rag/afterattack(atom/A as obj|turf|area, mob/user,proximity) . = ..() @@ -85,15 +85,27 @@ /obj/item/reagent_containers/rag/AltClick(mob/user) . = ..() if(reagents.total_volume && user.canUseTopic(src, BE_CLOSE)) - to_chat(user, "You start squeezing the liquids out of \the [src]...") + to_chat(user, "You start squeezing \the [src] dry...") if(do_after(user, action_speed, TRUE, src)) - to_chat(user, "You squeeze \the [src] dry.") - var/atom/react_loc = get_turf(src) - if(ismob(react_loc)) - react_loc = react_loc.loc - if(react_loc) - reagents.reaction(react_loc, TOUCH) - reagents.clear_reagents() + var/msg = "You squeeze \the [src]" + var/obj/item/target + if(Adjacent(user)) //Allows the user to drain the reagents into a beaker if adjacent (no telepathy). + for(var/obj/item/I in user.held_items) + if(I == src) + continue + if(I.is_open_container() && !I.reagents.holder_full()) + target = I + break + if(!target) + msg += " dry" + reagents.reaction(get_turf(src), TOUCH) + reagents.clear_reagents() + else + msg += "'s liquids into \the [target]" + reagents.trans_to(target, reagents.total_volume) + to_chat(user, "[msg].") + return TRUE + /obj/item/reagent_containers/rag/towel name = "towel" diff --git a/code/modules/reagents/reagent_containers/sleeper_buffer.dm b/code/modules/reagents/reagent_containers/sleeper_buffer.dm new file mode 100644 index 0000000000..044dab2924 --- /dev/null +++ b/code/modules/reagents/reagent_containers/sleeper_buffer.dm @@ -0,0 +1,11 @@ +//Created if a sleeper is deconstructed, to contain the reagents within it. +/obj/item/reagent_containers/sleeper_buffer + name = "Sleeper buffer container" + desc = "A closed container for insertion in the Medical Sleepers." + icon_state = "sleeper_buffer" + volume = 500 + reagent_flags = NO_REACT + spillable = TRUE + resistance_flags = ACID_PROOF + amount_per_transfer_from_this = 0 + possible_transfer_amounts = list(0) diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 424d7b9ed0..ddbc6cf92b 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -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..2e36a9deaa 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 @@ -113,7 +117,7 @@ if(user.incapacitated()) return for(var/mob/M in range(5, get_turf(src))) - M.show_message("CLONG, clong!", 2) + M.show_message("CLONG, clong!", MSG_AUDIBLE) playsound(src.loc, 'sound/effects/clang.ogg', 50, 0, 0) // called to vent all gas in holder to a location 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/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index 77eebca696..5f7648b245 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -504,7 +504,7 @@ desc = "A a electrode attached to a small circuit box that will tell you the pH of a solution." id = "pHmeter" build_type = PROTOLATHE - materials = list(MAT_METAL = 1000, MAT_SILVER = 100, MAT_DIAMOND = 100) + materials = list(MAT_METAL = 1000, MAT_SILVER = 100, MAT_PLASTIC = 100) build_path = /obj/item/fermichem/pHmeter category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE 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..78f636d948 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 @@ -81,13 +81,14 @@ /obj/machinery/rnd/production/proc/do_print(path, amount, list/matlist, notify_admins, mob/user) if(notify_admins) - 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]")) + investigate_log("[key_name(user)] built [amount] of [path] at [src]([type]).", INVESTIGATE_RESEARCH) /obj/machinery/rnd/production/proc/check_mat(datum/design/being_built, M) // now returns how many times the item can be built with the material if (!materials.mat_container) // no connected silo @@ -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..920c42b411 100644 --- a/code/modules/research/nanites/nanite_hijacker.dm +++ b/code/modules/research/nanites/nanite_hijacker.dm @@ -14,11 +14,12 @@ return if(disk) eject() + return TRUE /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..0d27d7ba0d 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) @@ -241,12 +238,12 @@ datum/nanite_program/proc/on_mob_remove() else if(deactivation_code && code == deactivation_code && activated) deactivate() host_mob.investigate_log("[host_mob]'s [name] nanite program was deactivated by [source] with code [code].", INVESTIGATE_NANITES) - if(can_trigger && trigger_code && code == trigger_code) - trigger() - host_mob.investigate_log("[host_mob]'s [name] nanite program was triggered by [source] with code [code].", INVESTIGATE_NANITES) if(kill_code && code == kill_code) host_mob.investigate_log("[host_mob]'s [name] nanite program was deleted by [source] with code [code].", INVESTIGATE_NANITES) qdel(src) + else if(can_trigger && trigger_code && code == trigger_code) + trigger() + host_mob.investigate_log("[host_mob]'s [name] nanite program was triggered by [source] with code [code].", INVESTIGATE_NANITES) /datum/nanite_program/proc/get_timer_type_text() switch(timer_type) diff --git a/code/modules/research/nanites/nanite_programs/healing.dm b/code/modules/research/nanites/nanite_programs/healing.dm index 1113f11e87..50fb5efcb0 100644 --- a/code/modules/research/nanites/nanite_programs/healing.dm +++ b/code/modules/research/nanites/nanite_programs/healing.dm @@ -61,6 +61,9 @@ /datum/nanite_program/purging/active_effect() host_mob.adjustToxLoss(-1) for(var/datum/reagent/R in host_mob.reagents.reagent_list) + if(R.id == "nanite_b_gone") + host_mob.adjustToxLoss(4) + continue host_mob.reagents.remove_reagent(R.id,1) /datum/nanite_program/brain_heal 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..a7c8533521 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) . = ..() @@ -35,6 +35,7 @@ update_icon() else to_chat(user, "Access denied.") + return TRUE /obj/item/nanite_remote/emag_act(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 9c9542ed17..292aba6c05 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -904,10 +904,11 @@ datum/status_effect/stabilized/blue/on_remove() colour = "light pink" /datum/status_effect/stabilized/lightpink/on_apply() - owner.add_movespeed_modifier(MOVESPEED_ID_SLIME_STATUS, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING)) + ADD_TRAIT(owner, TRAIT_FREESPRINT, "stabilized_slime") return ..() /datum/status_effect/stabilized/lightpink/tick() + owner.adjustStaminaLoss(-4.5) for(var/mob/living/carbon/human/H in range(1, get_turf(owner))) if(H != owner && H.stat != DEAD && H.health <= 0 && !H.reagents.has_reagent("epinephrine")) to_chat(owner, "[linked_extract] pulses in sync with [H]'s heartbeat, trying to keep [H.p_them()] alive.") @@ -915,7 +916,8 @@ datum/status_effect/stabilized/blue/on_remove() return ..() /datum/status_effect/stabilized/lightpink/on_remove() - owner.remove_movespeed_modifier(MOVESPEED_ID_SLIME_STATUS) + REMOVE_TRAIT(owner, TRAIT_FREESPRINT, "stabilized_slime") + return ..() /datum/status_effect/stabilized/adamantine id = "stabilizedadamantine" 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..205603e12e 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() @@ -28,6 +28,7 @@ var/datum/action/innate/monkey_recycle/monkey_recycle_action var/datum/action/innate/slime_scan/scan_action var/datum/action/innate/feed_potion/potion_action + var/datum/action/innate/hotkey_help/hotkey_help var/list/stored_slimes var/obj/item/slimepotion/slime/current_potion @@ -48,6 +49,7 @@ monkey_recycle_action = new scan_action = new potion_action = new + hotkey_help = new stored_slimes = list() RegisterSignal(src, COMSIG_ATOM_CONTENTS_DEL, .proc/on_contents_del) @@ -63,9 +65,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) ..() @@ -100,6 +102,27 @@ potion_action.Grant(user) actions += potion_action + if(hotkey_help) + hotkey_help.target = src + hotkey_help.Grant(user) + actions += hotkey_help + + RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_CTRL, .proc/XenoSlimeClickCtrl) + RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_ALT, .proc/XenoSlimeClickAlt) + RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_SHIFT, .proc/XenoSlimeClickShift) + RegisterSignal(user, COMSIG_XENO_TURF_CLICK_SHIFT, .proc/XenoTurfClickShift) + RegisterSignal(user, COMSIG_XENO_TURF_CLICK_CTRL, .proc/XenoTurfClickCtrl) + RegisterSignal(user, COMSIG_XENO_MONKEY_CLICK_CTRL, .proc/XenoMonkeyClickCtrl) + +/obj/machinery/computer/camera_advanced/xenobio/remove_eye_control(mob/living/user) + UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_CTRL) + UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_ALT) + UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_SHIFT) + UnregisterSignal(user, COMSIG_XENO_TURF_CLICK_SHIFT) + UnregisterSignal(user, COMSIG_XENO_TURF_CLICK_CTRL) + UnregisterSignal(user, COMSIG_XENO_MONKEY_CLICK_CTRL) + ..() + /obj/machinery/computer/camera_advanced/xenobio/proc/on_contents_del(atom/deleted) if(current_potion == deleted) current_potion = null @@ -169,7 +192,7 @@ S.visible_message("[S] warps in!") X.stored_slimes -= S else - to_chat(owner, "Target is not near a camera. Cannot proceed.") + to_chat(owner, "Target is not near a camera. Cannot proceed.") /datum/action/innate/slime_pick_up name = "Pick up Slime" @@ -194,7 +217,7 @@ S.forceMove(X) X.stored_slimes += S else - to_chat(owner, "Target is not near a camera. Cannot proceed.") + to_chat(owner, "Target is not near a camera. Cannot proceed.") /datum/action/innate/feed_slime @@ -215,9 +238,11 @@ if (!QDELETED(food)) food.LAssailant = C X.monkeys -- - to_chat(owner, "[X] now has [X.monkeys] monkeys left.") + to_chat(owner, "[X] now has [X.monkeys] monkey(s) left.") + else + to_chat(owner, "[X] needs to have at least 1 monkey stored. Currently has [X.monkeys] monkeys stored.") else - to_chat(owner, "Target is not near a camera. Cannot proceed.") + to_chat(owner, "Target is not near a camera. Cannot proceed.") /datum/action/innate/monkey_recycle @@ -239,7 +264,7 @@ X.monkeys = round(X.monkeys + 0.2,0.1) qdel(M) else - to_chat(owner, "Target is not near a camera. Cannot proceed.") + to_chat(owner, "Target is not near a camera. Cannot proceed.") /datum/action/innate/slime_scan name = "Scan Slime" @@ -256,7 +281,7 @@ for(var/mob/living/simple_animal/slime/S in remote_eye.loc) slime_scan(S, C) else - to_chat(owner, "Target is not near a camera. Cannot proceed.") + to_chat(owner, "Target is not near a camera. Cannot proceed.") /datum/action/innate/feed_potion name = "Apply Potion" @@ -280,7 +305,10 @@ X.current_potion.attack(S, C) break else - to_chat(owner, "Target is not near a camera. Cannot proceed.") + to_chat(owner, "Target is not near a camera. Cannot proceed.") + + +//Demodularized Code /obj/item/disk/xenobio_console_upgrade name = "Xenobiology console upgrade disk" @@ -307,3 +335,169 @@ name = "Xenobiology console advanced slime upgrade disk" desc = "This disk will add the ability to remotely feed slimes potions via the Xenobiology console, and lift the restrictions on the number of slimes that can be stored inside the Xenobiology console. This includes the contents of the basic slime upgrade disk." upgradetypes = list(XENOBIO_UPGRADE_SLIMEBASIC, XENOBIO_UPGRADE_SLIMEADV) + + +//Xenobio Hotkeys Port + +/datum/action/innate/hotkey_help + name = "Hotkey Help" + icon_icon = 'icons/mob/actions/actions_silicon.dmi' + button_icon_state = "hotkey_help" + +/datum/action/innate/hotkey_help/Activate() + if(!target || !isliving(owner)) + return + to_chat(owner, "Click shortcuts:") + to_chat(owner, "Shift-click a slime to pick it up, or the floor to drop all held slimes. (Requires Basic Slime Console upgrade)") + to_chat(owner, "Ctrl-click a slime to scan it.") + to_chat(owner, "Alt-click a slime to feed it a potion. (Requires Advanced Slime Console upgrade)") + to_chat(owner, "Ctrl-click on a dead monkey to recycle it, or the floor to place a new monkey. (Requires Monkey Console upgrade)") + +// +// Alternate clicks for slime, monkey and open turf if using a xenobio console + +// Scans slime +/mob/living/simple_animal/slime/CtrlClick(mob/user) + SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_CTRL, src) + ..() + +//Feeds a potion to slime +/mob/living/simple_animal/slime/AltClick(mob/user) + SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_ALT, src) + ..() + +//Picks up slime +/mob/living/simple_animal/slime/ShiftClick(mob/user) + SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_SHIFT, src) + ..() + +//Place slimes +/turf/open/ShiftClick(mob/user) + SEND_SIGNAL(user, COMSIG_XENO_TURF_CLICK_SHIFT, src) + ..() + +//Place monkey +/turf/open/CtrlClick(mob/user) + SEND_SIGNAL(user, COMSIG_XENO_TURF_CLICK_CTRL, src) + ..() + +//Pick up monkey +/mob/living/carbon/monkey/CtrlClick(mob/user) + SEND_SIGNAL(user, COMSIG_XENO_MONKEY_CLICK_CTRL, src) + ..() + +// Scans slime +/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickCtrl(mob/living/user, mob/living/simple_animal/slime/S) + if(!GLOB.cameranet.checkTurfVis(S.loc)) + to_chat(user, "Target is not near a camera. Cannot proceed.") + return + var/mob/living/C = user + var/mob/camera/aiEye/remote/xenobio/E = C.remote_control + var/area/mobarea = get_area(S.loc) + if(mobarea.name == E.allowed_area || mobarea.xenobiology_compatible) + slime_scan(S, C) + +//Feeds a potion to slime +/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickAlt(mob/living/user, mob/living/simple_animal/slime/S) + if(!(upgradetier & XENOBIO_UPGRADE_SLIMEADV)) //CIT CHANGE - makes slime-related actions require XENOBIO_UPGRADE_SLIMEADV + to_chat(user, "This console does not have the advanced slime upgrade.") + return + if(!GLOB.cameranet.checkTurfVis(S.loc)) + to_chat(user, "Target is not near a camera. Cannot proceed.") + return + var/mob/living/C = user + var/mob/camera/aiEye/remote/xenobio/E = C.remote_control + var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin + var/area/mobarea = get_area(S.loc) + if(QDELETED(X.current_potion)) + to_chat(C, "No potion loaded.") + return + if(mobarea.name == E.allowed_area || mobarea.xenobiology_compatible) + X.current_potion.attack(S, C) + +//Picks up slime +/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickShift(mob/living/user, mob/living/simple_animal/slime/S) + if(!(upgradetier & XENOBIO_UPGRADE_SLIMEBASIC)) //CIT CHANGE - makes slime-related actions require XENOBIO_UPGRADE_SLIMEBASIC + to_chat(user, "This console does not have the basic slime upgrade.") + return + if(!GLOB.cameranet.checkTurfVis(S.loc)) + to_chat(user, "Target is not near a camera. Cannot proceed.") + return + var/mob/living/C = user + var/mob/camera/aiEye/remote/xenobio/E = C.remote_control + var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin + var/area/mobarea = get_area(S.loc) + if(mobarea.name == E.allowed_area || mobarea.xenobiology_compatible) + if(X.stored_slimes.len >= X.max_slimes) + to_chat(C, "Slime storage is full.") + return + if(S.ckey) + to_chat(C, "The slime wiggled free!") + return + if(S.buckled) + S.Feedstop(silent = TRUE) + S.visible_message("[S] vanishes in a flash of light!") + S.forceMove(X) + X.stored_slimes += S + +//Place slimes +/obj/machinery/computer/camera_advanced/xenobio/proc/XenoTurfClickShift(mob/living/user, turf/open/T) + if(!(upgradetier & XENOBIO_UPGRADE_SLIMEBASIC)) //CIT CHANGE - makes slime-related actions require XENOBIO_UPGRADE_SLIMEBASIC + to_chat(user, "This console does not have the basic slime upgrade.") + return + if(!GLOB.cameranet.checkTurfVis(T)) + to_chat(user, "Target is not near a camera. Cannot proceed.") + return + var/mob/living/C = user + var/mob/camera/aiEye/remote/xenobio/E = C.remote_control + var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin + var/area/turfarea = get_area(T) + if(turfarea.name == E.allowed_area || turfarea.xenobiology_compatible) + for(var/mob/living/simple_animal/slime/S in X.stored_slimes) + S.forceMove(T) + S.visible_message("[S] warps in!") + X.stored_slimes -= S + +//Place monkey +/obj/machinery/computer/camera_advanced/xenobio/proc/XenoTurfClickCtrl(mob/living/user, turf/open/T) + if(!(upgradetier & XENOBIO_UPGRADE_MONKEYS)) // CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS + to_chat(user, "This console does not have the monkey upgrade.") + return + if(!GLOB.cameranet.checkTurfVis(T)) + to_chat(user, "Target is not near a camera. Cannot proceed.") + return + var/mob/living/C = user + var/mob/camera/aiEye/remote/xenobio/E = C.remote_control + var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin + var/area/turfarea = get_area(T) + if(turfarea.name == E.allowed_area || turfarea.xenobiology_compatible) + if(X.monkeys >= 1) + var/mob/living/carbon/monkey/food = new /mob/living/carbon/monkey(T, TRUE, C) + if (!QDELETED(food)) + food.LAssailant = C + X.monkeys-- + X.monkeys = round(X.monkeys, 0.1) //Prevents rounding errors + to_chat(C, "[X] now has [X.monkeys] monkey(s) stored.") + else + to_chat(C, "[X] needs to have at least 1 monkey stored. Currently has [X.monkeys] monkeys stored.") + +//Pick up monkey +/obj/machinery/computer/camera_advanced/xenobio/proc/XenoMonkeyClickCtrl(mob/living/user, mob/living/carbon/monkey/M) + if(!(upgradetier & XENOBIO_UPGRADE_MONKEYS)) // CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS + to_chat(user, "This console does not have the monkey upgrade.") + return + if(!GLOB.cameranet.checkTurfVis(M.loc)) + to_chat(user, "Target is not near a camera. Cannot proceed.") + return + var/mob/living/C = user + var/mob/camera/aiEye/remote/xenobio/E = C.remote_control + var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin + var/area/mobarea = get_area(M.loc) + if(mobarea.name == E.allowed_area || mobarea.xenobiology_compatible) + if(!M.stat) + return + M.visible_message("[M] vanishes as [p_theyre()] reclaimed for recycling!") + X.monkeys = round(X.monkeys + 0.2,0.1) + qdel(M) + if (X.monkeys == (round(X.monkeys,1))) + to_chat(C, "[X] now has [X.monkeys] monkey(s) available.") 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..b6e0db2646 100644 --- a/code/modules/ruins/lavaland_ruin_code.dm +++ b/code/modules/ruins/lavaland_ruin_code.dm @@ -85,7 +85,8 @@ /obj/item/stack/tile/bronze = /datum/species/golem/bronze, /obj/item/stack/sheet/cardboard = /datum/species/golem/cardboard, /obj/item/stack/sheet/leather = /datum/species/golem/leather, - /obj/item/stack/sheet/bone = /datum/species/golem/bone) + /obj/item/stack/sheet/bone = /datum/species/golem/bone, + /obj/item/stack/sheet/cotton/durathread = /datum/species/golem/durathread) if(istype(I, /obj/item/stack)) var/obj/item/stack/O = I @@ -135,7 +136,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..f64b5e4d01 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,330 @@ 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) + return TRUE /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